diff --git a/DEPS b/DEPS
index 067544a..815455e 100644
--- a/DEPS
+++ b/DEPS
@@ -213,7 +213,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:9c88febc5ab63469baf5aae05a74f8e419970ef3',
+  'luci_go': 'git_revision:d46a9c7ad4e38935bbacb01602fc1d09a162884b',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -245,15 +245,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': '3034776433e8309a87c90609a9993bf475938d6b',
+  'skia_revision': 'a69af3bec2e2fa1c30c30ceed18ba5a82131890d',
   # 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': '08eb6a08b1da6b9a9915276b40dfeaaefe940633',
+  'v8_revision': 'f5e87c2c7cbd8a7899b1e40303758581178e3e29',
   # 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': '84470eb3ddadd4993dd3a0e2b34042ac5828e6a2',
+  'angle_revision': 'f810e998993290f049bbdad4fae975e4867100ad',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -261,7 +261,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'ec9f4970f777350af0c0c291eac2958f2ef9e5cc',
+  'pdfium_revision': 'ffeb67faf715475f6e463d65c368f556780adf19',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -276,7 +276,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling googletest
   # and whatever else without interference from each other.
-  'googletest_revision': '28e1da21d8d677bc98f12ccc7fc159ff19e8e817',
+  'googletest_revision': '4517697675fc0d51c89aca61af5c77c4f1e4ee2d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lighttpd
   # and whatever else without interference from each other.
@@ -292,7 +292,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': 'fa226478b1dc846ba86eb364c524fb3f4c3bcd0d',
+  'freetype_revision': '946e1353eaa34872d0b138a13820fc03a782c545',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -312,7 +312,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': '9a1137f8eed514f028da5ce4ed96df9e85ee9ff0',
+  'catapult_revision': '1c33cd6890c82766fd66632c26c1844bab3a9bc9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -320,7 +320,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': '72eb091458dd864782f0aa6c8e6a5f0657a60612',
+  'devtools_frontend_revision': 'ffef39d9a3be59c3b6518c872a34bfec97078b16',
   # 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.
@@ -360,7 +360,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': '808e6cf12da3e7524878b04e80d1fe43d70a81a9',
+  'dawn_revision': 'e663ac2c27af03966a15bb03ae5e00379e92bbb1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -384,7 +384,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libavif
   # and whatever else without interference from each other.
-  'libavif_revision': '545a75608cb2b84d59601efb2dbddaa87eb8a55f',
+  'libavif_revision': 'd9cffc5f46b62aeff46eebf51449726386d6c485',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
@@ -663,7 +663,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '5dedf6823f57f981d3114ab3870f2f572eab4527',
+    'url': Var('chromium_git') + '/website.git' + '@' + '36ea18f18bd411969add98490af107ea3a8b0e9f',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -687,7 +687,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'ec85dac78dbf6cba59971f6d6db6b6e606a43fdb',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '0c37af79365fcdaa50046e0f6c8a1130ab8334d0',
       'condition': 'checkout_ios',
   },
 
@@ -851,7 +851,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'Qo3oi32JKnLwAeBGQyVax5FEUu97M2omI6yz5qDiMCwC',
+          'version': '3RcBXDFZuIJBL1I-gTWwvfRXm6fCwxFkV3tY3ZodF1YC',
       },
     ],
     'condition': 'checkout_android',
@@ -1090,7 +1090,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8dd74d4f85a739ff883831960c665b0a3a24ec36',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '98cf932814ca64260b9c1d36d9ae20b4286256ec',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1099,7 +1099,7 @@
     Var('chromium_git') + '/chromium/dom-distiller/dist.git' + '@' + 'f339eb9463714c3d31657c8ee1bd53d1c7e5c555',
 
   'src/third_party/eigen3/src':
-    Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + 'a30ecb7221a46824b85cad5f9016efe6e5871d69',
+    Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '7db0ac977acf276fb0817cfb89e490cdbae0ab56',
 
   'src/third_party/emoji-metadata/src': {
     'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '84fcb4151d2d110abfb4451369469048f28b73ff',
@@ -1473,7 +1473,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '045b467fafaa5b085a8d86a3a23c0585347814ea',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '00b152a26effb7ba2ec1f2d1fdace9116ea470e4',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1551,7 +1551,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/android/aemu/release/linux-amd64',
-              'version': 'T1h6dMLk8dN8wbV9UTyFUO1qclrAzLv_T9AP7EsVbd8C'
+              'version': 'M6mxGiuz2PpKF7SRQDyvJfZUvxMf5WMCG4kxBiVEMAsC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1634,7 +1634,7 @@
   },
 
   'src/third_party/tflite/src':
-    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'e8d09964ddf7d87041a9f9732be7645ea257dac9',
+    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'd570144d42b17065ea1c222e9ea38fa1810bee21',
 
   'src/third_party/turbine': {
       'packages': [
@@ -1655,7 +1655,7 @@
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb',
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@69f4b9c09e484e3cc0f87e7760a7865324825c7a',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@68af031cdcd172eb5d43bc097e67c635a32a9aa8',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1688,13 +1688,13 @@
     Var('chromium_git') + '/external/github.com/SeleniumHQ/selenium/py.git' + '@' + 'd0045ec570c1a77612db35d1e92f05e1d27b4d53',
 
   'src/third_party/webgl/src':
-    Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'b1f3776e4913637221733a4da09f3339e783b771',
+    Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'cf04aebdf9b53bb2853f22a81465688daf879ec6',
 
   'src/third_party/webgpu-cts/src':
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '89f20c5e69574ffbede2d89e18b4dba71bf9c1f2',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '48e1b2950b12653c04dbe28d0abacabdfd760f1f',
+    Var('webrtc_git') + '/src.git' + '@' + 'e804e60be0f66eb8aee9e9bcfeaab04878668c5e',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1721,7 +1721,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'a94AbgYafC6yjxWNmJJ4cHUWWXNhjFUQLcU79HycYjkC',
+          'version': 'EOs8AExsqXFWldVpuKUhohthnzRRSh8f1iOAv5ZTMaMC',
         },
       ],
       'dep_type': 'cipd',
@@ -1731,7 +1731,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': '3uvz7bDTL-QoL5KPX-caB_HxcvVE7JamyMibu71hqHAC',
+          'version': 'YNpvcNJRmWf1tWoS-tcsyhjqBG_mHDeGeur5IZYx0hEC',
         },
       ],
       'dep_type': 'cipd',
@@ -1742,7 +1742,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'IEdOBXQmFOksbZa16aKIWU6uYVYJlgvPwyX3wktMkkIC',
+          'version': 'eq2tMMf-q6AOpCv5MS-RFvueRyU6T_uvZrMA_EsM_cAC',
         },
       ],
       'dep_type': 'cipd',
@@ -1753,7 +1753,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': 'XtI7k09JHcA8aaaRNlOF92uDqOXfr8HMmepwH0q9uk0C',
+          'version': '-AnHHiBmUZNDkYjj6DIHVHg8N2LuttcBm9gUQx5Yrt8C',
         },
       ],
       'dep_type': 'cipd',
@@ -1764,7 +1764,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@68aaa4319bcfc963ac1261137a0006e353763be0',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@94d15e91a6f6c12fef24b9823be497a409939a33',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/lib/BUILD.gn b/android_webview/lib/BUILD.gn
index 9a14c5a..a744ebb 100644
--- a/android_webview/lib/BUILD.gn
+++ b/android_webview/lib/BUILD.gn
@@ -30,6 +30,7 @@
     "//components/safe_browsing/android:safe_browsing_api_handler",
     "//components/services/heap_profiling/public/cpp",
     "//components/spellcheck:buildflags",
+    "//components/translate/core/common",
     "//components/version_info",
     "//components/version_info/android:channel_getter",
     "//components/viz/common",
diff --git a/android_webview/lib/DEPS b/android_webview/lib/DEPS
index 07835fb..235f740 100644
--- a/android_webview/lib/DEPS
+++ b/android_webview/lib/DEPS
@@ -4,6 +4,7 @@
   "+components/crash/core",
   "+components/safe_browsing/android",
   "+components/spellcheck/common",
+  "+components/translate/core/common",
   "+components/viz/common",
   "+content/public",
   "+device/base/features.h",
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index 287f60f4..c5ee919 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -45,6 +45,7 @@
 #include "components/safe_browsing/android/safe_browsing_api_handler_bridge.h"
 #include "components/services/heap_profiling/public/cpp/profiling_client.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
+#include "components/translate/core/common/translate_util.h"
 #include "components/version_info/android/channel_getter.h"
 #include "components/viz/common/features.h"
 #include "content/public/browser/android/media_url_interceptor_register.h"
@@ -264,6 +265,11 @@
 
     // Disable dr-dc on webview.
     features.DisableIfNotSet(::features::kEnableDrDc);
+
+    // Disable TFLite based language detection on webview until webview supports
+    // ML model delivery via Optimization Guide component.
+    // TODO(crbug.com/1292622): Enable the feature on Webview.
+    features.DisableIfNotSet(::translate::kTFLiteLanguageDetectionEnabled);
   }
 
   android_webview::RegisterPathProvider();
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 8598016f..7688583 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1463,6 +1463,8 @@
     "system/time/calendar_event_list_item_view.h",
     "system/time/calendar_event_list_view.cc",
     "system/time/calendar_event_list_view.h",
+    "system/time/calendar_metrics.cc",
+    "system/time/calendar_metrics.h",
     "system/time/calendar_month_view.cc",
     "system/time/calendar_month_view.h",
     "system/time/calendar_utils.cc",
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc
index 8d09828..bbfd727 100644
--- a/ash/accelerators/accelerator_table_unittest.cc
+++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -16,10 +16,10 @@
 namespace {
 
 // The number of non-Search-based accelerators.
-constexpr int kNonSearchAcceleratorsNum = 105;
+constexpr int kNonSearchAcceleratorsNum = 108;
 // The hash of non-Search-based accelerators. See HashAcceleratorData().
 constexpr char kNonSearchAcceleratorsHash[] =
-    "5b40544d68a2355cf33f4afdf32568f1";
+    "b7713db7db9317e94164c28d23fd041c";
 
 struct Cmp {
   bool operator()(const AcceleratorData& lhs,
diff --git a/ash/accessibility/accessibility_controller_impl.cc b/ash/accessibility/accessibility_controller_impl.cc
index 361ed7432..5fe5625 100644
--- a/ash/accessibility/accessibility_controller_impl.cc
+++ b/ash/accessibility/accessibility_controller_impl.cc
@@ -2097,6 +2097,7 @@
   // could interact with the dialog.
   DeactivateSwitchAccess();
   if (disable_dialog_accepted) {
+    RemoveAccessibilityNotification();
     NotifyAccessibilityStatusChanged();
     SyncSwitchAccessPrefsToSignInProfile();
   } else {
@@ -2366,7 +2367,6 @@
       break;
     case FeatureType::kSwitchAccess:
       if (!enabled) {
-        RemoveAccessibilityNotification();
         if (no_switch_access_disable_confirmation_dialog_for_testing_) {
           SwitchAccessDisableDialogClosed(true);
         } else {
diff --git a/ash/accessibility/magnifier/docked_magnifier_controller.cc b/ash/accessibility/magnifier/docked_magnifier_controller.cc
index 7ab6fa3..8d4bc33 100644
--- a/ash/accessibility/magnifier/docked_magnifier_controller.cc
+++ b/ash/accessibility/magnifier/docked_magnifier_controller.cc
@@ -318,8 +318,10 @@
 
     // Resolution changes, screen rotation, etc. can reset the host to confine
     // the mouse cursor inside the root window. We want to make sure the cursor
-    // is confined properly outside the viewport.
-    ConfineMouseCursorOutsideViewport();
+    // is confined properly outside the viewport. But don't confine mouse if
+    // resizing.
+    if (!has_started_resize_)
+      ConfineMouseCursorOutsideViewport();
   }
 
   // A change in display configuration, such as resolution, rotation, ... etc.
@@ -388,31 +390,40 @@
   float magnifier_height = root_bounds.height() / screen_height_divisor_;
 
   // If user releases left mouse button, or any other mouse button is pressed,
-  // stop resizing.
+  // ignore and stop resizing.
   if (!event->IsOnlyLeftMouseButton() ||
       event->type() == ui::ET_MOUSE_RELEASED) {
-    has_started_resize_ = false;
+    if (has_started_resize_) {
+      has_started_resize_ = false;
+      ConfineMouseCursorOutsideViewport();
+    }
     return;
   }
-
+  float root_y = event->root_location_f().y();
   float new_screen_height_divisor =
-      root_bounds.height() / (event->y() + resize_offset_);
+      root_bounds.height() / (root_y + resize_offset_);
 
+  const int separator_top = separator_layer_->bounds().y();
+  const int separator_bottom = separator_layer_->bounds().bottom();
   switch (event->type()) {
     case ui::ET_MOUSE_PRESSED:
-      // User clicks separator to start resizing Docked Magnifier.
-      if (!has_started_resize_ && event->y() >= magnifier_height &&
-          event->y() <= magnifier_height + kSeparatorHeight) {
-        resize_offset_ = magnifier_height - event->y();
+      // User clicks within separator to start resizing Docked Magnifier.
+      // Subtracting one is needed to capture when mouse is at the very top.
+      if (!has_started_resize_ && root_y >= separator_top - 1 &&
+          root_y <= separator_bottom) {
+        resize_offset_ = magnifier_height - root_y;
         has_started_resize_ = true;
+        RootWindowController::ForWindow(current_source_root_window_)
+            ->ash_host()
+            ->ConfineCursorToRootWindow();
       }
       break;
     case ui::ET_MOUSE_DRAGGED:
       // User continues holding and drags separator to resize Docked Magnifier.
-      if (has_started_resize_ &&
-          new_screen_height_divisor >= kMinScreenHeightDivisor &&
-          new_screen_height_divisor <= kMaxScreenHeightDivisor) {
-        screen_height_divisor_ = new_screen_height_divisor;
+      if (has_started_resize_) {
+        screen_height_divisor_ =
+            base::clamp(new_screen_height_divisor, kMinScreenHeightDivisor,
+                        kMaxScreenHeightDivisor);
         OnDisplayConfigurationChanged();
       }
       break;
@@ -731,7 +742,11 @@
 
   gfx::Rect confine_bounds =
       current_source_root_window_->GetBoundsInRootWindow();
-  const int docked_height = separator_layer_->bounds().bottom();
+  const auto viewport_bounds = magnifier_utils::GetViewportWidgetBoundsInRoot(
+      current_source_root_window_, screen_height_divisor_);
+  const int docked_height = ::features::IsDockedMagnifierResizingEnabled()
+                                ? viewport_bounds.height()
+                                : separator_layer_->bounds().bottom();
   confine_bounds.Offset(0, docked_height);
   confine_bounds.set_height(confine_bounds.height() - docked_height);
   RootWindowController::ForWindow(current_source_root_window_)
diff --git a/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc b/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc
index 8a53a3d..31c19e25 100644
--- a/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc
+++ b/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc
@@ -848,7 +848,7 @@
             viewport_widget->GetWindowBoundsInScreen());
 }
 
-// Tests to verify dragging about separator does not resize docked magnifier.
+// Tests to verify dragging above separator does not resize docked magnifier.
 TEST_F(DockedMagnifierTest, DragAboveSeparatorDoesNotResizeDockedMagnifier) {
   base::test::ScopedFeatureList features;
   features.InitWithFeatures(
@@ -871,9 +871,9 @@
   EXPECT_EQ(gfx::Rect(0, 0, 800, viewport_height),
             viewport_widget->GetWindowBoundsInScreen());
 
-  // Move cursor 1px above the docked magnifier separator, in the viewport area,
+  // Move cursor 2px above the docked magnifier separator, in the viewport area,
   // where dragging should not work.
-  gfx::Point mouse_location(400, viewport_height - 1);
+  gfx::Point mouse_location(400, viewport_height - 2);
   GetEventGenerator()->MoveMouseTo(mouse_location);
 
   // Drag 100 pixels down.
diff --git a/ash/app_list/model/search/search_result.cc b/ash/app_list/model/search/search_result.cc
index 2128eb7..920fd30 100644
--- a/ash/app_list/model/search/search_result.cc
+++ b/ash/app_list/model/search/search_result.cc
@@ -34,11 +34,6 @@
     observer.OnMetadataChanged();
 }
 
-size_t SearchResult::IconDimension() const {
-  return metadata_->icon.dimension.value_or(
-      SharedAppListConfig::instance().search_list_icon_dimension());
-}
-
 void SearchResult::SetChipIcon(const gfx::ImageSkia& chip_icon) {
   metadata_->chip_icon = chip_icon;
   for (auto& observer : observers_)
diff --git a/ash/app_list/model/search/search_result.h b/ash/app_list/model/search/search_result.h
index 402cdb2..66fefe16 100644
--- a/ash/app_list/model/search/search_result.h
+++ b/ash/app_list/model/search/search_result.h
@@ -54,8 +54,6 @@
   const IconInfo& icon() const { return metadata_->icon; }
   void SetIcon(const IconInfo& icon);
 
-  size_t IconDimension() const;
-
   const gfx::ImageSkia& chip_icon() const { return metadata_->chip_icon; }
   void SetChipIcon(const gfx::ImageSkia& chip_icon);
 
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index c593f7e..8e16111 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -365,25 +365,55 @@
                                   const SearchResult::Tags& tags) {
   // Reset font weight styling for label.
   label->ApplyBaselineTextStyle();
-  // Apply font weight styles.
-  bool is_url = false;
+  auto color_tag = SearchResult::Tag::NONE;
   for (const auto& tag : tags) {
-    bool has_url_tag = (tag.styles & SearchResult::Tag::URL);
+    // Each label only supports one type of color tag. `color_tag` should only
+    // be set once.
+    if (tag.styles & SearchResult::Tag::URL) {
+      DCHECK(color_tag == SearchResult::Tag::NONE ||
+             color_tag == SearchResult::Tag::URL);
+      color_tag = SearchResult::Tag::URL;
+    }
+    if (tag.styles & SearchResult::Tag::GREEN) {
+      DCHECK(color_tag == SearchResult::Tag::NONE ||
+             color_tag == SearchResult::Tag::GREEN);
+      color_tag = SearchResult::Tag::GREEN;
+    }
+    if (tag.styles & SearchResult::Tag::RED) {
+      DCHECK(color_tag == SearchResult::Tag::NONE ||
+             color_tag == SearchResult::Tag::RED);
+      color_tag = SearchResult::Tag::RED;
+    }
+
     bool has_match_tag = (tag.styles & SearchResult::Tag::MATCH);
-    is_url = has_url_tag || is_url;
     if (has_match_tag) {
       label->SetTextStyleRange(AshTextStyle::STYLE_EMPHASIZED, tag.range);
     }
   }
-  // Apply font color styles.
-  label->SetEnabledColor(
-      is_url
-          ? AppListColorProvider::Get()->GetTextColorURL()
-          : is_title_label
-                ? AppListColorProvider::Get()->GetSearchBoxTextColor(
-                      kDeprecatedSearchBoxTextDefaultColor)
-                : AppListColorProvider::Get()->GetSearchBoxSecondaryTextColor(
-                      kDeprecatedSearchBoxTextDefaultColor));
+
+  switch (color_tag) {
+    case SearchResult::Tag::NONE:
+    case SearchResult::Tag::DIM:
+    case SearchResult::Tag::MATCH:
+      label->SetEnabledColor(
+          is_title_label
+              ? AppListColorProvider::Get()->GetSearchBoxTextColor(
+                    kDeprecatedSearchBoxTextDefaultColor)
+              : AppListColorProvider::Get()->GetSearchBoxSecondaryTextColor(
+                    kDeprecatedSearchBoxTextDefaultColor));
+      break;
+    case SearchResult::Tag::URL:
+      label->SetEnabledColor(AppListColorProvider::Get()->GetTextColorURL());
+      break;
+    case SearchResult::Tag::GREEN:
+      label->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kTextColorPositive));
+      break;
+    case SearchResult::Tag::RED:
+      label->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kTextColorAlert));
+      break;
+  }
 }
 
 void SearchResultView::StyleTitleLabel() {
@@ -638,7 +668,7 @@
 
     // Calculate the image dimensions. Images could be rectangular, and we
     // should preserve the aspect ratio.
-    const size_t dimension = result()->IconDimension();
+    const size_t dimension = result()->icon().dimension;
     const int max = std::max(image.width(), image.height());
     const bool is_square = image.width() == image.height();
     const int width = is_square ? dimension : dimension * image.width() / max;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 8cf977b..318216b4 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -405,8 +405,8 @@
       <message name="IDS_ASH_STATUS_TRAY_CAST_CAST_DESKTOP" desc="The label used in the tray popup to tell the user we are casting the desktop.">
         Casting screen to <ph name="RECEIVER_NAME">$1<ex>Living Room</ex></ph>
       </message>
-      <message name="IDS_ASH_STATUS_TRAY_CAST_ACCESS_CAST_ADD" desc="Menu item label that, when clicked on, opens the access code casting dialog. MANAGER can be a domain or an email address.">
-        Cast to a <ph name="MANAGER">$1<ex>yourdomain.com</ex></ph> device
+      <message name="IDS_ASH_STATUS_TRAY_CAST_ACCESS_CODE_CAST_CONNECT" desc="Menu item label that, when clicked on, opens the access code casting dialog.">
+        Connect with a code
       </message>
       <message name="IDS_ASH_STATUS_TRAY_DARK_THEME" desc="The label used as the header in the dark theme popup. [CHAR_LIMIT=19">
         Dark theme
@@ -1813,9 +1813,15 @@
       <message name="IDS_ASH_DESKS_TEMPLATES_DELETE_DIALOG_TITLE" desc="The text of the title of the desks templates delete dialog, which shows up when trying to delete a template.">
         Delete template?
       </message>
-      <message name="IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_DESCRIPTION" desc="The text of the description of the desks templates unsupported apps dialog, which shows up when trying to save a desk that contains an unsupported app (i.e. Crostini app).">
+      <message name="IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_DIALOG_DESCRIPTION" desc="The text of the description of the desks templates unsupported apps dialog, which shows up when trying to save a desk that contains an unsupported app (i.e. Crostini app).">
         Linux apps aren’t currently supported. Other apps will be saved.
       </message>
+      <message name="IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_AND_INCOGNITO_DIALOG_DESCRIPTION" desc="The text of the description of the desks templates unsupported apps dialog, which shows up when trying to save a desk that contains an unsupported app (i.e. Crostini app).">
+        Linux apps and Incognito windows aren’t currently supported. Other apps will be saved.
+      </message>
+      <message name="IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_INCOGNITO_DIALOG_DESCRIPTION" desc="The text of the description of the desks templates unsupported apps dialog, which shows up when trying to save a desk that contains an unsupported app (i.e. Crostini app).">
+        Incognito windows aren’t currently supported. Other apps will be saved.
+      </message>
       <message name="IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_DESCRIPTION" desc="The text of the description of the desks templates replace dialog, which shows up when trying to rename a template to the name of an existing template.">
         Template named <ph name="DESK_TEMPLATE_NAME">$1<ex>Bento</ex></ph> already exists
       </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_DESCRIPTION.png.sha1
deleted file mode 100644
index 56a24838..0000000
--- a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_DESCRIPTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f11199c826c60131aa8e7c5d21be3a14efb64769
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_INCOGNITO_DIALOG_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_INCOGNITO_DIALOG_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..59b0553
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_INCOGNITO_DIALOG_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+63b548391453f61602cce06832a2e4541ac68b00
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_AND_INCOGNITO_DIALOG_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_AND_INCOGNITO_DIALOG_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..8555220
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_AND_INCOGNITO_DIALOG_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+ae21ce1821766836be920779d8165ae425027a91
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_DIALOG_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_DIALOG_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..4ef75a3
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_DIALOG_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+d835a4c1079b37ccc7d87855dc007935797aed75
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CAST_ADD.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CAST_ADD.png.sha1
deleted file mode 100644
index 9f522e5..0000000
--- a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CAST_ADD.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0f8f03c66e4fc82a1a7a449861bff0b2b86eb148
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CODE_CAST_CONNECT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CODE_CAST_CONNECT.png.sha1
new file mode 100644
index 0000000..49b3906b
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_CAST_ACCESS_CODE_CAST_CONNECT.png.sha1
@@ -0,0 +1 @@
+c40f75a737a41e2a0bc8660f0ab542135026c26f
\ No newline at end of file
diff --git a/ash/components/fwupd/firmware_update_manager.cc b/ash/components/fwupd/firmware_update_manager.cc
index 860dc074..0105b9b 100644
--- a/ash/components/fwupd/firmware_update_manager.cc
+++ b/ash/components/fwupd/firmware_update_manager.cc
@@ -245,6 +245,21 @@
   firmware_update::metrics::EmitDeviceCount(num_devices, is_first_response_);
 }
 
+void FirmwareUpdateManager::RecordUpdateMetrics() {
+  firmware_update::metrics::EmitUpdateCount(
+      updates_.size(), GetNumCriticalUpdates(), is_first_response_);
+}
+
+int FirmwareUpdateManager::GetNumCriticalUpdates() {
+  int critical_update_count = 0;
+  for (const auto& update : updates_) {
+    if (update->priority == firmware_update::mojom::UpdatePriority::kCritical) {
+      critical_update_count++;
+    }
+  }
+  return critical_update_count;
+}
+
 void FirmwareUpdateManager::NotifyUpdateListObservers() {
   for (auto& observer : update_list_observers_) {
     observer->OnUpdateListChanged(mojo::Clone(updates_));
@@ -500,6 +515,8 @@
     return;
   }
 
+  RecordUpdateMetrics();
+
   // We only want to show the notification once, at startup.
   if (is_first_response_) {
     ShowNotificationIfRequired();
@@ -528,6 +545,8 @@
 
   devices_already_notified_.erase(inflight_update_->device_id);
   inflight_update_.reset();
+  // Request all updates to refresh the update list after an install.
+  RequestAllUpdates();
 }
 
 void FirmwareUpdateManager::BindInterface(
diff --git a/ash/components/fwupd/firmware_update_manager.h b/ash/components/fwupd/firmware_update_manager.h
index fdd6be6..9e4b21339 100644
--- a/ash/components/fwupd/firmware_update_manager.h
+++ b/ash/components/fwupd/firmware_update_manager.h
@@ -173,6 +173,12 @@
   // is refreshed.
   void RecordDeviceMetrics(int num_devices);
 
+  // Records the # of updates found at startup and whenever the update list
+  // is refreshed.
+  void RecordUpdateMetrics();
+
+  int GetNumCriticalUpdates();
+
   // Map of a device ID to `FwupdDevice` which is waiting for the list
   // of updates.
   base::flat_map<std::string, chromeos::FwupdDevice> devices_pending_update_;
diff --git a/ash/components/fwupd/firmware_update_manager_unittest.cc b/ash/components/fwupd/firmware_update_manager_unittest.cc
index 21c7f16d..23bfe20 100644
--- a/ash/components/fwupd/firmware_update_manager_unittest.cc
+++ b/ash/components/fwupd/firmware_update_manager_unittest.cc
@@ -644,9 +644,13 @@
   dbus_responses_.push_back(CreateOneDeviceResponse());
   dbus_responses_.push_back(CreateOneUpdateResponse());
   dbus_responses_.push_back(dbus::Response::CreateEmpty());
+  // Add dbus response for RequestAllUpdates() call made after an install
+  // is completed.
+  dbus_responses_.push_back(CreateOneDeviceResponse());
+  dbus_responses_.push_back(CreateOneUpdateResponse());
   FakeUpdateObserver update_observer;
   SetupObserver(&update_observer);
-  base::RunLoop().RunUntilIdle();
+  ASSERT_EQ(1, update_observer.num_times_notified());
 
   std::string fake_url = "https://faketesturl/";
   std::unique_ptr<FirmwareUpdateManager> firmware_update_manager_;
@@ -674,6 +678,9 @@
 
   EXPECT_EQ(ash::firmware_update::mojom::UpdateState::kSuccess,
             update_progress_observer.GetLatestUpdate()->state);
+  // Expect RequestAllUpdates() to have been called after an install to refresh
+  // the update list.
+  ASSERT_EQ(2, update_observer.num_times_notified());
 }
 
 TEST_F(FirmwareUpdateManagerTest, OnPropertiesChangedResponse) {
@@ -782,4 +789,27 @@
   histogram_tester.ExpectUniqueSample(
       "ChromeOS.FirmwareUpdateUi.OnRefresh.DeviceCount", 1, 1);
 }
+
+TEST_F(FirmwareUpdateManagerTest, UpdateCountMetric) {
+  base::HistogramTester histogram_tester;
+  EXPECT_CALL(*proxy_, DoCallMethodWithErrorResponse(_, _, _))
+      .WillRepeatedly(Invoke(this, &FirmwareUpdateManagerTest::OnMethodCalled));
+  dbus_responses_.push_back(CreateOneDeviceResponse());
+  dbus_responses_.push_back(CreateOneUpdateResponse());
+  dbus_responses_.push_back(CreateOneDeviceResponse());
+  dbus_responses_.push_back(CreateOneUpdateResponse());
+  FakeUpdateObserver update_observer;
+  SetupObserver(&update_observer);
+  histogram_tester.ExpectBucketCount(
+      "ChromeOS.FirmwareUpdateUi.OnStartup.CriticalUpdateCount", 0, 1);
+  histogram_tester.ExpectBucketCount(
+      "ChromeOS.FirmwareUpdateUi.OnStartup.UpdateCount", 1, 1);
+
+  RequestDevices();
+  histogram_tester.ExpectBucketCount(
+      "ChromeOS.FirmwareUpdateUi.OnRefresh.CriticalUpdateCount", 0, 1);
+  histogram_tester.ExpectBucketCount(
+      "ChromeOS.FirmwareUpdateUi.OnRefresh.UpdateCount", 1, 1);
+}
+
 }  // namespace ash
diff --git a/ash/components/fwupd/histogram_util.cc b/ash/components/fwupd/histogram_util.cc
index c3c86ff..4d7c4ab 100644
--- a/ash/components/fwupd/histogram_util.cc
+++ b/ash/components/fwupd/histogram_util.cc
@@ -21,6 +21,16 @@
       GetSourceStr(is_startup) + std::string(".DeviceCount"), num_devices);
 }
 
+void EmitUpdateCount(int num_updates,
+                     int num_critical_updates,
+                     bool is_startup) {
+  const auto source_str = GetSourceStr(is_startup);
+  base::UmaHistogramCounts100(source_str + std::string(".CriticalUpdateCount"),
+                              num_critical_updates);
+  base::UmaHistogramCounts100(source_str + std::string(".UpdateCount"),
+                              num_updates);
+}
+
 std::string GetSourceStr(bool is_startup) {
   return std::string(kHistogramName) +
          std::string(is_startup ? "OnStartup" : "OnRefresh");
diff --git a/ash/components/fwupd/histogram_util.h b/ash/components/fwupd/histogram_util.h
index 455d9c714..f34e73a0 100644
--- a/ash/components/fwupd/histogram_util.h
+++ b/ash/components/fwupd/histogram_util.h
@@ -14,6 +14,10 @@
 
 void EmitDeviceCount(int num_devices, bool is_startup);
 
+void EmitUpdateCount(int num_updates,
+                     int num_critical_updates,
+                     bool is_startup);
+
 std::string GetSourceStr(bool is_startup);
 
 }  // namespace metrics
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 96a4619..cac1a0c 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -800,6 +800,14 @@
     "KeyboardBasedDisplayArrangementInSettings",
     base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables to use lacros-chrome as the only web browser on Chrome OS.
+// This works only when both LacrosSupport and LacrosPrimary below are enabled.
+// NOTE: Use crosapi::browser_util::IsAshWebBrowserEnabled() instead of checking
+// the feature directly. Similar to LacrosSupport and LacrosPrimary,
+// this may not be allowed depending on user types and/or policies.
+const base::Feature kLacrosOnly{"LacrosOnly",
+                                base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables to use lacros-chrome as a primary web browser on Chrome OS.
 // This works only when LacrosSupport below is enabled.
 // NOTE: Use crosapi::browser_util::IsLacrosPrimary() instead of checking
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index dc6d1b46..61bc290 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -306,6 +306,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kInstantTethering;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kKeyboardBasedDisplayArrangementInSettings;
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosOnly;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosPrimary;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosSupport;
 COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc
index 59ecaf1..8ffea3af 100644
--- a/ash/display/mirror_window_controller.cc
+++ b/ash/display/mirror_window_controller.cc
@@ -177,15 +177,14 @@
   for (const display::ManagedDisplayInfo& display_info : display_info_list) {
     std::unique_ptr<RootWindowTransformer> transformer;
     if (display_manager->IsInSoftwareMirrorMode()) {
-      transformer.reset(CreateRootWindowTransformerForMirroredDisplay(
-          display_manager->GetDisplayInfo(reflecting_source_id_),
-          display_info));
+      transformer = CreateRootWindowTransformerForMirroredDisplay(
+          display_manager->GetDisplayInfo(reflecting_source_id_), display_info);
     } else {
       DCHECK(display_manager->IsInUnifiedMode());
       display::Display display =
           display_manager->GetMirroringDisplayById(display_info.id());
-      transformer.reset(CreateRootWindowTransformerForUnifiedDesktop(
-          display::Screen::GetScreen()->GetPrimaryDisplay().bounds(), display));
+      transformer = CreateRootWindowTransformerForUnifiedDesktop(
+          display::Screen::GetScreen()->GetPrimaryDisplay().bounds(), display);
     }
 
     if (mirroring_host_info_map_.find(display_info.id()) ==
diff --git a/ash/display/root_window_transformers.cc b/ash/display/root_window_transformers.cc
index b9b618f..444532c 100644
--- a/ash/display/root_window_transformers.cc
+++ b/ash/display/root_window_transformers.cc
@@ -12,6 +12,7 @@
 #include "ash/shell.h"
 #include "ash/utility/transformer_util.h"
 #include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "base/system/sys_info.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
@@ -358,6 +359,8 @@
   }
 
  private:
+  ~PartialBoundsRootWindowTransformer() override = default;
+
   gfx::Transform transform_;
   gfx::Transform invert_transform_;
   gfx::Rect root_bounds_;
@@ -365,22 +368,26 @@
 
 }  // namespace
 
-RootWindowTransformer* CreateRootWindowTransformerForDisplay(
+std::unique_ptr<RootWindowTransformer> CreateRootWindowTransformerForDisplay(
     const display::Display& display) {
-  return new AshRootWindowTransformer(display);
+  return base::WrapUnique<RootWindowTransformer>(
+      new AshRootWindowTransformer(display));
 }
 
-RootWindowTransformer* CreateRootWindowTransformerForMirroredDisplay(
+std::unique_ptr<RootWindowTransformer>
+CreateRootWindowTransformerForMirroredDisplay(
     const display::ManagedDisplayInfo& source_display_info,
     const display::ManagedDisplayInfo& mirror_display_info) {
-  return new MirrorRootWindowTransformer(source_display_info,
-                                         mirror_display_info);
+  return base::WrapUnique<RootWindowTransformer>(
+      new MirrorRootWindowTransformer(source_display_info,
+                                      mirror_display_info));
 }
 
-RootWindowTransformer* CreateRootWindowTransformerForUnifiedDesktop(
-    const gfx::Rect& screen_bounds,
-    const display::Display& display) {
-  return new PartialBoundsRootWindowTransformer(screen_bounds, display);
+std::unique_ptr<RootWindowTransformer>
+CreateRootWindowTransformerForUnifiedDesktop(const gfx::Rect& screen_bounds,
+                                             const display::Display& display) {
+  return base::WrapUnique<RootWindowTransformer>(
+      new PartialBoundsRootWindowTransformer(screen_bounds, display));
 }
 
 }  // namespace ash
diff --git a/ash/display/root_window_transformers.h b/ash/display/root_window_transformers.h
index c3a20cf..eab3aa27 100644
--- a/ash/display/root_window_transformers.h
+++ b/ash/display/root_window_transformers.h
@@ -5,6 +5,8 @@
 #ifndef ASH_DISPLAY_ROOT_WINDOW_TRANSFORMERS_H_
 #define ASH_DISPLAY_ROOT_WINDOW_TRANSFORMERS_H_
 
+#include <memory>
+
 #include "ash/ash_export.h"
 
 namespace display {
@@ -19,23 +21,24 @@
 namespace ash {
 class RootWindowTransformer;
 
-ASH_EXPORT RootWindowTransformer* CreateRootWindowTransformerForDisplay(
-    const display::Display& display);
+ASH_EXPORT std::unique_ptr<RootWindowTransformer>
+CreateRootWindowTransformerForDisplay(const display::Display& display);
 
 // Creates a RootWindowTransformers for mirror root window.
 // |source_display_info| specifies the display being mirrored,
 // and |mirror_display_info| specifies the display used to
 // mirror the content.
-ASH_EXPORT RootWindowTransformer* CreateRootWindowTransformerForMirroredDisplay(
+ASH_EXPORT std::unique_ptr<RootWindowTransformer>
+CreateRootWindowTransformerForMirroredDisplay(
     const display::ManagedDisplayInfo& source_display_info,
     const display::ManagedDisplayInfo& mirror_display_info);
 
 // Creates a RootWindowTransformers for unified desktop mode.
 // |screen_bounds| specifies the unified desktop's bounds and
 // |display| specifies the display used to mirror the unified desktop.
-ASH_EXPORT RootWindowTransformer* CreateRootWindowTransformerForUnifiedDesktop(
-    const gfx::Rect& screen_bounds,
-    const display::Display& display);
+ASH_EXPORT std::unique_ptr<RootWindowTransformer>
+CreateRootWindowTransformerForUnifiedDesktop(const gfx::Rect& screen_bounds,
+                                             const display::Display& display);
 
 }  // namespace ash
 
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc
index 86da64a..5da34673 100644
--- a/ash/display/root_window_transformers_unittest.cc
+++ b/ash/display/root_window_transformers_unittest.cc
@@ -143,9 +143,8 @@
     const display::ManagedDisplayInfo& source_display_info =
         display_manager()->GetDisplayInfo(
             display::Screen::GetScreen()->GetPrimaryDisplay().id());
-    return std::unique_ptr<RootWindowTransformer>(
-        CreateRootWindowTransformerForMirroredDisplay(source_display_info,
-                                                      mirror_display_info));
+    return CreateRootWindowTransformerForMirroredDisplay(source_display_info,
+                                                         mirror_display_info);
   }
 };
 
diff --git a/ash/login/ui/OWNERS b/ash/login/ui/OWNERS
index bbde27f3..e213f244 100644
--- a/ash/login/ui/OWNERS
+++ b/ash/login/ui/OWNERS
@@ -1,13 +1,13 @@
 # (in CET)
 tellier@google.com
 
-per-file lock_screen.*=set noparent
-per-file lock_screen.*=file://ash/login/LOGIN_LOCK_OWNERS
-per-file lock_screen.*=tellier@google.com
+per-file lock_screen*=set noparent
+per-file lock_screen*=file://ash/login/LOGIN_LOCK_OWNERS
+per-file lock_screen*=tellier@google.com
 
-per-file lock_contents_view.*=set noparent
-per-file lock_contents_view.*=file://ash/login/LOGIN_LOCK_OWNERS
-per-file lock_contents_view.*=tellier@google.com
+per-file lock_contents_view*=set noparent
+per-file lock_contents_view*=file://ash/login/LOGIN_LOCK_OWNERS
+per-file lock_contents_view*=tellier@google.com
 
-per-file .*auth_factor.*=cclem@google.com
-per-file .*auth_factor.*=hansberry@chromium.org
\ No newline at end of file
+per-file *auth_factor*=cclem@google.com
+per-file *auth_factor*=hansberry@chromium.org
\ No newline at end of file
diff --git a/ash/login/ui/animated_auth_factors_label_wrapper.cc b/ash/login/ui/animated_auth_factors_label_wrapper.cc
index e27f8a8..527ed5e 100644
--- a/ash/login/ui/animated_auth_factors_label_wrapper.cc
+++ b/ash/login/ui/animated_auth_factors_label_wrapper.cc
@@ -124,15 +124,9 @@
   current_label_->SetText(l10n_util::GetStringUTF16(label_id));
   current_label_->SetAccessibleName(
       l10n_util::GetStringUTF16(accessible_name_id));
-
-  // Add margin to the bottom of the label to ensure that the total height of
-  // the label and margin is always |kLabelMaxLines| lines.
-  DCHECK(current_label_->GetRequiredLines() <= kLabelMaxLines);
-  int bottom_margin = (kLabelMaxLines - current_label_->GetRequiredLines()) *
-                      current_label_->GetLineHeight();
   SetProperty(views::kMarginsKey,
               gfx::Insets(/*top=*/kSpacingBetweenIconsAndLabelDp, /*left=*/0,
-                          /*bottom=*/std::max(bottom_margin, 0),
+                          /*bottom=*/0,
                           /*right=*/0));
 
   // If |previous_text_| is empty, then this is the first time the text is
diff --git a/ash/login/ui/animated_auth_factors_label_wrapper.h b/ash/login/ui/animated_auth_factors_label_wrapper.h
index 34db568..7f6bde69 100644
--- a/ash/login/ui/animated_auth_factors_label_wrapper.h
+++ b/ash/login/ui/animated_auth_factors_label_wrapper.h
@@ -17,6 +17,7 @@
 
 namespace ash {
 
+// TODO(b/216696664): Add unit tests for this class.
 class ASH_EXPORT AnimatedAuthFactorsLabelWrapper : public views::View {
  public:
   AnimatedAuthFactorsLabelWrapper();
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index 3dc5c11..07226d7 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -85,6 +85,7 @@
     {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},
     {true, ui::VKEY_OEM_COMMA, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
      SWITCH_TO_PREVIOUS_USER},
     {true, ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
@@ -114,6 +115,7 @@
      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},
     {true, ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
      SCALE_UI_UP},
     {true, ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
@@ -206,6 +208,7 @@
     // 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},
 
     // Debugging shortcuts that need to be available to end-users in
     // release builds.
diff --git a/ash/public/cpp/app_list/app_list_types.cc b/ash/public/cpp/app_list/app_list_types.cc
index fe6897f9..02ea059 100644
--- a/ash/public/cpp/app_list/app_list_types.cc
+++ b/ash/public/cpp/app_list/app_list_types.cc
@@ -36,6 +36,7 @@
     case AppListSearchResultType::kHelpApp:
     case AppListSearchResultType::kFileSearch:
     case AppListSearchResultType::kDriveSearch:
+    case AppListSearchResultType::kKeyboardShortcut:
       return false;
   }
 }
@@ -167,8 +168,6 @@
 
 SearchResultIconInfo::SearchResultIconInfo() = default;
 
-SearchResultIconInfo::SearchResultIconInfo(gfx::ImageSkia icon) : icon(icon) {}
-
 SearchResultIconInfo::SearchResultIconInfo(gfx::ImageSkia icon, int dimension)
     : icon(icon), dimension(dimension) {}
 
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h
index 9db41b5f..926b09c 100644
--- a/ash/public/cpp/app_list/app_list_types.h
+++ b/ash/public/cpp/app_list/app_list_types.h
@@ -294,8 +294,9 @@
   kHelpApp,                // Help App (aka Explore) results.
   kFileSearch,             // Local file search results.
   kDriveSearch,            // Drive file search results.
+  kKeyboardShortcut,       // Keyboard shortcut search results.
   // Add new values here.
-  kMaxValue = kDriveSearch,
+  kMaxValue = kKeyboardShortcut,
 };
 
 ASH_PUBLIC_EXPORT bool IsAppListSearchResultAnApp(
@@ -374,10 +375,8 @@
 
 struct ASH_PUBLIC_EXPORT SearchResultIconInfo {
   SearchResultIconInfo();
-  // TODO(crbug.com/1232897): Make the search backend explicitly set dimension
-  // and shape for all icons by removing the one- and two-argument versions of
-  // the constructor.
-  explicit SearchResultIconInfo(gfx::ImageSkia icon);
+  // TODO(crbug.com/1232897): Make the search backend explicitly set the shape
+  // for all icons by removing the two-argument version of the constructor.
   SearchResultIconInfo(gfx::ImageSkia icon, int dimension);
   SearchResultIconInfo(gfx::ImageSkia icon,
                        int dimension,
@@ -392,7 +391,7 @@
 
   // The size to display the icon at, while preserving aspect ratio. Only
   // used for the results list view.
-  absl::optional<int> dimension;
+  int dimension;
 
   // The shape to mask the icon with. Only used by the results list view.
   SearchResultIconShape shape = SearchResultIconShape::kDefault;
diff --git a/ash/public/mojom/accelerator_keys.mojom b/ash/public/mojom/accelerator_keys.mojom
index 609ff6e..6c39526 100644
--- a/ash/public/mojom/accelerator_keys.mojom
+++ b/ash/public/mojom/accelerator_keys.mojom
@@ -212,6 +212,10 @@
   // represent them.
   kMediaPlay = 0xE9,
   kMediaPause = 0xEA,
+  kNew = 0xEB,
+  kClose = 0xEC,
+  kEmojiPicker = 0xED,
+  kDictate = 0xEE,
 };
 
 // Contains all sources of shortcuts, new sources must added to this enum.
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 285beb8..03578b8 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -323,6 +323,7 @@
     "system_menu_phone.icon",
     "system_menu_phone_legacy.icon",
     "system_menu_power.icon",
+    "system_menu_qr_code.icon",
     "system_menu_rollback.icon",
     "system_menu_rotation_lock_auto.icon",
     "system_menu_rotation_lock_landscape.icon",
diff --git a/ash/resources/vector_icons/system_menu_qr_code.icon b/ash/resources/vector_icons/system_menu_qr_code.icon
new file mode 100644
index 0000000..c6e990d
--- /dev/null
+++ b/ash/resources/vector_icons/system_menu_qr_code.icon
@@ -0,0 +1,75 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+MOVE_TO, 2.5f, 9.13f,
+V_LINE_TO, 2.5f,
+R_H_LINE_TO, 6.63f,
+R_V_LINE_TO, 6.63f,
+CLOSE,
+R_MOVE_TO, 1.75f, -1.75f,
+R_H_LINE_TO, 3.13f,
+V_LINE_TO, 4.25f,
+H_LINE_TO, 4.25f,
+CLOSE,
+MOVE_TO, 2.5f, 17.5f,
+R_V_LINE_TO, -6.62f,
+R_H_LINE_TO, 6.63f,
+V_LINE_TO, 17.5f,
+CLOSE,
+R_MOVE_TO, 1.75f, -1.75f,
+R_H_LINE_TO, 3.17f,
+R_V_LINE_TO, -3.12f,
+H_LINE_TO, 4.25f,
+CLOSE,
+R_MOVE_TO, 6.63f, -6.62f,
+V_LINE_TO, 2.5f,
+H_LINE_TO, 17.5f,
+R_V_LINE_TO, 6.63f,
+CLOSE,
+R_MOVE_TO, 1.75f, -1.75f,
+R_H_LINE_TO, 3.13f,
+V_LINE_TO, 4.25f,
+R_H_LINE_TO, -3.12f,
+CLOSE,
+MOVE_TO, 15.85f, 17.5f,
+R_V_LINE_TO, -1.67f,
+H_LINE_TO, 17.5f,
+V_LINE_TO, 17.5f,
+CLOSE,
+R_MOVE_TO, -4.98f, -4.98f,
+R_V_LINE_TO, -1.65f,
+R_H_LINE_TO, 1.67f,
+R_V_LINE_TO, 1.65f,
+CLOSE,
+R_MOVE_TO, 1.67f, 1.65f,
+R_V_LINE_TO, -1.65f,
+R_H_LINE_TO, 1.67f,
+R_V_LINE_TO, 1.65f,
+CLOSE,
+R_MOVE_TO, -1.67f, 1.67f,
+R_V_LINE_TO, -1.67f,
+R_H_LINE_TO, 1.67f,
+R_V_LINE_TO, 1.67f,
+CLOSE,
+R_MOVE_TO, 1.67f, 1.67f,
+R_V_LINE_TO, -1.67f,
+R_H_LINE_TO, 1.67f,
+V_LINE_TO, 17.5f,
+CLOSE,
+R_MOVE_TO, 1.67f, -1.67f,
+R_V_LINE_TO, -1.67f,
+R_H_LINE_TO, 1.65f,
+R_V_LINE_TO, 1.67f,
+CLOSE,
+R_MOVE_TO, 0, -3.31f,
+R_V_LINE_TO, -1.65f,
+R_H_LINE_TO, 1.65f,
+R_V_LINE_TO, 1.65f,
+CLOSE,
+R_MOVE_TO, 1.65f, 1.65f,
+R_V_LINE_TO, -1.65f,
+H_LINE_TO, 17.5f,
+R_V_LINE_TO, 1.65f,
+CLOSE
\ No newline at end of file
diff --git a/ash/services/ime/decoder/decoder_engine.cc b/ash/services/ime/decoder/decoder_engine.cc
index 50d3a922..96262a6 100644
--- a/ash/services/ime/decoder/decoder_engine.cc
+++ b/ash/services/ime/decoder/decoder_engine.cc
@@ -58,8 +58,7 @@
 DecoderEngine::DecoderEngine(ImeCrosPlatform* platform) : platform_(platform) {
   auto* decoder = ImeDecoder::GetInstance();
 
-  if (decoder->GetStatus() != ImeDecoder::Status::kSuccess ||
-      !decoder->GetEntryPoints().is_ready) {
+  if (!decoder->IsReady()) {
     LOG(WARNING) << "DecoderEngine INIT INCOMPLETE.";
     return;
   }
diff --git a/ash/services/ime/decoder/system_engine.cc b/ash/services/ime/decoder/system_engine.cc
index 18a84fc7..5d26c3a 100644
--- a/ash/services/ime/decoder/system_engine.cc
+++ b/ash/services/ime/decoder/system_engine.cc
@@ -16,8 +16,7 @@
 SystemEngine::SystemEngine(ImeCrosPlatform* platform) : platform_(platform) {
   auto* decoder = ImeDecoder::GetInstance();
 
-  if (decoder->GetStatus() != ImeDecoder::Status::kSuccess ||
-      !decoder->GetEntryPoints().is_ready) {
+  if (!decoder->IsReady()) {
     LOG(WARNING) << "SystemEngine INIT INCOMPLETE.";
     return;
   }
@@ -40,6 +39,12 @@
       host_pipe_version);
 }
 
+bool SystemEngine::BindConnectionFactory(
+    mojo::PendingReceiver<mojom::ConnectionFactory> receiver) {
+  // TODO(b/209697256): Pass and bind receiver in shared library.
+  return false;
+}
+
 bool SystemEngine::IsConnected() {
   return decoder_entry_points_->is_input_method_connected();
 }
diff --git a/ash/services/ime/decoder/system_engine.h b/ash/services/ime/decoder/system_engine.h
index 579e1dba..f925de5 100644
--- a/ash/services/ime/decoder/system_engine.h
+++ b/ash/services/ime/decoder/system_engine.h
@@ -8,6 +8,7 @@
 #include "ash/services/ime/ime_decoder.h"
 #include "ash/services/ime/input_engine.h"
 #include "ash/services/ime/public/cpp/shared_lib/interfaces.h"
+#include "ash/services/ime/public/mojom/connection_factory.mojom.h"
 #include "ash/services/ime/public/mojom/input_engine.mojom.h"
 #include "ash/services/ime/public/mojom/input_method.mojom.h"
 #include "ash/services/ime/public/mojom/input_method_host.mojom.h"
@@ -36,6 +37,10 @@
                    mojo::PendingReceiver<mojom::InputMethod> receiver,
                    mojo::PendingRemote<mojom::InputMethodHost> host);
 
+  // Binds the mojom::ConnectionFactory interface in the shared library.
+  bool BindConnectionFactory(
+      mojo::PendingReceiver<mojom::ConnectionFactory> receiver);
+
   // InputEngine:
   bool IsConnected() override;
 
diff --git a/ash/services/ime/decoder/system_engine_unittest.cc b/ash/services/ime/decoder/system_engine_unittest.cc
index 0ab114b1..03f5090c 100644
--- a/ash/services/ime/decoder/system_engine_unittest.cc
+++ b/ash/services/ime/decoder/system_engine_unittest.cc
@@ -29,10 +29,16 @@
 
 struct MockInputMethod : public mojom::InputMethod {
   MOCK_METHOD(void,
-              OnFocus,
+              OnFocusDeprecated,
               (chromeos::ime::mojom::InputFieldInfoPtr input_field_info,
                chromeos::ime::mojom::InputMethodSettingsPtr settings),
               (override));
+  MOCK_METHOD(void,
+              OnFocus,
+              (chromeos::ime::mojom::InputFieldInfoPtr input_field_info,
+               chromeos::ime::mojom::InputMethodSettingsPtr settings,
+               OnFocusCallback),
+              (override));
   MOCK_METHOD(void, OnBlur, (), (override));
   MOCK_METHOD(void,
               OnSurroundingTextChanged,
diff --git a/ash/services/ime/ime_decoder.cc b/ash/services/ime/ime_decoder.cc
index aff2ce8..b71a09e 100644
--- a/ash/services/ime/ime_decoder.cc
+++ b/ash/services/ime/ime_decoder.cc
@@ -53,11 +53,10 @@
 
 }  // namespace
 
-ImeDecoder::ImeDecoder() : status_(Status::kUninitialized) {
+ImeDecoder::ImeDecoder() : is_ready_(false) {
   if (g_fake_decoder_entry_points_for_testing) {
     entry_points_ = *g_fake_decoder_entry_points_for_testing;
-    status_ = Status::kSuccess;
-    entry_points_.is_ready = true;
+    is_ready_ = true;
     return;
   }
 
@@ -68,7 +67,6 @@
   if (!library.is_valid()) {
     LOG(ERROR) << "Failed to load decoder shared library from: " << path
                << ", error: " << library.GetError()->ToString();
-    status_ = Status::kLoadLibraryFailed;
     return;
   }
 
@@ -94,10 +92,8 @@
   if (!entry_points_.init_once || !entry_points_.supports ||
       !entry_points_.activate_ime || !entry_points_.process ||
       !entry_points_.close) {
-    status_ = Status::kFunctionMissing;
     return;
   }
-  entry_points_.is_ready = true;
 
   // Optional function pointer.
   SetImeEngineLoggerFn logger_setter = reinterpret_cast<SetImeEngineLoggerFn>(
@@ -109,7 +105,7 @@
   }
 
   library_ = std::move(library);
-  status_ = Status::kSuccess;
+  is_ready_ = true;
 }
 
 ImeDecoder::~ImeDecoder() = default;
@@ -119,12 +115,12 @@
   return instance.get();
 }
 
-ImeDecoder::Status ImeDecoder::GetStatus() const {
-  return status_;
+bool ImeDecoder::IsReady() const {
+  return is_ready_;
 }
 
 ImeDecoder::EntryPoints ImeDecoder::GetEntryPoints() {
-  DCHECK(status_ == Status::kSuccess);
+  DCHECK(is_ready_);
   return entry_points_;
 }
 
diff --git a/ash/services/ime/ime_decoder.h b/ash/services/ime/ime_decoder.h
index 7e9a0f5..882ebb53 100644
--- a/ash/services/ime/ime_decoder.h
+++ b/ash/services/ime/ime_decoder.h
@@ -54,15 +54,6 @@
 // sandbox is engaged.
 class ImeDecoder {
  public:
-  // Status of loading func from IME decoder DSO: either success or error type.
-  enum class Status {
-    kSuccess = 0,
-    kUninitialized = 1,
-    kNotInstalled = 2,
-    kLoadLibraryFailed = 3,
-    kFunctionMissing = 4,
-  };
-
   // Function pointers to "C" API entry points of the loaded IME shared library.
   // See ash/services/ime/public/cpp/shared_lib/interfaces.h for API specs.
   struct EntryPoints {
@@ -73,9 +64,6 @@
     ImeDecoderProcessFn process;
     ConnectToInputMethodFn connect_to_input_method;
     IsInputMethodConnectedFn is_input_method_connected;
-
-    // Whether the EntryPoints is ready to use.
-    bool is_ready = false;
   };
 
   // Gets the singleton ImeDecoder.
@@ -84,9 +72,7 @@
   ImeDecoder(const ImeDecoder&) = delete;
   ImeDecoder& operator=(const ImeDecoder&) = delete;
 
-  // Get status of the IME decoder library initialization.
-  // Return `Status::kSuccess` if the lib is successfully initialized.
-  Status GetStatus() const;
+  bool IsReady() const;
 
   // Returns entry points of the loaded decoder shared library.
   EntryPoints GetEntryPoints();
@@ -98,7 +84,7 @@
   explicit ImeDecoder();
   ~ImeDecoder();
 
-  Status status_;
+  bool is_ready_;
 
   // Result of IME decoder DSO initialization.
   absl::optional<base::ScopedNativeLibrary> library_;
diff --git a/ash/services/ime/ime_service.cc b/ash/services/ime/ime_service.cc
index b54fc9f..8605eba2 100644
--- a/ash/services/ime/ime_service.cc
+++ b/ash/services/ime/ime_service.cc
@@ -120,6 +120,19 @@
   std::move(callback).Run(bound);
 }
 
+void ImeService::InitializeConnectionFactory(
+    mojo::PendingReceiver<mojom::ConnectionFactory> connection_factory,
+    InitializeConnectionFactoryCallback callback) {
+  decoder_engine_.reset();
+
+  auto system_engine = std::make_unique<SystemEngine>(this);
+  bool bound =
+      system_engine->BindConnectionFactory(std::move(connection_factory));
+
+  input_engine_ = std::move(system_engine);
+  std::move(callback).Run(bound);
+}
+
 const char* ImeService::GetImeBundleDir() {
   return kBundledInputMethodsDirPath;
 }
diff --git a/ash/services/ime/ime_service.h b/ash/services/ime/ime_service.h
index 74c5bd6..b424d8c 100644
--- a/ash/services/ime/ime_service.h
+++ b/ash/services/ime/ime_service.h
@@ -53,6 +53,9 @@
       mojo::PendingReceiver<mojom::InputMethod> input_method,
       mojo::PendingRemote<mojom::InputMethodHost> input_method_host,
       ConnectToInputMethodCallback callback) override;
+  void InitializeConnectionFactory(
+      mojo::PendingReceiver<mojom::ConnectionFactory> connection_factory,
+      InitializeConnectionFactoryCallback callback) override;
 
   // ImeCrosPlatform overrides:
   const char* GetImeBundleDir() override;
diff --git a/ash/services/ime/ime_service_unittest.cc b/ash/services/ime/ime_service_unittest.cc
index dc1c36bc..803e3ad 100644
--- a/ash/services/ime/ime_service_unittest.cc
+++ b/ash/services/ime/ime_service_unittest.cc
@@ -74,9 +74,12 @@
 
  private:
   // mojom::InputMethod:
+  void OnFocusDeprecated(
+      chromeos::ime::mojom::InputFieldInfoPtr input_field_info,
+      chromeos::ime::mojom::InputMethodSettingsPtr settings) override {}
   void OnFocus(chromeos::ime::mojom::InputFieldInfoPtr input_field_info,
-               chromeos::ime::mojom::InputMethodSettingsPtr settings) override {
-  }
+               chromeos::ime::mojom::InputMethodSettingsPtr settings,
+               OnFocusCallback callback) override {}
   void OnBlur() override {}
   void OnSurroundingTextChanged(
       const std::string& text,
diff --git a/ash/services/ime/public/cpp/shared_lib/interfaces.h b/ash/services/ime/public/cpp/shared_lib/interfaces.h
index ff765fe..5e1a718 100644
--- a/ash/services/ime/public/cpp/shared_lib/interfaces.h
+++ b/ash/services/ime/public/cpp/shared_lib/interfaces.h
@@ -226,9 +226,11 @@
     size_t size);
 
 // ****************************************************************************
-// ***************************** MOJO MODE ************************************
+// ************************* DEPRECATED MOJO MODE *****************************
 // ****************************************************************************
-
+// DEPRECATED: This method of bootstrapping a Mojo connection has been
+// deprecated in favor of the InitializeConnectionFactory method below.
+//
 // Bootstraps a direct Mojo connection with an input method in this IME shared
 // lib. Returns false if the connection attempt was unsuccessful.
 __attribute__((visibility("default"))) bool ConnectToInputMethod(
@@ -237,6 +239,15 @@
     uint32_t remote_input_method_host_handle,
     uint32_t remote_input_method_host_version);
 
+// ****************************************************************************
+// ***************************** MOJO MODE ************************************
+// ****************************************************************************
+
+// Bootstraps an implementation of a ConnectionFactory in the IME shared lib.
+// Returns false if the connection attempt was unsuccessful.
+__attribute__((visibility("default"))) bool InitializeConnectionFactory(
+    uint32_t receiver_connection_factory_handle);
+
 // Returns whether there's a direct Mojo connection to an input method.
 __attribute__((visibility("default"))) bool IsInputMethodConnected();
 
diff --git a/ash/services/ime/public/mojom/BUILD.gn b/ash/services/ime/public/mojom/BUILD.gn
index 90ae8244..8d42f13 100644
--- a/ash/services/ime/public/mojom/BUILD.gn
+++ b/ash/services/ime/public/mojom/BUILD.gn
@@ -9,6 +9,7 @@
 
 mojom("mojom") {
   sources = [
+    "connection_factory.mojom",
     "ime_service.mojom",
     "input_engine.mojom",
     "input_method.mojom",
diff --git a/ash/services/ime/public/mojom/connection_factory.mojom b/ash/services/ime/public/mojom/connection_factory.mojom
new file mode 100644
index 0000000..dd32ffd
--- /dev/null
+++ b/ash/services/ime/public/mojom/connection_factory.mojom
@@ -0,0 +1,19 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chromeos.ime.mojom;
+
+import "ash/services/ime/public/mojom/input_method.mojom";
+import "ash/services/ime/public/mojom/input_method_host.mojom";
+
+// Responsible for instantiating the connection between the shared library
+// and Chromium over an associated Mojo pipe.
+interface ConnectionFactory {
+  // Connects to the given input method specified via ime_spec.
+  ConnectToInputMethod(
+    string ime_spec,
+    pending_associated_receiver<InputMethod> input_method,
+    pending_associated_remote<InputMethodHost> input_method_host)
+    => (bool success);
+};
diff --git a/ash/services/ime/public/mojom/ime_service.mojom b/ash/services/ime/public/mojom/ime_service.mojom
index 4903590e..ad130e9 100644
--- a/ash/services/ime/public/mojom/ime_service.mojom
+++ b/ash/services/ime/public/mojom/ime_service.mojom
@@ -4,6 +4,7 @@
 
 module chromeos.ime.mojom;
 
+import "ash/services/ime/public/mojom/connection_factory.mojom";
 import "ash/services/ime/public/mojom/input_engine.mojom";
 import "ash/services/ime/public/mojom/input_method.mojom";
 import "ash/services/ime/public/mojom/input_method_host.mojom";
@@ -49,6 +50,13 @@
                        pending_receiver<InputMethod> input_method,
                        pending_remote<InputMethodHost> input_method_host)
                        => (bool success);
+
+  // Initializes the mojo pipe used for messaging between the shared library
+  // and Chromium. Any messaging interfaces used will need to be associated
+  // to this pipe (see AssociatedInterfaces documentation for more details).
+  InitializeConnectionFactory(
+    pending_receiver<ConnectionFactory> connection_factory)
+    => (bool success);
 };
 
 // Implemented in the browser process, used to perform network requests or
diff --git a/ash/services/ime/public/mojom/input_method.mojom b/ash/services/ime/public/mojom/input_method.mojom
index 27c08ae0..90eb966 100644
--- a/ash/services/ime/public/mojom/input_method.mojom
+++ b/ash/services/ime/public/mojom/input_method.mojom
@@ -6,7 +6,7 @@
 // the Chromium repo. This file should be updated first, before syncing in the
 // other repos.
 
-// Next MinVersion: 9
+// Next MinVersion: 10
 
 module chromeos.ime.mojom;
 
@@ -379,12 +379,17 @@
 // a Chrome utility process, and this interface uses the InputMethodHost
 // interface to communicate back to the browser process.
 //
-// Next ordinal: 6
+// Next ordinal: 7
 [Stable]
 interface InputMethod {
+  // DEPRECATED: Called when there's a new focused input field.
+  OnFocusDeprecated@0(InputFieldInfo input_field_info,
+                      [MinVersion=4] InputMethodSettings? settings);
+
   // Called when there's a new focused input field.
-  OnFocus@0(InputFieldInfo input_field_info,
-            [MinVersion=4] InputMethodSettings? settings);
+  [MinVersion=9]
+  OnFocus@6(InputFieldInfo input_field_info,
+            InputMethodSettings settings) => (bool success);
 
   // Called when the input field loses focus.
   OnBlur@1();
diff --git a/ash/services/ime/rule_based_engine.cc b/ash/services/ime/rule_based_engine.cc
index 0d5c35b..d1c7f2d 100644
--- a/ash/services/ime/rule_based_engine.cc
+++ b/ash/services/ime/rule_based_engine.cc
@@ -103,6 +103,12 @@
 
 RuleBasedEngine::~RuleBasedEngine() = default;
 
+void RuleBasedEngine::OnFocus(mojom::InputFieldInfoPtr input_field_info,
+                              mojom::InputMethodSettingsPtr settings,
+                              OnFocusCallback callback) {
+  std::move(callback).Run(false);
+}
+
 bool RuleBasedEngine::IsConnected() {
   // `receiver_` will reset upon disconnection, so bound state is equivalent to
   // connected state.
diff --git a/ash/services/ime/rule_based_engine.h b/ash/services/ime/rule_based_engine.h
index 50d90f1..8a750cf 100644
--- a/ash/services/ime/rule_based_engine.h
+++ b/ash/services/ime/rule_based_engine.h
@@ -39,8 +39,11 @@
   // mojom::InputMethod overrides:
   // Most of these methods are deliberately empty because rule-based input
   // methods do not need to listen to these events.
+  void OnFocusDeprecated(mojom::InputFieldInfoPtr input_field_info,
+                         mojom::InputMethodSettingsPtr settings) override {}
   void OnFocus(mojom::InputFieldInfoPtr input_field_info,
-               mojom::InputMethodSettingsPtr settings) override {}
+               mojom::InputMethodSettingsPtr settings,
+               OnFocusCallback callback) override;
   void OnBlur() override {}
   void OnSurroundingTextChanged(
       const std::string& text,
diff --git a/ash/style/close_button.cc b/ash/style/close_button.cc
index 3d0a02c7..f6d6cf11 100644
--- a/ash/style/close_button.cc
+++ b/ash/style/close_button.cc
@@ -129,11 +129,28 @@
   UpdateVectorIcon();
 }
 
+void CloseButton::SetBackgroundColor(const SkColor background_color) {
+  if (background_color_ == background_color)
+    return;
+
+  background_color_ = background_color;
+  DCHECK(background());
+  background()->SetNativeControlColor(background_color_.value());
+}
+
+void CloseButton::SetIconColor(const SkColor icon_color) {
+  if (icon_color_ == icon_color)
+    return;
+
+  icon_color_ = icon_color;
+  UpdateVectorIcon();
+}
+
 void CloseButton::OnThemeChanged() {
   views::ImageButton::OnThemeChanged();
-  if (!IsFloatingCloseButton(type_)) {
-    background()->SetNativeControlColor(
-        GetCloseButtonBackgroundColor(use_light_colors_));
+  if (background()) {
+    background()->SetNativeControlColor(background_color_.value_or(
+        GetCloseButtonBackgroundColor(use_light_colors_)));
   }
 
   UpdateVectorIcon();
@@ -167,12 +184,14 @@
   DCHECK(icon_);
 
   auto* color_provider = AshColorProvider::Get();
-  SkColor enabled_icon_color = color_provider->GetContentLayerColor(
-      AshColorProvider::ContentLayerType::kButtonIconColor);
+  SkColor enabled_icon_color =
+      icon_color_.value_or(color_provider->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kButtonIconColor));
   if (use_light_colors_) {
     ScopedLightModeAsDefault scoped_light_mode_as_default;
-    enabled_icon_color = color_provider->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kButtonIconColor);
+    enabled_icon_color =
+        icon_color_.value_or(color_provider->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kButtonIconColor));
   }
   SetImage(
       views::Button::STATE_NORMAL,
diff --git a/ash/style/close_button.h b/ash/style/close_button.h
index f2e88e6..64b44a04 100644
--- a/ash/style/close_button.h
+++ b/ash/style/close_button.h
@@ -53,6 +53,11 @@
   // icon.
   void SetVectorIcon(const gfx::VectorIcon& icon);
 
+  // Sets the button's background color or icon's color. Note, do this only when
+  // the button wants to have different colors from the default ones.
+  void SetBackgroundColor(const SkColor background_color);
+  void SetIconColor(const SkColor icon_color);
+
  private:
   // views::ImageButton:
   void OnThemeChanged() override;
@@ -70,6 +75,10 @@
   // True if the button wants to use light colors when the D/L mode feature is
   // not enabled. Note, can be removed when D/L mode feature is fully launched.
   const bool use_light_colors_;
+
+  // Customized value for the button's background color and icon's color.
+  absl::optional<SkColor> background_color_;
+  absl::optional<SkColor> icon_color_;
 };
 
 }  // namespace ash
diff --git a/ash/style/icon_button.cc b/ash/style/icon_button.cc
index 0ede5e8..553063991 100644
--- a/ash/style/icon_button.cc
+++ b/ash/style/icon_button.cc
@@ -19,7 +19,6 @@
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/vector_icon_types.h"
-#include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/highlight_path_generator.h"
 
@@ -90,7 +89,6 @@
 
   SetImageHorizontalAlignment(ALIGN_CENTER);
   SetImageVerticalAlignment(ALIGN_MIDDLE);
-  GetViewAccessibility().OverrideIsLeaf(true);
   StyleUtil::SetUpInkDropForButton(this, gfx::Insets(),
                                    /*highlight_on_hover=*/false,
                                    /*highlight_on_focus=*/false);
@@ -124,6 +122,14 @@
   UpdateVectorIcon();
 }
 
+void IconButton::SetBackgroundColor(const SkColor background_color) {
+  if (background_color_ == background_color)
+    return;
+
+  background_color_ = background_color;
+  SchedulePaint();
+}
+
 void IconButton::SetIconColor(const SkColor icon_color) {
   if (icon_color_ == icon_color)
     return;
@@ -157,6 +163,8 @@
       color = color_provider->GetControlsLayerColor(
           AshColorProvider::ControlsLayerType::kControlBackgroundColorActive);
     }
+    if (background_color_)
+      color = background_color_.value();
 
     // If the button is disabled, apply opacity filter to the color.
     if (!GetEnabled())
diff --git a/ash/style/icon_button.h b/ash/style/icon_button.h
index 29e2995..fab02914 100644
--- a/ash/style/icon_button.h
+++ b/ash/style/icon_button.h
@@ -76,6 +76,10 @@
   // states.
   void SetVectorIcon(const gfx::VectorIcon& icon);
 
+  // Sets the button's background color. Note, do this only when the button
+  // wants to have different color from the default one.
+  void SetBackgroundColor(const SkColor background_color);
+
   // Sets the icon's color. If the button is togglable, this will be the color
   // when it's not toggled.
   void SetIconColor(const SkColor icon_color);
@@ -105,7 +109,8 @@
   // True if the button is currently toggled.
   bool toggled_ = false;
 
-  // Customized value for icon's color.
+  // Customized value for button's background color or icon's color.
+  absl::optional<SkColor> background_color_;
   absl::optional<SkColor> icon_color_;
 
   DisabledButtonBehavior button_behavior_ = DisabledButtonBehavior::kNone;
diff --git a/ash/style/pill_button.cc b/ash/style/pill_button.cc
index b4698c1..a9194e3 100644
--- a/ash/style/pill_button.cc
+++ b/ash/style/pill_button.cc
@@ -30,7 +30,7 @@
          type == PillButton::Type::kIconlessAccentFloating;
 }
 
-SkColor GetPillButtonBackgroundColor(PillButton::Type type) {
+SkColor GetDefaultBackgroundColor(PillButton::Type type) {
   AshColorProvider::ControlsLayerType color_id =
       AshColorProvider::ControlsLayerType::kControlBackgroundColorInactive;
   switch (type) {
@@ -53,6 +53,26 @@
   return AshColorProvider::Get()->GetControlsLayerColor(color_id);
 }
 
+SkColor GetDefaultButtonTextColor(PillButton::Type type) {
+  AshColorProvider::ContentLayerType color_id =
+      AshColorProvider::ContentLayerType::kButtonLabelColor;
+  switch (type) {
+    case PillButton::Type::kIcon:
+    case PillButton::Type::kIconless:
+    case PillButton::Type::kIconlessProminent:
+    case PillButton::Type::kIconlessFloating:
+      break;
+    case PillButton::Type::kIconlessAlert:
+      color_id = AshColorProvider::ContentLayerType::kButtonLabelColorPrimary;
+      break;
+    case PillButton::Type::kIconlessAccent:
+    case PillButton::Type::kIconlessAccentFloating:
+      color_id = AshColorProvider::ContentLayerType::kButtonLabelColorBlue;
+      break;
+  }
+  return AshColorProvider::Get()->GetContentLayerColor(color_id);
+}
+
 }  // namespace
 
 PillButton::PillButton(PressedCallback callback,
@@ -90,7 +110,7 @@
   }
   if (!IsFloatingPillButton(type_)) {
     SetBackground(views::CreateRoundedRectBackground(
-        GetPillButtonBackgroundColor(type), kPillButtonHeight / 2.f));
+        GetDefaultBackgroundColor(type), kPillButtonHeight / 2.f));
   }
   SetTooltipText(text);
 }
@@ -117,25 +137,32 @@
 
   auto* color_provider = AshColorProvider::Get();
 
-  SkColor enabled_icon_color = color_provider->GetContentLayerColor(
-      AshColorProvider::ContentLayerType::kButtonIconColor);
-  SkColor enabled_text_color = GetPillButtonTextColor(type_);
+  SkColor enabled_icon_color =
+      icon_color_.value_or(color_provider->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kButtonIconColor));
+  SkColor enabled_text_color =
+      text_color_.value_or(GetDefaultButtonTextColor(type_));
   views::FocusRing::Get(this)->SetColor(color_provider->GetControlsLayerColor(
       AshColorProvider::ControlsLayerType::kFocusRingColor));
-  if (!IsFloatingPillButton(type_))
-    background()->SetNativeControlColor(GetPillButtonBackgroundColor(type_));
+  SkColor background_color =
+      background_color_.value_or(GetDefaultBackgroundColor(type_));
+  if (background())
+    background()->SetNativeControlColor(background_color);
 
   // Override the colors to light mode if `use_light_colors_` is true when D/L
   // is not enabled.
   if (use_light_colors_ && !features::IsDarkLightModeEnabled()) {
     ScopedLightModeAsDefault scoped_light_mode_as_default;
-    enabled_icon_color = color_provider->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kButtonIconColor);
-    enabled_text_color = GetPillButtonTextColor(type_);
+    enabled_icon_color =
+        icon_color_.value_or(color_provider->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kButtonIconColor));
+    enabled_text_color = text_color_.value_or(GetDefaultButtonTextColor(type_));
     views::FocusRing::Get(this)->SetColor(color_provider->GetControlsLayerColor(
         AshColorProvider::ControlsLayerType::kFocusRingColor));
-    if (!IsFloatingPillButton(type_))
-      background()->SetNativeControlColor(GetPillButtonBackgroundColor(type_));
+    background_color =
+        background_color_.value_or(GetDefaultBackgroundColor(type_));
+    if (background())
+      background()->SetNativeControlColor(background_color);
   }
 
   if (type_ == PillButton::Type::kIcon) {
@@ -154,35 +181,29 @@
                AshColorProvider::GetDisabledColor(enabled_text_color));
 }
 
+void PillButton::SetBackgroundColor(const SkColor background_color) {
+  if (background_color_ == background_color)
+    return;
+
+  background_color_ = background_color;
+  DCHECK(background());
+  background()->SetNativeControlColor(background_color_.value());
+}
+
 void PillButton::SetButtonTextColor(const SkColor text_color) {
   if (text_color_ == text_color)
     return;
+
   text_color_ = text_color;
   OnThemeChanged();
 }
 
-SkColor PillButton::GetPillButtonTextColor(Type type) {
-  // Use customized text color if it is set.
-  if (text_color_)
-    return text_color_.value();
+void PillButton::SetIconColor(const SkColor icon_color) {
+  if (icon_color_ == icon_color)
+    return;
 
-  AshColorProvider::ContentLayerType color_id =
-      AshColorProvider::ContentLayerType::kButtonLabelColor;
-  switch (type) {
-    case PillButton::Type::kIcon:
-    case PillButton::Type::kIconless:
-    case PillButton::Type::kIconlessProminent:
-    case PillButton::Type::kIconlessFloating:
-      break;
-    case PillButton::Type::kIconlessAlert:
-      color_id = AshColorProvider::ContentLayerType::kButtonLabelColorPrimary;
-      break;
-    case PillButton::Type::kIconlessAccent:
-    case PillButton::Type::kIconlessAccentFloating:
-      color_id = AshColorProvider::ContentLayerType::kButtonLabelColorBlue;
-      break;
-  }
-  return AshColorProvider::Get()->GetContentLayerColor(color_id);
+  icon_color_ = icon_color;
+  OnThemeChanged();
 }
 
 BEGIN_METADATA(PillButton, views::LabelButton)
diff --git a/ash/style/pill_button.h b/ash/style/pill_button.h
index 4c53086d..53febab 100644
--- a/ash/style/pill_button.h
+++ b/ash/style/pill_button.h
@@ -62,10 +62,12 @@
   int GetHeightForWidth(int width) const override;
   void OnThemeChanged() override;
 
-  // Sets the text's color for the button. Note, do this only when the button
-  // wants to have a different text color from the defined ones (E.g: the action
-  // buttons of notifications align their color with the app icon's color).
+  // Sets the button's background color, text's color or icon's color. Note, do
+  // this only when the button wants to have different colors from the default
+  // ones.
+  void SetBackgroundColor(const SkColor background_color);
   void SetButtonTextColor(const SkColor text_color);
+  void SetIconColor(const SkColor icon_color);
 
  private:
   // Get text's color depending on the type used.
@@ -82,8 +84,11 @@
   // set as the default value.
   int horizontal_spacing_;
 
-  // Customized value for text's color.
+  // Customized value for the button's background color, text's color and icon's
+  // color.
+  absl::optional<SkColor> background_color_;
   absl::optional<SkColor> text_color_;
+  absl::optional<SkColor> icon_color_;
 };
 
 }  // namespace ash
diff --git a/ash/system/bluetooth/bluetooth_feature_pod_controller_unittest.cc b/ash/system/bluetooth/bluetooth_feature_pod_controller_unittest.cc
index 8066f1d1..5174bc7 100644
--- a/ash/system/bluetooth/bluetooth_feature_pod_controller_unittest.cc
+++ b/ash/system/bluetooth/bluetooth_feature_pod_controller_unittest.cc
@@ -82,7 +82,7 @@
 
   void ExpectBluetoothDetailedViewFocused() {
     EXPECT_TRUE(tray_view()->detailed_view());
-    const IconButton::Views& children =
+    const FeaturePodIconButton::Views& children =
         tray_view()->detailed_view()->children();
     EXPECT_EQ(1u, children.size());
     EXPECT_STREQ("BluetoothDetailedViewImpl", children.at(0)->GetClassName());
@@ -203,7 +203,8 @@
                     IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED_TOOLTIP)),
             label_button->GetTooltipText());
 
-  const IconButton* icon_button = feature_pod_button_->icon_button();
+  const ash::FeaturePodIconButton* icon_button =
+      feature_pod_button_->icon_button();
 
   EXPECT_STREQ(kUnifiedMenuBluetoothDisabledIcon.name,
                feature_pod_icon_button_icon()->name);
@@ -230,7 +231,8 @@
                     IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED_TOOLTIP)),
             label_button->GetTooltipText());
 
-  const IconButton* icon_button = feature_pod_button_->icon_button();
+  const ash::FeaturePodIconButton* icon_button =
+      feature_pod_button_->icon_button();
 
   EXPECT_STREQ(kUnifiedMenuBluetoothIcon.name,
                feature_pod_icon_button_icon()->name);
@@ -269,7 +271,8 @@
                     public_name)),
             label_button->GetTooltipText());
 
-  const IconButton* icon_button = feature_pod_button_->icon_button();
+  const ash::FeaturePodIconButton* icon_button =
+      feature_pod_button_->icon_button();
 
   EXPECT_STREQ(kUnifiedMenuBluetoothConnectedIcon.name,
                feature_pod_icon_button_icon()->name);
@@ -330,7 +333,8 @@
               base::FormatNumber(kMultipleDeviceCount))),
       label_button->GetTooltipText());
 
-  const IconButton* icon_button = feature_pod_button_->icon_button();
+  const ash::FeaturePodIconButton* icon_button =
+      feature_pod_button_->icon_button();
 
   EXPECT_STREQ(kUnifiedMenuBluetoothConnectedIcon.name,
                feature_pod_icon_button_icon()->name);
diff --git a/ash/system/cast/tray_cast.cc b/ash/system/cast/tray_cast.cc
index 369feb8..98a08f7 100644
--- a/ash/system/cast/tray_cast.cc
+++ b/ash/system/cast/tray_cast.cc
@@ -15,7 +15,6 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
-#include "ash/system/model/enterprise_domain_model.h"
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/tray/hover_highlight_view.h"
 #include "ash/system/tray/tray_constants.h"
@@ -125,16 +124,10 @@
   }
 
   if (CastConfigController::Get()->AccessCodeCastingEnabled()) {
-    EnterpriseDomainModel* enterprise_domain =
-        Shell::Get()->system_tray_model()->enterprise_domain();
-    const std::string& org_name = enterprise_domain->account_domain_manager();
-    DCHECK(!org_name.empty())
-        << "account_domain_manager should not be empty when user is managed!";
     add_access_code_device_ = AddScrollListItem(
-        // TODO(b/209720161): replace with plus button icon when UI is final.
-        SinkIconTypeToIcon(SinkIconType::kGeneric),
-        l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_CAST_ACCESS_CAST_ADD,
-                                   base::UTF8ToUTF16(org_name)));
+        kSystemMenuQrCodeIcon,
+        l10n_util::GetStringUTF16(
+          IDS_ASH_STATUS_TRAY_CAST_ACCESS_CODE_CAST_CONNECT));
   }
 
   scroll_content()->SizeToPreferredSize();
diff --git a/ash/system/message_center/unified_message_center_bubble.cc b/ash/system/message_center/unified_message_center_bubble.cc
index 28d4dc6..b4c09a48e 100644
--- a/ash/system/message_center/unified_message_center_bubble.cc
+++ b/ash/system/message_center/unified_message_center_bubble.cc
@@ -155,6 +155,9 @@
   message_center_view_->SetMaxHeight(available_height);
   message_center_view_->SetAvailableHeight(available_height);
 
+  if (!tray_->bubble())
+    return;
+
   // Note: It's tempting to set the insets for TrayBubbleView in order to
   // achieve the padding, but that enlarges the layer bounds and breaks rounded
   // corner clipping for ARC notifications. This approach only modifies the
@@ -236,17 +239,10 @@
     views::View* starting_view) {
   // Hide the message center widget if the message center is not
   // visible. This is to ensure we do not see an empty bubble.
-
   if (observed_view != message_center_view_)
     return;
 
-  if (observed_view->GetVisible()) {
-    bubble_widget_->Show();
-    return;
-  }
-
-  tray_->ActivateBubble();
-  bubble_widget_->Hide();
+  bubble_view_->UpdateBubble();
 }
 
 void UnifiedMessageCenterBubble::OnWidgetDestroying(views::Widget* widget) {
diff --git a/ash/system/message_center/unified_message_center_bubble_unittest.cc b/ash/system/message_center/unified_message_center_bubble_unittest.cc
index ff9c8e1..8229ed5f 100644
--- a/ash/system/message_center/unified_message_center_bubble_unittest.cc
+++ b/ash/system/message_center/unified_message_center_bubble_unittest.cc
@@ -392,7 +392,7 @@
   views::Widget* message_center_widget =
       GetMessageCenterBubble()->GetBubbleWidget();
   EXPECT_FALSE(quick_settings_widget->IsActive());
-  EXPECT_TRUE(message_center_widget->IsActive());
+  EXPECT_TRUE(message_center_widget->GetFocusManager()->GetFocusedView());
 
   RemoveAllNotifications();
   WaitForAnimation();
@@ -400,7 +400,7 @@
       0u,
       message_center::MessageCenter::Get()->GetVisibleNotifications().size());
   EXPECT_FALSE(quick_settings_widget->IsActive());
-  EXPECT_FALSE(message_center_widget->IsActive());
+  EXPECT_FALSE(message_center_widget->GetFocusManager()->GetFocusedView());
 
   EXPECT_EQ(nullptr, GetFirstMessageCenterFocusable());
   EXPECT_EQ(nullptr,
diff --git a/ash/system/network/network_feature_pod_controller_unittest.cc b/ash/system/network/network_feature_pod_controller_unittest.cc
index be3542ac..42bf8ea1 100644
--- a/ash/system/network/network_feature_pod_controller_unittest.cc
+++ b/ash/system/network/network_feature_pod_controller_unittest.cc
@@ -251,7 +251,7 @@
 
   FeaturePodButton* feature_pod_button() { return feature_pod_button_.get(); }
 
-  IconButton* feature_pod_icon_button() {
+  FeaturePodIconButton* feature_pod_icon_button() {
     return feature_pod_button_->icon_button_;
   }
 
diff --git a/ash/system/phonehub/quick_action_item.cc b/ash/system/phonehub/quick_action_item.cc
index ab753c4..b7fa503 100644
--- a/ash/system/phonehub/quick_action_item.cc
+++ b/ash/system/phonehub/quick_action_item.cc
@@ -7,13 +7,11 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
-#include "ash/style/icon_button.h"
 #include "ash/system/tray/tray_constants.h"
 #include "base/bind.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/vector_icon_types.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -49,16 +47,14 @@
   layout->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
-  icon_button_ = AddChildView(std::make_unique<IconButton>(
+  icon_button_ = AddChildView(std::make_unique<FeaturePodIconButton>(
       base::BindRepeating(
           [](Delegate* delegate, QuickActionItem* item) {
             delegate->OnButtonPressed(item->IsToggled());
           },
           delegate, this),
-      IconButton::Type::kMedium, /*icon=*/nullptr,
-      /*is_togglable=*/true, /*has_border=*/true));
+      true /* is_togglable */));
   icon_button_->SetVectorIcon(icon);
-  icon_button_->SetFlipCanvasOnPaintForRTLUI(false);
 
   auto* label_view = AddChildView(std::make_unique<views::View>());
   label_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/ash/system/phonehub/quick_action_item.h b/ash/system/phonehub/quick_action_item.h
index dad5527..86389c7 100644
--- a/ash/system/phonehub/quick_action_item.h
+++ b/ash/system/phonehub/quick_action_item.h
@@ -6,11 +6,7 @@
 #define ASH_SYSTEM_PHONEHUB_QUICK_ACTION_ITEM_H_
 
 #include "ash/ash_export.h"
-#include "ui/views/view.h"
-
-namespace gfx {
-struct VectorIcon;
-}  // namespace gfx
+#include "ash/system/unified/feature_pod_button.h"
 
 namespace views {
 class Label;
@@ -18,8 +14,6 @@
 
 namespace ash {
 
-class IconButton;
-
 // A toggle button with labels used in the quick action view.
 class ASH_EXPORT QuickActionItem : public views::View {
  public:
@@ -64,11 +58,11 @@
   void RequestFocus() override;
   const char* GetClassName() const override;
 
-  IconButton* icon_button() const { return icon_button_; }
+  FeaturePodIconButton* icon_button() const { return icon_button_; }
 
  private:
   // Owned by views hierarchy.
-  IconButton* icon_button_ = nullptr;
+  FeaturePodIconButton* icon_button_ = nullptr;
   views::Label* label_ = nullptr;
   views::Label* sub_label_ = nullptr;
 
diff --git a/ash/system/phonehub/quick_actions_view_unittest.cc b/ash/system/phonehub/quick_actions_view_unittest.cc
index 6a1e430..9f1e688 100644
--- a/ash/system/phonehub/quick_actions_view_unittest.cc
+++ b/ash/system/phonehub/quick_actions_view_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "ash/components/phonehub/fake_phone_hub_manager.h"
 #include "ash/constants/ash_features.h"
-#include "ash/style/icon_button.h"
 #include "ash/system/phonehub/quick_action_item.h"
 #include "ash/test/ash_test_base.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/ash/system/phonehub/silence_phone_quick_action_controller.cc b/ash/system/phonehub/silence_phone_quick_action_controller.cc
index dff56ee..5cde8a4 100644
--- a/ash/system/phonehub/silence_phone_quick_action_controller.cc
+++ b/ash/system/phonehub/silence_phone_quick_action_controller.cc
@@ -6,7 +6,6 @@
 
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
-#include "ash/style/icon_button.h"
 #include "ash/system/phonehub/phone_hub_metrics.h"
 #include "ash/system/phonehub/quick_action_item.h"
 #include "base/bind.h"
@@ -46,7 +45,8 @@
   item_ = new QuickActionItem(this, IDS_ASH_PHONE_HUB_SILENCE_PHONE_TITLE,
                               kPhoneHubSilencePhoneIcon);
   item_->icon_button()->set_button_behavior(
-      IconButton::DisabledButtonBehavior::kCanDisplayDisabledToggleValue);
+      FeaturePodIconButton::DisabledButtonBehavior::
+          kCanDisplayDisabledToggleValue);
   OnDndStateChanged();
   return item_;
 }
diff --git a/ash/system/privacy_screen/privacy_screen_toast_view.cc b/ash/system/privacy_screen/privacy_screen_toast_view.cc
index aa6ceef5..8eea7e33 100644
--- a/ash/system/privacy_screen/privacy_screen_toast_view.cc
+++ b/ash/system/privacy_screen/privacy_screen_toast_view.cc
@@ -7,9 +7,9 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
-#include "ash/style/icon_button.h"
 #include "ash/system/privacy_screen/privacy_screen_toast_controller.h"
 #include "ash/system/tray/tray_constants.h"
+#include "ash/system/unified/feature_pod_button.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -121,13 +121,11 @@
   layout->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
-  button_ = new IconButton(std::move(callback), IconButton::Type::kMedium,
-                           /*icon=*/nullptr, /*is_togglable=*/true,
-                           /*has_border=*/true);
+  button_ =
+      new FeaturePodIconButton(std::move(callback), /*is_togglable=*/true);
   button_->SetVectorIcon(kPrivacyScreenIcon);
   button_->SetToggled(false);
   button_->AddObserver(this);
-  button_->SetFlipCanvasOnPaintForRTLUI(false);
   AddChildView(button_);
 
   label_ = new PrivacyScreenToastLabelView();
diff --git a/ash/system/privacy_screen/privacy_screen_toast_view.h b/ash/system/privacy_screen/privacy_screen_toast_view.h
index 11c42cb..71b2e17 100644
--- a/ash/system/privacy_screen/privacy_screen_toast_view.h
+++ b/ash/system/privacy_screen/privacy_screen_toast_view.h
@@ -12,7 +12,7 @@
 
 namespace ash {
 
-class IconButton;
+class FeaturePodIconButton;
 class PrivacyScreenToastLabelView;
 class PrivacyScreenToastController;
 
@@ -41,7 +41,7 @@
   void OnViewBlurred(views::View* observed_view) override;
 
   PrivacyScreenToastController* controller_ = nullptr;
-  IconButton* button_ = nullptr;
+  FeaturePodIconButton* button_ = nullptr;
   PrivacyScreenToastLabelView* label_ = nullptr;
   bool is_enabled_ = false;
   bool is_managed_ = false;
diff --git a/ash/system/time/calendar_event_list_item_view.cc b/ash/system/time/calendar_event_list_item_view.cc
index b65709c..857c3be 100644
--- a/ash/system/time/calendar_event_list_item_view.cc
+++ b/ash/system/time/calendar_event_list_item_view.cc
@@ -9,6 +9,7 @@
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/model/system_tray_model.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/time/calendar_utils.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "ash/system/tray/tri_view.h"
@@ -160,6 +161,9 @@
 
 bool CalendarEventListItemView::PerformAction(const ui::Event& event) {
   DCHECK(event_url_.is_empty() || event_url_.is_valid());
+
+  calendar_metrics::RecordEventListItemActivated(event);
+
   GURL finalized_url;
   bool opened_pwa = false;
   Shell::Get()->system_tray_model()->client()->ShowCalendarEvent(
diff --git a/ash/system/time/calendar_metrics.cc b/ash/system/time/calendar_metrics.cc
new file mode 100644
index 0000000..fb75115
--- /dev/null
+++ b/ash/system/time/calendar_metrics.cc
@@ -0,0 +1,96 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/time/calendar_metrics.h"
+
+#include "base/check_op.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
+#include "ui/events/event.h"
+
+namespace ash {
+
+namespace calendar_metrics {
+
+namespace {
+
+// The event types CalendarView is interested in. These are used in histograms,
+// do not remove/renumber entries. If you're adding to this enum with the
+// intention that it will be logged, update the CalendarEventSource listing in
+// enums.xml.
+enum class CalendarEventSource {
+  kInvalid = 0,
+  kTap = 1,
+  kClick = 2,
+  kKeyboard = 3,
+  kStylus = 4,
+  kMaxValue = kStylus
+};
+
+constexpr char kCalendarViewShowSourcePrefix[] = "Ash.Calendar.ShowSource.";
+constexpr char kCalendarDateCellActivated[] = "Ash.Calendar.DateCell.Activated";
+constexpr char kCalendarEventListItemActivated[] =
+    "Ash.Calendar.EventListItem.Activated";
+constexpr char kCalendarMonthDownArrowButtonActivated[] =
+    "Ash.Calendar.MonthDownArrowButton.Activated";
+constexpr char kCalendarMonthUpArrowButtonActivated[] =
+    "Ash.Calendar.MonthUpArrowButton.Activated";
+
+CalendarEventSource GetEventType(const ui::Event& event) {
+  if (event.IsGestureEvent())
+    return CalendarEventSource::kTap;
+
+  if (event.IsMouseEvent())
+    return CalendarEventSource::kClick;
+
+  if (event.IsKeyEvent())
+    return CalendarEventSource::kKeyboard;
+
+  if (event.IsTouchEvent())
+    return CalendarEventSource::kStylus;
+
+  NOTREACHED();
+  return CalendarEventSource::kInvalid;
+}
+
+}  // namespace
+
+void RecordCalendarShowMetrics(CalendarViewShowSource show_source,
+                               const ui::Event& event) {
+  std::string histogram_name = kCalendarViewShowSourcePrefix;
+  switch (show_source) {
+    case CalendarViewShowSource::kDateView:
+      histogram_name += "DateView";
+      break;
+    case CalendarViewShowSource::kTimeView:
+      histogram_name += "TimeView";
+      break;
+    case CalendarViewShowSource::kAccelerator:
+      DCHECK(event.IsKeyEvent());
+      histogram_name += "Keyboard";
+      break;
+  }
+
+  base::UmaHistogramEnumeration(histogram_name, GetEventType(event));
+}
+
+void RecordCalendarDateCellActivated(const ui::Event& event) {
+  base::UmaHistogramEnumeration(kCalendarDateCellActivated,
+                                GetEventType(event));
+}
+
+void RecordMonthArrowButtonActivated(bool up, const ui::Event& event) {
+  base::UmaHistogramEnumeration(up ? kCalendarMonthUpArrowButtonActivated
+                                   : kCalendarMonthDownArrowButtonActivated,
+                                GetEventType(event));
+}
+
+void RecordEventListItemActivated(const ui::Event& event) {
+  base::UmaHistogramEnumeration(kCalendarEventListItemActivated,
+                                GetEventType(event));
+}
+
+}  // namespace calendar_metrics
+
+}  // namespace ash
diff --git a/ash/system/time/calendar_metrics.h b/ash/system/time/calendar_metrics.h
new file mode 100644
index 0000000..8f4b269b
--- /dev/null
+++ b/ash/system/time/calendar_metrics.h
@@ -0,0 +1,39 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_TIME_CALENDAR_METRICS_H_
+#define ASH_SYSTEM_TIME_CALENDAR_METRICS_H_
+
+namespace ui {
+class Event;
+}  // namespace ui
+
+namespace ash {
+namespace calendar_metrics {
+// The different hosts which hold components allowing a user to open the
+// calendar. These are used in histograms, do not remove/renumber entries. If
+// you're adding to this enum with the intention that it will be logged, update
+// the CalendarViewShowSource token variant in histograms.xml.
+enum class CalendarViewShowSource {
+  kTimeView = 0,  // Shown via activating the time view in the status area.
+  kDateView = 1,  // Shown via activating the  date view in the quick settings
+                  // bubble.
+  kAccelerator = 2,  // Shown via activating the accelerator.
+  kMaxValue = kAccelerator
+};
+
+// Records calendar show metrics for a given CalendarViewShowSource
+void RecordCalendarShowMetrics(CalendarViewShowSource show_source,
+                               const ui::Event& event);
+
+void RecordCalendarDateCellActivated(const ui::Event& event);
+
+void RecordMonthArrowButtonActivated(bool up, const ui::Event& event);
+
+void RecordEventListItemActivated(const ui::Event& event);
+
+}  // namespace calendar_metrics
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_TIME_CALENDAR_METRICS_H_
diff --git a/ash/system/time/calendar_month_view.cc b/ash/system/time/calendar_month_view.cc
index b4ff8450f..12da14ad 100644
--- a/ash/system/time/calendar_month_view.cc
+++ b/ash/system/time/calendar_month_view.cc
@@ -9,6 +9,7 @@
 #include "ash/public/cpp/ash_typography.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/time/calendar_utils.h"
 #include "ash/system/time/calendar_view_controller.h"
 #include "base/bind.h"
@@ -20,6 +21,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/compositor/layer.h"
+#include "ui/events/event.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/label_button.h"
@@ -78,17 +80,11 @@
     base::Time date,
     bool is_grayed_out_date,
     int row_index)
-    : views::LabelButton(
-          views::Button::PressedCallback(
-              is_grayed_out_date
-                  ? base::DoNothing()
-                  : base::BindRepeating(
-                        &CalendarViewController::ShowEventListView,
-                        base::Unretained(calendar_view_controller),
-                        date,
-                        row_index)),
-          base::TimeFormatWithPattern(date, "d"),
-          CONTEXT_CALENDAR_DATE),
+    : views::LabelButton(views::Button::PressedCallback(base::BindRepeating(
+                             &CalendarDateCellView::OnDateCellActivated,
+                             base::Unretained(this))),
+                         base::TimeFormatWithPattern(date, "d"),
+                         CONTEXT_CALENDAR_DATE),
       date_(date),
       grayed_out_(is_grayed_out_date),
       row_index_(row_index),
@@ -271,6 +267,14 @@
   MaybeDrawEventsIndicator(canvas);
 }
 
+void CalendarDateCellView::OnDateCellActivated(const ui::Event& event) {
+  if (grayed_out_)
+    return;
+
+  calendar_metrics::RecordCalendarDateCellActivated(event);
+  calendar_view_controller_->ShowEventListView(date_, row_index_);
+}
+
 CalendarMonthView::CalendarMonthView(
     const base::Time first_day_of_month,
     CalendarViewController* calendar_view_controller)
diff --git a/ash/system/time/calendar_month_view.h b/ash/system/time/calendar_month_view.h
index 4b08d59..138ce34b 100644
--- a/ash/system/time/calendar_month_view.h
+++ b/ash/system/time/calendar_month_view.h
@@ -11,6 +11,10 @@
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/view.h"
 
+namespace ui {
+class Event;
+}  // namespace ui
+
 namespace ash {
 
 // Renders a Calendar date cell. Pass in `true` as `is_grayed_out_date` if
@@ -59,6 +63,9 @@
   // For unit tests.
   friend class CalendarMonthViewTest;
 
+  // Callback called when this view is activated.
+  void OnDateCellActivated(const ui::Event& event);
+
   // Computes the position of the indicator that our day has events.
   gfx::Point GetEventsPresentIndicatorCenterPosition();
 
diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc
index 4aa524b..a1b2190 100644
--- a/ash/system/time/calendar_view.cc
+++ b/ash/system/time/calendar_view.cc
@@ -9,6 +9,7 @@
 #include "ash/style/icon_button.h"
 #include "ash/style/pill_button.h"
 #include "ash/system/time/calendar_event_list_view.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/time/calendar_month_view.h"
 #include "ash/system/time/calendar_utils.h"
 #include "ash/system/tray/tray_popup_utils.h"
@@ -270,13 +271,13 @@
   tri_view->AddView(TriView::Container::START, header_);
 
   down_button_ = new IconButton(
-      base::BindRepeating(&CalendarView::ScrollOneMonthWithAnimation,
-                          base::Unretained(this), /*is_scrolling_up=*/false),
+      base::BindRepeating(&CalendarView::OnMonthArrowButtonActivated,
+                          base::Unretained(this), /*up=*/false),
       IconButton::Type::kSmallFloating, &vector_icons::kCaretDownIcon,
       IDS_ASH_CALENDAR_DOWN_BUTTON_ACCESSIBLE_DESCRIPTION);
   up_button_ = new IconButton(
-      base::BindRepeating(&CalendarView::ScrollOneMonthWithAnimation,
-                          base::Unretained(this), /*is_scrolling_up=*/true),
+      base::BindRepeating(&CalendarView::OnMonthArrowButtonActivated,
+                          base::Unretained(this), /*up=*/true),
       IconButton::Type::kSmallFloating, &vector_icons::kCaretUpIcon,
       IDS_ASH_CALENDAR_UP_BUTTON_ACCESSIBLE_DESCRIPTION);
 
@@ -1213,6 +1214,12 @@
   }
 }
 
+void CalendarView::OnMonthArrowButtonActivated(bool up,
+                                               const ui::Event& event) {
+  calendar_metrics::RecordMonthArrowButtonActivated(up, event);
+  ScrollOneMonthWithAnimation(up);
+}
+
 void CalendarView::AdjustDateCellVoxBounds() {
   auto* focused_view = GetFocusManager()->GetFocusedView();
   DCHECK_EQ(focused_view->GetClassName(), CalendarDateCellView::kViewClassName);
diff --git a/ash/system/time/calendar_view.h b/ash/system/time/calendar_view.h
index a8fb7d7..b1739aa7 100644
--- a/ash/system/time/calendar_view.h
+++ b/ash/system/time/calendar_view.h
@@ -19,6 +19,10 @@
 #include "ui/views/controls/scroll_view.h"
 #include "ui/views/view.h"
 
+namespace ui {
+class Event;
+}  // namespace ui
+
 namespace views {
 
 class Label;
@@ -177,6 +181,10 @@
   // ScrollView callback.
   void OnContentsScrolled();
 
+  // Callback passed to `up_button_` and `down_button_`, activated on button
+  // activation.
+  void OnMonthArrowButtonActivated(bool up, const ui::Event& event);
+
   // Adjusts the Chrome Vox box position for date cells in the scroll view.
   void AdjustDateCellVoxBounds();
 
diff --git a/ash/system/unified/feature_pod_button.cc b/ash/system/unified/feature_pod_button.cc
index c04fbd39..69dede76 100644
--- a/ash/system/unified/feature_pod_button.cc
+++ b/ash/system/unified/feature_pod_button.cc
@@ -46,6 +46,23 @@
 
 }  // namespace
 
+FeaturePodIconButton::FeaturePodIconButton(PressedCallback callback,
+                                           bool is_togglable)
+    : IconButton(std::move(callback),
+                 IconButton::Type::kMedium,
+                 /*icon=*/nullptr,
+                 is_togglable,
+                 /*has_border=*/true) {
+  SetFlipCanvasOnPaintForRTLUI(false);
+  GetViewAccessibility().OverrideIsLeaf(true);
+}
+
+FeaturePodIconButton::~FeaturePodIconButton() = default;
+
+const char* FeaturePodIconButton::GetClassName() const {
+  return "FeaturePodIconButton";
+}
+
 FeaturePodLabelButton::FeaturePodLabelButton(PressedCallback callback)
     : Button(std::move(callback)),
       label_(new views::Label),
@@ -199,17 +216,13 @@
 
 FeaturePodButton::FeaturePodButton(FeaturePodControllerBase* controller,
                                    bool is_togglable)
-    : icon_button_(new IconButton(
+    : icon_button_(new FeaturePodIconButton(
           base::BindRepeating(&FeaturePodControllerBase::OnIconPressed,
                               base::Unretained(controller)),
-          IconButton::Type::kMedium,
-          /*icon=*/nullptr,
-          is_togglable,
-          /*has_border=*/true)),
+          is_togglable)),
       label_button_(new FeaturePodLabelButton(
           base::BindRepeating(&FeaturePodControllerBase::OnLabelPressed,
                               base::Unretained(controller)))) {
-  icon_button_->SetFlipCanvasOnPaintForRTLUI(false);
   auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical, gfx::Insets(),
       kUnifiedFeaturePodSpacing));
diff --git a/ash/system/unified/feature_pod_button.h b/ash/system/unified/feature_pod_button.h
index e2fd1812..c2bbb70 100644
--- a/ash/system/unified/feature_pod_button.h
+++ b/ash/system/unified/feature_pod_button.h
@@ -20,6 +20,19 @@
 
 class FeaturePodControllerBase;
 
+// TODO(crbug/1276545): Remove FeaturePodIconButton after the migration.
+// A toggle button with an icon used by feature pods and in other places.
+class ASH_EXPORT FeaturePodIconButton : public IconButton {
+ public:
+  FeaturePodIconButton(PressedCallback callback, bool is_togglable);
+  FeaturePodIconButton(const FeaturePodIconButton&) = delete;
+  FeaturePodIconButton& operator=(const FeaturePodIconButton&) = delete;
+  ~FeaturePodIconButton() override;
+
+  // views::ImageButton:
+  const char* GetClassName() const override;
+};
+
 // Button internally used in FeaturePodButton. Should not be used directly.
 class ASH_EXPORT FeaturePodLabelButton : public views::Button {
  public:
@@ -137,7 +150,7 @@
 
   bool visible_preferred() const { return visible_preferred_; }
 
-  IconButton* icon_button() const { return icon_button_; }
+  FeaturePodIconButton* icon_button() const { return icon_button_; }
 
  private:
   // For unit tests.
@@ -147,7 +160,7 @@
   void OnEnabledChanged();
 
   // Owned by views hierarchy.
-  IconButton* const icon_button_;
+  FeaturePodIconButton* const icon_button_;
   FeaturePodLabelButton* const label_button_;
 
   // If true, it is preferred by the FeaturePodController that the view is
diff --git a/ash/system/unified/unified_system_info_view.cc b/ash/system/unified/unified_system_info_view.cc
index c9854e3..cd68a72 100644
--- a/ash/system/unified/unified_system_info_view.cc
+++ b/ash/system/unified/unified_system_info_view.cc
@@ -19,6 +19,7 @@
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/power/power_status.h"
 #include "ash/system/supervised/supervised_icon_string.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/tray/system_tray_notifier.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "base/bind.h"
@@ -73,6 +74,9 @@
   void OnThemeChanged() override;
 
  private:
+  // Callback called when this is pressed.
+  void OnButtonPressed(const ui::Event& event);
+
   void Update();
 
   // views::Button:
@@ -84,17 +88,19 @@
   void OnSystemClockCanSetTimeChanged(bool can_set_time) override;
   void Refresh() override;
 
+  // Owned by the views hierarchy.
   views::Label* label_;
+
+  // Unowned.
+  UnifiedSystemTrayController* const controller_;
 };
 
 DateView::DateView(UnifiedSystemTrayController* controller)
-    : Button(base::BindRepeating(
-          features::IsCalendarViewEnabled()
-              ? &UnifiedSystemTrayController::ShowCalendarView
-              : &UnifiedSystemTrayController::HandleOpenDateTimeSettingsAction,
-          base::Unretained(controller))) {
+    : Button(base::BindRepeating(&DateView::OnButtonPressed,
+                                 base::Unretained(this))),
+      label_(AddChildView(std::make_unique<views::Label>())),
+      controller_(controller) {
   SetLayoutManager(std::make_unique<views::FillLayout>());
-  label_ = AddChildView(std::make_unique<views::Label>());
   label_->SetAutoColorReadabilityEnabled(false);
   label_->SetSubpixelRenderingEnabled(false);
   Update();
@@ -118,6 +124,16 @@
       AshColorProvider::ControlsLayerType::kFocusRingColor));
 }
 
+void DateView::OnButtonPressed(const ui::Event& event) {
+  if (features::IsCalendarViewEnabled()) {
+    controller_->ShowCalendarView(
+        calendar_metrics::CalendarViewShowSource::kDateView, event);
+    return;
+  }
+
+  controller_->HandleOpenDateTimeSettingsAction();
+}
+
 void DateView::Update() {
   base::Time now = base::Time::Now();
   label_->SetText(l10n_util::GetStringFUTF16(
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index edae64b..482f631 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -22,6 +22,7 @@
 #include "ash/system/network/network_tray_view.h"
 #include "ash/system/power/tray_power.h"
 #include "ash/system/privacy_screen/privacy_screen_toast_controller.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/time/time_tray_item_view.h"
 #include "ash/system/time/time_view.h"
 #include "ash/system/tray/system_tray_notifier.h"
@@ -466,7 +467,8 @@
     CloseBubble();
   } else {
     ShowBubble();
-    bubble_->ShowCalendarView();
+    bubble_->ShowCalendarView(
+        calendar_metrics::CalendarViewShowSource::kTimeView, event);
   }
 }
 
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc
index 3e34049..50da42f 100644
--- a/ash/system/unified/unified_system_tray_bubble.cc
+++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -9,6 +9,7 @@
 #include "ash/shell.h"
 #include "ash/system/message_center/unified_message_center_bubble.h"
 #include "ash/system/status_area_widget.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_event_filter.h"
@@ -22,6 +23,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
+#include "ui/events/event.h"
 #include "ui/wm/core/window_util.h"
 #include "ui/wm/public/activation_client.h"
 
@@ -150,13 +152,15 @@
   controller_->ShowAudioDetailedView();
 }
 
-void UnifiedSystemTrayBubble::ShowCalendarView() {
+void UnifiedSystemTrayBubble::ShowCalendarView(
+    calendar_metrics::CalendarViewShowSource show_source,
+    const ui::Event& event) {
   if (!bubble_widget_)
     return;
 
   DCHECK(unified_view_);
   DCHECK(controller_);
-  controller_->ShowCalendarView();
+  controller_->ShowCalendarView(show_source, event);
 }
 
 void UnifiedSystemTrayBubble::ShowNetworkDetailedView(bool force) {
diff --git a/ash/system/unified/unified_system_tray_bubble.h b/ash/system/unified/unified_system_tray_bubble.h
index 2913c4d0..324a4da 100644
--- a/ash/system/unified/unified_system_tray_bubble.h
+++ b/ash/system/unified/unified_system_tray_bubble.h
@@ -10,6 +10,7 @@
 #include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/shelf/shelf_observer.h"
 #include "ash/system/screen_layout_observer.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/tray/time_to_click_recorder.h"
 #include "ash/system/tray/tray_bubble_base.h"
 #include "base/time/time.h"
@@ -19,6 +20,10 @@
 #include "ui/views/widget/widget_observer.h"
 #include "ui/wm/public/activation_change_observer.h"
 
+namespace ui {
+class Event;
+}  // namespace ui
+
 namespace views {
 class Widget;
 }  // namespace views
@@ -74,7 +79,8 @@
   void ShowAudioDetailedView();
 
   // Show calendar view.
-  void ShowCalendarView();
+  void ShowCalendarView(calendar_metrics::CalendarViewShowSource show_source,
+                        const ui::Event& event);
 
   // Show network settings detailed view.
   void ShowNetworkDetailedView(bool force);
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index bb3437b..a99bca0a 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -45,6 +45,7 @@
 #include "ash/system/night_light/night_light_feature_pod_controller.h"
 #include "ash/system/privacy_screen/privacy_screen_feature_pod_controller.h"
 #include "ash/system/rotation/rotation_lock_feature_pod_controller.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/time/unified_calendar_view_controller.h"
 #include "ash/system/tray/system_tray_item_uma_type.h"
 #include "ash/system/tray/tray_constants.h"
@@ -70,6 +71,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/compositor/compositor.h"
 #include "ui/display/screen.h"
+#include "ui/events/event.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/message_center/message_center.h"
 #include "ui/views/widget/widget.h"
@@ -394,9 +396,14 @@
   ShowDetailedView(std::make_unique<UnifiedNotifierSettingsController>(this));
 }
 
-void UnifiedSystemTrayController::ShowCalendarView() {
-  if (features::IsCalendarViewEnabled())
-    ShowDetailedView(std::make_unique<UnifiedCalendarViewController>(this));
+void UnifiedSystemTrayController::ShowCalendarView(
+    calendar_metrics::CalendarViewShowSource show_source,
+    const ui::Event& event) {
+  if (!features::IsCalendarViewEnabled())
+    return;
+
+  calendar_metrics::RecordCalendarShowMetrics(show_source, event);
+  ShowDetailedView(std::make_unique<UnifiedCalendarViewController>(this));
 }
 
 void UnifiedSystemTrayController::ShowMediaControlsDetailedView() {
diff --git a/ash/system/unified/unified_system_tray_controller.h b/ash/system/unified/unified_system_tray_controller.h
index 5adf37ca..f540183 100644
--- a/ash/system/unified/unified_system_tray_controller.h
+++ b/ash/system/unified/unified_system_tray_controller.h
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/session/session_observer.h"
 #include "ash/system/audio/unified_volume_slider_controller.h"
 #include "ash/system/media/unified_media_controls_controller.h"
+#include "ash/system/time/calendar_metrics.h"
 #include "ash/system/unified/unified_system_tray_model.h"
 #include "base/memory/scoped_refptr.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -22,6 +23,10 @@
 class PrefRegistrySimple;
 class PrefService;
 
+namespace ui {
+class Event;
+}  // namespace ui
+
 namespace gfx {
 class SlideAnimation;
 }  // namespace gfx
@@ -110,7 +115,8 @@
   // Show the detailed view of media controls. Called from the view.
   void ShowMediaControlsDetailedView();
   // Show the detailed view of Calendar. Called from the view.
-  void ShowCalendarView();
+  void ShowCalendarView(calendar_metrics::CalendarViewShowSource show_source,
+                        const ui::Event& event);
 
   // If you want to add a new detailed view, add here.
 
diff --git a/ash/system/unified/unified_system_tray_unittest.cc b/ash/system/unified/unified_system_tray_unittest.cc
index a961383..8eeea174 100644
--- a/ash/system/unified/unified_system_tray_unittest.cc
+++ b/ash/system/unified/unified_system_tray_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/system/unified/unified_system_tray.h"
 
+#include "ash/constants/ash_features.h"
 #include "ash/ime/ime_controller_impl.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_layout_manager.h"
@@ -16,18 +17,19 @@
 #include "ash/system/unified/unified_slider_bubble_controller.h"
 #include "ash/system/unified/unified_system_tray_bubble.h"
 #include "ash/test/ash_test_base.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
+#include "ui/events/event.h"
 
 namespace ash {
 
 class UnifiedSystemTrayTest : public AshTestBase {
  public:
   UnifiedSystemTrayTest() = default;
-
   UnifiedSystemTrayTest(const UnifiedSystemTrayTest&) = delete;
   UnifiedSystemTrayTest& operator=(const UnifiedSystemTrayTest&) = delete;
-
   ~UnifiedSystemTrayTest() override = default;
 
  protected:
@@ -211,7 +213,7 @@
 
   // Sets all tray items' visibility to false except TimeView.
   for (TrayItemView* item : tray_items()) {
-    item->SetVisible(item->GetClassName() == time_view()->GetClassName());
+    item->SetVisible(item == time_view());
   }
 
   // Only one visible tray item, padding should not be visible.
@@ -241,4 +243,80 @@
   EXPECT_FALSE(vertical_clock_padding()->GetVisible());
 }
 
+// Enables CalendarView.
+class CalendarSystemTrayTest : public UnifiedSystemTrayTest {
+ public:
+  CalendarSystemTrayTest() = default;
+  CalendarSystemTrayTest(const CalendarSystemTrayTest&) = delete;
+  CalendarSystemTrayTest& operator=(const CalendarSystemTrayTest&) = delete;
+  ~CalendarSystemTrayTest() override = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(features::kCalendarView);
+    UnifiedSystemTrayTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests that Calendar View doesn't show when time view is clicked with only one
+// item showing.
+TEST_F(CalendarSystemTrayTest, CalendarViewDoesNotShowWhenClickingTimeView) {
+  // Only show TimeView.
+  for (TrayItemView* item : tray_items())
+    item->SetVisible(item == time_view());
+
+  base::HistogramTester histogram_tester;
+
+  // Show the date, enabling the calendar view entry through TimeView.
+  time_view()->time_view()->SetShowDate(true);
+
+  // Clicking TimeView with only one item should not show calendar.
+  GetEventGenerator()->MoveMouseTo(
+      time_view()->GetBoundsInScreen().CenterPoint());
+  GetEventGenerator()->ClickLeftButton();
+
+  histogram_tester.ExpectTotalCount("Ash.Calendar.ShowSource.TimeView", 0);
+
+  // Hide the date, calendar still should not show.
+  time_view()->time_view()->SetShowDate(false);
+
+  GetEventGenerator()->MoveMouseTo(
+      time_view()->GetBoundsInScreen().CenterPoint());
+  GetEventGenerator()->ClickLeftButton();
+
+  histogram_tester.ExpectTotalCount("Ash.Calendar.ShowSource.TimeView", 0);
+}
+
+// Tests that Calendar View shows when many items are showing.
+TEST_F(CalendarSystemTrayTest, CalendarViewShowsWhenClickingTimeView) {
+  // Show all TrayItemViews.
+  for (TrayItemView* item : tray_items())
+    item->SetVisible(true);
+
+  base::HistogramTester histogram_tester;
+
+  // Hide the date, calendar should not show.
+  time_view()->time_view()->SetShowDate(false);
+
+  GetEventGenerator()->MoveMouseTo(
+      time_view()->GetBoundsInScreen().CenterPoint());
+  GetEventGenerator()->ClickLeftButton();
+
+  histogram_tester.ExpectTotalCount("Ash.Calendar.ShowSource.TimeView", 0);
+
+  // Close the Quick Settings bubble.
+  GetEventGenerator()->ClickLeftButton();
+
+  // Show the date, enabling the calendar view entry through TimeView.
+  time_view()->time_view()->SetShowDate(true);
+  // Clicking TimeView with only one item should not show calendar.
+  GetEventGenerator()->MoveMouseTo(
+      time_view()->GetBoundsInScreen().CenterPoint());
+  GetEventGenerator()->ClickLeftButton();
+
+  histogram_tester.ExpectTotalCount("Ash.Calendar.ShowSource.TimeView", 1);
+}
+
 }  // namespace ash
diff --git a/ash/webui/common/resources/keyboard_diagram.html b/ash/webui/common/resources/keyboard_diagram.html
index b33416f..2026bfb1 100644
--- a/ash/webui/common/resources/keyboard_diagram.html
+++ b/ash/webui/common/resources/keyboard_diagram.html
@@ -223,7 +223,7 @@
       data-show-assistant-key$="[[showAssistantKey]]"
       data-show-fn-and-globe-keys$="[[showFnAndGlobeKeys_]]">
     <div id="topRow">
-      <keyboard-key main-glyph="esc"></keyboard-key>
+      <keyboard-key main-glyph="esc" data-code="1"></keyboard-key>
       <dom-repeat items="[[topRowKeys]]" as="key">
         <template>
           <keyboard-key icon="[[key.icon]]" main-glyph="[[key.text]]"></keyboard-key>
@@ -233,133 +233,133 @@
     </div>
 
     <!-- TODO(crbug.com/1207678): Apply glyphs from the backend to the keys. -->
-    <keyboard-key main-glyph="\`"></keyboard-key>
-    <keyboard-key main-glyph="1"></keyboard-key>
-    <keyboard-key main-glyph="2"></keyboard-key>
-    <keyboard-key main-glyph="3"></keyboard-key>
-    <keyboard-key main-glyph="4"></keyboard-key>
-    <keyboard-key main-glyph="5"></keyboard-key>
-    <keyboard-key main-glyph="6"></keyboard-key>
-    <keyboard-key main-glyph="7"></keyboard-key>
-    <keyboard-key main-glyph="8"></keyboard-key>
-    <keyboard-key main-glyph="9"></keyboard-key>
-    <keyboard-key main-glyph="0"></keyboard-key>
-    <keyboard-key main-glyph="-"></keyboard-key>
-    <keyboard-key main-glyph="="></keyboard-key>
+    <keyboard-key main-glyph="\`" data-code="41"></keyboard-key>
+    <keyboard-key main-glyph="1" data-code="2"></keyboard-key>
+    <keyboard-key main-glyph="2" data-code="3"></keyboard-key>
+    <keyboard-key main-glyph="3" data-code="4"></keyboard-key>
+    <keyboard-key main-glyph="4" data-code="5"></keyboard-key>
+    <keyboard-key main-glyph="5" data-code="6"></keyboard-key>
+    <keyboard-key main-glyph="6" data-code="7"></keyboard-key>
+    <keyboard-key main-glyph="7" data-code="8"></keyboard-key>
+    <keyboard-key main-glyph="8" data-code="9"></keyboard-key>
+    <keyboard-key main-glyph="9" data-code="10"></keyboard-key>
+    <keyboard-key main-glyph="0" data-code="11"></keyboard-key>
+    <keyboard-key main-glyph="-" data-code="12"></keyboard-key>
+    <keyboard-key main-glyph="=" data-code="13"></keyboard-key>
     <template is="dom-if" if="[[isEqual_(mechanicalLayout, 'jis')]]">
-      <keyboard-key id="jisYenKey" main-glyph="¥"></keyboard-key>
+      <keyboard-key id="jisYenKey" main-glyph="¥" data-code="124"></keyboard-key>
     </template>
-    <keyboard-key id="backspaceKey" class="right" main-glyph="backspace"></keyboard-key>
+    <keyboard-key id="backspaceKey" class="right" main-glyph="backspace" data-code="14"></keyboard-key>
 
-    <keyboard-key id="tabKey" class="left" main-glyph="tab"></keyboard-key>
-    <keyboard-key main-glyph="q"></keyboard-key>
-    <keyboard-key main-glyph="w"></keyboard-key>
-    <keyboard-key main-glyph="e"></keyboard-key>
-    <keyboard-key main-glyph="r"></keyboard-key>
-    <keyboard-key main-glyph="t"></keyboard-key>
-    <keyboard-key main-glyph="y"></keyboard-key>
-    <keyboard-key main-glyph="u"></keyboard-key>
-    <keyboard-key main-glyph="i"></keyboard-key>
-    <keyboard-key main-glyph="o"></keyboard-key>
-    <keyboard-key main-glyph="p"></keyboard-key>
-    <keyboard-key main-glyph="["></keyboard-key>
-    <keyboard-key main-glyph="]"></keyboard-key>
-    <keyboard-key id="backslashKey" main-glyph="\\"></keyboard-key>
+    <keyboard-key id="tabKey" class="left" main-glyph="tab" data-code="15"></keyboard-key>
+    <keyboard-key main-glyph="q" data-code="16"></keyboard-key>
+    <keyboard-key main-glyph="w" data-code="17"></keyboard-key>
+    <keyboard-key main-glyph="e" data-code="18"></keyboard-key>
+    <keyboard-key main-glyph="r" data-code="19"></keyboard-key>
+    <keyboard-key main-glyph="t" data-code="20"></keyboard-key>
+    <keyboard-key main-glyph="y" data-code="21"></keyboard-key>
+    <keyboard-key main-glyph="u" data-code="22"></keyboard-key>
+    <keyboard-key main-glyph="i" data-code="23"></keyboard-key>
+    <keyboard-key main-glyph="o" data-code="24"></keyboard-key>
+    <keyboard-key main-glyph="p" data-code="25"></keyboard-key>
+    <keyboard-key main-glyph="[" data-code="26"></keyboard-key>
+    <keyboard-key main-glyph="]" data-code="27"></keyboard-key>
+    <keyboard-key id="backslashKey" main-glyph="\\" data-code="43"></keyboard-key>
 
-    <keyboard-key id="launcherKey" class="left" icon="keyboard:launcher"></keyboard-key>
-    <keyboard-key main-glyph="a"></keyboard-key>
-    <keyboard-key main-glyph="s"></keyboard-key>
-    <keyboard-key main-glyph="d"></keyboard-key>
-    <keyboard-key main-glyph="f"></keyboard-key>
-    <keyboard-key main-glyph="g"></keyboard-key>
-    <keyboard-key main-glyph="h"></keyboard-key>
-    <keyboard-key main-glyph="j"></keyboard-key>
-    <keyboard-key main-glyph="k"></keyboard-key>
-    <keyboard-key main-glyph="l"></keyboard-key>
-    <keyboard-key main-glyph=";"></keyboard-key>
-    <keyboard-key main-glyph="'"></keyboard-key>
-    <keyboard-key id="enterKey" class="right" main-glyph="enter"></keyboard-key>
-    <keyboard-key id="enterKeyLowerPart" main-glyph=""></keyboard-key>
+    <keyboard-key id="launcherKey" class="left" icon="keyboard:launcher" data-code="125"></keyboard-key>
+    <keyboard-key main-glyph="a" data-code="30"></keyboard-key>
+    <keyboard-key main-glyph="s" data-code="31"></keyboard-key>
+    <keyboard-key main-glyph="d" data-code="32"></keyboard-key>
+    <keyboard-key main-glyph="f" data-code="33"></keyboard-key>
+    <keyboard-key main-glyph="g" data-code="34"></keyboard-key>
+    <keyboard-key main-glyph="h" data-code="35"></keyboard-key>
+    <keyboard-key main-glyph="j" data-code="36"></keyboard-key>
+    <keyboard-key main-glyph="k" data-code="37"></keyboard-key>
+    <keyboard-key main-glyph="l" data-code="38"></keyboard-key>
+    <keyboard-key main-glyph=";" data-code="39"></keyboard-key>
+    <keyboard-key main-glyph="'" data-code="40"></keyboard-key>
+    <keyboard-key id="enterKey" class="right" main-glyph="enter" data-code="28"></keyboard-key>
+    <keyboard-key id="enterKeyLowerPart" main-glyph="" data-code="28"></keyboard-key>
 
-    <keyboard-key id="leftShiftKey" class="left" main-glyph="shift"></keyboard-key>
+    <keyboard-key id="leftShiftKey" class="left" main-glyph="shift" data-code="42"></keyboard-key>
     <template is="dom-if" if="[[isEqual_(mechanicalLayout, 'iso')]]">
-      <keyboard-key id="isoKey" main-glyph="&lt;"></keyboard-key>
+      <keyboard-key id="isoKey" main-glyph="&lt;" data-code="86"></keyboard-key>
     </template>
-    <keyboard-key main-glyph="z"></keyboard-key>
-    <keyboard-key main-glyph="x"></keyboard-key>
-    <keyboard-key main-glyph="c"></keyboard-key>
-    <keyboard-key main-glyph="v"></keyboard-key>
-    <keyboard-key main-glyph="b"></keyboard-key>
-    <keyboard-key main-glyph="n"></keyboard-key>
-    <keyboard-key main-glyph="m"></keyboard-key>
-    <keyboard-key main-glyph=","></keyboard-key>
-    <keyboard-key main-glyph="."></keyboard-key>
-    <keyboard-key main-glyph="/"></keyboard-key>
+    <keyboard-key main-glyph="z" data-code="44"></keyboard-key>
+    <keyboard-key main-glyph="x" data-code="45"></keyboard-key>
+    <keyboard-key main-glyph="c" data-code="46"></keyboard-key>
+    <keyboard-key main-glyph="v" data-code="47"></keyboard-key>
+    <keyboard-key main-glyph="b" data-code="48"></keyboard-key>
+    <keyboard-key main-glyph="n" data-code="49"></keyboard-key>
+    <keyboard-key main-glyph="m" data-code="50"></keyboard-key>
+    <keyboard-key main-glyph="," data-code="51"></keyboard-key>
+    <keyboard-key main-glyph="." data-code="52"></keyboard-key>
+    <keyboard-key main-glyph="/" data-code="53"></keyboard-key>
     <template is="dom-if" if="[[isEqual_(mechanicalLayout, 'jis')]]">
-      <keyboard-key id="jisBackslashKey" main-glyph="\\"></keyboard-key>
+      <keyboard-key id="jisBackslashKey" main-glyph="\\" data-code="89"></keyboard-key>
     </template>
-    <keyboard-key id="rightShiftKey" class="right" main-glyph="shift"></keyboard-key>
+    <keyboard-key id="rightShiftKey" class="right" main-glyph="shift" data-code="54"></keyboard-key>
 
-    <keyboard-key id="leftCtrlKey" class="left" main-glyph="ctrl"></keyboard-key>
+    <keyboard-key id="leftCtrlKey" class="left" main-glyph="ctrl" data-code="29"></keyboard-key>
     <template is="dom-if" if="[[showFnAndGlobeKeys_]]">
       <keyboard-key id="fnKey" class="disabled" main-glyph="fn"></keyboard-key>
-      <keyboard-key id="layoutSwitchKey" icon="keyboard:layout-switch"></keyboard-key>
+      <keyboard-key id="layoutSwitchKey" icon="keyboard:layout-switch" data-code="584"></keyboard-key>
     </template>
     <template is="dom-if" if="[[showAssistantKey]]">
-      <keyboard-key icon="keyboard:assistant"></keyboard-key>
+      <keyboard-key icon="keyboard:assistant" data-code="583"></keyboard-key>
     </template>
-    <keyboard-key id="leftAltKey" class="left" main-glyph="alt"></keyboard-key>
+    <keyboard-key id="leftAltKey" class="left" main-glyph="alt" data-code="56"></keyboard-key>
     <template is="dom-if" if="[[isEqual_(mechanicalLayout, 'jis')]]">
-      <keyboard-key id="jisAlphanumericKey" main-glyph="英数"></keyboard-key>
+      <keyboard-key id="jisAlphanumericKey" main-glyph="英数" data-code="94"></keyboard-key>
     </template>
-    <keyboard-key id="spacebar" main-glyph=""></keyboard-key>
+    <keyboard-key id="spacebar" main-glyph="" data-code="57"></keyboard-key>
     <template is="dom-if" if="[[isEqual_(mechanicalLayout, 'jis')]]">
-      <keyboard-key id="jisKanaKey" main-glyph="かな"></keyboard-key>
+      <keyboard-key id="jisKanaKey" main-glyph="かな" data-code="92"></keyboard-key>
     </template>
-    <keyboard-key id="rightAltKey" main-glyph="alt"></keyboard-key>
-    <keyboard-key id="rightCtrlKey" main-glyph="ctrl"></keyboard-key>
+    <keyboard-key id="rightAltKey" main-glyph="alt" data-code="100"></keyboard-key>
+    <keyboard-key id="rightCtrlKey" main-glyph="ctrl" data-code="97"></keyboard-key>
 
     <div id="arrowKeyCluster">
       <template is="dom-if"
           if="[[isEqual_(physicalLayout, 'dell-enterprise-wilco')]]">
-        <keyboard-key id="dellPageUpKey" main-glyph="pg up"></keyboard-key>
+        <keyboard-key id="dellPageUpKey" main-glyph="pg up" data-code="104"></keyboard-key>
       </template>
-      <keyboard-key id="upArrow" icon="keyboard:arrow-up"></keyboard-key>
+      <keyboard-key id="upArrow" icon="keyboard:arrow-up" data-code="103"></keyboard-key>
       <template is="dom-if"
           if="[[isEqual_(physicalLayout, 'dell-enterprise-wilco')]]">
-        <keyboard-key id="dellPageDownKey" main-glyph="pg dn"></keyboard-key>
+        <keyboard-key id="dellPageDownKey" main-glyph="pg dn" data-code="109"></keyboard-key>
       </template>
-      <keyboard-key icon="keyboard:arrow-left"></keyboard-key>
-      <keyboard-key icon="keyboard:arrow-down"></keyboard-key>
-      <keyboard-key icon="keyboard:arrow-right"></keyboard-key>
+      <keyboard-key icon="keyboard:arrow-left" data-code="105"></keyboard-key>
+      <keyboard-key icon="keyboard:arrow-down" data-code="108"></keyboard-key>
+      <keyboard-key icon="keyboard:arrow-right" data-code="106"></keyboard-key>
     </div>
   </div>
   <div id="numberPad">
-    <keyboard-key main-glyph="page up"></keyboard-key>
-    <keyboard-key main-glyph="page dn"></keyboard-key>
-    <keyboard-key main-glyph="home"></keyboard-key>
-    <keyboard-key main-glyph="end"></keyboard-key>
+    <keyboard-key main-glyph="page up" data-code="104"></keyboard-key>
+    <keyboard-key main-glyph="page dn" data-code="109"></keyboard-key>
+    <keyboard-key main-glyph="home" data-code="102"></keyboard-key>
+    <keyboard-key main-glyph="end" data-code="107"></keyboard-key>
 
-    <keyboard-key main-glyph="delete"></keyboard-key>
-    <keyboard-key main-glyph="/"></keyboard-key>
-    <keyboard-key main-glyph="*"></keyboard-key>
-    <keyboard-key main-glyph="-"></keyboard-key>
+    <keyboard-key main-glyph="delete" data-code="111"></keyboard-key>
+    <keyboard-key main-glyph="/" data-code="98"></keyboard-key>
+    <keyboard-key main-glyph="*" data-code="55"></keyboard-key>
+    <keyboard-key main-glyph="-" data-code="74"></keyboard-key>
 
-    <keyboard-key main-glyph="7"></keyboard-key>
-    <keyboard-key main-glyph="8"></keyboard-key>
-    <keyboard-key main-glyph="9"></keyboard-key>
-    <keyboard-key class="double-height" main-glyph="+"></keyboard-key>
+    <keyboard-key main-glyph="7" data-code="71"></keyboard-key>
+    <keyboard-key main-glyph="8" data-code="72"></keyboard-key>
+    <keyboard-key main-glyph="9" data-code="73"></keyboard-key>
+    <keyboard-key class="double-height" main-glyph="+" data-code="78"></keyboard-key>
 
-    <keyboard-key main-glyph="4"></keyboard-key>
-    <keyboard-key main-glyph="5"></keyboard-key>
-    <keyboard-key main-glyph="6"></keyboard-key>
+    <keyboard-key main-glyph="4" data-code="75"></keyboard-key>
+    <keyboard-key main-glyph="5" data-code="76"></keyboard-key>
+    <keyboard-key main-glyph="6" data-code="77"></keyboard-key>
 
-    <keyboard-key main-glyph="1"></keyboard-key>
-    <keyboard-key main-glyph="2"></keyboard-key>
-    <keyboard-key main-glyph="3"></keyboard-key>
-    <keyboard-key class="double-height" main-glyph="enter"></keyboard-key>
+    <keyboard-key main-glyph="1" data-code="79"></keyboard-key>
+    <keyboard-key main-glyph="2" data-code="80"></keyboard-key>
+    <keyboard-key main-glyph="3" data-code="81"></keyboard-key>
+    <keyboard-key class="double-height" main-glyph="enter" data-code="96"></keyboard-key>
 
-    <keyboard-key class="double-width" main-glyph="0"></keyboard-key>
-    <keyboard-key main-glyph="."></keyboard-key>
+    <keyboard-key class="double-width" main-glyph="0" data-code="82"></keyboard-key>
+    <keyboard-key main-glyph="." data-code="83"></keyboard-key>
   </div>
 </div>
diff --git a/ash/webui/common/resources/keyboard_diagram.js b/ash/webui/common/resources/keyboard_diagram.js
index dd34747a..e823af5 100644
--- a/ash/webui/common/resources/keyboard_diagram.js
+++ b/ash/webui/common/resources/keyboard_diagram.js
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import './keyboard_key.js';
-
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {KeyboardKeyState} from './keyboard_key.js';
+
 /**
  * @fileoverview
  * 'keyboard-diagram' displays a diagram of a CrOS-style keyboard.
@@ -172,6 +172,38 @@
       this.currentWidth_ = newWidth;
     }
   }
+
+  /**
+   * Set the state of a given key.
+   * @param {number} evdevCode
+   * @param {!KeyboardKeyState} state
+   */
+  setKeyState(evdevCode, state) {
+    const keys = this.root.querySelectorAll(`[data-code="${evdevCode}"]`);
+    if (keys.length === 0) {
+      console.warn(`No keys found for evdev code ${evdevCode}.`);
+      return;
+    }
+    for (const key of keys) {
+      key.state = state;
+    }
+  }
+
+  /**
+   * Set the state of a top row key.
+   * @param {number} topRowPosition The position of the key on the top row,
+   *     where 0 is the first key after escape (which is not counted as part of
+   *     the top row).
+   * @param {!KeyboardKeyState} state
+   */
+  setTopRowKeyState(topRowPosition, state) {
+    if (topRowPosition < 0 || topRowPosition >= this.topRowKeys.length) {
+      throw new RangeError(
+          `Invalid top row position ${topRowPosition} ` +
+          `> ${this.topRowKeys.length}`);
+    }
+    this.$.topRow.children[topRowPosition + 1].state = state;
+  }
 }
 
 customElements.define(KeyboardDiagramElement.is, KeyboardDiagramElement);
diff --git a/ash/webui/common/resources/keyboard_key.html b/ash/webui/common/resources/keyboard_key.html
index 9e88404..e29013b9 100644
--- a/ash/webui/common/resources/keyboard_key.html
+++ b/ash/webui/common/resources/keyboard_key.html
@@ -2,6 +2,7 @@
   :root {
     --background-color-pressed: hsl(214deg 82% 51%);
     --background-color-unpressed: hsl(218deg 92% 95%);
+    --background-color-tested: hsl(214deg 82% 85%);
     --border-color: hsl(214deg 82% 51%);
     --border-radius:
         var(--keyboard-key-top-radii, 3px)
@@ -70,17 +71,21 @@
    * TODO(crbug.com/1207678): Apply this styling when the key is pressed,
    * instead of on hover.
    */
-  :host(:hover) #foreground {
+  :host([state='pressed']) #foreground {
     background-color: var(--background-color-pressed);
     bottom: 0;
     color: var(--foreground-color-pressed);
     top: var(--travel);
   }
 
-  :host(:hover) iron-icon {
+  :host([state='pressed']) iron-icon {
     --iron-icon-fill-color: var(--foreground-color-pressed);
   }
 
+  :host([state='tested']) #foreground {
+    background-color: var(--background-color-tested);
+  }
+
   #background {
     background-color: var(--border-color);
     border-radius: var(--border-radius);
@@ -100,6 +105,27 @@
   :host(.disabled) #background {
     background-color: hsl(0deg 0% 59%);
   }
+
+  @media (prefers-color-scheme: dark) {
+    :root {
+      --background-color-pressed: hsl(217deg 87% 76%);
+      --background-color-unpressed: hsl(218deg 20% 32%);
+      --border-color: hsl(217deg 87% 76%);
+      --foreground-color-pressed: hsl(225deg 6% 13%);
+      --foreground-color-unpressed: hsl(217deg 87% 76%);
+    }
+
+    :host(.disabled) #foreground {
+      --foreground-color-unpressed: var(--cros-button-label-color-primary-disabled);
+      background-color: var(--cros-button-background-color-primary-disabled);
+      border-color: var(--cros-button-background-color-primary-disabled);
+      color: var(--foreground-color-unpressed);
+    }
+
+    :host(.disabled) #background {
+      background-color: hsl(192deg 4% 25%);
+    }
+  }
 </style>
 <div id="background"></div>
 <div id="foreground">
diff --git a/ash/webui/common/resources/keyboard_key.js b/ash/webui/common/resources/keyboard_key.js
index 0b273003..ec546f5 100644
--- a/ash/webui/common/resources/keyboard_key.js
+++ b/ash/webui/common/resources/keyboard_key.js
@@ -13,6 +13,19 @@
  * 'keyboard-diagram' component.
  */
 
+/**
+ * Enum of key states.
+ * @enum {string}
+ */
+export const KeyboardKeyState = {
+  /** The key has not been pressed during this test session. */
+  kNotPressed: 'not-pressed',
+  /** The key is currently pressed. */
+  kPressed: 'pressed',
+  /** The key is not currently pressed, but we've seen it pressed previously. */
+  kTested: 'tested',
+};
+
 export class KeyboardKeyElement extends PolymerElement {
   static get is() {
     return 'keyboard-key';
@@ -36,6 +49,16 @@
        * @type {?string}
        */
       icon: String,
+
+      /**
+       * The state to display the key in.
+       * @type {!KeyboardKeyState}
+       */
+      state: {
+        type: String,
+        value: KeyboardKeyState.kNotPressed,
+        reflectToAttribute: true,
+      },
     };
   }
 }
diff --git a/ash/webui/diagnostics_ui/backend/BUILD.gn b/ash/webui/diagnostics_ui/backend/BUILD.gn
index 99abf73..6527b935 100644
--- a/ash/webui/diagnostics_ui/backend/BUILD.gn
+++ b/ash/webui/diagnostics_ui/backend/BUILD.gn
@@ -73,6 +73,7 @@
     "//ui/events/ozone/layout",
     "//ui/gfx",
     "//ui/shell_dialogs",
+    "//ui/web_dialogs",
     "//ui/webui",
   ]
 }
@@ -130,6 +131,7 @@
     "//ui/events/ozone/evdev:event_device_info_test_utils",
     "//ui/gfx",
     "//ui/shell_dialogs",
+    "//ui/views:test_support",
     "//ui/webui",
   ]
 }
diff --git a/ash/webui/diagnostics_ui/backend/diagnostics_manager.cc b/ash/webui/diagnostics_ui/backend/diagnostics_manager.cc
index 35a4bec7..69d986f 100644
--- a/ash/webui/diagnostics_ui/backend/diagnostics_manager.cc
+++ b/ash/webui/diagnostics_ui/backend/diagnostics_manager.cc
@@ -4,6 +4,7 @@
 
 #include "ash/webui/diagnostics_ui/backend/diagnostics_manager.h"
 
+#include <ui/aura/window.h>
 #include "ash/constants/ash_features.h"
 #include "ash/webui/diagnostics_ui/backend/input_data_provider.h"
 #include "ash/webui/diagnostics_ui/backend/network_health_provider.h"
@@ -14,19 +15,17 @@
 namespace ash {
 namespace diagnostics {
 
-DiagnosticsManager::DiagnosticsManager(SessionLogHandler* session_log_handler)
+DiagnosticsManager::DiagnosticsManager(SessionLogHandler* session_log_handler,
+                                       content::WebUI* webui)
     : system_data_provider_(std::make_unique<SystemDataProvider>(
           session_log_handler->GetTelemetryLog())),
       system_routine_controller_(std::make_unique<SystemRoutineController>(
-          session_log_handler->GetRoutineLog())) {
+          session_log_handler->GetRoutineLog())),
+      webui_(webui) {
   if (features::IsNetworkingInDiagnosticsAppEnabled()) {
     network_health_provider_ = std::make_unique<NetworkHealthProvider>(
         session_log_handler->GetNetworkingLog());
   }
-
-  if (features::IsInputInDiagnosticsAppEnabled()) {
-    input_data_provider_ = std::make_unique<InputDataProvider>();
-  }
 }
 
 DiagnosticsManager::~DiagnosticsManager() = default;
@@ -45,7 +44,14 @@
   return system_routine_controller_.get();
 }
 
-InputDataProvider* DiagnosticsManager::GetInputDataProvider() const {
+InputDataProvider* DiagnosticsManager::GetInputDataProvider() {
+  // Do not construct the InputDataProvider until it is requested;
+  // performing this in the constructor is too early, and the native
+  // window will not be available.
+  if (features::IsInputInDiagnosticsAppEnabled() && !input_data_provider_) {
+    input_data_provider_ = std::make_unique<InputDataProvider>(
+        webui_->GetWebContents()->GetTopLevelNativeWindow());
+  }
   return input_data_provider_.get();
 }
 
diff --git a/ash/webui/diagnostics_ui/backend/diagnostics_manager.h b/ash/webui/diagnostics_ui/backend/diagnostics_manager.h
index ca7805e..fe39d57 100644
--- a/ash/webui/diagnostics_ui/backend/diagnostics_manager.h
+++ b/ash/webui/diagnostics_ui/backend/diagnostics_manager.h
@@ -7,6 +7,8 @@
 
 #include <memory>
 
+#include "ui/web_dialogs/web_dialog_ui.h"
+
 namespace ash {
 namespace diagnostics {
 
@@ -20,7 +22,8 @@
 // used by the Diagnostics SWA.
 class DiagnosticsManager {
  public:
-  explicit DiagnosticsManager(SessionLogHandler* session_log_handler);
+  DiagnosticsManager(SessionLogHandler* session_log_handler,
+                     content::WebUI* webui);
   ~DiagnosticsManager();
 
   DiagnosticsManager(const DiagnosticsManager&) = delete;
@@ -29,13 +32,14 @@
   NetworkHealthProvider* GetNetworkHealthProvider() const;
   SystemDataProvider* GetSystemDataProvider() const;
   SystemRoutineController* GetSystemRoutineController() const;
-  InputDataProvider* GetInputDataProvider() const;
+  InputDataProvider* GetInputDataProvider();
 
  private:
   std::unique_ptr<NetworkHealthProvider> network_health_provider_;
   std::unique_ptr<SystemDataProvider> system_data_provider_;
   std::unique_ptr<SystemRoutineController> system_routine_controller_;
   std::unique_ptr<InputDataProvider> input_data_provider_;
+  content::WebUI* webui_;
 };
 
 }  // namespace diagnostics
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider.cc b/ash/webui/diagnostics_ui/backend/input_data_provider.cc
index 7dfe99c1..f425a30 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider.cc
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider.cc
@@ -8,23 +8,16 @@
 #include <linux/input.h>
 #include <vector>
 
-#include "ash/constants/ash_switches.h"
-#include "base/command_line.h"
-#include "base/files/scoped_file.h"
 #include "base/logging.h"
+#include "base/message_loop/message_pump_for_ui.h"
 #include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "chromeos/system/statistics_provider.h"
+#include "base/strings/stringprintf.h"
+#include "base/task/current_thread.h"
 #include "ui/base/ime/ash/input_method_manager.h"
 #include "ui/events/devices/device_util_linux.h"
 #include "ui/events/devices/input_device.h"
-#include "ui/events/event_constants.h"
 #include "ui/events/keycodes/dom/keycode_converter.h"
-#include "ui/events/ozone/evdev/event_device_info.h"
 
 namespace ash {
 namespace diagnostics {
@@ -49,8 +42,166 @@
            !device_info->event_device_info.HasStylus()));
 }
 
+const int kKeyReleaseValue = 0;
+
 }  // namespace
 
+// Class for dispatching relevant events from evdev to the input_data_provider.
+// While it would be nice to re-use EventConverterEvdevImpl for this purpose,
+// it has a lot of connections (ui::Cursor, full ui::DeviceEventDispatcherEvdev
+// interface) that take more room to stub out rather than just implementing
+// another evdev FdWatcher from scratch.
+class InputDataEventWatcherImpl : public InputDataEventWatcher,
+                                  base::MessagePumpForUI::FdWatcher {
+ public:
+  InputDataEventWatcherImpl(
+      uint32_t id,
+      base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher);
+  ~InputDataEventWatcherImpl() override;
+  void ConvertKeyEvent(uint32_t key_code,
+                       uint32_t key_state,
+                       uint32_t scan_code);
+  void ProcessEvent(const input_event& input);
+  void Start();
+  void Stop();
+
+ protected:
+  // base::MessagePumpForUI::FdWatcher:
+  void OnFileCanReadWithoutBlocking(int fd) override;
+  void OnFileCanWriteWithoutBlocking(int fd) override;
+
+  // Device id
+  const uint32_t id_;
+
+  // Path to input device.
+  const base::FilePath path_;
+
+  // File descriptor to read.
+  const int fd_;
+
+  // Scoped auto-closer for FD.
+  const base::ScopedFD input_device_fd_;
+
+  // Whether we're polling for input on the device.
+  bool watching_ = false;
+
+  // EV_ information pending for SYN_REPORT to dispatch.
+  uint32_t pending_scan_code_;
+  uint32_t pending_key_code_;
+  uint32_t pending_key_state_;
+
+  base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher_;
+
+  // Controller for watching the input fd.
+  base::MessagePumpForUI::FdWatchController controller_;
+};
+
+class InputDataEventWatcherFactoryImpl : public InputDataEventWatcher::Factory {
+ public:
+  InputDataEventWatcherFactoryImpl() = default;
+  InputDataEventWatcherFactoryImpl(const InputDataEventWatcherFactoryImpl&) =
+      delete;
+  InputDataEventWatcherFactoryImpl& operator=(
+      const InputDataEventWatcherFactoryImpl&) = delete;
+  ~InputDataEventWatcherFactoryImpl() override = default;
+
+  std::unique_ptr<InputDataEventWatcher> MakeWatcher(
+      uint32_t id,
+      base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher) override {
+    return std::make_unique<InputDataEventWatcherImpl>(id,
+                                                       std::move(dispatcher));
+  }
+};
+
+InputDataEventWatcher::~InputDataEventWatcher() = default;
+InputDataEventWatcher::Factory::~Factory() = default;
+
+InputDataEventWatcherImpl::InputDataEventWatcherImpl(
+    uint32_t id,
+    base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher)
+    : id_(id),
+      path_(base::FilePath(base::StringPrintf("/dev/input/event%d", id_))),
+      fd_(open(path_.value().c_str(), O_RDWR | O_NONBLOCK)),
+      input_device_fd_(fd_),
+      dispatcher_(dispatcher),
+      controller_(FROM_HERE) {
+  if (fd_ == -1) {
+    PLOG(ERROR) << "Unable to open event device " << id_
+                << ", not forwarding events for input diagnostics.";
+    // Leave un-Started(), so we never enable the fd watcher.
+    return;
+  }
+
+  Start();
+}
+
+InputDataEventWatcherImpl::~InputDataEventWatcherImpl() = default;
+
+void InputDataEventWatcherImpl::Start() {
+  base::CurrentUIThread::Get()->WatchFileDescriptor(
+      fd_, true, base::MessagePumpForUI::WATCH_READ, &controller_, this);
+  watching_ = true;
+}
+
+void InputDataEventWatcherImpl::Stop() {
+  controller_.StopWatchingFileDescriptor();
+  watching_ = false;
+}
+
+void InputDataEventWatcherImpl::OnFileCanReadWithoutBlocking(int fd) {
+  while (true) {
+    input_event input;
+    ssize_t read_size = read(fd, &input, sizeof(input));
+    if (read_size != sizeof(input)) {
+      if (errno == EINTR || errno == EAGAIN)
+        return;
+      if (errno != ENODEV)
+        PLOG(ERROR) << "error reading device " << path_.value();
+      Stop();
+      return;
+    }
+
+    ProcessEvent(input);
+  }
+}
+
+void InputDataEventWatcherImpl::OnFileCanWriteWithoutBlocking(int fd) {}
+
+// Once we have an entire keypress/release, dispatch it.
+void InputDataEventWatcherImpl::ConvertKeyEvent(uint32_t key_code,
+                                                uint32_t key_state,
+                                                uint32_t scan_code) {
+  bool down = key_state != kKeyReleaseValue;
+  if (dispatcher_)
+    dispatcher_->SendInputKeyEvent(id_, key_code, scan_code, down);
+}
+
+// Process evdev event structures directly from the kernel.
+void InputDataEventWatcherImpl::ProcessEvent(const input_event& input) {
+  // Accumulate relevant data about an event until a SYN_REPORT event releases
+  // the full report. For more information, see kernel documentation for
+  // input/event-codes.rst.
+  switch (input.type) {
+    case EV_MSC:
+      if (input.code == MSC_SCAN)
+        pending_scan_code_ = input.value;
+      break;
+    case EV_KEY:
+      pending_key_code_ = input.code;
+      pending_key_state_ = input.value;
+      break;
+    case EV_SYN:
+      if (input.code == SYN_REPORT)
+        ConvertKeyEvent(pending_key_code_, pending_key_state_,
+                        pending_scan_code_);
+
+      pending_key_code_ = 0;
+      pending_key_state_ = 0;
+      pending_scan_code_ = 0;
+      break;
+  }
+}
+
 // All blockings calls for identifying hardware need to go here: both
 // EventDeviceInfo::Initialize and ui::GetInputPathInSys can block in
 // base::MakeAbsoluteFilePath.
@@ -59,14 +210,14 @@
     base::FilePath path) {
   base::ScopedFD fd(open(path.value().c_str(), O_RDWR | O_NONBLOCK));
   if (fd.get() < 0) {
-    LOG(ERROR) << "Couldn't open device path " << path;
+    PLOG(ERROR) << "Couldn't open device path " << path << ".";
     return nullptr;
   }
 
   auto info = std::make_unique<InputDeviceInformation>();
 
   if (!info->event_device_info.Initialize(fd.get(), path)) {
-    LOG(ERROR) << "Failed to get device info for " << path;
+    LOG(ERROR) << "Failed to get device info for " << path << ".";
     return nullptr;
   }
 
@@ -91,19 +242,24 @@
   return info;
 }
 
-InputDataProvider::InputDataProvider()
-    : device_manager_(ui::CreateDeviceManager()) {
-  Initialize();
+InputDataProvider::InputDataProvider(aura::Window* window)
+    : device_manager_(ui::CreateDeviceManager()),
+      watcher_factory_(std::make_unique<InputDataEventWatcherFactoryImpl>()) {
+  Initialize(window);
 }
 
 InputDataProvider::InputDataProvider(
-    std::unique_ptr<ui::DeviceManager> device_manager_for_test)
-    : device_manager_(std::move(device_manager_for_test)) {
-  Initialize();
+    aura::Window* window,
+    std::unique_ptr<ui::DeviceManager> device_manager_for_test,
+    std::unique_ptr<InputDataEventWatcher::Factory> watcher_factory)
+    : device_manager_(std::move(device_manager_for_test)),
+      watcher_factory_(std::move(watcher_factory)) {
+  Initialize(window);
 }
 
 InputDataProvider::~InputDataProvider() {
   device_manager_->RemoveObserver(this);
+  widget_->RemoveObserver(this);
 }
 
 // static
@@ -121,9 +277,15 @@
   }
 }
 
-void InputDataProvider::Initialize() {
+void InputDataProvider::Initialize(aura::Window* window) {
+  // Window and widget are needed for security enforcement.
+  CHECK(window);
+  widget_ = views::Widget::GetWidgetForNativeWindow(window);
+  CHECK(widget_);
   device_manager_->AddObserver(this);
   device_manager_->ScanDevices(this);
+  widget_->AddObserver(this);
+  UpdateMaySendEvents();
 }
 
 void InputDataProvider::BindInterface(
@@ -174,12 +336,135 @@
     GetKeyboardVisualLayoutCallback callback) {
   if (!keyboards_.contains(id)) {
     LOG(ERROR) << "Couldn't find keyboard with ID " << id
-               << "when retrieving visual layout.";
+               << " when retrieving visual layout.";
     return;
   }
 
-  keyboard_helper_.GetKeyboardVisualLayout(keyboards_[id]->Clone(),
-                                           std::move(callback));
+  keyboard_helper_.GetKeyboardVisualLayout(keyboards_[id], std::move(callback));
+}
+
+void InputDataProvider::OnWidgetVisibilityChanged(views::Widget* widget,
+                                                  bool visible) {
+  UpdateEventObservers();
+}
+
+void InputDataProvider::OnWidgetActivationChanged(views::Widget* widget,
+                                                  bool active) {
+  UpdateEventObservers();
+}
+
+void InputDataProvider::UpdateMaySendEvents() {
+  const bool widget_open = !widget_->IsClosed();
+  const bool widget_active = widget_->IsActive();
+  const bool widget_visible = widget_->IsVisible();
+
+  may_send_events_ = widget_open && widget_visible && widget_active;
+}
+
+void InputDataProvider::UpdateEventObservers() {
+  const bool previous = may_send_events_;
+  UpdateMaySendEvents();
+
+  if (previous != may_send_events_) {
+    if (!may_send_events_)
+      SendPauseEvents();
+    else
+      SendResumeEvents();
+  }
+}
+
+void InputDataProvider::ForwardKeyboardInput(uint32_t id) {
+  if (!keyboards_.contains(id)) {
+    LOG(ERROR) << "Couldn't find keyboard with ID " << id
+               << " when trying to forward input.";
+    return;
+  }
+
+  keyboard_watchers_[id] =
+      watcher_factory_->MakeWatcher(id, weak_factory_.GetWeakPtr());
+}
+
+void InputDataProvider::UnforwardKeyboardInput(uint32_t id) {
+  if (!keyboards_.contains(id)) {
+    LOG(ERROR) << "Couldn't find keyboard with ID " << id
+               << " when trying to unforward input.";
+  }
+  if (!keyboard_watchers_.erase(id)) {
+    LOG(ERROR) << "Couldn't find keyboard watcher with ID " << id
+               << " when trying to unforward input.";
+  }
+}
+
+void InputDataProvider::OnObservedKeyboardInputDisconnect(
+    uint32_t id,
+    mojo::RemoteSetElementId) {
+  if (!keyboard_observers_.contains(id)) {
+    LOG(ERROR) << "received keyboard observer disconnect for ID " << id
+               << " without observer.";
+    return;
+  }
+
+  // When the last observer has been disconnected, stop forwarding events.
+  if (keyboard_observers_[id]->empty()) {
+    UnforwardKeyboardInput(id);
+
+    // The observer RemoteSet remains empty at this point; if a new
+    // observer comes in, we will Forward it again.
+  }
+}
+
+void InputDataProvider::ObserveKeyEvents(
+    uint32_t id,
+    mojo::PendingRemote<mojom::KeyboardObserver> observer) {
+  CHECK(widget_) << "Observing Key Events for input diagnostics not allowed "
+                    "without widget to track focus.";
+
+  if (!keyboards_.contains(id)) {
+    LOG(ERROR) << "Couldn't find keyboard with ID " << id
+               << " when trying to receive input.";
+    return;
+  }
+
+  // When keyboard observer remote set is constructed, establish the disconnect
+  // handler.
+  if (!keyboard_observers_.contains(id)) {
+    keyboard_observers_[id] =
+        std::make_unique<mojo::RemoteSet<mojom::KeyboardObserver>>();
+    keyboard_observers_[id]->set_disconnect_handler(base::BindRepeating(
+        &InputDataProvider::OnObservedKeyboardInputDisconnect,
+        base::Unretained(this), id));
+  }
+
+  auto& observers = *keyboard_observers_[id];
+
+  const auto observer_id = observers.Add(std::move(observer));
+
+  // Ensure first callback is 'Paused' if we do not currently have focus
+  if (!may_send_events_)
+    observers.Get(observer_id)->OnKeyEventsPaused();
+
+  // When we are adding the first observer, start forwarding events.
+  if (observers.size() == 1)
+    ForwardKeyboardInput(id);
+}
+
+void InputDataProvider::SendPauseEvents() {
+  for (const auto& keyboard : keyboard_observers_) {
+    for (const auto& observer : *keyboard.second) {
+      observer->OnKeyEventsPaused();
+    }
+  }
+
+  // Re-arm our log message for future events.
+  logged_not_dispatching_key_events_ = false;
+}
+
+void InputDataProvider::SendResumeEvents() {
+  for (const auto& keyboard : keyboard_observers_) {
+    for (const auto& observer : *keyboard.second) {
+      observer->OnKeyEventsResumed();
+    }
+  }
 }
 
 void InputDataProvider::OnDeviceEvent(const ui::DeviceEvent& event) {
@@ -203,13 +488,21 @@
   } else {
     DCHECK(event.action_type() == ui::DeviceEvent::ActionType::REMOVE);
     if (keyboards_.contains(id)) {
+      if (keyboard_observers_.erase(id)) {
+        // Unref'ing the observers does not trigger their
+        // OnObservedKeyboardInputDisconnect handlers (which would normally
+        // clean up any watchers), so we must explicitly release the watchers
+        // here.
+        keyboard_watchers_.erase(id);
+      }
       keyboards_.erase(id);
-      for (auto& observer : connected_devices_observers_) {
+      keyboard_aux_data_.erase(id);
+      for (const auto& observer : connected_devices_observers_) {
         observer->OnKeyboardDisconnected(id);
       }
     } else if (touch_devices_.contains(id)) {
       touch_devices_.erase(id);
-      for (auto& observer : connected_devices_observers_) {
+      for (const auto& observer : connected_devices_observers_) {
         observer->OnTouchDeviceDisconnected(id);
       }
     }
@@ -237,20 +530,56 @@
   touch_devices_[device_info->evdev_id] =
       touch_helper_.ConstructTouchDevice(device_info);
 
-  for (auto& observer : connected_devices_observers_) {
+  for (const auto& observer : connected_devices_observers_) {
     observer->OnTouchDeviceConnected(
         touch_devices_[device_info->evdev_id]->Clone());
   }
 }
 
 void InputDataProvider::AddKeyboard(const InputDeviceInformation* device_info) {
-  keyboards_[device_info->evdev_id] =
-      keyboard_helper_.ConstructKeyboard(device_info);
+  auto aux_data = std::make_unique<InputDataProviderKeyboard::AuxData>();
 
-  for (auto& observer : connected_devices_observers_) {
+  keyboards_[device_info->evdev_id] =
+      keyboard_helper_.ConstructKeyboard(device_info, aux_data.get());
+  keyboard_aux_data_[device_info->evdev_id] = std::move(aux_data);
+
+  for (const auto& observer : connected_devices_observers_) {
     observer->OnKeyboardConnected(keyboards_[device_info->evdev_id]->Clone());
   }
 }
 
+void InputDataProvider::SendInputKeyEvent(uint32_t id,
+                                          uint32_t key_code,
+                                          uint32_t scan_code,
+                                          bool down) {
+  CHECK(widget_) << "Sending Key Events for input diagnostics not allowed "
+                    "without widget to track focus.";
+
+  if (!keyboard_observers_.contains(id)) {
+    LOG(ERROR) << "Couldn't find keyboard observer with ID " << id
+               << " when trying to dispatch key.";
+    return;
+  }
+
+  if (!may_send_events_) {
+    if (!logged_not_dispatching_key_events_) {
+      // Note: this will be common if the input diagnostics window is opened,
+      // but not focused, so just log once.
+      LOG(ERROR) << "Will not dispatch keys when diagnostics window does not "
+                    "have focus.";
+      logged_not_dispatching_key_events_ = true;
+    }
+    return;
+  }
+
+  mojom::KeyEventPtr event = keyboard_helper_.ConstructInputKeyEvent(
+      keyboards_[id], keyboard_aux_data_[id].get(), key_code, scan_code, down);
+
+  const auto& observers = *keyboard_observers_[id];
+  for (const auto& observer : observers) {
+    observer->OnKeyEvent(event->Clone());
+  }
+}
+
 }  // namespace diagnostics
 }  // namespace ash
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider.h b/ash/webui/diagnostics_ui/backend/input_data_provider.h
index 3c57eeb..4d43827 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider.h
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider.h
@@ -18,15 +18,41 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
-#include "ui/chromeos/events/event_rewriter_chromeos.h"
+#include "ui/aura/window.h"
 #include "ui/events/ozone/device/device_event.h"
 #include "ui/events/ozone/device/device_event_observer.h"
 #include "ui/events/ozone/device/device_manager.h"
 #include "ui/events/ozone/evdev/event_device_info.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
 
 namespace ash {
 namespace diagnostics {
 
+// Interfaces for watching and dispatching relevant events from evdev to the
+// input_data_provider.
+class InputDataEventWatcher {
+ public:
+  class Dispatcher {
+   public:
+    virtual void SendInputKeyEvent(uint32_t id,
+                                   uint32_t key_code,
+                                   uint32_t scan_code,
+                                   bool down) = 0;
+  };
+
+  class Factory {
+   public:
+    virtual ~Factory() = 0;
+
+    virtual std::unique_ptr<InputDataEventWatcher> MakeWatcher(
+        uint32_t evdev_id,
+        base::WeakPtr<Dispatcher> dispatcher) = 0;
+  };
+
+  virtual ~InputDataEventWatcher() = 0;
+};
+
 // Wrapper for tracking several pieces of information about an evdev-backed
 // device.
 class InputDeviceInformation {
@@ -50,7 +76,7 @@
       keyboard_scan_code_map;
 };
 
-// Class for running GetDeviceInfo in its own sequence that can block.
+// Class for running GetDeviceInfo in its own sequence, to allow it to block.
 class InputDeviceInfoHelper {
  public:
   InputDeviceInfoHelper() {}
@@ -62,13 +88,18 @@
 };
 
 // Provides information about input devices connected to the system. Implemented
-// in the browser process and called by the Diagnostics SWA (a renderer
-// process).
+// in the browser process, constructed within the Diagnostics_UI in the browser
+// process, and eventually called by the Diagnostics SWA (a renderer process).
 class InputDataProvider : public mojom::InputDataProvider,
-                          public ui::DeviceEventObserver {
+                          public ui::DeviceEventObserver,
+                          public InputDataEventWatcher::Dispatcher,
+                          public views::WidgetObserver {
  public:
-  InputDataProvider();
-  explicit InputDataProvider(std::unique_ptr<ui::DeviceManager> device_manager);
+  explicit InputDataProvider(aura::Window* window);
+  explicit InputDataProvider(
+      aura::Window* window,
+      std::unique_ptr<ui::DeviceManager> device_manager,
+      std::unique_ptr<InputDataEventWatcher::Factory> watcher_factory);
   InputDataProvider(const InputDataProvider&) = delete;
   InputDataProvider& operator=(const InputDataProvider&) = delete;
   ~InputDataProvider() override;
@@ -78,9 +109,16 @@
   // Handler for when remote attached to |receiver_| disconnects.
   void OnBoundInterfaceDisconnect();
   bool ReceiverIsBound();
+
   static mojom::ConnectionType ConnectionTypeFromInputDeviceType(
       ui::InputDeviceType type);
 
+  // InputDataEventWatcher::Dispatcher:
+  void SendInputKeyEvent(uint32_t id,
+                         uint32_t key_code,
+                         uint32_t scan_code,
+                         bool down) override;
+
   // mojom::InputDataProvider:
   void GetConnectedDevices(GetConnectedDevicesCallback callback) override;
 
@@ -91,34 +129,72 @@
       uint32_t id,
       GetKeyboardVisualLayoutCallback callback) override;
 
+  void ObserveKeyEvents(
+      uint32_t id,
+      mojo::PendingRemote<mojom::KeyboardObserver> observer) override;
+
   // ui::DeviceEventObserver:
   void OnDeviceEvent(const ui::DeviceEvent& event) override;
 
+  // views::WidgetObserver:
+  void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
+  void OnWidgetActivationChanged(views::Widget* widget, bool active) override;
+
  protected:
   base::SequenceBound<InputDeviceInfoHelper> info_helper_{
       base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})};
 
  private:
-  void Initialize();
+  void Initialize(aura::Window* window);
 
   void ProcessDeviceInfo(std::unique_ptr<InputDeviceInformation> device_info);
 
   void AddTouchDevice(const InputDeviceInformation* device_info);
   void AddKeyboard(const InputDeviceInformation* device_info);
 
+  bool may_send_events_ = false;
+
+  // Review widget state to determine whether it is safe to send events.
+  void UpdateMaySendEvents();
+  // Pass on pause or resume events to observers if that state has changed.
+  void UpdateEventObservers();
+
+  void SendPauseEvents();
+  void SendResumeEvents();
+
   InputDataProviderKeyboard keyboard_helper_;
   InputDataProviderTouch touch_helper_;
 
-  // Map by evdev ids to information blocks
+  // Handle destroyed KeyboardObservers.
+  void OnObservedKeyboardInputDisconnect(uint32_t evdev_id,
+                                         mojo::RemoteSetElementId observer_id);
+  // Manage watchers that read an evdev and process events for observers.
+  void ForwardKeyboardInput(uint32_t id);
+  void UnforwardKeyboardInput(uint32_t id);
+
+  // Map by evdev ids to information blocks.
   base::flat_map<int, mojom::KeyboardInfoPtr> keyboards_;
+  base::flat_map<int, std::unique_ptr<InputDataProviderKeyboard::AuxData>>
+      keyboard_aux_data_;
   base::flat_map<int, mojom::TouchDeviceInfoPtr> touch_devices_;
 
+  // Map by evdev ids to remote observers and event watchers.
+  base::flat_map<int, std::unique_ptr<mojo::RemoteSet<mojom::KeyboardObserver>>>
+      keyboard_observers_;
+  base::flat_map<int, std::unique_ptr<InputDataEventWatcher>>
+      keyboard_watchers_;
+
+  bool logged_not_dispatching_key_events_ = false;
+  views::Widget* widget_ = nullptr;
+
   mojo::RemoteSet<mojom::ConnectedDevicesObserver> connected_devices_observers_;
 
   mojo::Receiver<mojom::InputDataProvider> receiver_{this};
 
   std::unique_ptr<ui::DeviceManager> device_manager_;
 
+  std::unique_ptr<InputDataEventWatcher::Factory> watcher_factory_;
+
   base::WeakPtrFactory<InputDataProvider> weak_factory_{this};
 };
 
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.cc b/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.cc
index 3ff6e11..d4ed5498 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.cc
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.cc
@@ -23,7 +23,6 @@
 #include "base/strings/string_util.h"
 #include "chromeos/system/statistics_provider.h"
 #include "ui/base/ime/ash/input_method_manager.h"
-#include "ui/chromeos/events/event_rewriter_chromeos.h"
 #include "ui/events/devices/device_util_linux.h"
 #include "ui/events/devices/input_device.h"
 #include "ui/events/event_constants.h"
@@ -53,16 +52,35 @@
   kFKey15
 };
 
+// Numeric values of evdev KEY_F# are non-contiguous, making this mapping
+// non-trivial.
+constexpr auto kFKeyOrder =
+    base::MakeFixedFlatMap<uint32_t, unsigned int>({{KEY_F1, kFKey1},
+                                                    {KEY_F2, kFKey2},
+                                                    {KEY_F3, kFKey3},
+                                                    {KEY_F4, kFKey4},
+                                                    {KEY_F5, kFKey5},
+                                                    {KEY_F6, kFKey6},
+                                                    {KEY_F7, kFKey7},
+                                                    {KEY_F8, kFKey8},
+                                                    {KEY_F9, kFKey9},
+                                                    {KEY_F10, kFKey10},
+                                                    {KEY_F11, kFKey11},
+                                                    {KEY_F12, kFKey12},
+                                                    {KEY_F13, kFKey13},
+                                                    {KEY_F14, kFKey14},
+                                                    {KEY_F15, kFKey15}});
+
 // Mapping from keyboard scancodes to TopRowKeys (must be in scancode-sorted
-// order). This replicates and should be identical to the mapping behaviour
-// of ChromeOS: changes will be needed if new AT scancodes or HID mappings
-// are used in a top-row key, likely added in
-// ui/events/keycodes/dom/dom_code_data.inc
+// order) for keyboards with custom top row layouts (vivaldi). This replicates
+// and should be identical to the mapping behaviour of ChromeOS: changes will
+// be needed if new AT scancodes or HID mappings are used in a top-row key,
+// likely added in ui/events/keycodes/dom/dom_code_data.inc.
 //
-// Note that there are no dedicated scancodes for kScreenMirror.
-constexpr auto kScancodeMapping =
+// Note that there are currently no dedicated scancodes for kScreenMirror.
+constexpr auto kCustomScancodeMapping =
     base::MakeFixedFlatMap<uint32_t, mojom::TopRowKey>({
-        // Vivaldi extended Set-1 AT-style scancodes
+        // Vivaldi-specific extended Set-1 AT-style scancodes.
         {0x90, mojom::TopRowKey::kPreviousTrack},
         {0x91, mojom::TopRowKey::kFullscreen},
         {0x92, mojom::TopRowKey::kOverview},
@@ -77,7 +95,6 @@
         {0xA0, mojom::TopRowKey::kVolumeMute},
         {0xAE, mojom::TopRowKey::kVolumeDown},
         {0xB0, mojom::TopRowKey::kVolumeUp},
-        {0xD3, mojom::TopRowKey::kDelete},  // Only relevant for Drallion.
         {0xE9, mojom::TopRowKey::kForward},
         {0xEA, mojom::TopRowKey::kBack},
         {0xE7, mojom::TopRowKey::kRefresh},
@@ -164,6 +181,19 @@
     mojom::TopRowKey::kDelete  // Just a normal Delete key, but in the top row.
 };
 
+// Wilco and Drallion have unique 'action' scancodes for their top rows,
+// that are different from the vivaldi mappings. These scancodes are generated
+// when a top-tow key is pressed without the /Fn/ modifier.
+constexpr uint32_t kScancodesWilco[] = {
+    0xEA, 0xE7, 0xD5, 0xD6, 0x95, 0x91, 0xA0,
+    0xAE, 0xB0, 0x44, 0x57, 0x8B, 0xD3,
+};
+
+constexpr uint32_t kScancodesDrallion[] = {
+    0xEA, 0xE7, 0xD5, 0xD6, 0x95, 0x91, 0xA0,
+    0xAE, 0xB0, 0x44, 0x57, 0xd7, 0x8B, 0xD3,
+};
+
 mojom::MechanicalLayout GetSystemMechanicalLayout() {
   chromeos::system::StatisticsProvider* stats_provider =
       chromeos::system::StatisticsProvider::GetInstance();
@@ -203,10 +233,14 @@
     : xkb_layout_engine_(xkb_evdev_codes_) {}
 InputDataProviderKeyboard::~InputDataProviderKeyboard() {}
 
+InputDataProviderKeyboard::AuxData::AuxData() = default;
+InputDataProviderKeyboard::AuxData::~AuxData() = default;
+
 void InputDataProviderKeyboard::GetKeyboardVisualLayout(
-    mojom::KeyboardInfoPtr keyboard,
+    const mojom::KeyboardInfoPtr& keyboard,
     mojom::InputDataProvider::GetKeyboardVisualLayoutCallback callback) {
   std::string layout_name;
+
   if (keyboard->connection_type == mojom::ConnectionType::kInternal) {
     chromeos::system::StatisticsProvider* stats_provider =
         chromeos::system::StatisticsProvider::GetInstance();
@@ -295,24 +329,38 @@
     ui::EventRewriterChromeOS::KeyboardTopRowLayout top_row_layout,
     const base::flat_map<uint32_t, ui::EventRewriterChromeOS::MutableKeyState>&
         scan_code_map,
-    std::vector<mojom::TopRowKey>* out_top_row_keys) {
+    std::vector<mojom::TopRowKey>* out_top_row_keys,
+    AuxData* out_aux_data) {
   ui::InputDevice input_device = device_info->input_device;
 
   // Simple array in physical order from left to right
   std::vector<mojom::TopRowKey> top_row_keys = {};
 
+  // Map of scan-code -> index within tow_row_keys: 0 is first key to the
+  // right of Escape, 1 is next key to the right of it, etc.
+  base::flat_map<uint32_t, uint32_t> top_row_key_scancode_indexes;
+
   switch (top_row_layout) {
     case ui::EventRewriterChromeOS::kKbdTopRowLayoutWilco:
       top_row_keys.assign(std::begin(kSystemKeysWilco),
                           std::end(kSystemKeysWilco));
+
+      for (size_t i = 0; i < top_row_keys.size(); i++)
+        top_row_key_scancode_indexes[kScancodesWilco[i]] = i;
       break;
 
     case ui::EventRewriterChromeOS::kKbdTopRowLayoutDrallion:
       top_row_keys.assign(std::begin(kSystemKeysDrallion),
                           std::end(kSystemKeysDrallion));
 
+      for (size_t i = 0; i < top_row_keys.size(); i++)
+        top_row_key_scancode_indexes[kScancodesDrallion[i]] = i;
+
       // On some Drallion devices, the F12 key is used for the Privacy Screen.
 
+      // The scancode for F12 does not need to be modified, it is the same on
+      // all Drallion devices, only the interpretation of the key is different.
+
       // This should be the same logic as in
       // EventRewriterControllerImpl::Initialize. This is a historic device, and
       // this logic should not need to be updated, as newer devices will use
@@ -328,7 +376,7 @@
 
       // Process scan-code map generated from custom top-row key layout: it maps
       // from physical scan codes to several things, including VKEY key-codes,
-      // which we will use to produce indexes.
+      // which we will use to derive a linear index.
 
       for (auto iter = scan_code_map.begin(); iter != scan_code_map.end();
            iter++) {
@@ -338,27 +386,43 @@
         if (top_row_keys.size() < fn_key_number + 1)
           top_row_keys.resize(fn_key_number + 1, mojom::TopRowKey::kNone);
 
-        if (kScancodeMapping.contains(scancode))
-          top_row_keys[fn_key_number] = kScancodeMapping.at(scancode);
+        if (kCustomScancodeMapping.contains(scancode))
+          top_row_keys[fn_key_number] = kCustomScancodeMapping.at(scancode);
         else
           top_row_keys[fn_key_number] = mojom::TopRowKey::kUnknown;
+
+        top_row_key_scancode_indexes[scancode] = fn_key_number;
       }
       break;
 
     case ui::EventRewriterChromeOS::kKbdTopRowLayout2:
       top_row_keys.assign(std::begin(kSystemKeys2), std::end(kSystemKeys2));
+      // No specific top_row_key_scancode_indexes are needed
+      // for classic ChromeOS keyboards, as they do not have an /Fn/ key and
+      // only emit /F[0-9]+/ keys.
       break;
 
     case ui::EventRewriterChromeOS::kKbdTopRowLayout1:
     default:
       top_row_keys.assign(std::begin(kSystemKeys1), std::end(kSystemKeys1));
+      // No specific top_row_key_scancode_indexes are needed for classic
+      // ChromeOS keyboards, as they do not have an /Fn/ key and only emit
+      // /F[0-9]+/ keys.
+      //
+      // If this is an unknown keyboard and we are just using Layout1 as
+      // the default, we also do not want to assign any scancode or keycode
+      // indexes, as we do not know whether the keyboard can generate special
+      // keys, or their location relative to the top row.
   }
 
   *out_top_row_keys = std::move(top_row_keys);
+  out_aux_data->top_row_key_scancode_indexes =
+      std::move(top_row_key_scancode_indexes);
 }
 
 mojom::KeyboardInfoPtr InputDataProviderKeyboard::ConstructKeyboard(
-    const InputDeviceInformation* device_info) {
+    const InputDeviceInformation* device_info,
+    AuxData* out_aux_data) {
   mojom::KeyboardInfoPtr result = mojom::KeyboardInfo::New();
 
   result->id = device_info->evdev_id;
@@ -370,7 +434,7 @@
 
   ProcessKeyboardTopRowLayout(device_info, device_info->keyboard_top_row_layout,
                               device_info->keyboard_scan_code_map,
-                              &result->top_row_keys);
+                              &result->top_row_keys, out_aux_data);
 
   // Work out the physical layout.
   if (device_info->keyboard_type ==
@@ -439,5 +503,35 @@
   return result;
 }
 
+mojom::KeyEventPtr InputDataProviderKeyboard::ConstructInputKeyEvent(
+    const mojom::KeyboardInfoPtr& keyboard,
+    const AuxData* aux_data,
+    uint32_t key_code,
+    uint32_t scan_code,
+    bool down) {
+  mojom::KeyEventPtr event = mojom::KeyEvent::New();
+  event->id = keyboard->id;
+  event->type =
+      down ? mojom::KeyEventType::kPress : mojom::KeyEventType::kRelease;
+  event->key_code = key_code;    // evdev code
+  event->scan_code = scan_code;  // scan code
+  event->top_row_position = -1;
+
+  // If a top row action key was pressed, note its physical index in the row.
+  const auto iter =
+      aux_data->top_row_key_scancode_indexes.find(event->scan_code);
+  if (iter != aux_data->top_row_key_scancode_indexes.end()) {
+    event->top_row_position = iter->second;
+  }
+
+  // Do the same if F1-F15 was pressed.
+  const auto* jter = kFKeyOrder.find(event->key_code);
+  if (event->top_row_position == -1 && jter != kFKeyOrder.end()) {
+    event->top_row_position = jter->second;
+  }
+
+  return event;
+}
+
 }  // namespace diagnostics
 }  // namespace ash
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.h b/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.h
index cda2dc58..d5437f13 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.h
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider_keyboard.h
@@ -5,10 +5,11 @@
 #ifndef ASH_WEBUI_DIAGNOSTICS_UI_BACKEND_INPUT_DATA_PROVIDER_KEYBOARD_H_
 #define ASH_WEBUI_DIAGNOSTICS_UI_BACKEND_INPUT_DATA_PROVIDER_KEYBOARD_H_
 
+#include <vector>
+
 #include "ash/webui/diagnostics_ui/mojom/input_data_provider.mojom.h"
 #include "base/memory/weak_ptr.h"
 #include "ui/chromeos/events/event_rewriter_chromeos.h"
-#include "ui/events/ozone/evdev/event_device_info.h"
 #include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
 
@@ -21,6 +22,20 @@
 // keyboard-specific logic.
 class InputDataProviderKeyboard {
  public:
+  // Holder for any data that needs to be persisted per keyboard, that
+  // does not need to be exposed in the mojo::KeyboardInfo.
+  class AuxData {
+   public:
+    AuxData();
+    AuxData(const AuxData&) = delete;
+    AuxData& operator=(const AuxData&) = delete;
+    ~AuxData();
+
+    // Map of scancodes that map to particular indexes within the top_row_keys
+    // for that evdev. May contain AT and HID-style scancodes.
+    base::flat_map<uint32_t, uint32_t> top_row_key_scancode_indexes;
+  };
+
   InputDataProviderKeyboard();
   InputDataProviderKeyboard(const InputDataProviderKeyboard&) = delete;
   InputDataProviderKeyboard& operator=(const InputDataProviderKeyboard&) =
@@ -28,11 +43,19 @@
   ~InputDataProviderKeyboard();
 
   void GetKeyboardVisualLayout(
-      mojom::KeyboardInfoPtr keyboard,
+      const mojom::KeyboardInfoPtr& keyboard,
       mojom::InputDataProvider::GetKeyboardVisualLayoutCallback callback);
 
   mojom::KeyboardInfoPtr ConstructKeyboard(
-      const InputDeviceInformation* device_info);
+      const InputDeviceInformation* device_info,
+      AuxData* out_aux_data);
+
+  mojom::KeyEventPtr ConstructInputKeyEvent(
+      const mojom::KeyboardInfoPtr& keyboard,
+      const AuxData* aux_data,
+      uint32_t key_code,
+      uint32_t scan_code,
+      bool down);
 
  private:
   void ProcessXkbLayout(
@@ -45,7 +68,8 @@
       const base::flat_map<uint32_t,
                            ui::EventRewriterChromeOS::MutableKeyState>&
           scan_code_map,
-      std::vector<mojom::TopRowKey>* out_top_row_keys);
+      std::vector<mojom::TopRowKey>* out_top_row_keys,
+      AuxData* out_aux_data);
 
   ui::XkbEvdevCodes xkb_evdev_codes_;
   ui::XkbKeyboardLayoutEngine xkb_layout_engine_;
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider_touch.cc b/ash/webui/diagnostics_ui/backend/input_data_provider_touch.cc
index 48b05e87..854b6f2 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider_touch.cc
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider_touch.cc
@@ -4,7 +4,6 @@
 
 #include "ash/webui/diagnostics_ui/backend/input_data_provider_touch.h"
 #include "ash/webui/diagnostics_ui/backend/input_data_provider.h"
-#include "base/logging.h"
 #include "ui/events/ozone/evdev/event_device_info.h"
 
 namespace ash {
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider_touch.h b/ash/webui/diagnostics_ui/backend/input_data_provider_touch.h
index 5fe7db2..7cf17e4 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider_touch.h
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider_touch.h
@@ -6,7 +6,6 @@
 #define ASH_WEBUI_DIAGNOSTICS_UI_BACKEND_INPUT_DATA_PROVIDER_TOUCH_H_
 
 #include "ash/webui/diagnostics_ui/mojom/input_data_provider.mojom.h"
-#include "ui/events/ozone/evdev/event_device_info.h"
 
 namespace ash {
 namespace diagnostics {
diff --git a/ash/webui/diagnostics_ui/backend/input_data_provider_unittest.cc b/ash/webui/diagnostics_ui/backend/input_data_provider_unittest.cc
index c4eab92..4e7602f 100644
--- a/ash/webui/diagnostics_ui/backend/input_data_provider_unittest.cc
+++ b/ash/webui/diagnostics_ui/backend/input_data_provider_unittest.cc
@@ -4,18 +4,24 @@
 
 #include "ash/webui/diagnostics_ui/backend/input_data_provider.h"
 
+#include <iostream>
+#include <map>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/containers/flat_map.h"
+#include "base/message_loop/message_pump_for_ui.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/test/bind.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "chromeos/system/fake_statistics_provider.h"
 #include "chromeos/system/statistics_provider.h"
+#include "content/public/test/browser_task_environment.h"
 #include "device/udev_linux/fake_udev_loader.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/chromeos/events/event_rewriter_chromeos.h"
 #include "ui/events/keycodes/dom/dom_code.h"
@@ -23,6 +29,16 @@
 #include "ui/events/ozone/device/device_event_observer.h"
 #include "ui/events/ozone/device/device_manager.h"
 #include "ui/events/ozone/evdev/event_device_test_util.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget.h"
+
+// Note: this is not a recommended pattern, but works and allows cleanly
+// formatted invocations for this test set.
+#define EXPECT_KEY_EVENTS(observerptr, id, ...)    \
+  do {                                             \
+    SCOPED_TRACE("EXPECT_KEY_EVENTS invocation");  \
+    ExpectKeyEvents(observerptr, id, __VA_ARGS__); \
+  } while (0);
 
 namespace ash {
 namespace diagnostics {
@@ -96,6 +112,61 @@
 
 constexpr char kInvalidMechnicalLayout[] = "Not ANSI, JIS, or ISO";
 
+// Privacy Screen replaced with unknown 0xC4 scancode.
+constexpr char kModifiedJinlonDescriptor[] =
+    "EA E7 91 92 93 94 95 C4 97 98 A0 AE B0";
+constexpr uint32_t kUnknownScancode = 0xC4;
+constexpr int kUnknownScancodeIndex = 7;
+
+struct KeyDefinition {
+  uint32_t key_code;
+  uint32_t at_scan_code;
+  uint32_t usb_scan_code;
+};
+
+// TODO(b/211780758): we should acquire these tuples from dom_code_data.inc,
+// where feasible.
+constexpr KeyDefinition kKeyA = {KEY_A, 0x1E, 0x70004};
+constexpr KeyDefinition kKeyB = {KEY_B, 0x30, 0x70005};
+constexpr KeyDefinition kKeyEsc = {KEY_ESC, 0x30, 0x70005};
+constexpr KeyDefinition kKeyF1 = {KEY_F1, 0x3B, 0x7003A};
+constexpr KeyDefinition kKeyF8 = {KEY_F8, 0x42, 0x70041};
+constexpr KeyDefinition kKeyF10 = {KEY_F10, 0x44, 0x70043};
+// Drallion AT codes for F11-F12; not standardized
+constexpr KeyDefinition kKeyF11 = {KEY_F11, 0x57, 0x700044};
+constexpr KeyDefinition kKeyF12 = {KEY_F12, 0xD7, 0x700045};
+constexpr KeyDefinition kKeyDelete = {KEY_DELETE, 0xD3, 0x7004C};
+// Eve AT code; unknown if this is standard
+constexpr KeyDefinition kKeyMenu = {KEY_CONTROLPANEL, 0x5D, 0};
+// Jinlon AT code; unknown if this is standard
+constexpr KeyDefinition kKeySleep = {KEY_SLEEP, 0x5D, 0};
+constexpr KeyDefinition kKeyActionBack = {KEY_BACK, 0xEA, 0x0C0224};
+constexpr KeyDefinition kKeyActionRefresh = {KEY_REFRESH, 0xE7, 0x0C0227};
+constexpr KeyDefinition kKeyActionFullscreen = {KEY_ZOOM, 0x91, 0x0C0232};
+constexpr KeyDefinition kKeyActionOverview = {KEY_SCALE, 0x92, 0x0C029F};
+constexpr KeyDefinition kKeyActionScreenshot = {KEY_SYSRQ, 0x93, 0x070046};
+constexpr KeyDefinition kKeyActionScreenBrightnessDown = {KEY_BRIGHTNESSDOWN,
+                                                          0x94, 0x0C0070};
+constexpr KeyDefinition kKeyActionScreenBrightnessUp = {KEY_BRIGHTNESSUP, 0x95,
+                                                        0x0C006F};
+constexpr KeyDefinition kKeyActionKeyboardBrightnessDown = {KEY_KBDILLUMDOWN,
+                                                            0x97, 0x0C007A};
+constexpr KeyDefinition kKeyActionKeyboardBrightnessUp = {KEY_KBDILLUMUP, 0x98,
+                                                          0x0C0079};
+constexpr KeyDefinition kKeyActionKeyboardVolumeMute = {KEY_MUTE, 0xA0,
+                                                        0x0C00E2};
+constexpr KeyDefinition kKeyActionKeyboardVolumeDown = {KEY_VOLUMEDOWN, 0xAE,
+                                                        0x0C00EA};
+constexpr KeyDefinition kKeyActionKeyboardVolumeUp = {KEY_VOLUMEUP, 0xB0,
+                                                      0x0C00E9};
+#if 0
+// TODO(b/208729519): Not useful until we can test Drallion keyboards.
+// Drallion, no HID equivalent
+constexpr KeyDefinition kKeySwitchVideoMode = {KEY_SWITCHVIDEOMODE, 0x8B, 0};
+constexpr KeyDefinition kKeyActionPrivacyScreenToggle =
+   {KEY_PRIVACY_SCREEN_TOGGLE, 0x96, 0x0C02D0};
+#endif
+
 // NOTE: This is only creates a simple ui::InputDevice based on a device
 // capabilities report; it is not suitable for subclasses of ui::InputDevice.
 ui::InputDevice InputDeviceFromCapabilities(
@@ -115,6 +186,22 @@
 
 }  // namespace
 
+namespace mojom {
+
+std::ostream& operator<<(std::ostream& os, const KeyEvent& event) {
+  os << "KeyEvent{ id=" << event.id << ", ";
+  os << "type=" << event.type << ", ";
+  os << "key_code=" << event.key_code << ", ";
+  os << "scan_code=" << event.scan_code << ", ";
+  os << "top_row_position=" << event.top_row_position;
+  os << "}";
+  return os;
+}
+
+}  // namespace mojom
+
+// Fake device manager that lets us control the input devices that
+// an InputDataProvider can see.
 class FakeDeviceManager : public ui::DeviceManager {
  public:
   FakeDeviceManager() {}
@@ -128,6 +215,62 @@
   void RemoveObserver(ui::DeviceEventObserver* observer) override {}
 };
 
+class FakeInputDataEventWatcher;
+typedef std::map<uint32_t, FakeInputDataEventWatcher*> watchers_t;
+
+// Fake evdev watcher class that lets us manually post input
+// events into an InputDataProvider; this keeps an external
+// map of watchers updated so that instances can easily be found.
+class FakeInputDataEventWatcher : public InputDataEventWatcher {
+ public:
+  FakeInputDataEventWatcher(
+      uint32_t id,
+      base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher,
+      watchers_t& watchers)
+      : id_(id), dispatcher_(dispatcher), watchers_(watchers) {
+    EXPECT_EQ(0u, watchers_.count(id_));
+    watchers_[id_] = this;
+  }
+  ~FakeInputDataEventWatcher() override {
+    EXPECT_EQ(watchers_[id_], this);
+    watchers_.erase(id_);
+  }
+
+  void PostKeyEvent(bool down, uint32_t evdev_code, uint32_t scan_code) {
+    if (dispatcher_)
+      dispatcher_->SendInputKeyEvent(id_, evdev_code, scan_code, down);
+  }
+
+ private:
+  uint32_t id_;
+  base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher_;
+  watchers_t& watchers_;
+};
+
+// Utility to construct FakeInputDataEventWatcher for InputDataProvider.
+class FakeInputDataEventWatcherFactory : public InputDataEventWatcher::Factory {
+ public:
+  FakeInputDataEventWatcherFactory(watchers_t& watchers)
+      : watchers_(watchers) {}
+  FakeInputDataEventWatcherFactory(const FakeInputDataEventWatcherFactory&) =
+      delete;
+  FakeInputDataEventWatcherFactory& operator=(
+      const FakeInputDataEventWatcherFactory&) = delete;
+  ~FakeInputDataEventWatcherFactory() override = default;
+
+  std::unique_ptr<InputDataEventWatcher> MakeWatcher(
+      uint32_t id,
+      base::WeakPtr<InputDataEventWatcher::Dispatcher> dispatcher) override {
+    return std::make_unique<FakeInputDataEventWatcher>(
+        id, std::move(dispatcher), watchers_);
+  }
+
+ private:
+  watchers_t& watchers_;
+};
+
+// A mock observer that records device change events emitted from an
+// InputDataProvider.
 class FakeConnectedDevicesObserver : public mojom::ConnectedDevicesObserver {
  public:
   // mojom::ConnectedDevicesObserver:
@@ -153,6 +296,29 @@
   mojo::Receiver<mojom::ConnectedDevicesObserver> receiver{this};
 };
 
+// A mock observer that records key event events emitted from an
+// InputDataProvider.
+class FakeKeyboardObserver : public mojom::KeyboardObserver {
+ public:
+  enum EventType {
+    kEvent = 1,
+    kPause = 2,
+    kResume = 3,
+  };
+
+  // mojom::KeyboardObserver:
+  void OnKeyEvent(mojom::KeyEventPtr key_event) override {
+    events_.push_back({kEvent, std::move(key_event)});
+  }
+  void OnKeyEventsPaused() override { events_.push_back({kPause, nullptr}); }
+  void OnKeyEventsResumed() override { events_.push_back({kResume, nullptr}); }
+
+  std::vector<std::pair<EventType, mojom::KeyEventPtr>> events_;
+
+  mojo::Receiver<mojom::KeyboardObserver> receiver{this};
+};
+
+// A utility class that fakes obtaining information about an evdev.
 class FakeInputDeviceInfoHelper : public InputDeviceInfoHelper {
  public:
   FakeInputDeviceInfoHelper() {}
@@ -225,6 +391,22 @@
       info->keyboard_top_row_layout = ui::EventRewriterChromeOS::
           KeyboardTopRowLayout::kKbdTopRowLayoutDefault;
       EXPECT_EQ(9, id);
+    } else if (base_name == "event10") {
+      device_caps = ui::kDrallionKeyboard;
+      EXPECT_EQ(10, id);
+    } else if (base_name == "event11") {
+      // Used for customized top row layout.
+      device_caps = ui::kJinlonKeyboard;
+      device_caps.kbd_function_row_physmap = kModifiedJinlonDescriptor;
+      info->keyboard_type =
+          ui::EventRewriterChromeOS::DeviceType::kDeviceInternalKeyboard;
+      info->keyboard_top_row_layout = ui::EventRewriterChromeOS::
+          KeyboardTopRowLayout::kKbdTopRowLayoutCustom;
+      info->keyboard_scan_code_map = kInternalJinlonScanCodeMap;
+      info->keyboard_scan_code_map.erase(0x96);
+      info->keyboard_scan_code_map[0xC4] = {ui::EF_NONE, ui::DomCode::F8,
+                                            ui::DomKey::F8, ui::VKEY_F8};
+      EXPECT_EQ(11, id);
     } else if (base_name == kSillyDeviceName) {
       // Simulate a device that is properly described, but has a malformed
       // device name.
@@ -251,31 +433,63 @@
   }
 };
 
+// Our modifications to InputDataProvider that carries around its own
+// widget (representing the window that needs to be visible for key events
+// to be observed), the needed factories for our fake utilities, and a
+// reference to the current event watchers.
 class TestInputDataProvider : public InputDataProvider {
  public:
-  TestInputDataProvider(std::unique_ptr<ui::DeviceManager> device_manager)
-      : InputDataProvider(std::move(device_manager)) {
+  TestInputDataProvider(views::Widget* widget, watchers_t& watchers)
+      : InputDataProvider(
+            widget->GetNativeWindow(),
+            std::make_unique<FakeDeviceManager>(),
+            std::make_unique<FakeInputDataEventWatcherFactory>(watchers)),
+        attached_widget_(widget),
+        watchers_(watchers) {
     info_helper_ = base::SequenceBound<FakeInputDeviceInfoHelper>(
         base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}));
   }
   explicit TestInputDataProvider(const TestInputDataProvider&) = delete;
   TestInputDataProvider& operator=(const TestInputDataProvider&) = delete;
+
+  // The widget represents the tab that input diagnostics would normally be
+  // shown in. This is allocated outside this class so it won't
+  // be destroyed early. (See next item.)
+  views::Widget* attached_widget_;
+  // Keep a list of watchers for each evdev in the provider. This is a
+  // reference to an instance outside of this class, as the lifetime of the list
+  // needs to exceed the destruction of this test class, and can only be cleaned
+  // up once all watchers have been destroyed by the base InputDataProvider,
+  // which occurs after our destruction.
+  watchers_t& watchers_;
 };
 
-class InputDataProviderTest : public testing::Test {
+class InputDataProviderTest : public views::ViewsTestBase {
  public:
-  InputDataProviderTest() {
+  InputDataProviderTest()
+      : views::ViewsTestBase(std::unique_ptr<base::test::TaskEnvironment>(
+            std::make_unique<content::BrowserTaskEnvironment>(
+                content::BrowserTaskEnvironment::MainThreadType::UI,
+                content::BrowserTaskEnvironment::TimeSource::MOCK_TIME))) {}
+
+  void SetUp() override {
+    views::ViewsTestBase::SetUp();
+
+    // Note: some init for creating widgets is performed in base SetUp
+    // instead of the constructor, so our init must also be delayed until SetUp,
+    // so we can safely invoke CreateTestWidget().
+
     statistics_provider_.SetMachineStatistic(
         chromeos::system::kKeyboardMechanicalLayoutKey, "ANSI");
     chromeos::system::StatisticsProvider::SetTestProvider(
         &statistics_provider_);
 
-    auto manager = std::make_unique<FakeDeviceManager>();
-    manager_ = manager.get();
     fake_udev_ = std::make_unique<testing::FakeUdevLoader>();
-    provider_ = std::make_unique<TestInputDataProvider>(std::move(manager));
+    widget_ = CreateTestWidget();
+    provider_ =
+        std::make_unique<TestInputDataProvider>(widget_.get(), watchers_);
 
-    // Apply these early; delaying until
+    // Apply these early, in SetUp; delaying until
     // FakeInputDeviceInfoHelper::GetDeviceInfo() is not appropriate, as
     // fake_udev is not thread safe. (If multiple devices are constructed in a
     // row, then GetDeviceInfo() invocation can overlap with
@@ -283,15 +497,64 @@
     UdevAddFakeDeviceCapabilities("/dev/input/event5", ui::kSarienKeyboard);
     UdevAddFakeDeviceCapabilities("/dev/input/event6", ui::kEveKeyboard);
     UdevAddFakeDeviceCapabilities("/dev/input/event7", ui::kJinlonKeyboard);
+    UdevAddFakeDeviceCapabilities("/dev/input/event10", ui::kDrallionKeyboard);
+    // Tweak top row keys for event11.
+    auto device_caps = ui::kJinlonKeyboard;
+    device_caps.kbd_function_row_physmap = kModifiedJinlonDescriptor;
+    UdevAddFakeDeviceCapabilities("/dev/input/event11", device_caps);
+  }
+
+  InputDataProviderTest(const InputDataProviderTest&) = delete;
+  InputDataProviderTest& operator=(const InputDataProviderTest&) = delete;
+  ~InputDataProviderTest() override {
+    provider_.reset();
+    base::RunLoop().RunUntilIdle();
+  }
+
+ protected:
+  struct ExpectedKeyEvent {
+    KeyDefinition key;
+    int position;
+    bool down = true;
+  };
+
+  void ExpectKeyEvents(FakeKeyboardObserver* fake_observer,
+                       uint32_t id,
+                       std::initializer_list<ExpectedKeyEvent> list) {
+    // Make sure the test does something...
+    EXPECT_TRUE(std::size(list) > 0);
+
+    size_t i;
+
+    i = 0;
+    for (auto* iter = list.begin(); iter != list.end(); iter++, i++) {
+      provider_->watchers_[id]->PostKeyEvent(iter->down, iter->key.key_code,
+                                             iter->key.at_scan_code);
+    }
+    base::RunLoop().RunUntilIdle();
+
+    ASSERT_EQ(std::size(list), fake_observer->events_.size());
+
+    i = 0;
+    for (auto* iter = list.begin(); iter != list.end(); iter++, i++) {
+      EXPECT_EQ(*fake_observer->events_[i].second,
+                mojom::KeyEvent(/*id=*/id, /*type=*/iter->down
+                                               ? mojom::KeyEventType::kPress
+                                               : mojom::KeyEventType::kRelease,
+                                /*key_code=*/iter->key.key_code,
+                                /*scan_code=*/iter->key.at_scan_code,
+                                /*top_row_position=*/iter->position))
+          << " which is EXPECT_KEY_EVENTS item #" << i;
+    }
   }
 
   void UdevAddFakeDeviceCapabilities(
       const std::string& device_name,
       const ui::DeviceCapabilities& device_caps) {
     std::map<std::string, std::string>
-        sysfs_properties;  // Old style numeric tags
+        sysfs_properties;  // Old style numeric tags.
     std::map<std::string, std::string>
-        sysfs_attributes;  // New style vivaldi scancode layouts
+        sysfs_attributes;  // New style vivaldi scancode layouts.
 
     if (device_caps.kbd_function_row_physmap &&
         strlen(device_caps.kbd_function_row_physmap) > 0) {
@@ -304,7 +567,10 @@
       sysfs_properties[kKbdTopRowPropertyName] = device_caps.kbd_top_row_layout;
     }
 
-    // Each device needs a unique sys path
+    // Each device needs a unique sys path; many of the ones embedded in
+    // capabilities are the same, so uniquify them with the event device name.
+    // These aren't actual valid paths, but nothing in the testing logic needs
+    // them to be real.
     const std::string sys_path = device_name + "-" + device_caps.path;
 
     fake_udev_->AddFakeDevice(device_caps.name, sys_path.c_str(),
@@ -314,17 +580,12 @@
                               std::move(sysfs_properties));
   }
 
-  ~InputDataProviderTest() override {
-    provider_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
- protected:
-  base::test::TaskEnvironment task_environment_;
-  FakeDeviceManager* manager_;
   std::unique_ptr<testing::FakeUdevLoader> fake_udev_;
   chromeos::system::FakeStatisticsProvider statistics_provider_;
-  std::unique_ptr<InputDataProvider> provider_;
+  std::unique_ptr<views::Widget> widget_;
+  // All evdev watchers in use by provider_.
+  watchers_t watchers_;
+  std::unique_ptr<TestInputDataProvider> provider_;
 };
 
 TEST_F(InputDataProviderTest, GetConnectedDevices_DeviceInfoMapping) {
@@ -344,7 +605,7 @@
   provider_->OnDeviceEvent(event1);
   provider_->OnDeviceEvent(event2);
   provider_->OnDeviceEvent(event3);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
                          std::vector<mojom::TouchDeviceInfoPtr>>
@@ -393,7 +654,7 @@
                         ui::DeviceEvent::ActionType::ADD,
                         base::FilePath("/dev/input/event4"));
   provider_->OnDeviceEvent(event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   {
     base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
@@ -415,6 +676,8 @@
 }
 
 TEST_F(InputDataProviderTest, GetConnectedDevices_AddUnusualDevices) {
+  // Add two devices with unusual bus types, and verify connection types.
+
   ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
                          ui::DeviceEvent::ActionType::ADD,
                          base::FilePath("/dev/input/event8"));
@@ -423,7 +686,7 @@
                          base::FilePath("/dev/input/event9"));
   provider_->OnDeviceEvent(event0);
   provider_->OnDeviceEvent(event1);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
                          std::vector<mojom::TouchDeviceInfoPtr>>
@@ -434,7 +697,6 @@
   const auto& touch_devices = future.Get<1>();
 
   ASSERT_EQ(2ul, keyboards.size());
-  // The stylus device should be filtered out, hence only 2 touch devices.
   ASSERT_EQ(0ul, touch_devices.size());
 
   const mojom::KeyboardInfoPtr& keyboard1 = keyboards[0];
@@ -457,7 +719,7 @@
                                 ui::DeviceEvent::ActionType::ADD,
                                 base::FilePath("/dev/input/event4"));
   provider_->OnDeviceEvent(add_kbd_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   {
     base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
@@ -483,7 +745,7 @@
                                    ui::DeviceEvent::ActionType::REMOVE,
                                    base::FilePath("/dev/input/event4"));
   provider_->OnDeviceEvent(remove_kbd_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   {
     base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
@@ -519,7 +781,7 @@
   provider_->OnDeviceEvent(event1);
   provider_->OnDeviceEvent(event2);
   provider_->OnDeviceEvent(event3);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
                          std::vector<mojom::TouchDeviceInfoPtr>>
@@ -591,7 +853,7 @@
                             base::FilePath("/dev/input/event6"));
   provider_->OnDeviceEvent(link_event);
   provider_->OnDeviceEvent(eve_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
                          std::vector<mojom::TouchDeviceInfoPtr>>
@@ -619,7 +881,7 @@
                              ui::DeviceEvent::ActionType::ADD,
                              base::FilePath("/dev/input/event0"));
   provider_->OnDeviceEvent(link_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
                          std::vector<mojom::TouchDeviceInfoPtr>>
@@ -644,7 +906,7 @@
                                      ui::DeviceEvent::ActionType::ADD,
                                      base::FilePath("/dev/input/event4"));
   provider_->OnDeviceEvent(add_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1ul, fake_observer.keyboards_connected.size());
   EXPECT_EQ(4u, fake_observer.keyboards_connected[0]->id);
 
@@ -652,7 +914,7 @@
                                         ui::DeviceEvent::ActionType::REMOVE,
                                         base::FilePath("/dev/input/event4"));
   provider_->OnDeviceEvent(remove_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1ul, fake_observer.keyboards_disconnected.size());
   EXPECT_EQ(4u, fake_observer.keyboards_disconnected[0]);
 }
@@ -666,7 +928,7 @@
                                   ui::DeviceEvent::ActionType::ADD,
                                   base::FilePath("/dev/input/event1"));
   provider_->OnDeviceEvent(add_touch_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1ul, fake_observer.touch_devices_connected.size());
   EXPECT_EQ(1u, fake_observer.touch_devices_connected[0]->id);
 
@@ -674,7 +936,7 @@
                                      ui::DeviceEvent::ActionType::REMOVE,
                                      base::FilePath("/dev/input/event1"));
   provider_->OnDeviceEvent(remove_touch_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1ul, fake_observer.touch_devices_disconnected.size());
   EXPECT_EQ(1u, fake_observer.touch_devices_disconnected[0]);
 }
@@ -687,18 +949,18 @@
                                       ui::DeviceEvent::ActionType::CHANGE,
                                       base::FilePath("/dev/input/event1"));
   provider_->OnDeviceEvent(add_device_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
   provider_->OnDeviceEvent(change_device_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(InputDataProviderTest, BadDeviceDoesNotCrash) {
-  // Try a device that specifically fails to be processed
+  // Try a device that specifically fails to be processed.
   ui::DeviceEvent add_bad_device_event(ui::DeviceEvent::DeviceType::INPUT,
                                        ui::DeviceEvent::ActionType::ADD,
                                        base::FilePath("/dev/input/event99"));
   provider_->OnDeviceEvent(add_bad_device_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(InputDataProviderTest, SillyDeviceDoesNotCrash) {
@@ -707,7 +969,7 @@
                                          ui::DeviceEvent::ActionType::ADD,
                                          base::FilePath(kSillyDeviceName));
   provider_->OnDeviceEvent(add_silly_device_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(InputDataProviderTest, GetKeyboardVisualLayout_AmericanEnglish) {
@@ -718,7 +980,7 @@
                                      ui::DeviceEvent::ActionType::ADD,
                                      base::FilePath("/dev/input/event6"));
   provider_->OnDeviceEvent(add_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<base::flat_map<uint32_t, mojom::KeyGlyphSetPtr>>
       future;
@@ -749,7 +1011,7 @@
                                      ui::DeviceEvent::ActionType::ADD,
                                      base::FilePath("/dev/input/event6"));
   provider_->OnDeviceEvent(add_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   base::test::TestFuture<base::flat_map<uint32_t, mojom::KeyGlyphSetPtr>>
       future;
@@ -779,7 +1041,7 @@
                                      ui::DeviceEvent::ActionType::ADD,
                                      base::FilePath("/dev/input/event6"));
   provider_->OnDeviceEvent(add_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   {
     base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
@@ -809,7 +1071,7 @@
                                      ui::DeviceEvent::ActionType::ADD,
                                      base::FilePath("/dev/input/event6"));
   provider_->OnDeviceEvent(add_keyboard_event);
-  task_environment_.RunUntilIdle();
+  base::RunLoop().RunUntilIdle();
 
   {
     base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
@@ -850,5 +1112,673 @@
   ASSERT_TRUE(provider_->ReceiverIsBound());
 }
 
+TEST_F(InputDataProviderTest, KeyObservationBasic) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(0u, provider_->watchers_.size());
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure an event watcher was constructed for the observer,
+  // but has not posted any events.
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(1u, provider_->watchers_.size());
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  // Post a key event through the watcher that
+  // was created for the observer.
+  provider_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                        kKeyA.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure the event came through.
+  EXPECT_EQ(1u, fake_observer->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kEvent, fake_observer->events_[0].first);
+  ASSERT_TRUE(fake_observer->events_[0].second);
+
+  EXPECT_EQ(*fake_observer->events_[0].second,
+            mojom::KeyEvent(/*id=*/6u, /*type=*/mojom::KeyEventType::kPress,
+                            /*key_code=*/kKeyA.key_code,
+                            /*scan_code=*/kKeyA.at_scan_code,
+                            /*top_row_position=*/-1));
+}
+
+TEST_F(InputDataProviderTest, KeyObservationRemoval) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(0u, provider_->watchers_.size());
+
+  bool disconnected = false;
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  fake_observer->receiver.set_disconnect_handler(
+      base::BindOnce([](bool* disconnected) { *disconnected = true; },
+                     base::Unretained(&disconnected)));
+
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure an event watcher was constructed for the observer,
+  // but has not posted any events.
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(1u, provider_->watchers_.size());
+  EXPECT_FALSE(disconnected);
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  // Test a key event.
+  EXPECT_KEY_EVENTS(fake_observer.get(), 6u, {{kKeyA, -1}});
+
+  // Disconnect keyboard while it is being observed.
+  ui::DeviceEvent remove_kbd_event(ui::DeviceEvent::DeviceType::INPUT,
+                                   ui::DeviceEvent::ActionType::REMOVE,
+                                   base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(remove_kbd_event);
+  base::RunLoop().RunUntilIdle();
+
+  // Watcher should have been shut down, and receiver disconnected.
+  EXPECT_FALSE(provider_->watchers_[6]);
+  EXPECT_TRUE(disconnected);
+}
+
+TEST_F(InputDataProviderTest, KeyObservationMultiple) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  EXPECT_KEY_EVENTS(fake_observer.get(), 6u,
+                    {{kKeyA, -1, true},
+                     {kKeyB, -1, true},
+                     {kKeyA, -1, false},
+                     {kKeyB, -1, false}});
+}
+
+TEST_F(InputDataProviderTest, KeyObservationObeysFocus) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  provider_->attached_widget_->Deactivate();
+  provider_->attached_widget_->Hide();
+
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  // Verify we got the pause event from hiding the window.
+  ASSERT_EQ(1u, fake_observer->events_.size());
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer->events_[0].first);
+
+  // Post a key event through the watcher that
+  // was created for the observer.
+  provider_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                        kKeyA.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure the event did not come through, as the widget was not visible and
+  // focused.
+  ASSERT_EQ(1u, fake_observer->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer->events_[0].first);
+}
+
+TEST_F(InputDataProviderTest, KeyObservationDisconnect) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  fake_observer->receiver.reset();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  ASSERT_FALSE(provider_->watchers_[6]);
+}
+
+TEST_F(InputDataProviderTest, KeyObservationObeysFocusSwitching) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+  std::unique_ptr<views::Widget> other_widget = CreateTestWidget();
+
+  // Provider's widget must be active and visible.
+  provider_->attached_widget_->Show();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(0u, provider_->watchers_.size());
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure an event watcher was constructed for the observer,
+  // but has not posted any events.
+  EXPECT_EQ(0u, fake_observer->events_.size());
+  EXPECT_EQ(1u, provider_->watchers_.size());
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  // Focus on the other window.
+  other_widget->Show();
+  other_widget->Activate();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(provider_->attached_widget_->IsActive());
+  EXPECT_TRUE(other_widget->IsVisible());
+  EXPECT_TRUE(other_widget->IsActive());
+
+  EXPECT_EQ(1u, fake_observer->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer->events_[0].first);
+  ASSERT_FALSE(fake_observer->events_[0].second);
+
+  // Post a key event through the watcher that
+  // was created for the observer.
+  provider_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                        kKeyA.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure the event did not come through.
+  EXPECT_EQ(1u, fake_observer->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer->events_[0].first);
+
+  // Clear events for next round.
+  fake_observer->events_.clear();
+
+  // Switch windows back.
+  provider_->attached_widget_->Show();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(provider_->attached_widget_->IsActive());
+  EXPECT_FALSE(other_widget->IsActive());
+
+  // Post another key event.
+  provider_->watchers_[6]->PostKeyEvent(true, kKeyB.key_code,
+                                        kKeyB.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(2u, fake_observer->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kResume, fake_observer->events_[0].first);
+  EXPECT_EQ(FakeKeyboardObserver::kEvent, fake_observer->events_[1].first);
+  ASSERT_TRUE(fake_observer->events_[1].second);
+
+  EXPECT_EQ(*fake_observer->events_[1].second,
+            mojom::KeyEvent(/*id=*/6u, /*type=*/mojom::KeyEventType::kPress,
+                            /*key_code=*/kKeyB.key_code,
+                            /*scan_code=*/kKeyB.at_scan_code,
+                            /*top_row_position=*/-1));
+}
+
+// Test overlapping lifetimes of separate observers of one device.
+TEST_F(InputDataProviderTest, KeyObservationOverlappingeObserversOfDevice) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer1 =
+      std::make_unique<FakeKeyboardObserver>();
+
+  provider_->attached_widget_->Show();
+
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  provider_->ObserveKeyEvents(
+      6u, fake_observer1->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer1->events_.size());
+  EXPECT_EQ(1u, provider_->watchers_.size());
+  EXPECT_TRUE(provider_->watchers_[6]);
+
+  std::unique_ptr<FakeKeyboardObserver> fake_observer2 =
+      std::make_unique<FakeKeyboardObserver>();
+
+  provider_->ObserveKeyEvents(
+      6u, fake_observer2->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer1->events_.size());
+  EXPECT_EQ(0u, fake_observer2->events_.size());
+  EXPECT_TRUE(provider_->watchers_[6]);
+
+  fake_observer1.reset();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, fake_observer2->events_.size());
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  // And send an event through to check functionality.
+  provider_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                        kKeyA.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure an event comes through properly after all that.
+  EXPECT_EQ(1u, fake_observer2->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kEvent, fake_observer2->events_[0].first);
+  ASSERT_TRUE(fake_observer2->events_[0].second);
+  EXPECT_EQ(*fake_observer2->events_[0].second,
+            mojom::KeyEvent(/*id=*/6u, /*type=*/mojom::KeyEventType::kPress,
+                            /*key_code=*/kKeyA.key_code,
+                            /*scan_code=*/kKeyA.at_scan_code,
+                            /*top_row_position=*/-1));
+
+  fake_observer2.reset();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0u, provider_->watchers_.count(6));
+}
+
+// Double-check security model and ensure that multiple instances
+// do not interfere with each other, and that key observations obey
+// individual window focus combined with multiple instances.
+TEST_F(InputDataProviderTest, KeyObservationMultipleProviders) {
+  // Create a second InputDataProvider, with a separate window/widget,
+  // as would happen if multiple instances of the SWA were created.
+  watchers_t provider2_watchers;
+  auto provider2_widget = CreateTestWidget();
+
+  std::unique_ptr<TestInputDataProvider> provider2_ =
+      std::make_unique<TestInputDataProvider>(provider2_widget.get(),
+                                              provider2_watchers);
+  auto& provider1_ = provider_;
+
+  std::unique_ptr<FakeKeyboardObserver> fake_observer1 =
+      std::make_unique<FakeKeyboardObserver>();
+  std::unique_ptr<FakeKeyboardObserver> fake_observer2 =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Show and activate first window.
+  provider1_->attached_widget_->Show();
+  // Show and activate second window; this will deactivate the first window.
+  provider2_->attached_widget_->Show();
+
+  EXPECT_FALSE(provider1_->attached_widget_->IsActive());
+  EXPECT_TRUE(provider2_->attached_widget_->IsActive());
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider1_->OnDeviceEvent(event0);
+  provider2_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(provider1_->watchers_.empty());
+  EXPECT_TRUE(provider2_->watchers_.empty());
+
+  // Connected observer 1 to provider 1.
+  provider1_->ObserveKeyEvents(
+      6u, fake_observer1->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(provider1_->watchers_.empty());
+  EXPECT_TRUE(provider2_->watchers_.empty());
+  EXPECT_EQ(1u, fake_observer1->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer1->events_[0].first);
+  EXPECT_EQ(1u, provider1_->watchers_.count(6));
+
+  EXPECT_EQ(0u, fake_observer2->events_.size());
+  EXPECT_EQ(0u, provider2_->watchers_.count(6));
+
+  // Connected observer 2 to provider 2.
+
+  provider2_->ObserveKeyEvents(
+      6u, fake_observer2->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(provider1_->watchers_.empty());
+  EXPECT_FALSE(provider2_->watchers_.empty());
+  EXPECT_EQ(1u, fake_observer1->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer1->events_[0].first);
+  EXPECT_EQ(1u, provider1_->watchers_.size());
+  EXPECT_EQ(1u, provider1_->watchers_.size());
+  ASSERT_TRUE(provider1_->watchers_[6]);
+  ASSERT_TRUE(provider2_->watchers_[6]);
+
+  EXPECT_EQ(0u, fake_observer2->events_.size());
+  EXPECT_EQ(1u, provider2_->watchers_.size());
+  EXPECT_TRUE(provider2_->watchers_[6]);
+  // Providers should have distinct Watcher instances.
+  EXPECT_NE(provider1_->watchers_[6], provider2_->watchers_[6]);
+
+  // Reset event logs for next round.
+  fake_observer1->events_.clear();
+  fake_observer2->events_.clear();
+
+  // Post two separate key events.
+  provider1_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                         kKeyA.at_scan_code);
+  provider2_->watchers_[6]->PostKeyEvent(true, kKeyB.key_code,
+                                         kKeyB.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure the events came through to expected targets.
+  EXPECT_EQ(0u, fake_observer1->events_.size());
+
+  EXPECT_EQ(1u, fake_observer2->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kEvent, fake_observer2->events_[0].first);
+  ASSERT_TRUE(fake_observer2->events_[0].second);
+  EXPECT_EQ(*fake_observer2->events_[0].second,
+            mojom::KeyEvent(/*id=*/6u, /*type=*/mojom::KeyEventType::kPress,
+                            /*key_code=*/kKeyB.key_code,
+                            /*scan_code=*/kKeyB.at_scan_code,
+                            /*top_row_position=*/-1));
+
+  // Reset event logs for next round.
+  fake_observer1->events_.clear();
+  fake_observer2->events_.clear();
+
+  // Switch active window.
+  provider1_->attached_widget_->Activate();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(provider1_->attached_widget_->IsActive());
+  EXPECT_TRUE(provider1_->attached_widget_->IsVisible());
+  EXPECT_FALSE(provider2_->attached_widget_->IsActive());
+
+  provider1_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                         kKeyA.at_scan_code);
+  provider2_->watchers_[6]->PostKeyEvent(true, kKeyB.key_code,
+                                         kKeyB.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Ensure the events came through to expected targets.
+
+  EXPECT_EQ(2u, fake_observer1->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kResume, fake_observer1->events_[0].first);
+  EXPECT_FALSE(fake_observer1->events_[0].second);
+  EXPECT_EQ(FakeKeyboardObserver::kEvent, fake_observer1->events_[1].first);
+  ASSERT_TRUE(fake_observer1->events_[1].second);
+  EXPECT_EQ(*fake_observer1->events_[1].second,
+            mojom::KeyEvent(/*id=*/6u, /*type=*/mojom::KeyEventType::kPress,
+                            /*key_code=*/kKeyA.key_code,
+                            /*scan_code=*/kKeyA.at_scan_code,
+                            /*top_row_position=*/-1));
+
+  EXPECT_EQ(1u, fake_observer2->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer2->events_[0].first);
+  EXPECT_FALSE(fake_observer2->events_[0].second);
+
+  // Reset event logs for next round.
+  fake_observer1->events_.clear();
+  fake_observer2->events_.clear();
+
+  // Activate a new widget, ensuring neither previous window is active.
+  auto widget3 = CreateTestWidget();
+  widget3->Activate();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(provider1_->attached_widget_->IsActive());
+  EXPECT_FALSE(provider2_->attached_widget_->IsActive());
+
+  // Event should show key paused from previously active window.
+  EXPECT_EQ(1u, fake_observer1->events_.size());
+  EXPECT_EQ(FakeKeyboardObserver::kPause, fake_observer1->events_[0].first);
+  EXPECT_FALSE(fake_observer1->events_[0].second);
+
+  // Reset event logs for next round.
+  fake_observer1->events_.clear();
+  fake_observer2->events_.clear();
+
+  // Deliver keys to both.
+  provider1_->watchers_[6]->PostKeyEvent(true, kKeyA.key_code,
+                                         kKeyA.at_scan_code);
+  provider2_->watchers_[6]->PostKeyEvent(true, kKeyB.key_code,
+                                         kKeyB.at_scan_code);
+  base::RunLoop().RunUntilIdle();
+
+  // Neither window is visible and active, no events should be received.
+  EXPECT_FALSE(provider1_->attached_widget_->IsVisible() &&
+               provider1_->attached_widget_->IsActive());
+  EXPECT_FALSE(provider2_->attached_widget_->IsVisible() &&
+               provider2_->attached_widget_->IsActive());
+  EXPECT_EQ(0u, fake_observer1->events_.size());
+  EXPECT_EQ(0u, fake_observer2->events_.size());
+}
+
+TEST_F(InputDataProviderTest, KeyObservationTopRowBasic) {
+  // Test with Eve keyboard: [Escape, Back, ..., Louder, Menu]
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event6"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      6u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_TRUE(provider_->watchers_[6]);
+
+  EXPECT_KEY_EVENTS(fake_observer.get(), 6u,
+                    {{kKeyEsc, -1},
+                     {kKeyF1, 0},
+                     {kKeyF10, 9},
+                     {kKeyMenu, -1},
+                     {kKeyDelete, -1}});
+}
+
+TEST_F(InputDataProviderTest, KeyObservationTopRowUnknownAction) {
+  // Test for Vivaldi descriptor having an unrecognized scan-code;
+  // most likely due to external keyboard being newer than OS image.
+
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  std::vector<mojom::TopRowKey> modified_top_row_keys =
+      std::vector(std::begin(kInternalJinlonTopRowKeys),
+                  std::end(kInternalJinlonTopRowKeys));
+  modified_top_row_keys[kUnknownScancodeIndex] = mojom::TopRowKey::kUnknown;
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event11"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  base::test::TestFuture<std::vector<mojom::KeyboardInfoPtr>,
+                         std::vector<mojom::TouchDeviceInfoPtr>>
+      future;
+  provider_->GetConnectedDevices(future.GetCallback());
+
+  const auto& keyboards = future.Get<0>();
+
+  ASSERT_EQ(1ul, keyboards.size());
+  const mojom::KeyboardInfoPtr& keyboard = keyboards[0];
+  EXPECT_EQ(11u, keyboard->id);
+  EXPECT_EQ(modified_top_row_keys, keyboard->top_row_keys);
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      11u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_TRUE(provider_->watchers_[11]);
+
+  EXPECT_KEY_EVENTS(fake_observer.get(), 11u,
+                    {{kKeyEsc, -1},
+                     {kKeyActionBack, 0},
+                     {kKeyF1, 0},
+                     {kKeyActionRefresh, 1},
+                     {kKeyActionFullscreen, 2},
+                     {kKeyActionOverview, 3},
+                     {kKeyActionScreenshot, 4},
+                     {kKeyActionScreenBrightnessDown, 5},
+                     {kKeyActionScreenBrightnessUp, 6},
+                     {{0, kUnknownScancode, 0}, kUnknownScancodeIndex},
+                     {kKeyF8, 7},
+                     {kKeyActionKeyboardBrightnessDown, 8},
+                     {kKeyActionKeyboardBrightnessUp, 9},
+                     {kKeyActionKeyboardVolumeMute, 10},
+                     {kKeyF10, 9},
+                     {kKeyActionKeyboardVolumeDown, 11},
+                     {kKeyActionKeyboardVolumeUp, 12},
+                     {kKeySleep, -1}});
+}
+
+// TODO(b/208729519): Not available until we can test Drallion keyboards.
+#if 0
+TEST_F(InputDataProviderTest, KeyObservationTopRowDrallion) {
+  // Test with Drallion keyboard:
+  //  [Escape, Back, ..., Louder, F10, F11, F12, Mirror, Delete]
+  // ...
+
+  // Construct a keyboard
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event10"));
+  // ...
+  struct {
+    KeyDefinition key;
+    int position;
+  } keys[] = {
+      {kKeyA, -1},
+      {kKeyB, -1},
+      {kKeyEsc, -1},
+      {kKeyF1, 0},
+      {kKeyF10, 9},
+      {kKeyF11, 10},
+      {kKeyF12, 11},
+      {kKeySwitchVideoMode, 12},
+      {kKeyDelete, 13},
+  };
+
+  for (size_t i = 0; i < std::size(keys); i++) {
+    auto item = keys[i];
+    provider_->watchers_[10]->PostKeyEvent(true, item.key.key_code,
+         item.key.at_scan_code);
+  }
+  base::RunLoop().RunUntilIdle();
+
+  // ...
+}
+#endif  // 0
+
+TEST_F(InputDataProviderTest, KeyObservationTopRowExternalUSB) {
+  std::unique_ptr<FakeKeyboardObserver> fake_observer =
+      std::make_unique<FakeKeyboardObserver>();
+
+  // Widget must be active and visible.
+  provider_->attached_widget_->Show();
+  provider_->attached_widget_->Activate();
+
+  // Construct a keyboard.
+  const ui::DeviceEvent event0(ui::DeviceEvent::DeviceType::INPUT,
+                               ui::DeviceEvent::ActionType::ADD,
+                               base::FilePath("/dev/input/event9"));
+  provider_->OnDeviceEvent(event0);
+  base::RunLoop().RunUntilIdle();
+
+  // Attach a key observer.
+  provider_->ObserveKeyEvents(
+      9u, fake_observer->receiver.BindNewPipeAndPassRemote());
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_TRUE(provider_->watchers_[9]);
+
+  // Test with generic external keyboard.
+  EXPECT_KEY_EVENTS(fake_observer.get(), 9u,
+                    {{kKeyA, -1},
+                     {kKeyB, -1},
+                     {kKeyMenu, -1},
+                     {kKeyDelete, -1},
+                     {kKeyEsc, -1},
+                     {kKeyF1, 0},
+                     {kKeyF10, 9},
+                     {kKeyF11, 10},
+                     {kKeyF12, 11}});
+}
+
+// TODO(b/211780758): Test all Fx scancodes using
+// ui/events/keycodes/dom/dom_code_data.inc as source of truth.
+
 }  // namespace diagnostics
 }  // namespace ash
diff --git a/ash/webui/diagnostics_ui/diagnostics_ui.cc b/ash/webui/diagnostics_ui/diagnostics_ui.cc
index e85cc908..b65b6362 100644
--- a/ash/webui/diagnostics_ui/diagnostics_ui.cc
+++ b/ash/webui/diagnostics_ui/diagnostics_ui.cc
@@ -391,7 +391,7 @@
   auto session_log_handler = std::make_unique<diagnostics::SessionLogHandler>(
       select_file_policy_creator, holding_space_client, log_directory_path);
   diagnostics_manager_ = std::make_unique<diagnostics::DiagnosticsManager>(
-      session_log_handler.get());
+      session_log_handler.get(), web_ui);
   web_ui->AddMessageHandler(std::move(session_log_handler));
 
   AddDiagnosticsStrings(html_source.get());
diff --git a/ash/webui/diagnostics_ui/diagnostics_ui.h b/ash/webui/diagnostics_ui/diagnostics_ui.h
index b04038da..4808a756 100644
--- a/ash/webui/diagnostics_ui/diagnostics_ui.h
+++ b/ash/webui/diagnostics_ui/diagnostics_ui.h
@@ -27,6 +27,7 @@
 
 namespace diagnostics {
 class DiagnosticsManager;
+class InputDataProvider;
 }  // namespace diagnostics
 
 // The WebDialogUI for chrome://diagnostics.
@@ -67,6 +68,7 @@
   std::unique_ptr<diagnostics::DiagnosticsManager> diagnostics_manager_;
   std::unique_ptr<diagnostics::metrics::DiagnosticsMetrics>
       diagnostics_metrics_;
+  std::unique_ptr<diagnostics::InputDataProvider> input_data_provider_;
 };
 
 }  // namespace ash
diff --git a/ash/webui/diagnostics_ui/mojom/input_data_provider.mojom b/ash/webui/diagnostics_ui/mojom/input_data_provider.mojom
index cb76da5..74c4c80 100644
--- a/ash/webui/diagnostics_ui/mojom/input_data_provider.mojom
+++ b/ash/webui/diagnostics_ui/mojom/input_data_provider.mojom
@@ -82,12 +82,53 @@
   PhysicalLayout physical_layout;
   MechanicalLayout mechanical_layout;
   NumberPadPresence number_pad_present;
-  // Excludes left-most Escape key, and right-most key (usually Power/Lock).
+  // List of ChromeOS specific action keys in the top row. This list excludes
+  // the left-most Escape key, and right-most key (usually Power/Lock).
+  // If a keyboard has F11-F15 keys beyond the rightmost action key, they may
+  // not be included in this list (even as kNone).
   array<TopRowKey> top_row_keys;
   // Only applicable to CrOS keyboards.
   bool has_assistant_key;
 };
 
+enum KeyEventType {
+  kPress,
+  kRelease,
+};
+
+// Describes an event on a connected keyboard.
+struct KeyEvent {
+  // The number of the keyboard's /dev/input/event* node.
+  uint32 id;
+  KeyEventType type;
+  // The evdev key code
+  uint32 key_code;
+  // The kernel-reported 'physical' scancode; this may be a 32-bit Usage for
+  // USB and Bluetooth HID devices, or an AT-style scancode for some internal
+  // keyboards.
+  uint32 scan_code;
+  // Position of the key on the top row after escape (0 is leftmost, 1 is next
+  // to the right, etc.), or -1 for keys not on the top row. Generally, 0 is F1,
+  // in some fashion.
+  // NOTE: This position may exceed the length of top_row_keys, for external
+  // keyboards with keys in the F11-F15 range.
+  int32 top_row_position;
+};
+
+// Implemented by clients that wish to be updated when input devices have keys
+// pressed or released, while the client has focus and is visible; pause and
+// resume events will be generated if focus/visibility changes.
+interface KeyboardObserver {
+  // Called when a key is pressed or released on the observed device, and
+  // events to this observer have not been paused.
+  OnKeyEvent(KeyEvent event);
+  // Called when delivery of events to the app are paused temporarily for
+  // security reasons. While paused, events will be discarded.
+  OnKeyEventsPaused();
+  // Called when delivery of events resumes.
+  OnKeyEventsResumed();
+};
+
 // Describes the glyphs that appear on a single key.
 struct KeyGlyphSet {
   // Glyph if pressed without modifiers. Displayed in the centre or on the lower
@@ -136,9 +177,18 @@
   GetConnectedDevices() =>
     (array<KeyboardInfo> keyboards,
      array<TouchDeviceInfo> touch_devices);
-  // Registers an observer of connected input devices.
+
+  // Registers an observer for changes to the connected input devices.
   ObserveConnectedDevices(pending_remote<ConnectedDevicesObserver> observer);
 
+  // id is the number of the keyboard device's /dev/input/event* node.
+  // Observation is cancelled when KeyboardObserver (or InputDataProvider)
+  // is destroyed.
+  // The native implementation of InputDataProvider has a reference to the
+  // target SWA window, and enforces the security policy of only forwarding
+  // key events to the observer when that window is visible and has focus.
+  ObserveKeyEvents(uint32 id, pending_remote<KeyboardObserver> observer);
+
   // Returns the visual layout for the keyboard with the given ID. For external
   // keyboards where we can't be sure of their layout, this will default to the
   // system layout.
diff --git a/ash/webui/diagnostics_ui/resources/diagnostics_types.js b/ash/webui/diagnostics_ui/resources/diagnostics_types.js
index 4b0e379..7e49be1f 100644
--- a/ash/webui/diagnostics_ui/resources/diagnostics_types.js
+++ b/ash/webui/diagnostics_ui/resources/diagnostics_types.js
@@ -521,6 +521,33 @@
 export const ConnectedDevicesObserverReceiver =
     ash.diagnostics.mojom.ConnectedDevicesObserverReceiver;
 
+/**
+ * Type alias for KeyboardObserver.
+ * @typedef {ash.diagnostics.mojom.KeyboardObserver}
+ */
+export const KeyboardObserver = ash.diagnostics.mojom.CpuUsageObserver;
+
+/**
+ * Type alias for KeyboardObserverRemote.
+ * @typedef {ash.diagnostics.mojom.KeyboardObserverRemote}
+ */
+export const KeyboardObserverRemote =
+    ash.diagnostics.mojom.KeyboardObserverRemote;
+
+/**
+ * Type alias for KeyboardObserverInterface.
+ * @typedef {ash.diagnostics.mojom.KeyboardObserverInterface}
+ */
+export const KeyboardObserverInterface =
+    ash.diagnostics.mojom.KeyboardObserverInterface;
+
+/**
+ * Type alias for KeyboardObserverReceiver.
+ * @typedef {ash.diagnostics.mojom.KeyboardObserverReceiver}
+ */
+export const KeyboardObserverReceiver =
+    ash.diagnostics.mojom.KeyboardObserverReceiver;
+
 
 /**
  * Type alias for the the response from InputDataProvider.GetConnectedDevices.
@@ -541,3 +568,15 @@
  */
 export const InputDataProviderInterface =
     ash.diagnostics.mojom.InputDataProviderInterface;
+
+/**
+ * Type alias for KeyEvent.
+ * @typedef {ash.diagnostics.mojom.KeyEvent}
+ */
+export const KeyEvent = ash.diagnostics.mojom.KeyEvent;
+
+/**
+ * Type alias for KeyEventType.
+ * @typedef {ash.diagnostics.mojom.KeyEvent}
+ */
+export const KeyEventType = ash.diagnostics.mojom.KeyEventType;
diff --git a/ash/webui/diagnostics_ui/resources/fake_input_data_provider.js b/ash/webui/diagnostics_ui/resources/fake_input_data_provider.js
index 7db7417e..1936e77d 100644
--- a/ash/webui/diagnostics_ui/resources/fake_input_data_provider.js
+++ b/ash/webui/diagnostics_ui/resources/fake_input_data_provider.js
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {ConnectedDevicesObserverRemote, ConnectionType, GetConnectedDevicesResponse, GetKeyboardVisualLayoutResponse, InputDataProviderInterface, KeyboardInfo, TouchDeviceInfo, TouchDeviceType} from './diagnostics_types.js';
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
 
+import {ConnectedDevicesObserverRemote, ConnectionType, GetConnectedDevicesResponse, GetKeyboardVisualLayoutResponse, InputDataProviderInterface, KeyboardInfo, KeyboardObserverRemote, TouchDeviceInfo, TouchDeviceType} from './diagnostics_types.js';
+
 /**
  * @fileoverview
  * Implements a fake version of the InputDataProvider Mojo interface.
@@ -18,6 +19,8 @@
     this.observers_ = [];
     /** @private {!Array<!KeyboardInfo>} */
     this.keyboards_ = [];
+    /** @private {!Array<!Array<!KeyboardObserverRemote>>} */
+    this.keyboard_observers_ = [];
     /** @private {!Array<!TouchDeviceInfo>} */
     this.touchDevices_ = [];
 
@@ -40,6 +43,7 @@
   registerMethods() {
     this.methods_.register('getConnectedDevices');
     this.methods_.register('getKeyboardVisualLayout');
+    this.methods_.register('observeKeyEvents');
   }
 
   /**
@@ -50,6 +54,18 @@
   }
 
   /**
+   * Registers an observer for key events on the specific device.
+   * @param {number} id The ID of the keyboard to observe
+   * @param {!KeyboardObserverRemote} remote
+   */
+  observeKeyEvents(id, remote) {
+    if (!this.keyboard_observers_[id]) {
+      return;
+    }
+    this.keyboard_observers_[id].push(remote);
+  }
+
+  /**
    * Sets the values that will be returned when calling getConnectedDevices(),
    * but does not notify connected device observers of the changes.
    * @param {!Array<!KeyboardInfo>} keyboards
@@ -78,6 +94,7 @@
    */
   addFakeConnectedKeyboard(keyboard) {
     this.keyboards_.push(keyboard);
+    this.keyboard_observers_[keyboard.id] = [];
     this.methods_.setResult('getConnectedDevices',
                             {keyboards: [...this.keyboards_],
                              touchDevices: [...this.touchDevices_]});
@@ -94,6 +111,7 @@
    */
   removeFakeConnectedKeyboardById(id) {
     this.keyboards_ = this.keyboards_.filter((device) => device.id !== id);
+    delete this.keyboard_observers_[id];
 
     for (const observer of this.observers_) {
       observer.onKeyboardDisconnected(id);
diff --git a/ash/webui/diagnostics_ui/resources/input_list.js b/ash/webui/diagnostics_ui/resources/input_list.js
index d96b735..fc4ad7a 100644
--- a/ash/webui/diagnostics_ui/resources/input_list.js
+++ b/ash/webui/diagnostics_ui/resources/input_list.js
@@ -140,6 +140,8 @@
     if (!this.keyboardTester_) {
       this.keyboardTester_ = /** @type {!KeyboardTesterElement} */ (
           document.createElement('keyboard-tester'));
+      this.keyboardTester_.setInputDataProvider(
+          assert(this.inputDataProvider_));
       this.root.appendChild(this.keyboardTester_);
     }
     this.keyboardTester_.keyboard = assert(
diff --git a/ash/webui/diagnostics_ui/resources/keyboard_tester.html b/ash/webui/diagnostics_ui/resources/keyboard_tester.html
index 7a9685b..cf0adf5 100644
--- a/ash/webui/diagnostics_ui/resources/keyboard_tester.html
+++ b/ash/webui/diagnostics_ui/resources/keyboard_tester.html
@@ -3,7 +3,7 @@
     --cr-dialog-width: min(calc(100% - 80px), 1400px);
   }
 </style>
-<cr-dialog id="dialog" show-close-button>
+<cr-dialog id="dialog" show-close-button on-close="handleClose">
   <div slot="title">Keyboard tester</div>
   <div slot="body">
     <p>Physical layout: [[keyboard.physicalLayout]]</p>
@@ -14,6 +14,7 @@
     </template>
     <template is="dom-if" if="[[layoutIsKnown_]]">
       <keyboard-diagram
+          id="diagram"
           mechanical-layout="[[diagramMechanicalLayout_]]"
           physical-layout="[[diagramPhysicalLayout_]]"
           show-assistant-key="[[keyboard.hasAssistantKey]]"
diff --git a/ash/webui/diagnostics_ui/resources/keyboard_tester.js b/ash/webui/diagnostics_ui/resources/keyboard_tester.js
index 80c5407..7730f6a 100644
--- a/ash/webui/diagnostics_ui/resources/keyboard_tester.js
+++ b/ash/webui/diagnostics_ui/resources/keyboard_tester.js
@@ -5,9 +5,11 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 
 import {MechanicalLayout as DiagramMechanicalLayout, PhysicalLayout as DiagramPhysicalLayout, TopRowKey as DiagramTopRowKey} from 'chrome://resources/ash/common/keyboard_diagram.js';
+import {KeyboardKeyState} from 'chrome://resources/ash/common/keyboard_key.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {KeyboardInfo, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRowKey} from './diagnostics_types.js';
+import {InputDataProviderInterface, KeyboardInfo, KeyboardObserverInterface, KeyboardObserverReceiver, KeyEvent, KeyEventType, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRowKey} from './diagnostics_types.js';
 
 /**
  * @fileoverview
@@ -47,6 +49,20 @@
 
   _template: html`{__html_template__}`,
 
+  /** @private {?KeyboardObserverReceiver} */
+  receiver_: null,
+
+  /** @private {?InputDataProviderInterface} */
+  inputDataProvider_: null,
+
+  /**
+   * Set the InputDataProvider to get events from.
+   * @param {!InputDataProviderInterface} provider
+   */
+  setInputDataProvider(provider) {
+    this.inputDataProvider_ = provider;
+  },
+
   properties: {
     /**
      * The keyboard being tested, or null if none is being tested at the moment.
@@ -169,6 +185,11 @@
 
   /** Shows the tester's dialog. */
   show() {
+    assert(this.inputDataProvider_);
+    this.receiver_ = new KeyboardObserverReceiver(
+        /** @type {!KeyboardObserverInterface} */ (this));
+    this.inputDataProvider_.observeKeyEvents(
+        this.keyboard.id, this.receiver_.$.bindNewPipeAndPassRemote());
     this.$.dialog.showModal();
   },
 
@@ -179,4 +200,39 @@
   isOpen() {
     return this.$.dialog.open;
   },
+
+  handleClose() {
+    this.receiver_.$.close();
+  },
+
+  /**
+   * Implements KeyboardObserver.OnKeyEvent.
+   * @param {!KeyEvent} keyEvent
+   */
+  onKeyEvent(keyEvent) {
+    const state = keyEvent.type === KeyEventType.kPress ?
+        KeyboardKeyState.kPressed :
+        KeyboardKeyState.kTested;
+    if (keyEvent.topRowPosition !== -1) {
+      this.$$('#diagram').setTopRowKeyState(keyEvent.topRowPosition, state);
+    } else {
+      this.$$('#diagram').setKeyState(keyEvent.keyCode, state);
+    }
+  },
+
+  /**
+   * Implements KeyboardObserver.OnKeyEventsPaused.
+   */
+  onKeyEventsPaused() {
+    // TODO(crbug.com/1207678): show key event pauses in the UI.
+    console.log('key events paused');
+  },
+
+  /**
+   * Implements KeyboardObserver.OnKeyEventsResumed.
+   */
+  onKeyEventsResumed() {
+    // TODO(crbug.com/1207678): show key event pauses in the UI.
+    console.log('key events resumed');
+  },
 });
diff --git a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
index 87bbbc4..8788d06d 100644
--- a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
+++ b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
@@ -47,6 +47,7 @@
       {"cancelButton", IDS_FIRMWARE_CANCEL_BUTTON_TEXT},
       {"doneButton", IDS_FIRMWARE_DONE_BUTTON_TEXT},
       {"updateButton", IDS_FIRMWARE_UPDATE_BUTTON_TEXT},
+      {"updateButtonA11yLabel", IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL},
       {"updateFailedBodyText", IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT},
       {"updateFailedTitleText", IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT},
       {"updating", IDS_FIRMWARE_UPDATING_TEXT},
diff --git a/ash/webui/firmware_update_ui/resources/update_card.html b/ash/webui/firmware_update_ui/resources/update_card.html
index 3bfdcac2..4611a07 100644
--- a/ash/webui/firmware_update_ui/resources/update_card.html
+++ b/ash/webui/firmware_update_ui/resources/update_card.html
@@ -33,10 +33,10 @@
 </style>
 <div id="container">
   <div class="update-info">
-    <div id="name" class="firmware-name-font">
+    <div id="name" class="firmware-name-font" aria-hidden="true">
       [[computeDeviceName_(update.deviceName)]]
     </div>
-    <div id="version" class="firmware-version-font">
+    <div id="version" class="firmware-version-font" aria-hidden="true">
       <span>[[computeVersionText_(update.deviceVersion)]]</span>
       <span id ="priorityText"
           hidden$="[[!isCriticalUpdate_(update.priority)]]">
@@ -45,7 +45,7 @@
     </div>
   </div>
   <cr-button id="updateButton" on-click="onUpdateButtonClicked_"
-      disabled="[[disabled]]">
+      disabled="[[disabled]]" aria-label="[[getUpdateButtonA11yLabel_()]]">
     [[i18n('updateButton')]]
   </cr-button>
 </div>
diff --git a/ash/webui/firmware_update_ui/resources/update_card.js b/ash/webui/firmware_update_ui/resources/update_card.js
index a2892bd..ec2111fe9 100644
--- a/ash/webui/firmware_update_ui/resources/update_card.js
+++ b/ash/webui/firmware_update_ui/resources/update_card.js
@@ -86,6 +86,14 @@
   computeDeviceName_() {
     return mojoString16ToString(this.update.deviceName);
   }
+
+  /**
+   * @protected
+   * @return {string}
+   */
+  getUpdateButtonA11yLabel_() {
+    return this.i18n('updateButtonA11yLabel', this.computeDeviceName_());
+  }
 }
 
 customElements.define(UpdateCardElement.is, UpdateCardElement);
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn
index 79a19de5..ba398393 100644
--- a/ash/webui/personalization_app/resources/BUILD.gn
+++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -61,6 +61,8 @@
   "trusted/ambient/ambient_preview_element.ts",
   "trusted/ambient/ambient_subpage_element.ts",
   "trusted/ambient/toggle_row.ts",
+  "trusted/ambient/topic_source_item.ts",
+  "trusted/ambient/topic_source_list.ts",
   "trusted/personalization_main_element.ts",
   "trusted/personalization_router_element.ts",
   "trusted/personalization_theme_element.ts",
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html
index 3a05d2c..134c015 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html
+++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html
@@ -5,4 +5,5 @@
       description="[[description_]]" checked="[[ambientModeEnabled_]]">
   </toggle-row>
   <ambient-preview>Image Preview</ambient-preview>
+  <topic-source-list></topic-source-list>
 </div>
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts
index 834a92a..965ae1a 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts
@@ -7,6 +7,9 @@
  * the ambient mode settings.
  */
 
+import 'chrome://personalization/trusted/ambient/toggle_row.js';
+import 'chrome://personalization/trusted/ambient/topic_source_list.js';
+
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 export class AmbientSubpage extends PolymerElement {
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.html b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.html
new file mode 100644
index 0000000..51f57d5
--- /dev/null
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.html
@@ -0,0 +1,31 @@
+<style include="cr-shared-style cr-radio-button-style">
+  #container {
+    align-items: center;
+    display: flex;
+    flex: 1;
+    flex-flow: row nowrap;
+    height: 100%;
+    justify-content: space-between;
+    padding-inline-end: var(--cr-icon-ripple-padding);
+    padding-inline-start: var(--cr-section-padding);
+  }
+</style>
+
+<div id="container">
+  <!-- This item behaves similar to a radio button and reuses disc and label
+       style in cr-radio-button-style. -->
+  <div class="disc-wrapper" aria-hidden="true">
+    <div class="disc-border"></div>
+    <div class="disc"></div>
+  </div>
+
+  <div id="labelWrapper" aria-hidden="true">
+    <div>source</div>
+    <div class="cr-secondary-text">
+      source description
+    </div>
+  </div>
+
+  <cr-icon-button class="subpage-arrow">
+  </cr-icon-button>
+</div>
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.ts b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.ts
new file mode 100644
index 0000000..381df16
--- /dev/null
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item.ts
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview This component displays a topic (image) source.
+ */
+
+import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button_style_css.m.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+export class TopicSourceItemElement extends PolymerElement {
+  static get is() {
+    return 'topic-source-item';
+  }
+
+  static get template() {
+    return html`{__html_template__}`;
+  }
+
+  static get properties() {
+    return {
+      /**
+       * Whether this item is selected. This property is related to
+       * cr_radio_button_style and used to style the disc appearance.
+       */
+      checked: {
+        type: Boolean,
+        value: true,
+        reflectToAttribute: true,
+      },
+    };
+  }
+}
+
+customElements.define(TopicSourceItemElement.is, TopicSourceItemElement);
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.html b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.html
new file mode 100644
index 0000000..888c05e
--- /dev/null
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.html
@@ -0,0 +1,29 @@
+<style>
+  #topicSourceTitle {
+    padding-bottom: 16px;
+    padding-top: 16px;
+  }
+
+  topic-source-item {
+    align-items: center;
+    height: 64px;
+  }
+
+  iron-list > *:not(:first-of-type) {
+    border-top: var(--cr-separator-line);
+  }
+
+  iron-list > :focus {
+    background-color: var(--cr-focused-item-color);
+  }
+</style>
+
+<h3 id="topicSourceTitle" aria-hidden="true">
+  image source
+</h3>
+
+<iron-list id="topicSourceList" items="[[topicSources]]">
+  <template>
+    <topic-source-item></topic-source-item>
+  </template>
+</iron-list>
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.ts b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.ts
new file mode 100644
index 0000000..55c2b91
--- /dev/null
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list.ts
@@ -0,0 +1,33 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview This component displays a list of topic (image) sources. It
+ * behaviors similar to a radio button group, e.g. single selection.
+ */
+
+import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
+
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+export class TopicSourceListElement extends PolymerElement {
+  static get is() {
+    return 'topic-source-list';
+  }
+
+  static get template() {
+    return html`{__html_template__}`;
+  }
+
+  static get properties() {
+    return {
+      topicSources: {
+        type: Array,
+        value: ['art', 'photos'],
+      },
+    };
+  }
+}
+
+customElements.define(TopicSourceListElement.is, TopicSourceListElement);
diff --git a/ash/webui/personalization_app/resources/trusted/personalization_app.ts b/ash/webui/personalization_app/resources/trusted/personalization_app.ts
index 16fa214..13b28f0 100644
--- a/ash/webui/personalization_app/resources/trusted/personalization_app.ts
+++ b/ash/webui/personalization_app/resources/trusted/personalization_app.ts
@@ -12,6 +12,8 @@
 import './ambient/ambient_preview_element.js';
 import './ambient/ambient_subpage_element.js';
 import './ambient/toggle_row.js';
+import './ambient/topic_source_item.js';
+import './ambient/topic_source_list.js';
 import './personalization_router_element.js';
 import './personalization_test_api.js';
 import './personalization_toast_element.js';
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.html b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.html
index d2150d0..082c6f4 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.html
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.html
@@ -50,15 +50,16 @@
   </template>
   <template is="dom-if" if="[[!isPhotosEmpty_(photos_)]]">
     <google-photos-photos id="photosContent"
-      hidden$="[[!isPhotosTabVisible_(hidden, tab_)]]">
+      hidden="[[!isPhotosTabVisible_(hidden, tab_)]]">
     </google-photos-photos>
   </template>
   <template is="dom-if" if="[[!isAlbumsEmpty_(albums_)]]">
     <google-photos-albums id="albumsContent"
-      hidden$="[[!isAlbumsTabVisible_(hidden, tab_)]]">
+      hidden="[[!isAlbumsTabVisible_(hidden, tab_)]]">
     </google-photos-albums>
-    <google-photos-photos-by-album-id id="photosByAlbumIdContent" album-id="[[albumId]]"
-      hidden$="[[!isPhotosByAlbumIdTabVisible_(hidden, tab_)]]">
+    <google-photos-photos-by-album-id id="photosByAlbumIdContent"
+      album-id="[[albumId]]"
+      hidden="[[!isPhotosByAlbumIdTabVisible_(hidden, tab_)]]">
     </google-photos-photos-by-album-id>
   </template>
   <template is="dom-if" if="[[isPhotosEmpty_(photos_)]]">
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.ts
index 38b66cc..caf77cd 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_collection_element.ts
@@ -12,11 +12,10 @@
 import '/common/styles.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {isNonEmptyArray} from '../../common/utils.js';
-import {GooglePhotosAlbum, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js';
+import {GooglePhotosAlbum, GooglePhotosPhoto, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js';
 import {WithPersonalizationStore} from '../personalization_store.js';
 
 import {initializeGooglePhotosData} from './wallpaper_controller.js';
@@ -76,7 +75,7 @@
   private albums_: GooglePhotosAlbum[]|null|undefined;
 
   /** The list of photos. */
-  private photos_: Url[]|null|undefined;
+  private photos_: GooglePhotosPhoto[]|null|undefined;
 
   /** The currently selected tab. */
   private tab_: Tab;
@@ -114,7 +113,7 @@
   }
 
   /** Invoked on tab selected. */
-  onTabSelected_(e: Event) {
+  private onTabSelected_(e: Event) {
     const currentTarget: HTMLElement = e.currentTarget as HTMLElement;
     switch (currentTarget.id) {
       case 'albumsTab':
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.html b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.html
index 0ac6075c..84886b5 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.html
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.html
@@ -12,7 +12,7 @@
     align-items: center;
     display: flex;
     flex-direction: row;
-    justify-content: center;
+    justify-content: flex-start;
     width: 100%;
   }
 
@@ -28,8 +28,8 @@
         <wallpaper-grid-item
           class="photo"
           colindex$="[[index]]"
-          image-src="[[photo.url]]"
-          tabindex="-1">    
+          image-src="[[photo.url.url]]"
+          tabindex="-1">
         </wallpaper-grid-item>
       </template>
     </div>
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts
index 655757b..04b6f96 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts
@@ -11,15 +11,13 @@
 import '../../common/styles.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {afterNextRender, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNumberOfGridItemsPerRow, isNonEmptyArray, isSelectionEvent, normalizeKeyForRTL} from '../../common/utils.js';
+import {GooglePhotosPhoto} from '../personalization_app.mojom-webui.js';
 import {WithPersonalizationStore} from '../personalization_store.js';
 
-type PhotosRow = Array<Url|undefined>;
-
 export interface GooglePhotosPhotos {
   $: {grid: IronListElement;};
 }
@@ -72,13 +70,13 @@
   private focusedColIndex_: number;
 
   /** The list of photos. */
-  private photos_: Url[]|null|undefined;
+  private photos_: GooglePhotosPhoto[]|null|undefined;
 
   /**
    * The list of |photos_| split into the appropriate number of |photosPerRow_|
    * so as to be rendered in a grid.
    */
-  private photosByRow_: PhotosRow[]|null;
+  private photosByRow_: GooglePhotosPhoto[][]|null;
 
   /** Whether the list of photos is currently loading. */
   private photosLoading_: boolean;
@@ -121,8 +119,9 @@
   }
 
   /** Invoked on key down of a grid row. */
-  private onGridRowKeyDown_(e: KeyboardEvent&
-                            {model: {index: number, row: Url[]}}) {
+  private onGridRowKeyDown_(e: KeyboardEvent&{
+    model: {index: number, row: GooglePhotosPhoto[]}
+  }) {
     switch (normalizeKeyForRTL(e.key, this.i18n('textdirection') === 'rtl')) {
       case 'ArrowLeft':
         if (this.focusedColIndex_ > 0) {
@@ -166,7 +165,7 @@
   }
 
   /** Invoked to compute |photosByRow_|. */
-  private computePhotosByRow_(): PhotosRow[]|null {
+  private computePhotosByRow_(): GooglePhotosPhoto[][]|null {
     if (this.photosLoading_ || !this.photosPerRow_) {
       return null;
     }
@@ -177,11 +176,7 @@
         {length: Math.ceil(this.photos_.length / this.photosPerRow_)},
         (_, i) => {
           i *= this.photosPerRow_;
-          const row: PhotosRow = this.photos_!.slice(i, i + this.photosPerRow_);
-          while (row.length < this.photosPerRow_) {
-            row.push(undefined);
-          }
-          return row;
+          return this.photos_!.slice(i, i + this.photosPerRow_);
         });
   }
 }
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts
index e5e96e71..16d6a49 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts
@@ -5,9 +5,8 @@
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {Action} from 'chrome://resources/js/cr/ui/store.js';
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
-import {CurrentWallpaper, GooglePhotosAlbum, WallpaperCollection, WallpaperImage} from '../personalization_app.mojom-webui.js';
+import {CurrentWallpaper, GooglePhotosAlbum, GooglePhotosPhoto, WallpaperCollection, WallpaperImage} from '../personalization_app.mojom-webui.js';
 import {DisplayableImage} from '../personalization_reducers.js';
 
 /**
@@ -269,11 +268,11 @@
 
 export type SetGooglePhotosPhotosAction = Action&{
   name: WallpaperActionName.SET_GOOGLE_PHOTOS_PHOTOS;
-  photos: Url[]|null;
+  photos: GooglePhotosPhoto[]|null;
 };
 
 /** Sets the list of Google Photos photos. May be called with null on error. */
-export function setGooglePhotosPhotosAction(photos: Url[]|
+export function setGooglePhotosPhotosAction(photos: GooglePhotosPhoto[]|
                                             null): SetGooglePhotosPhotosAction {
   return {photos, name: WallpaperActionName.SET_GOOGLE_PHOTOS_PHOTOS};
 }
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts
index 75ba821..d16f231 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts
@@ -11,13 +11,12 @@
 import './styles.js';
 
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 import {afterNextRender, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {kMaximumGooglePhotosPreviews, kMaximumLocalImagePreviews} from '../../common/constants.js';
 import {isNonEmptyArray, isNullOrArray, isNullOrNumber, promisifyOnload} from '../../common/utils.js';
 import {IFrameApi} from '../iframe_api.js';
-import {WallpaperCollection, WallpaperImage, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js';
+import {GooglePhotosPhoto, WallpaperCollection, WallpaperImage, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js';
 import {WithPersonalizationStore} from '../personalization_store.js';
 
 import {initializeBackdropData} from './wallpaper_controller.js';
@@ -108,7 +107,7 @@
   hidden: boolean;
   private collections_: WallpaperCollection[];
   private collectionsLoading_: boolean;
-  private googlePhotos_: unknown[]|null;
+  private googlePhotos_: GooglePhotosPhoto[]|null;
   private googlePhotosLoading_: boolean;
   private googlePhotosCount_: number|null;
   private googlePhotosCountLoading_: boolean;
@@ -249,14 +248,16 @@
 
   /** Invoked on changes to the list of Google Photos photos. */
   private async onGooglePhotosChanged_(
-      googlePhotos: Url[]|null, googlePhotosLoading: boolean) {
+      googlePhotos: GooglePhotosPhoto[]|null, googlePhotosLoading: boolean) {
     if (googlePhotosLoading || !isNullOrArray(googlePhotos)) {
       return;
     }
     const iframe = await this.iframePromise_;
     IFrameApi.getInstance().sendGooglePhotosPhotos(
         iframe.contentWindow!,
-        googlePhotos?.slice(0, kMaximumGooglePhotosPreviews) ?? null);
+        googlePhotos?.slice(0, kMaximumGooglePhotosPreviews)
+                ?.map(googlePhoto => googlePhoto.url) ??
+            null);
   }
 
   /** Invoked on changes to the count of Google Photos photos. */
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
index 3466805b..d6c6d96 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
@@ -5,10 +5,9 @@
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
 import {isNonEmptyArray} from '../../common/utils.js';
-import {FetchGooglePhotosAlbumsResponse, GooglePhotosAlbum, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperProviderInterface, WallpaperType} from '../personalization_app.mojom-webui.js';
+import {FetchGooglePhotosAlbumsResponse, FetchGooglePhotosPhotosResponse, GooglePhotosAlbum, GooglePhotosPhoto, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperProviderInterface, WallpaperType} from '../personalization_app.mojom-webui.js';
 import {PersonalizationStore} from '../personalization_store.js';
 import {isFilePath, isWallpaperImage} from '../utils.js';
 
@@ -89,6 +88,8 @@
   let albums: Array<GooglePhotosAlbum>|null = [];
   let resumeToken: string|null|undefined = null;
 
+  // TODO(b/215179074): Support incremental load of albums as the user scrolls
+  // through their library as opposed to loading them all at once.
   do {
     const {response} = await provider.fetchGooglePhotosAlbums(resumeToken) as
         {response: FetchGooglePhotosAlbumsResponse};
@@ -115,29 +116,28 @@
 
 /** Fetches the list of Google Photos photos and saves it to the store. */
 async function fetchGooglePhotosPhotos(
-    _: WallpaperProviderInterface, store: PersonalizationStore): Promise<void> {
+    provider: WallpaperProviderInterface,
+    store: PersonalizationStore): Promise<void> {
   store.dispatch(action.beginLoadGooglePhotosPhotosAction());
 
-  // TODO(dmblack): Create and wire up mojo API. For now, simulate an async
-  // request that returns a list of 1,000 Google Photos photos.
-  return new Promise(
-      resolve => setTimeout(() => {
-        // Temporarily use hard-coded URLs from the solid colors backdrop
-        // collection since the backdrop server is already allowlisted with the
-        // untrusted iframe's content security policy.
-        const urls = [
-          'https://lh6.googleusercontent.com/proxy/dVgC6TzmRH-4uhdcqZK37RyRErOz46Y4S9W8Pw3tfRHyPluwELODHfvrx-SorsUFq5YphXy1VXIxQO2oXlF7GfjeRLY4hsH9c20FqCM4Tpk',
-          'https://lh6.googleusercontent.com/proxy/qcBQd3OJ8qwQeFvAb0p23WJau6s1w5RQ0UAUFD1bm56SVBgP1X7-LAfv2_uF47-9Dd6v_fCVKYVU6SCsorTxMRahBSdv6of9FBdReaoqPg',
-          'https://lh6.googleusercontent.com/proxy/fahpL4TekPUgLhKJQ289ISWz_FPG9XutzfjqBiSdDhxjuBfZ7SjlE4j58rg9wzEsu9NcQ0Yrm0B5NW_MWaLbX0TWJ5yRDVH1z-Zf',
-          'https://lh6.googleusercontent.com/proxy/dVgC6TzmRH-4uhdcqZK37RyRErOz46Y4S9W8Pw3tfRHyPluwELODHfvrx-SorsUFq5YphXy1VXIxQO2oXlF7GfjeRLY4hsH9c20FqCM4Tpk',
-          'https://lh6.googleusercontent.com/proxy/5ftru2Wt8g3R7r4TzRAOhJD7jMpLWOiqKxgql3vd_s26EnV51M5WfJe-ZJZkrMnqbOQ4uB1iBycwwGziEVYCwMeRx2Tcdmiq2lH44hUD3OLX',
-          'https://lh6.googleusercontent.com/proxy/qcBQd3OJ8qwQeFvAb0p23WJau6s1w5RQ0UAUFD1bm56SVBgP1X7-LAfv2_uF47-9Dd6v_fCVKYVU6SCsorTxMRahBSdv6of9FBdReaoqPg',
-        ];
-        store.dispatch(action.setGooglePhotosPhotosAction(
-            Array.from({length: 1000})
-                .map((_, i) => ({url: urls[i % urls.length]}))));
-        resolve();
-      }, 1000));
+  let photos: Array<GooglePhotosPhoto>|null = [];
+  let resumeToken: string|null|undefined = null;
+
+  // TODO(b/216882690): Support incremental load of photos as the user scrolls
+  // through their library as opposed to loading them all at once.
+  do {
+    const {response} = await provider.fetchGooglePhotosPhotos(resumeToken) as
+        {response: FetchGooglePhotosPhotosResponse};
+    if (!Array.isArray(response.photos)) {
+      console.warn('Failed to fetch Google Photos photos');
+      photos = null;
+      break;
+    }
+    photos.push(...response.photos);
+    resumeToken = response.resumeToken;
+  } while (resumeToken);
+
+  store.dispatch(action.setGooglePhotosPhotosAction(photos));
 }
 
 /** Get list of local images from disk and save it to the store. */
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts
index 69434ed..b634b54 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
-import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
-import {CurrentWallpaper, GooglePhotosAlbum, WallpaperCollection, WallpaperImage} from '../personalization_app.mojom-webui.js';
+import {CurrentWallpaper, GooglePhotosAlbum, GooglePhotosPhoto, WallpaperCollection, WallpaperImage} from '../personalization_app.mojom-webui.js';
 
 /**
  * Stores collections and images from backdrop server.
@@ -30,7 +29,7 @@
 export interface GooglePhotosState {
   count: number|null|undefined;
   albums: GooglePhotosAlbum[]|null|undefined;
-  photos: Url[]|null|undefined;
+  photos: GooglePhotosPhoto[]|null|undefined;
   photosByAlbumId: Record<string, unknown[]|null|undefined>;
 }
 
diff --git a/ash/webui/projector_app/projector_app_client.cc b/ash/webui/projector_app/projector_app_client.cc
index 23a1af7..11f53af 100644
--- a/ash/webui/projector_app/projector_app_client.cc
+++ b/ash/webui/projector_app/projector_app_client.cc
@@ -13,6 +13,7 @@
 
 constexpr char kPendingScreencastName[] = "name";
 constexpr char kPendingScreencastUploadProgress[] = "uploadProgress";
+constexpr char kPendingScreencastCreatedTime[] = "createdTime";
 constexpr int64_t kPendingScreencastDiffThresholdInBytes = 600 * 1024;
 
 ProjectorAppClient* g_instance = nullptr;
@@ -26,6 +27,10 @@
                                  static_cast<double>(total_size_in_bytes);
   val.SetKey(kPendingScreencastUploadProgress,
              base::Value(upload_progress * 100));
+  val.SetKey(kPendingScreencastCreatedTime,
+             base::Value(created_time.is_null()
+                             ? 0
+                             : created_time.ToJsTimeIgnoringNull()));
   return val;
 }
 
diff --git a/ash/webui/projector_app/projector_app_client.h b/ash/webui/projector_app/projector_app_client.h
index e27c1ad..b0daf6f 100644
--- a/ash/webui/projector_app/projector_app_client.h
+++ b/ash/webui/projector_app/projector_app_client.h
@@ -9,6 +9,7 @@
 
 #include "base/files/file_path.h"
 #include "base/observer_list_types.h"
+#include "base/time/time.h"
 
 namespace network {
 namespace mojom {
@@ -28,9 +29,7 @@
 
 struct NewScreencastPrecondition;
 
-// TODO(b/201468756): pendings screencasts are sorted by created time. Add
-// `created_time` field to PendingScreencast. Screencasts might fail to
-// upload. Add `failed_to_upload` field to PendingScreencast.
+// TODO(b/200179137): Add `failed_to_upload` field to PendingScreencast.
 struct PendingScreencast {
   base::Value ToValue() const;
   bool operator==(const PendingScreencast& rhs) const;
@@ -41,11 +40,14 @@
   // The display name of screencast. If `container_dir` is
   // "/root/projector_data/abc", the `name` is "abc".
   std::string name;
-  // The total size of a screencast in bytes, including all media files and
-  // metadata files under `container_dir`.
+  // The total size of a screencast in bytes, including the media file and the
+  // metadata file under `container_dir`.
   int64_t total_size_in_bytes = 0;
   // The bytes have been transferred to drive.
   int64_t bytes_transferred = 0;
+
+  // The media file created time.
+  base::Time created_time;
 };
 
 struct PendingScreencastSetComparator {
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
index 85389084..fc96b3e3 100644
--- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc
+++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -21,9 +21,6 @@
 namespace {
 
 const char kTestUserEmail[] = "testuser1@gmail.com";
-const char kTestScreencastName[] = "test_pending_screecast";
-const char kTestScreencastPath[] =
-    "/root/projector_data/test_pending_screecast";
 
 const char kTestXhrUrl[] = "https://www.googleapis.com/drive/v3/files/fileID";
 const char kTestXhrUnsupportedUrl[] = "https://www.example.com";
@@ -347,10 +344,13 @@
 }
 
 TEST_F(ProjectorMessageHandlerUnitTest, GetPendingScreencasts) {
+  const std::string name = "test_pending_screecast";
+  const std::string path = "/root/projector_data/test_pending_screecast";
+  const base::Time created_time;
   const PendingScreencastSet expectedScreencasts{ash::PendingScreencast{
-      /*container_dir=*/base::FilePath(kTestScreencastPath),
-      /*name=*/kTestScreencastName, /*total_size_in_bytes=*/1,
-      /*bytes_untransferred=*/0}};
+      /*container_dir=*/base::FilePath(path),
+      /*name=*/name, /*total_size_in_bytes=*/1,
+      /*bytes_untransferred=*/0, /*created_time=*/created_time}};
   ON_CALL(mock_app_client(), GetPendingScreencasts())
       .WillByDefault(testing::ReturnRef(expectedScreencasts));
 
@@ -376,7 +376,8 @@
   EXPECT_EQ(list_view.size(), 1u);
 
   const auto& screencast = list_view[0];
-  EXPECT_EQ(*(screencast.FindStringPath("name")), kTestScreencastName);
+  EXPECT_EQ(*(screencast.FindStringPath("name")), name);
+  EXPECT_EQ(*(screencast.FindDoublePath("createdTime")), 0);
 }
 
 TEST_F(ProjectorMessageHandlerUnitTest, OnScreencastsStateChange) {
diff --git a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc
index 5e061a9..3bfdb3b 100644
--- a/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc
+++ b/ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.cc
@@ -4,6 +4,8 @@
 
 #include "ash/webui/shimless_rma/mojom/shimless_rma_mojom_traits.h"
 
+#include <string>
+
 #include "base/notreached.h"
 #include "chromeos/dbus/rmad/rmad.pb.h"
 #include "chromeos/dbus/update_engine/update_engine.pb.h"
@@ -728,9 +730,12 @@
          rmad::ComponentsRepairState_ComponentRepairStatus* out) {
   rmad::RmadComponent component;
   rmad::ComponentsRepairState_ComponentRepairStatus_RepairStatus repair_status;
-  if (data.ReadComponent(&component) && data.ReadState(&repair_status)) {
+  std::string identifier;
+  if (data.ReadComponent(&component) && data.ReadState(&repair_status) &&
+      data.ReadIdentifier(&identifier)) {
     out->set_component(component);
     out->set_repair_status(repair_status);
+    out->set_identifier(identifier);
     return true;
   }
   return false;
diff --git a/ash/webui/shimless_rma/resources/base_page.html b/ash/webui/shimless_rma/resources/base_page.html
index 557b09a8..e47cdde 100644
--- a/ash/webui/shimless_rma/resources/base_page.html
+++ b/ash/webui/shimless_rma/resources/base_page.html
@@ -1,24 +1,24 @@
 <style include="cr-shared-style shimless-rma-shared">
-  .page-wrapper {
-    padding: 50px 0 50px 0;
-    width:  100%;
-  }
-
-  .page-wrapper {
+  #pageWrapper {
+    align-items: stretch;
     display: flex;
     flex-direction: row;
+    height: 100%;
+    width: 100%;
   }
 
   #leftPane {
-    flex-grow: 1;
+    box-sizing: border-box;
+    padding-inline-end: 32px;
+    width: 40%;
   }
 
   #rightPane {
-    flex-basis: 500px;
+    flex-grow: 1;
+    padding-inline-start: 48px;
   }
-
 </style>
-<div class="page-wrapper">
+<div id="pageWrapper">
   <div id="leftPane">
     <slot name="left-pane"></slot>
   </div>
diff --git a/ash/webui/shimless_rma/resources/index.html b/ash/webui/shimless_rma/resources/index.html
index 43efdcb..541f5491 100644
--- a/ash/webui/shimless_rma/resources/index.html
+++ b/ash/webui/shimless_rma/resources/index.html
@@ -6,6 +6,14 @@
   <head>
     <meta charset="utf-8">
     <title></title>
+    <style>
+      html, 
+      body {
+        height: 100%;
+        margin: 0;
+        width: 100%;
+      }
+    </style>
   </head>
   <body>
     <shimless-rma></shimless-rma>
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.html b/ash/webui/shimless_rma/resources/shimless_rma.html
index 40aa210..71c9db5 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma.html
+++ b/ash/webui/shimless_rma/resources/shimless_rma.html
@@ -1,9 +1,26 @@
 <style include="cr-shared-style shimless-rma-shared">
   #shimlessRMAContainer {
-    padding: 50px;
+    align-items: stretch;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+    padding-inline-end: 40px;
+    padding-inline-start: 40px;
+    width: 100%;
+  }
+
+  #contentContainer {
+    flex-grow: 1;
+  }
+
+  .shimless-content {
+    height: 100%;
+    width: 100%;
   }
 
   .shimless-footer {
+    height: 80px;
     margin-top: 10px;
     text-align: end;
   }
@@ -14,7 +31,7 @@
 
   #back {
     border: 0;
-    margin-inline-start: -15px;
+    height: 80px;
   }
 
   #cancel {
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
index d512631b..a69b4e81 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
+++ b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
@@ -63,5 +63,10 @@
       font-weight: var(--shimless-regular-font-weight);
       line-height: var(--shimless-dialog-body-line-height);
     }
+
+    base-page {
+      height: 100%;
+      width: 100%;
+    }
   </style>
 </template>
diff --git a/ash/wm/desks/desk_drag_proxy.cc b/ash/wm/desks/desk_drag_proxy.cc
index 06e7bf9..390f5000 100644
--- a/ash/wm/desks/desk_drag_proxy.cc
+++ b/ash/wm/desks/desk_drag_proxy.cc
@@ -5,6 +5,7 @@
 #include "ash/wm/desks/desk_drag_proxy.h"
 
 #include "ash/drag_drop/drag_image_view.h"
+#include "ash/style/system_shadow.h"
 #include "ash/wm/desks/desk_mini_view.h"
 #include "ash/wm/desks/desk_preview_view.h"
 #include "ash/wm/desks/desks_bar_view.h"
@@ -67,8 +68,9 @@
   drag_widget_->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
 
   // Copy the preview of the dragged desk to the widget content.
-  drag_widget_->SetContentsView(std::make_unique<DeskPreviewView>(
-      views::Button::PressedCallback(), drag_view_));
+  drag_preview_ =
+      drag_widget_->SetContentsView(std::make_unique<DeskPreviewView>(
+          views::Button::PressedCallback(), drag_view_));
 
   // Set the bounds of dragged preview to drag proxy.
   drag_widget_->SetBounds(drag_view_->GetPreviewBoundsInScreen());
@@ -88,6 +90,9 @@
           proxy_bounds_in_screen.origin().OffsetFromOrigin(),
       scale_transform));
 
+  // When being dragged, the shadow elevation will be increased.
+  drag_preview_->shadow()->SetType(DeskPreviewView::kDraggedShadowType);
+
   // Perform Moving.
   DragToX(location_screen_x);
 
@@ -122,6 +127,9 @@
   settings.AddObserver(this);
   layer->SetTransform(gfx::Transform());
 
+  // Reset the shadow elevation when drag ends.
+  drag_preview_->shadow()->SetType(DeskPreviewView::kDefaultShadowType);
+
   state_ = State::kSnappingBack;
 }
 
diff --git a/ash/wm/desks/desk_drag_proxy.h b/ash/wm/desks/desk_drag_proxy.h
index 9e5681f..8c48ca5 100644
--- a/ash/wm/desks/desk_drag_proxy.h
+++ b/ash/wm/desks/desk_drag_proxy.h
@@ -64,6 +64,8 @@
   DesksBarView* desks_bar_view_ = nullptr;
   // The desk's mini view being dragged.
   DeskMiniView* drag_view_ = nullptr;
+  // The desk preview view generated based on the `drag_view_`.
+  DeskPreviewView* drag_preview_ = nullptr;
   // The size of dragged preview.
   const gfx::Size drag_preview_size_;
   // The y of the dragged preview in screen coordinate.
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc
index 32877942..460ab54 100644
--- a/ash/wm/desks/desk_preview_view.cc
+++ b/ash/wm/desks/desk_preview_view.cc
@@ -58,8 +58,6 @@
 constexpr int kCornerRadius = 4;
 constexpr gfx::RoundedCornersF kCornerRadii(kCornerRadius);
 
-constexpr int kShadowElevation = 4;
-
 // Holds data about the original desk's layers to determine what we should do
 // when we attempt to mirror those layers.
 struct LayerData {
@@ -244,54 +242,6 @@
 }  // namespace
 
 // -----------------------------------------------------------------------------
-// DeskPreviewView::ShadowRenderer
-
-// Layer delegate which handles drawing a shadow around DeskPreviewView.
-class DeskPreviewView::ShadowRenderer : public ui::LayerDelegate {
- public:
-  ShadowRenderer()
-      : shadow_values_(gfx::ShadowValue::MakeMdShadowValues(kShadowElevation)) {
-  }
-
-  ShadowRenderer(const ShadowRenderer&) = delete;
-  ShadowRenderer& operator=(const ShadowRenderer&) = delete;
-
-  ~ShadowRenderer() override = default;
-
-  gfx::Rect GetPaintedBounds() const {
-    gfx::Rect total_rect(bounds_);
-    total_rect.Inset(gfx::ShadowValue::GetMargin(shadow_values_));
-    return total_rect;
-  }
-
-  void set_bounds(const gfx::Rect& bounds) { bounds_ = bounds; }
-
- private:
-  // ui::LayerDelegate:
-  void OnPaintLayer(const ui::PaintContext& context) override {
-    ui::PaintRecorder recorder(context, bounds_.size());
-
-    cc::PaintFlags shadow_flags;
-    shadow_flags.setAntiAlias(true);
-    shadow_flags.setLooper(gfx::CreateShadowDrawLooper(shadow_values_));
-
-    const gfx::Rect rrect_bounds =
-        bounds_ - GetPaintedBounds().OffsetFromOrigin();
-    const auto r_rect = SkRRect::MakeRectXY(gfx::RectToSkRect(rrect_bounds),
-                                            kCornerRadius, kCornerRadius);
-    recorder.canvas()->sk_canvas()->clipRRect(r_rect, SkClipOp::kDifference,
-                                              /*do_anti_alias=*/true);
-    recorder.canvas()->sk_canvas()->drawRRect(r_rect, shadow_flags);
-  }
-
-  void OnDeviceScaleFactorChanged(float old_device_scale_factor,
-                                  float new_device_scale_factor) override {}
-
-  gfx::Rect bounds_;
-  const gfx::ShadowValues shadow_values_;
-};
-
-// -----------------------------------------------------------------------------
 // DeskPreviewView
 
 DeskPreviewView::DeskPreviewView(PressedCallback callback,
@@ -303,7 +253,7 @@
       force_occlusion_tracker_visible_(
           std::make_unique<aura::WindowOcclusionTracker::ScopedForceVisible>(
               mini_view->GetDeskContainer())),
-      shadow_delegate_(std::make_unique<ShadowRenderer>()) {
+      shadow_(std::make_unique<SystemShadow>(kDefaultShadowType)) {
   DCHECK(mini_view_);
 
   SetFocusPainter(nullptr);
@@ -319,9 +269,8 @@
   layer()->SetFillsBoundsOpaquely(false);
   layer()->SetMasksToBounds(false);
 
-  shadow_layer_.SetFillsBoundsOpaquely(false);
-  layer()->Add(&shadow_layer_);
-  shadow_layer_.set_delegate(shadow_delegate_.get());
+  shadow_->SetRoundedCornerRadius(kCornerRadius);
+  layer()->Add(shadow_->layer());
 
   wallpaper_preview_->SetPaintToLayer();
   auto* wallpaper_preview_layer = wallpaper_preview_->layer();
@@ -418,9 +367,8 @@
 }
 
 void DeskPreviewView::Layout() {
-  gfx::Rect bounds = GetContentsBounds();
-  shadow_delegate_->set_bounds(bounds);
-  shadow_layer_.SetBounds(shadow_delegate_->GetPaintedBounds());
+  const gfx::Rect bounds = GetContentsBounds();
+  shadow_->SetContentBounds(bounds);
   wallpaper_preview_->SetBoundsRect(bounds);
   desk_mirrored_contents_view_->SetBoundsRect(bounds);
 
diff --git a/ash/wm/desks/desk_preview_view.h b/ash/wm/desks/desk_preview_view.h
index 1263776..a5628dc4 100644
--- a/ash/wm/desks/desk_preview_view.h
+++ b/ash/wm/desks/desk_preview_view.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "ash/ash_export.h"
+#include "ash/style/system_shadow.h"
 #include "ui/aura/window_occlusion_tracker.h"
 #include "ui/compositor/layer.h"
 #include "ui/views/controls/button/button.h"
@@ -68,10 +69,17 @@
 
   ~DeskPreviewView() override;
 
+  static constexpr SystemShadow::Type kDefaultShadowType =
+      SystemShadow::Type::kElevation4;
+  static constexpr SystemShadow::Type kDraggedShadowType =
+      SystemShadow::Type::kElevation12;
+
   // Returns the height of the DeskPreviewView, which is a function of the
   // |root| window's height.
   static int GetHeight(aura::Window* root);
 
+  SystemShadow* shadow() const { return shadow_.get(); }
+
   void SetBorderColor(SkColor color);
 
   // Called when the CloseDeskButton is pressed, and the desk is about to be
@@ -91,8 +99,6 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
 
  private:
-  class ShadowRenderer;
-
   DeskMiniView* const mini_view_;
 
   // A view that paints the wallpaper in the mini_view. It avoids the dimming
@@ -121,8 +127,7 @@
   std::unique_ptr<aura::WindowOcclusionTracker::ScopedForceVisible>
       force_occlusion_tracker_visible_;
 
-  ui::Layer shadow_layer_;
-  std::unique_ptr<ShadowRenderer> shadow_delegate_;
+  std::unique_ptr<SystemShadow> shadow_;
 };
 
 }  // namespace ash
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index 3327e28b..c21c2c0 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -895,7 +895,8 @@
 }
 
 void DesksController::CaptureActiveDeskAsTemplate(
-    GetDeskTemplateCallback callback) const {
+    GetDeskTemplateCallback callback,
+    aura::Window* root_window_to_show) const {
   DCHECK(current_account_id_.is_valid());
 
   // Construct |restore_data| for |desk_template|.
@@ -947,8 +948,9 @@
       shell->overview_controller()->InOverviewSession()) {
     // There were some unsupported apps in the active desk so open up a dialog
     // to let the user know.
+    DCHECK(root_window_to_show);
     DesksTemplatesDialogController::Get()->ShowUnsupportedAppsDialog(
-        shell->GetPrimaryRootWindow(), unsupported_apps, std::move(callback),
+        root_window_to_show, unsupported_apps, std::move(callback),
         std::move(desk_template));
     return;
   }
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h
index 6276b19..a5a68f5 100644
--- a/ash/wm/desks/desks_controller.h
+++ b/ash/wm/desks/desks_controller.h
@@ -259,8 +259,11 @@
 
   // Captures the active desk and returns it as a desk template containing
   // necessary information that can be used to create a same desk via provided
-  // `callback`.
-  void CaptureActiveDeskAsTemplate(GetDeskTemplateCallback callback) const;
+  // `callback`, `root_window_to_show` is used to determine which monitor to
+  // show template related dialog.
+  void CaptureActiveDeskAsTemplate(
+      GetDeskTemplateCallback callback,
+      aura::Window* root_window_to_show = nullptr) const;
 
   // Creates and activates a new desk for a template with name `template_name`
   // or `template_name ({counter})` to resolve naming conflicts. Runs `callback`
diff --git a/ash/wm/desks/templates/desks_templates_dialog_controller.cc b/ash/wm/desks/templates/desks_templates_dialog_controller.cc
index 0b8904e..64996d9 100644
--- a/ash/wm/desks/templates/desks_templates_dialog_controller.cc
+++ b/ash/wm/desks/templates/desks_templates_dialog_controller.cc
@@ -4,6 +4,7 @@
 
 #include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
 
+#include "ash/public/cpp/desks_templates_delegate.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
@@ -149,13 +150,36 @@
   unsupported_apps_callback_ = std::move(callback);
   unsupported_apps_template_ = std::move(desk_template);
 
+  size_t incognito_window_count = 0;
+  auto* delegate = Shell::Get()->desks_templates_delegate();
+  // TODO(shidi): The caller of  ShowUnsupportedAppsDialog should provide us
+  // with the incognito window count to avoid double looping.
+  for (auto* window : unsupported_apps) {
+    if (delegate->IsIncognitoWindow(window))
+      ++incognito_window_count;
+  }
+
+  // Note that this assumed unsupported apps which are not incognito browsers
+  // are linux apps.
+  std::u16string app_description;
+  int app_description_id;
+  if (incognito_window_count == 0) {
+    app_description_id =
+        IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_DIALOG_DESCRIPTION;
+  } else if (incognito_window_count != unsupported_apps.size()) {
+    app_description_id =
+        IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_LINUX_APPS_AND_INCOGNITO_DIALOG_DESCRIPTION;
+  } else {
+    app_description_id =
+        IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_INCOGNITO_DIALOG_DESCRIPTION;
+  }
+
   auto dialog =
       views::Builder<DesksTemplatesDialog>()
           .SetTitleText(IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_TITLE)
           .SetConfirmButtonText(
               IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_CONFIRM_BUTTON)
-          .SetDescriptionText(l10n_util::GetStringUTF16(
-              IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_DESCRIPTION))
+          .SetDescriptionText(l10n_util::GetStringUTF16(app_description_id))
           .SetCancelCallback(
               base::BindOnce(&DesksTemplatesDialogController::
                                  OnUserCanceledUnsupportedAppsDialog,
diff --git a/ash/wm/desks/templates/desks_templates_item_view.cc b/ash/wm/desks/templates/desks_templates_item_view.cc
index 6121a8d6..3df022c3 100644
--- a/ash/wm/desks/templates/desks_templates_item_view.cc
+++ b/ash/wm/desks/templates/desks_templates_item_view.cc
@@ -517,7 +517,7 @@
   // we needed to make `this` a `ViewTargeterDelegate` for the view event
   // targeter in order to allow the `name_view_` to be specifically targeted and
   // focused. Use the centerpoint for `rect` as parts of `rect` may be outside
-  // the `name_view_bounds` for touch event
+  // the `name_view_bounds` for touch events.
   if (root == this &&
       gfx::ToRoundedRect(name_view_bounds).Contains(rect.CenterPoint())) {
     return name_view_;
@@ -544,7 +544,8 @@
   // Show the dialog to confirm the deletion.
   auto* dialog_controller = DesksTemplatesDialogController::Get();
   dialog_controller->ShowDeleteDialog(
-      Shell::GetPrimaryRootWindow(), name_view_->GetAccessibleName(),
+      GetWidget()->GetNativeWindow()->GetRootWindow(),
+      name_view_->GetAccessibleName(),
       base::BindOnce(&DesksTemplatesItemView::OnDeleteTemplate,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/ash/wm/desks/templates/desks_templates_presenter.cc b/ash/wm/desks/templates/desks_templates_presenter.cc
index 5114ce5b5..c09a1f0 100644
--- a/ash/wm/desks/templates/desks_templates_presenter.cc
+++ b/ash/wm/desks/templates/desks_templates_presenter.cc
@@ -157,11 +157,13 @@
                      weak_ptr_factory_.GetWeakPtr(), delay));
 }
 
-void DesksTemplatesPresenter::MaybeSaveActiveDeskAsTemplate() {
+void DesksTemplatesPresenter::MaybeSaveActiveDeskAsTemplate(
+    aura::Window* root_window_to_show) {
   DesksController::Get()->CaptureActiveDeskAsTemplate(
       base::BindOnce(&DesksTemplatesPresenter::SaveOrUpdateDeskTemplate,
                      weak_ptr_factory_.GetWeakPtr(),
-                     /*is_update=*/false));
+                     /*is_update=*/false),
+      root_window_to_show);
 }
 
 void DesksTemplatesPresenter::SaveOrUpdateDeskTemplate(
diff --git a/ash/wm/desks/templates/desks_templates_presenter.h b/ash/wm/desks/templates/desks_templates_presenter.h
index d27205c..df22477 100644
--- a/ash/wm/desks/templates/desks_templates_presenter.h
+++ b/ash/wm/desks/templates/desks_templates_presenter.h
@@ -14,6 +14,7 @@
 #include "components/desks_storage/core/desk_model.h"
 #include "components/desks_storage/core/desk_model_observer.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/aura/window.h"
 
 namespace ash {
 
@@ -63,7 +64,7 @@
   // callback to `OnAddOrUpdateEntry`. If there are unsupported apps on the
   // active desk, a dialog will open up and we may or may not save the desk
   // asynchronously based on the user's decision.
-  void MaybeSaveActiveDeskAsTemplate();
+  void MaybeSaveActiveDeskAsTemplate(aura::Window* root_window_to_show);
 
   // Saves or updates the `desk_template` to the model.
   void SaveOrUpdateDeskTemplate(bool is_update,
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc
index ed2babf..e6579886 100644
--- a/ash/wm/desks/templates/desks_templates_unittest.cc
+++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -2303,6 +2303,41 @@
   EXPECT_EQ(0.f, test_window->layer()->opacity());
 }
 
+// Tests that windows have their opacity reset after being hidden and then going
+// to a different desk. Regression test for https://crbug.com/1292174.
+TEST_F(DesksTemplatesTest, WindowOpacityResetAfterViewing) {
+  AddEntry(base::GUID::GenerateRandomV4(), "template", base::Time::Now());
+
+  // Create and a new desk, and create a couple of test windows on the active
+  // desk.
+  DesksController* desks_controller = DesksController::Get();
+  desks_controller->NewDesk(DesksCreationRemovalSource::kKeyboard);
+  auto test_window1 = CreateAppWindow();
+  auto test_window2 = CreateAppWindow();
+  auto test_window3 = CreateAppWindow();
+  ASSERT_EQ(0, desks_controller->GetActiveDeskIndex());
+  ASSERT_TRUE(desks_controller->BelongsToActiveDesk(test_window1.get()));
+  ASSERT_TRUE(desks_controller->BelongsToActiveDesk(test_window2.get()));
+  ASSERT_TRUE(desks_controller->BelongsToActiveDesk(test_window3.get()));
+
+  OpenOverviewAndShowTemplatesGrid();
+
+  // All the windows are hidden to show the templates grid.
+  EXPECT_EQ(0.f, test_window1->layer()->opacity());
+  EXPECT_EQ(0.f, test_window2->layer()->opacity());
+  EXPECT_EQ(0.f, test_window3->layer()->opacity());
+
+  ui::ScopedAnimationDurationScaleMode animation(
+      ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
+
+  // Activate the second desk which has no windows. Test that all the windows
+  // have their opacity restored.
+  ActivateDesk(desks_controller->desks()[1].get());
+  EXPECT_EQ(1.f, test_window1->layer()->opacity());
+  EXPECT_EQ(1.f, test_window2->layer()->opacity());
+  EXPECT_EQ(1.f, test_window3->layer()->opacity());
+}
+
 // Tests that the desks templates name view can accept touch events and get
 // focused. Regression test for https://crbug.com/1291769.
 TEST_F(DesksTemplatesTest, TouchForNameView) {
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index 3f272a4..cc99c81 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -1709,6 +1709,13 @@
   for (auto& overview_mode_item : window_list_)
     overview_mode_item->HideForDesksTemplatesGrid(/*animate=*/true);
 
+  // There may be an existing animation in progress triggered by
+  // `HideDeskTemplatesGrid()` below, which animates a widget to 0.f before
+  // calling `OnDesksTemplatesGridFadedOut()` to hide the widget on animation
+  // end. Stop animating so that the callbacks associated get fired, otherwise
+  // we may end up trying to show a widget that's already shown.
+  // `StopAnimating()` is a no-op if there is no animation in progress.
+  desks_templates_grid_widget_->GetLayer()->GetAnimator()->StopAnimating();
   desks_templates_grid_widget_->Show();
 
   // Fade in the widget from its current opacity.
@@ -1737,15 +1744,18 @@
 
   if (exit_overview && overview_session_->enter_exit_overview_type() ==
                            OverviewEnterExitType::kImmediateExit) {
-    // Since we're immediately exiting, we don't need to animate anything and
-    // can let the `desks_templates_grid_widget_` handle its own destruction.
+    // Since we're immediately exiting, we don't need to animate anything.
+    // Reshow the overview items and let the `desks_templates_grid_widget_`
+    // handle its own destruction.
+    for (auto& overview_mode_item : window_list_)
+      overview_mode_item->RevertHideForDesksTemplatesGrid(/*animate=*/false);
     return;
   }
 
   if (exit_overview) {
     // Un-hide the overview mode items.
     for (auto& overview_mode_item : window_list_)
-      overview_mode_item->RevertHideForDesksTemplatesGrid();
+      overview_mode_item->RevertHideForDesksTemplatesGrid(/*animate=*/true);
 
     // Disable the `desks_templates_grid_widget_`'s event targeting so it can't
     // get any events during the animation.
@@ -1858,6 +1868,14 @@
             &OverviewGrid::OnSaveDeskAsTemplateButtonPressed,
             weak_ptr_factory_.GetWeakPtr())));
   }
+
+  // There may be an existing animation in progress triggered by
+  // `PerformFadeOutLayer()` above, which animates a widget to 0.f before
+  // calling `OnSaveDeskAsTemplateButtonFadedOut()` to hide the widget on
+  // animation end. Stop animating so that the callbacks associated get fired,
+  // otherwise we may end up trying to show a widget that's already shown.
+  // `StopAnimating()` is a no-op if there is no animation in progress.
+  save_desk_as_template_widget_->GetLayer()->GetAnimator()->StopAnimating();
   save_desk_as_template_widget_->Show();
   PerformFadeInLayer(save_desk_as_template_widget_->GetLayer());
 
@@ -2334,12 +2352,13 @@
 }
 
 void OverviewGrid::OnSaveDeskAsTemplateButtonPressed() {
-  DesksTemplatesPresenter::Get()->MaybeSaveActiveDeskAsTemplate();
+  DesksTemplatesPresenter::Get()->MaybeSaveActiveDeskAsTemplate(
+      save_desk_as_template_widget_->GetNativeWindow()->GetRootWindow());
 }
 
 void OverviewGrid::OnDesksTemplatesGridFadedOut() {
   for (auto& overview_mode_item : window_list_)
-    overview_mode_item->RevertHideForDesksTemplatesGrid();
+    overview_mode_item->RevertHideForDesksTemplatesGrid(/*animate=*/true);
 
   desks_templates_grid_widget_->Hide();
 
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 93d57a1..ac61421 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -16,6 +16,7 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/default_color_constants.h"
 #include "ash/style/default_colors.h"
+#include "ash/style/system_shadow.h"
 #include "ash/wm/desks/desks_util.h"
 #include "ash/wm/desks/templates/desks_templates_animations.h"
 #include "ash/wm/drag_window_controller.h"
@@ -75,8 +76,6 @@
 // this fraction of size.
 constexpr float kPreCloseScale = 0.02f;
 
-constexpr int kShadowElevation = 16;
-
 // The amount of translation an item animates by when it is closed by using
 // swipe to close.
 constexpr int kSwipeToCloseCloseTranslationDp = 96;
@@ -87,6 +86,12 @@
 // change in the size of the item along that dimension.
 constexpr float kDragWindowScale = 0.05f;
 
+// The shadow types corresponding to the default and dragged states.
+constexpr SystemShadow::Type kDefaultShadowType =
+    SystemShadow::Type::kElevation12;
+constexpr SystemShadow::Type kDraggedShadowType =
+    SystemShadow::Type::kElevation24;
+
 // A self-deleting animation observer that runs the given callback when its
 // associated animation completes. Optionally takes a callback that is run when
 // the animation starts.
@@ -234,14 +239,21 @@
           item_widget_->GetNativeWindow());
 }
 
-void OverviewItem::RevertHideForDesksTemplatesGrid() {
+void OverviewItem::RevertHideForDesksTemplatesGrid(bool animate) {
   // `item_widget_` may be null during shutdown if the window is minimized.
-  if (item_widget_)
-    PerformFadeInLayer(item_widget_->GetLayer());
+  if (item_widget_) {
+    if (animate)
+      PerformFadeInLayer(item_widget_->GetLayer());
+    else
+      item_widget_->GetLayer()->SetOpacity(1.f);
+  }
 
   for (aura::Window* transient_child :
        GetTransientTreeIterator(transform_window_.window())) {
-    PerformFadeInLayer(transient_child->layer());
+    if (animate)
+      PerformFadeInLayer(transient_child->layer());
+    else
+      transient_child->layer()->SetOpacity(1.f);
   }
 
   item_widget_event_blocker_.reset();
@@ -769,6 +781,10 @@
   }
 }
 
+void OverviewItem::UpdateShadowTypeForDrag(bool is_dragging) {
+  shadow_->SetType(is_dragging ? kDraggedShadowType : kDefaultShadowType);
+}
+
 void OverviewItem::OnStartingAnimationComplete() {
   DCHECK(item_widget_);
   if (transform_window_.IsMinimized()) {
@@ -1252,8 +1268,7 @@
   aura::Window* widget_window = item_widget_->GetNativeWindow();
   widget_window->parent()->StackChildBelow(widget_window, GetWindow());
 
-  shadow_ = std::make_unique<ui::Shadow>();
-  shadow_->Init(kShadowElevation);
+  shadow_ = std::make_unique<SystemShadow>(kDefaultShadowType);
   item_widget_->GetLayer()->Add(shadow_->layer());
 
   overview_item_view_ =
diff --git a/ash/wm/overview/overview_item.h b/ash/wm/overview/overview_item.h
index c2b3b20..ec1e2b6 100644
--- a/ash/wm/overview/overview_item.h
+++ b/ash/wm/overview/overview_item.h
@@ -22,10 +22,6 @@
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/views/controls/button/button.h"
 
-namespace ui {
-class Shadow;
-}  // namespace ui
-
 namespace views {
 class Widget;
 }  // namespace views
@@ -35,6 +31,7 @@
 class OverviewGrid;
 class OverviewItemView;
 class RoundedLabelWidget;
+class SystemShadow;
 
 // This class represents an item in overview mode.
 class ASH_EXPORT OverviewItem : public aura::WindowObserver,
@@ -86,8 +83,9 @@
 
   // This shows overview items that were hidden by the desk templates grid.
   // Called when exiting the desk templates UI and going back to the overview
-  // grid.
-  void RevertHideForDesksTemplatesGrid();
+  // grid. Fades the overview items in if `animate` is true, otherwise shows
+  // them immediately.
+  void RevertHideForDesksTemplatesGrid(bool animate);
 
   // Dispatched before beginning window overview. This will do any necessary
   // one time actions such as restoring minimized windows.
@@ -180,6 +178,9 @@
   // Updates the rounded corners and shadow on this overview window item.
   void UpdateRoundedCornersAndShadow();
 
+  // Updates the shadow type while being dragged and dropped.
+  void UpdateShadowTypeForDrag(bool is_dragging);
+
   // Called when the starting animation is completed, or called immediately
   // if there was no starting animation.
   void OnStartingAnimationComplete();
@@ -439,7 +440,7 @@
   // The shadow around the overview window. Shadows the original window, not
   // |item_widget_|. Done here instead of on the original window because of the
   // rounded edges mask applied on entering overview window.
-  std::unique_ptr<ui::Shadow> shadow_;
+  std::unique_ptr<SystemShadow> shadow_;
 
   // Cached values of the item bounds so that they do not have to be calculated
   // on each scroll update. Will be nullopt unless a grid scroll is underway.
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc
index 8904478..a704eb5 100644
--- a/ash/wm/overview/overview_window_drag_controller.cc
+++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -309,6 +309,8 @@
   auto* overview_grid = item_->overview_grid();
   overview_grid->AddDropTargetForDraggingFromThisGrid(item_);
 
+  item_->UpdateShadowTypeForDrag(/*is_dragging=*/true);
+
   if (should_allow_split_view_) {
     overview_session_->SetSplitViewDragIndicatorsDraggedWindow(
         item_->GetWindow());
@@ -448,6 +450,8 @@
   current_drag_behavior_ = DragBehavior::kDragToClose;
   overview_session_->GetGridWithRootWindow(item_->root_window())
       ->StartNudge(item_);
+
+  item_->UpdateShadowTypeForDrag(/*is_dragging=*/true);
 }
 
 void OverviewWindowDragController::ContinueDragToClose(
@@ -504,6 +508,8 @@
     return DragResult::kSuccessfulDragToClose;
   }
 
+  item_->UpdateShadowTypeForDrag(/*is_dragging=*/false);
+
   item_->SetOpacity(original_opacity_);
   overview_session_->PositionWindows(/*animate=*/true);
   RecordDragToClose(kSwipeToCloseCanceled);
@@ -624,6 +630,8 @@
   item_->DestroyPhantomsForDragging();
   overview_session_->RemoveDropTargets();
 
+  item_->UpdateShadowTypeForDrag(/*is_dragging=*/false);
+
   const gfx::Point rounded_screen_point =
       gfx::ToRoundedPoint(location_in_screen);
   if (should_allow_split_view_) {
diff --git a/base/allocator/partition_allocator/PartitionAlloc.md b/base/allocator/partition_allocator/PartitionAlloc.md
index dbccc88..2906864 100644
--- a/base/allocator/partition_allocator/PartitionAlloc.md
+++ b/base/allocator/partition_allocator/PartitionAlloc.md
@@ -19,12 +19,13 @@
 memory cost of partitions is minimal, but the implicit cost resulting from
 fragmentation is not to be underestimated.
 
-Each partition holds multiple buckets. A *bucket* is a series of regions in a
-partition that contains similar-sized objects, e.g. one bucket holds sizes
-(240,&nbsp;256], another (256,&nbsp;288], and so on. Bucket sizes are
-geometrically-spaced, and go all the way up to `kMaxBucketed=960KiB`
-(so called *normal buckets*). There are 8 buckets between each power of two.
-Note that buckets that aren't a multiple of `base::kAlignment` can't be used.
+Each partition holds multiple buckets. A *bucket* is a collection of regions in
+a partition that contains similar-sized objects, e.g. one bucket holds sizes
+(224,&nbsp;256], another (256,&nbsp;320], and so on. Bucket sizes are
+geometrically-spaced, and go all the way up to `kMaxBucketed`, which is a tad
+under 1MiB (so called *normal buckets*). There are tens of buckets, 4 between
+each power of two (except for lower sizes where buckets that aren't a multiple
+of `base::kAlignment` simply don't exist).
 
 Larger allocations (&gt;`kMaxBucketed`) are realized by direct memory mapping
 (*direct map*).
diff --git a/base/threading/hang_watcher.cc b/base/threading/hang_watcher.cc
index fd91002..0985d500 100644
--- a/base/threading/hang_watcher.cc
+++ b/base/threading/hang_watcher.cc
@@ -13,6 +13,7 @@
 #include "base/debug/alias.h"
 #include "base/debug/crash_logging.h"
 #include "base/debug/dump_without_crashing.h"
+#include "base/debug/leak_annotations.h"
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
@@ -35,16 +36,19 @@
 
 // Defines how much logging happens when the HangWatcher monitors the threads.
 // Logging levels are set per thread type through Finch. It's important that
-// the order of the enum members stay the and that their numerical
+// the order of the enum members stay the same and that their numerical
 // values be in increasing order. The implementation of
 // ThreadTypeLoggingLevelGreaterOrEqual() depends on it.
 enum class LoggingLevel { kNone = 0, kUmaOnly = 1, kUmaAndCrash = 2 };
 
 HangWatcher* g_instance = nullptr;
 std::atomic<bool> g_use_hang_watcher{false};
+std::atomic<HangWatcher::ProcessType> g_hang_watcher_process_type{
+    HangWatcher::ProcessType::kBrowserProcess};
+
 std::atomic<LoggingLevel> g_threadpool_log_level{LoggingLevel::kNone};
 std::atomic<LoggingLevel> g_io_thread_log_level{LoggingLevel::kNone};
-std::atomic<LoggingLevel> g_ui_thread_log_level{LoggingLevel::kNone};
+std::atomic<LoggingLevel> g_main_thread_log_level{LoggingLevel::kNone};
 
 // Indicates whether HangWatcher::Run() should return after the next monitoring.
 std::atomic<bool> g_keep_monitoring{true};
@@ -59,20 +63,34 @@
   // not make sense.
   const bool any_thread_hung = count >= 1;
 
-  switch (thread_type) {
-    case HangWatcher::ThreadType::kIOThread:
-      UMA_HISTOGRAM_BOOLEAN(
-          "HangWatcher.IsThreadHung.BrowserProcess."
-          "IOThread",
-          any_thread_hung);
+  const HangWatcher::ProcessType process_type =
+      g_hang_watcher_process_type.load(std::memory_order_relaxed);
+  switch (process_type) {
+    case HangWatcher::ProcessType::kUnknownProcess:
       break;
-    case HangWatcher::ThreadType::kUIThread:
-      UMA_HISTOGRAM_BOOLEAN(
-          "HangWatcher.IsThreadHung.BrowserProcess."
-          "UIThread",
-          any_thread_hung);
+
+    case HangWatcher::ProcessType::kBrowserProcess:
+      switch (thread_type) {
+        case HangWatcher::ThreadType::kIOThread:
+          UMA_HISTOGRAM_BOOLEAN(
+              "HangWatcher.IsThreadHung.BrowserProcess."
+              "IOThread",
+              any_thread_hung);
+          break;
+        case HangWatcher::ThreadType::kMainThread:
+          UMA_HISTOGRAM_BOOLEAN(
+              "HangWatcher.IsThreadHung.BrowserProcess."
+              "UIThread",
+              any_thread_hung);
+          break;
+        case HangWatcher::ThreadType::kThreadPoolThread:
+          // Not recorded for now.
+          break;
+      }
       break;
-    case HangWatcher::ThreadType::kThreadPoolThread:
+
+    case HangWatcher::ProcessType::kGPUProcess:
+    case HangWatcher::ProcessType::kRendererProcess:
       // Not recorded for now.
       break;
   }
@@ -86,8 +104,8 @@
     case HangWatcher::ThreadType::kIOThread:
       return g_io_thread_log_level.load(std::memory_order_relaxed) >=
              logging_level;
-    case HangWatcher::ThreadType::kUIThread:
-      return g_ui_thread_log_level.load(std::memory_order_relaxed) >=
+    case HangWatcher::ThreadType::kMainThread:
+      return g_main_thread_log_level.load(std::memory_order_relaxed) >=
              logging_level;
     case HangWatcher::ThreadType::kThreadPoolThread:
       return g_threadpool_log_level.load(std::memory_order_relaxed) >=
@@ -102,6 +120,7 @@
 const Feature kEnableHangWatcher{"EnableHangWatcher",
                                  FEATURE_ENABLED_BY_DEFAULT};
 
+// Browser process.
 constexpr base::FeatureParam<int> kIOThreadLogLevel{
     &kEnableHangWatcher, "io_thread_log_level",
     static_cast<int>(LoggingLevel::kUmaOnly)};
@@ -112,6 +131,28 @@
     &kEnableHangWatcher, "threadpool_log_level",
     static_cast<int>(LoggingLevel::kUmaOnly)};
 
+// GPU process.
+constexpr base::FeatureParam<int> kGPUProcessIOThreadLogLevel{
+    &kEnableHangWatcher, "gpu_process_io_thread_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+constexpr base::FeatureParam<int> kGPUProcessMainThreadLogLevel{
+    &kEnableHangWatcher, "gpu_process_main_thread_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+constexpr base::FeatureParam<int> kGPUProcessThreadPoolLogLevel{
+    &kEnableHangWatcher, "gpu_process_threadpool_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+
+// Renderer process.
+constexpr base::FeatureParam<int> kRendererProcessIOThreadLogLevel{
+    &kEnableHangWatcher, "renderer_process_io_thread_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+constexpr base::FeatureParam<int> kRendererProcessMainThreadLogLevel{
+    &kEnableHangWatcher, "renderer_process_main_thread_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+constexpr base::FeatureParam<int> kRendererProcessThreadPoolLogLevel{
+    &kEnableHangWatcher, "renderer_process_threadpool_log_level",
+    static_cast<int>(LoggingLevel::kUmaOnly)};
+
 // static
 const base::TimeDelta WatchHangsInScope::kDefaultHangWatchTime =
     base::Seconds(10);
@@ -226,27 +267,64 @@
 }
 
 // static
-void HangWatcher::InitializeOnMainThread() {
+void HangWatcher::InitializeOnMainThread(ProcessType process_type) {
   DCHECK(!g_use_hang_watcher);
   DCHECK(g_io_thread_log_level == LoggingLevel::kNone);
-  DCHECK(g_ui_thread_log_level == LoggingLevel::kNone);
+  DCHECK(g_main_thread_log_level == LoggingLevel::kNone);
   DCHECK(g_threadpool_log_level == LoggingLevel::kNone);
 
-  g_use_hang_watcher.store(base::FeatureList::IsEnabled(kEnableHangWatcher),
-                           std::memory_order_relaxed);
+  const bool enable_hang_watcher =
+      base::FeatureList::IsEnabled(kEnableHangWatcher);
+  g_use_hang_watcher.store(enable_hang_watcher, std::memory_order_relaxed);
+
+  // Keep the process type.
+  g_hang_watcher_process_type.store(process_type, std::memory_order_relaxed);
 
   // If hang watching is disabled as a whole there is no need to read the
   // params.
-  if (g_use_hang_watcher.load(std::memory_order_relaxed)) {
-    g_threadpool_log_level.store(
-        static_cast<LoggingLevel>(kThreadPoolLogLevel.Get()),
-        std::memory_order_relaxed);
-    g_io_thread_log_level.store(
-        static_cast<LoggingLevel>(kIOThreadLogLevel.Get()),
-        std::memory_order_relaxed);
-    g_ui_thread_log_level.store(
-        static_cast<LoggingLevel>(kUIThreadLogLevel.Get()),
-        std::memory_order_relaxed);
+  if (!enable_hang_watcher)
+    return;
+
+  // Retrieve thread-specific config for hang watching.
+  switch (process_type) {
+    case HangWatcher::ProcessType::kUnknownProcess:
+      break;
+
+    case HangWatcher::ProcessType::kBrowserProcess:
+      g_threadpool_log_level.store(
+          static_cast<LoggingLevel>(kThreadPoolLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_io_thread_log_level.store(
+          static_cast<LoggingLevel>(kIOThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_main_thread_log_level.store(
+          static_cast<LoggingLevel>(kUIThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      break;
+
+    case HangWatcher::ProcessType::kGPUProcess:
+      g_threadpool_log_level.store(
+          static_cast<LoggingLevel>(kGPUProcessThreadPoolLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_io_thread_log_level.store(
+          static_cast<LoggingLevel>(kGPUProcessIOThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_main_thread_log_level.store(
+          static_cast<LoggingLevel>(kGPUProcessMainThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      break;
+
+    case HangWatcher::ProcessType::kRendererProcess:
+      g_threadpool_log_level.store(
+          static_cast<LoggingLevel>(kRendererProcessThreadPoolLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_io_thread_log_level.store(
+          static_cast<LoggingLevel>(kRendererProcessIOThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      g_main_thread_log_level.store(
+          static_cast<LoggingLevel>(kRendererProcessMainThreadLogLevel.Get()),
+          std::memory_order_relaxed);
+      break;
   }
 }
 
@@ -254,7 +332,7 @@
   g_use_hang_watcher.store(false, std::memory_order_relaxed);
   g_threadpool_log_level.store(LoggingLevel::kNone, std::memory_order_relaxed);
   g_io_thread_log_level.store(LoggingLevel::kNone, std::memory_order_relaxed);
-  g_ui_thread_log_level.store(LoggingLevel::kNone, std::memory_order_relaxed);
+  g_main_thread_log_level.store(LoggingLevel::kNone, std::memory_order_relaxed);
 }
 
 // static
@@ -276,7 +354,7 @@
 
 // static
 bool HangWatcher::IsCrashReportingEnabled() {
-  if (g_ui_thread_log_level.load(std::memory_order_relaxed) ==
+  if (g_main_thread_log_level.load(std::memory_order_relaxed) ==
       LoggingLevel::kUmaAndCrash) {
     return true;
   }
@@ -320,6 +398,14 @@
   g_instance = this;
 }
 
+// static
+void HangWatcher::CreateHangWatcherInstance() {
+  DCHECK(!g_instance);
+  g_instance = new base::HangWatcher();
+  // The hang watcher is leaked to make sure it survives all watched threads.
+  ANNOTATE_LEAKING_OBJECT_PTR(g_instance);
+}
+
 #if !BUILDFLAG(IS_NACL)
 debug::ScopedCrashKeyString
 HangWatcher::GetTimeSinceLastCriticalMemoryPressureCrashKey() {
diff --git a/base/threading/hang_watcher.h b/base/threading/hang_watcher.h
index ab512b6..86edd64 100644
--- a/base/threading/hang_watcher.h
+++ b/base/threading/hang_watcher.h
@@ -105,10 +105,19 @@
 // within a single process. This instance must outlive all monitored threads.
 class BASE_EXPORT HangWatcher : public DelegateSimpleThread::Delegate {
  public:
+  // Describes the type of a process for logging purposes.
+  enum class ProcessType {
+    kUnknownProcess = 0,
+    kBrowserProcess = 1,
+    kGPUProcess = 2,
+    kRendererProcess = 3,
+    kMax = kRendererProcess
+  };
+
   // Describes the type of a thread for logging purposes.
   enum class ThreadType {
     kIOThread = 0,
-    kUIThread = 1,
+    kMainThread = 1,
     kThreadPoolThread = 2,
     kMax = kThreadPoolThread
   };
@@ -130,12 +139,14 @@
   HangWatcher(const HangWatcher&) = delete;
   HangWatcher& operator=(const HangWatcher&) = delete;
 
+  static void CreateHangWatcherInstance();
+
   // Returns a non-owning pointer to the global HangWatcher instance.
   static HangWatcher* GetInstance();
 
   // Initializes HangWatcher. Must be called once on the main thread during
   // startup while single-threaded.
-  static void InitializeOnMainThread();
+  static void InitializeOnMainThread(ProcessType process_type);
 
   // Returns the values that were set through InitializeOnMainThread() to their
   // default value. Used for testing since in prod initialization should happen
diff --git a/base/threading/hang_watcher_unittest.cc b/base/threading/hang_watcher_unittest.cc
index e2234c7..da8e0d8 100644
--- a/base/threading/hang_watcher_unittest.cc
+++ b/base/threading/hang_watcher_unittest.cc
@@ -70,7 +70,7 @@
     // happens on the right thread.
     base::ScopedClosureRunner unregister_closure =
         base::HangWatcher::RegisterThread(
-            base::HangWatcher::ThreadType::kUIThread);
+            base::HangWatcher::ThreadType::kMainThread);
 
     WatchHangsInScope scope(timeout_);
     wait_until_entered_scope_.Signal();
@@ -114,7 +114,8 @@
 
   HangWatcherTest() {
     feature_list_.InitWithFeaturesAndParameters(kFeatureAndParams, {});
-    hang_watcher_.InitializeOnMainThread();
+    hang_watcher_.InitializeOnMainThread(
+        HangWatcher::ProcessType::kBrowserProcess);
 
     hang_watcher_.SetAfterMonitorClosureForTesting(base::BindRepeating(
         &WaitableEvent::Signal, base::Unretained(&monitor_event_)));
@@ -210,7 +211,7 @@
 TEST_F(HangWatcherTest, InvalidatingExpectationsPreventsCapture) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   // Create a hang.
   WatchHangsInScope expires_instantly(base::TimeDelta{});
@@ -229,7 +230,7 @@
 TEST_F(HangWatcherTest, MultipleInvalidateExpectationsDoNotCancelOut) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   // Create a hang.
   WatchHangsInScope expires_instantly(base::TimeDelta{});
@@ -251,7 +252,7 @@
 TEST_F(HangWatcherTest, NewInnerWatchHangsInScopeAfterInvalidationDetectsHang) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   WatchHangsInScope expires_instantly(base::TimeDelta{});
   task_environment_.FastForwardBy(kHangTime);
@@ -291,7 +292,7 @@
        NewSeparateWatchHangsInScopeAfterInvalidationDetectsHang) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   {
     WatchHangsInScope expires_instantly(base::TimeDelta{});
@@ -319,7 +320,7 @@
 TEST_F(HangWatcherTest, ScopeDisabledObjectInnerScope) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   // Start a WatchHangsInScope that expires right away. Then advance
   // time to make sure no hang is detected.
@@ -345,7 +346,7 @@
 TEST_F(HangWatcherTest, NewScopeAfterDisabling) {
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   // Start a WatchHangsInScope that expires right away. Then advance
   // time to make sure no hang is detected.
@@ -376,7 +377,7 @@
   // threaded.
   auto current_hang_watch_state =
       base::internal::HangWatchState::CreateHangWatchStateForCurrentThread(
-          HangWatcher::ThreadType::kUIThread);
+          HangWatcher::ThreadType::kMainThread);
 
   ASSERT_FALSE(current_hang_watch_state->IsOverDeadline());
   base::TimeTicks original_deadline = current_hang_watch_state->GetDeadline();
@@ -593,7 +594,7 @@
 
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
   {
     // Start a WatchHangsInScope that expires right away. Ensures that
     // the first monitor will detect a hang.
@@ -641,7 +642,7 @@
 
   // Register the main test thread for hang watching.
   auto unregister_thread_closure =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   BlockingThread blocking_thread(&monitor_event_, base::TimeDelta{});
   blocking_thread.StartAndWaitForScopeEntered();
@@ -796,7 +797,7 @@
 
   // Register a thread,
   unregister_thread_closure_ =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   run_loop.Run();
 
@@ -825,7 +826,7 @@
 
   // Register a thread.
   unregister_thread_closure_ =
-      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+      HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
 
   // Unblock the test thread. All waits were perceived as oversleeping so all
   // monitoring was inhibited.
@@ -844,7 +845,8 @@
  public:
   WatchHangsInScopeBlockingTest() {
     feature_list_.InitWithFeaturesAndParameters(kFeatureAndParams, {});
-    hang_watcher_.InitializeOnMainThread();
+    hang_watcher_.InitializeOnMainThread(
+        HangWatcher::ProcessType::kBrowserProcess);
 
     hang_watcher_.SetOnHangClosureForTesting(base::BindLambdaForTesting([&] {
       capture_started_.Signal();
@@ -869,7 +871,7 @@
 
     // Register the test main thread for hang watching.
     unregister_thread_closure_ =
-        HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kUIThread);
+        HangWatcher::RegisterThread(base::HangWatcher::ThreadType::kMainThread);
   }
 
   void TearDown() override { hang_watcher_.UnitializeOnMainThreadForTesting(); }
@@ -1133,7 +1135,7 @@
            kArbitraryDeadline;
   }));
 
-  // Clearing kIgnoreHang is unafected by deadline or flags change.
+  // Clearing kIgnoreHang is unaffected by deadline or flags change.
   deadline_.UnsetIgnoreCurrentWatchHangsInScope();
   ASSERT_FALSE(deadline_.IsFlagSet(
       HangWatchDeadline::Flag::kIgnoreCurrentWatchHangsInScope));
diff --git a/base/time/time.cc b/base/time/time.cc
index 32c2fc50..0de273e 100644
--- a/base/time/time.cc
+++ b/base/time/time.cc
@@ -163,15 +163,6 @@
   return Microseconds(us_);
 }
 
-// static
-Time Time::FromTimeT(time_t tt) {
-  if (tt == 0)
-    return Time();  // Preserve 0 so we can tell it doesn't exist.
-  return (tt == std::numeric_limits<time_t>::max())
-             ? Max()
-             : (UnixEpoch() + Seconds(tt));
-}
-
 time_t Time::ToTimeT() const {
   if (is_null())
     return 0;  // Preserve 0 so we can tell it doesn't exist.
@@ -239,11 +230,6 @@
                    : std::numeric_limits<int64_t>::max();
 }
 
-// static
-Time Time::UnixEpoch() {
-  return Time(kTimeTToMicrosecondsOffset);
-}
-
 Time Time::Midnight(bool is_local) const {
   Exploded exploded;
   Explode(is_local, &exploded);
diff --git a/base/time/time.h b/base/time/time.h
index 1ab3746..c027aab 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -560,7 +560,7 @@
   constexpr Time() : TimeBase(0) {}
 
   // Returns the time for epoch in Unix-like system (Jan 1, 1970).
-  static Time UnixEpoch();
+  static constexpr Time UnixEpoch() { return Time(kTimeTToMicrosecondsOffset); }
 
   // Returns the current time. Watch out, the system might adjust its clock
   // in which case time will actually go backwards. We don't guarantee that
@@ -593,7 +593,7 @@
   TimeDelta ToDeltaSinceWindowsEpoch() const;
 
   // Converts to/from time_t in UTC and a Time class.
-  static Time FromTimeT(time_t tt);
+  static constexpr Time FromTimeT(time_t tt);
   time_t ToTimeT() const;
 
   // Converts time to/from a double which is the number of seconds since epoch
@@ -938,6 +938,17 @@
 
 }  // namespace time_internal
 
+// Time functions that must appear below the declarations of Time/TimeDelta
+
+// static
+constexpr Time Time::FromTimeT(time_t tt) {
+  if (tt == 0)
+    return Time();  // Preserve 0 so we can tell it doesn't exist.
+  return (tt == std::numeric_limits<time_t>::max())
+             ? Max()
+             : (UnixEpoch() + Seconds(tt));
+}
+
 // For logging use only.
 BASE_EXPORT std::ostream& operator<<(std::ostream& os, Time time);
 
diff --git a/base/trace_event/traced_value.cc b/base/trace_event/traced_value.cc
index fccc23c..f9f52f5 100644
--- a/base/trace_event/traced_value.cc
+++ b/base/trace_event/traced_value.cc
@@ -15,6 +15,7 @@
 #include "base/json/json_writer.h"
 #include "base/json/string_escape.h"
 #include "base/memory/ptr_util.h"
+#include "base/pickle.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_impl.h"
diff --git a/base/trace_event/traced_value.h b/base/trace_event/traced_value.h
index 90b483a..6719bd3 100644
--- a/base/trace_event/traced_value.h
+++ b/base/trace_event/traced_value.h
@@ -12,7 +12,6 @@
 #include <string>
 #include <vector>
 
-#include "base/pickle.h"
 #include "base/strings/string_piece.h"
 #include "base/trace_event/trace_event_impl.h"
 
diff --git a/build/config/rust.gni b/build/config/rust.gni
index 6186345..3de7f0e8 100644
--- a/build/config/rust.gni
+++ b/build/config/rust.gni
@@ -166,4 +166,4 @@
 # This is common between gcc/clang, Mac and Windows toolchains so specify once,
 # here. This is not the complete command-line: toolchains should add -o
 # and probably --emit arguments too.
-rustc_common_args = "--crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} {{rustdeps}} {{externs}}"
+rustc_common_args = "--crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}}"
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 8fa405c..852f1be 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-7.20220131.1.1
+7.20220131.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 8fa405c..852f1be 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-7.20220131.1.1
+7.20220131.3.1
diff --git a/build/rust/rustc_wrapper.py b/build/rust/rustc_wrapper.py
index 6f3e16b1..328f011b 100755
--- a/build/rust/rustc_wrapper.py
+++ b/build/rust/rustc_wrapper.py
@@ -17,9 +17,10 @@
                  os.pardir, 'build', 'android', 'gyp'))
 from util import build_utils
 
-# This script wraps rustc for (currently) two reasons:
+# This script wraps rustc for (currently) three reasons:
 # * To work around some ldflags escaping performed by ninja/gn
 # * To remove dependencies on some environment variables from the .d file.
+# * To enable use of .rsp files.
 #
 # LDFLAGS ESCAPING
 #
@@ -46,6 +47,14 @@
 # variables (typically, all of them) are set by .gn files which ninja
 # tracks independently. So we remove them from the .d file.
 #
+# RSP files:
+#
+# We want to put the ninja/gn variables {{rustdeps}} and {{externs}}
+# in an RSP file. Unfortunately, they are space-separated variables
+# but Rust requires a newline-separated input. This script duly makes
+# the adjustment. This works around a gn issue:
+# TODO(https://bugs.chromium.org/p/gn/issues/detail?id=249): fix this
+#
 # Usage:
 #   rustc_wrapper.py --rustc <path to rustc> --depfile <path to .d file>
 #      -- <normal rustc args> LDFLAGS {{ldflags}} RUSTENV {{rustenv}}
@@ -56,12 +65,22 @@
 #
 # Both LDFLAGS and RUSTENV **MUST** be specified, in that order, even if
 # the list following them is empty.
+#
+# TODO(https://github.com/rust-lang/rust/issues/73632): avoid using rustc
+# for linking in the first place. Most of our binaries are linked using
+# clang directly, but there are some types of Rust build product which
+# must currently be created by rustc (e.g. unit test executables). As
+# part of support for using non-rustc linkers, we should arrange to extract
+# such functionality from rustc so that we can make all types of binary
+# using our clang toolchain. That will remove the need for most of this
+# script.
 
 
 def main():
   parser = argparse.ArgumentParser()
   parser.add_argument('--rustc', required=True, type=pathlib.Path)
   parser.add_argument('--depfile', type=pathlib.Path)
+  parser.add_argument('--rsp', type=pathlib.Path)
   parser.add_argument('args', metavar='ARG', nargs='+')
 
   args = parser.parse_args()
@@ -76,6 +95,14 @@
 
   rustc_args.extend(["-Clink-arg=%s" % arg for arg in ldflags])
 
+  # Workaround for https://bugs.chromium.org/p/gn/issues/detail?id=249
+  if args.rsp:
+    with open(args.rsp) as rspfile:
+      rsp_args = [l.rstrip() for l in rspfile.read().split(' ') if l.rstrip()]
+    with open(args.rsp, 'w') as rspfile:
+      rspfile.write("\n".join(rsp_args))
+    rustc_args.append(f'@{args.rsp}')
+
   env = os.environ.copy()
   fixed_env_vars = []
   for item in rustenv:
diff --git a/build/toolchain/apple/toolchain.gni b/build/toolchain/apple/toolchain.gni
index 9bc0b69..cb0e347e 100644
--- a/build/toolchain/apple/toolchain.gni
+++ b/build/toolchain/apple/toolchain.gni
@@ -231,7 +231,9 @@
       tool("rust_staticlib") {
         rust_outfile = "{{target_out_dir}}/{{crate_name}}.a"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"$_cxx\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        rspfile = "$rust_outfile.rsp"
+        rspfile_content = "{{rustdeps}} {{externs}}"
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"$_cxx\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -240,7 +242,10 @@
       tool("rust_rlib") {
         rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.rlib"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"$_cxx\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        # Do not use rsp files in this (common) case because they occupy the
+        # ninja main thread, and {{rlibs}} have shorter command lines than
+        # fully linked targets.
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"$_cxx\" $rustc_common_args {{rustdeps}} {{externs}} --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -250,7 +255,9 @@
         tool("rust_bin") {
           rust_outfile = "{{root_out_dir}}/{{crate_name}}"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -259,7 +266,9 @@
         tool("rust_cdylib") {
           rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.dylib"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -268,7 +277,9 @@
         tool("rust_macro") {
           rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.dylib"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${_cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 5c5f61e..43609ba 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -685,11 +685,13 @@
       rust_sysroot_relative_to_out = rebase_path(rust_sysroot, root_out_dir)
       rustc_wrapper = rebase_path("//build/rust/rustc_wrapper.py")
 
-      # RSP files not used due to https://bugs.chromium.org/p/gn/issues/detail?id=249
+      # RSP manipulation due to https://bugs.chromium.org/p/gn/issues/detail?id=249
       tool("rust_staticlib") {
         rust_outfile = "{{target_out_dir}}/{{crate_name}}.a"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        rspfile = "$rust_outfile.rsp"
+        rspfile_content = "{{rustdeps}} {{externs}}"
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -698,7 +700,10 @@
       tool("rust_rlib") {
         rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.rlib"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        # Do not use rsp files in this (common) case because they occupy the
+        # ninja main thread, and {{rlibs}} have shorter command lines than
+        # fully linked targets.
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args {{rustdeps}} {{externs}} --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -708,7 +713,9 @@
         tool("rust_bin") {
           rust_outfile = "{{root_out_dir}}/{{crate_name}}"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -717,7 +724,9 @@
         tool("rust_cdylib") {
           rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.so"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -726,7 +735,9 @@
         tool("rust_macro") {
           rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.so"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- -Clinker=\"${invoker.cxx}\" $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS {{ldflags}} ${extra_ldflags} RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index bc69978d..96a914bb 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -309,7 +309,9 @@
       tool("rust_staticlib") {
         rust_outfile = "{{target_out_dir}}/{{crate_name}}.lib"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        rspfile = "$rust_outfile.rsp"
+        rspfile_content = "{{rustdeps}} {{externs}}"
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -318,7 +320,10 @@
       tool("rust_rlib") {
         rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.rlib"
         depfile = "{{output}}.d"
-        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+        # Do not use rsp files in this (common) case because they occupy the
+        # ninja main thread, and {{rlibs}} have shorter command lines than
+        # fully linked targets.
+        command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile {{rustdeps}} {{externs}} LDFLAGS RUSTENV {{rustenv}}"
         description = "RUST $rust_outfile"
         rust_sysroot = rust_sysroot_relative_to_out
         outputs = [ rust_outfile ]
@@ -328,7 +333,9 @@
         tool("rust_bin") {
           rust_outfile = "{{root_out_dir}}/{{crate_name}}.exe"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -337,7 +344,9 @@
         tool("rust_cdylib") {
           rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.dll"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
@@ -346,7 +355,9 @@
         tool("rust_macro") {
           rust_outfile = "{{target_out_dir}}/{{crate_name}}.dll"
           depfile = "{{output}}.d"
-          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
+          rspfile = "$rust_outfile.rsp"
+          rspfile_content = "{{rustdeps}} {{externs}}"
+          command = "$python_path \"$rustc_wrapper\" --rustc=$rustc --depfile=$depfile --rsp=$rspfile -- $rustc_common_args --emit=dep-info=$depfile,link -o $rust_outfile LDFLAGS RUSTENV {{rustenv}}"
           description = "RUST $rust_outfile"
           rust_sysroot = rust_sysroot_relative_to_out
           outputs = [ rust_outfile ]
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index d92fe14..be779c2 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -23,14 +23,11 @@
 #include "cc/paint/paint_canvas.h"
 #include "cc/paint/paint_recorder.h"
 #include "cc/raster/raster_source.h"
-#include "cc/raster/scoped_gpu_raster.h"
-#include "cc/raster/scoped_grcontext_access.h"
 #include "components/viz/client/client_resource_provider.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/raster_interface.h"
 #include "gpu/command_buffer/client/shared_image_interface.h"
 #include "gpu/command_buffer/common/shared_image_trace_utils.h"
@@ -38,7 +35,6 @@
 #include "skia/ext/legacy_display_globals.h"
 #include "third_party/skia/include/core/SkPictureRecorder.h"
 #include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/gpu/GrDirectContext.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/gfx/geometry/axis_transform2d.h"
 #include "url/gurl.h"
@@ -46,12 +42,10 @@
 namespace cc {
 namespace {
 
-static void RasterizeSourceOOP(
+static void RasterizeSource(
     const RasterSource* raster_source,
-    bool resource_has_previous_content,
     gpu::Mailbox* mailbox,
     const gpu::SyncToken& sync_token,
-    GLenum texture_target,
     bool texture_is_overlay_candidate,
     const gfx::Size& resource_size,
     viz::ResourceFormat resource_format,
@@ -117,77 +111,6 @@
   // https://crbug.com/789153
 }
 
-static void RasterizeSource(
-    const RasterSource* raster_source,
-    bool resource_has_previous_content,
-    gpu::Mailbox* mailbox,
-    const gpu::SyncToken& sync_token,
-    GLenum texture_target,
-    bool texture_is_overlay_candidate,
-    const gfx::Size& resource_size,
-    viz::ResourceFormat resource_format,
-    const gfx::ColorSpace& color_space,
-    const gfx::Rect& raster_full_rect,
-    const gfx::Rect& playback_rect,
-    const gfx::AxisTransform2d& transform,
-    const RasterSource::PlaybackSettings& playback_settings,
-    viz::RasterContextProvider* context_provider,
-    const gfx::Size& max_tile_size) {
-  gpu::raster::RasterInterface* ri = context_provider->RasterInterface();
-  if (mailbox->IsZero()) {
-    auto* sii = context_provider->SharedImageInterface();
-    uint32_t flags = gpu::SHARED_IMAGE_USAGE_DISPLAY |
-                     gpu::SHARED_IMAGE_USAGE_GLES2 |
-                     gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT;
-    if (texture_is_overlay_candidate)
-      flags |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
-    *mailbox = sii->CreateSharedImage(
-        resource_format, resource_size, color_space, kTopLeft_GrSurfaceOrigin,
-        kPremul_SkAlphaType, flags, gpu::kNullSurfaceHandle);
-    ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
-  } else {
-    // Wait on the SyncToken that was created on the compositor thread after
-    // making the mailbox. This ensures that the mailbox we consume here is
-    // valid by the time the consume command executes.
-    ri->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
-  }
-  GLuint texture_id = ri->CreateAndConsumeForGpuRaster(*mailbox);
-  ri->BeginSharedImageAccessDirectCHROMIUM(
-      texture_id, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
-  {
-    ScopedGrContextAccess gr_context_access(context_provider);
-    SkSurface* surface;
-    sk_sp<SkColorSpace> sk_color_space = color_space.ToSkColorSpace();
-    viz::ClientResourceProvider::ScopedSkSurface scoped_surface(
-        context_provider->GrContext(), sk_color_space, texture_id,
-        texture_target, resource_size, resource_format,
-        skia::LegacyDisplayGlobals::ComputeSurfaceProps(
-            playback_settings.use_lcd_text),
-        playback_settings.msaa_sample_count);
-    surface = scoped_surface.surface();
-
-    // Allocating an SkSurface will fail after a lost context.  Pretend we
-    // rasterized, as the contents of the resource don't matter anymore.
-    if (!surface) {
-      DLOG(ERROR) << "Failed to allocate raster surface";
-      return;
-    }
-
-    SkCanvas* canvas = surface->getCanvas();
-
-    // As an optimization, inform Skia to discard when not doing partial raster.
-    if (raster_full_rect == playback_rect)
-      canvas->discard();
-
-    gfx::Size content_size = raster_source->GetContentSize(transform.scale());
-    raster_source->PlaybackToCanvas(canvas, content_size, raster_full_rect,
-                                    playback_rect, transform,
-                                    playback_settings);
-  }
-  ri->EndSharedImageAccessDirectCHROMIUM(texture_id);
-  ri->DeleteGpuRasterTexture(texture_id);
-}
-
 }  // namespace
 
 // Subclass for InUsePoolResource that holds ownership of a gpu-rastered backing
@@ -242,19 +165,16 @@
       depends_on_hardware_accelerated_webp_candidates_(
           depends_on_hardware_accelerated_webp_candidates),
       before_raster_sync_token_(backing->returned_sync_token),
-      texture_target_(backing->texture_target),
       texture_is_overlay_candidate_(backing->overlay_candidate),
       mailbox_(backing->mailbox) {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  // Only do this in Chrome OS with OOP-R because:
+  // Only do this in Chrome OS because:
   //   1) We will use this timestamp to measure raster scheduling delay and we
   //      only need to collect that data to assess the impact of hardware
-  //      acceleration of image decodes which works only on Chrome OS with
-  //      OOP-R.
+  //      acceleration of image decodes which works only on Chrome OS.
   //   2) We use CLOCK_MONOTONIC in that OS to get timestamps, so we can assert
   //      certain assumptions.
-  if (client_->enable_oop_rasterization_)
-    creation_time_ = base::TimeTicks::Now();
+  creation_time_ = base::TimeTicks::Now();
 #endif
 }
 
@@ -284,8 +204,8 @@
   // returns another SyncToken generated on the worker thread to synchronize
   // with after the raster is complete.
   after_raster_sync_token_ = client_->PlaybackOnWorkerThread(
-      &mailbox_, texture_target_, texture_is_overlay_candidate_,
-      before_raster_sync_token_, resource_size_, resource_format_, color_space_,
+      &mailbox_, texture_is_overlay_candidate_, before_raster_sync_token_,
+      resource_size_, resource_format_, color_space_,
       resource_has_previous_content_, raster_source, raster_full_rect,
       raster_dirty_rect, new_content_id, transform, playback_settings, url,
       creation_time_, depends_on_at_raster_decodes_,
@@ -305,7 +225,6 @@
     viz::ResourceFormat tile_format,
     const gfx::Size& max_tile_size,
     bool unpremultiply_and_dither_low_bit_depth_tiles,
-    bool enable_oop_rasterization,
     RasterQueryQueue* const pending_raster_queries,
     float raster_metric_probability)
     : compositor_context_provider_(compositor_context_provider),
@@ -313,7 +232,6 @@
       use_gpu_memory_buffer_resources_(use_gpu_memory_buffer_resources),
       tile_format_(tile_format),
       max_tile_size_(max_tile_size),
-      enable_oop_rasterization_(enable_oop_rasterization),
       pending_raster_queries_(pending_raster_queries),
       random_generator_(static_cast<uint32_t>(base::RandUint64())),
       bernoulli_distribution_(raster_metric_probability),
@@ -323,8 +241,7 @@
   DCHECK(worker_context_provider);
 }
 
-GpuRasterBufferProvider::~GpuRasterBufferProvider() {
-}
+GpuRasterBufferProvider::~GpuRasterBufferProvider() = default;
 
 std::unique_ptr<RasterBuffer> GpuRasterBufferProvider::AcquireBufferForRaster(
     const ResourcePool::InUsePoolResource& resource,
@@ -407,12 +324,10 @@
   return callback_id;
 }
 
-void GpuRasterBufferProvider::Shutdown() {
-}
+void GpuRasterBufferProvider::Shutdown() {}
 
 gpu::SyncToken GpuRasterBufferProvider::PlaybackOnWorkerThread(
     gpu::Mailbox* mailbox,
-    GLenum texture_target,
     bool texture_is_overlay_candidate,
     const gpu::SyncToken& sync_token,
     const gfx::Size& resource_size,
@@ -436,11 +351,10 @@
   query.depends_on_hardware_accelerated_webp_candidates =
       depends_on_hardware_accelerated_webp_candidates;
   gpu::SyncToken raster_finished_token = PlaybackOnWorkerThreadInternal(
-      mailbox, texture_target, texture_is_overlay_candidate, sync_token,
-      resource_size, resource_format, color_space,
-      resource_has_previous_content, raster_source, raster_full_rect,
-      raster_dirty_rect, new_content_id, transform, playback_settings, url,
-      depends_on_at_raster_decodes, &query);
+      mailbox, texture_is_overlay_candidate, sync_token, resource_size,
+      resource_format, color_space, resource_has_previous_content,
+      raster_source, raster_full_rect, raster_dirty_rect, new_content_id,
+      transform, playback_settings, url, depends_on_at_raster_decodes, &query);
 
   if (query.raster_duration_query_id) {
     if (query.raster_start_query_id)
@@ -459,7 +373,6 @@
 
 gpu::SyncToken GpuRasterBufferProvider::PlaybackOnWorkerThreadInternal(
     gpu::Mailbox* mailbox,
-    GLenum texture_target,
     bool texture_is_overlay_candidate,
     const gpu::SyncToken& sync_token,
     const gfx::Size& resource_size,
@@ -493,15 +406,14 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     // Use a query to detect when the GPU side is ready to start issuing raster
     // work to the driver. We will use the resulting timestamp to measure raster
-    // scheduling delay. We only care about this in Chrome OS and when OOP-R is
-    // enabled because we will use this timestamp to measure raster scheduling
-    // delay and we only need to collect that data to assess the impact of
-    // hardware acceleration of image decodes which work only in Chrome OS with
-    // OOP-R. Furthermore, we don't count raster work that depends on at-raster
-    // image decodes. This is because we want the delay to always include
-    // image decoding and uploading time, and at-raster decodes should be
-    // relatively rare.
-    if (enable_oop_rasterization_ && !depends_on_at_raster_decodes) {
+    // scheduling delay. We only care about this in Chrome OS because we will
+    // use this timestamp to measure raster scheduling delay and we only need to
+    // collect that data to assess the impact of hardware acceleration of image
+    // decodes which work only in Chrome OS. Furthermore, we don't count raster
+    // work that depends on at-raster image decodes. This is because we want the
+    // delay to always include image decoding and uploading time, and at-raster
+    // decodes should be relatively rare.
+    if (!depends_on_at_raster_decodes) {
       ri->GenQueriesEXT(1, &query->raster_start_query_id);
       DCHECK_GT(query->raster_start_query_id, 0u);
       ri->QueryCounterEXT(query->raster_start_query_id,
@@ -520,21 +432,11 @@
     absl::optional<base::ElapsedTimer> timer;
     if (measure_raster_metric)
       timer.emplace();
-    if (enable_oop_rasterization_) {
-      RasterizeSourceOOP(raster_source, resource_has_previous_content, mailbox,
-                         sync_token, texture_target,
-                         texture_is_overlay_candidate, resource_size,
-                         resource_format, color_space, raster_full_rect,
-                         playback_rect, transform, playback_settings,
-                         worker_context_provider_, is_using_raw_draw_);
-    } else {
-      RasterizeSource(raster_source, resource_has_previous_content, mailbox,
-                      sync_token, texture_target, texture_is_overlay_candidate,
-                      resource_size, resource_format, color_space,
-                      raster_full_rect, playback_rect, transform,
-                      playback_settings, worker_context_provider_,
-                      max_tile_size_);
-    }
+    RasterizeSource(raster_source, mailbox, sync_token,
+                    texture_is_overlay_candidate, resource_size,
+                    resource_format, color_space, raster_full_rect,
+                    playback_rect, transform, playback_settings,
+                    worker_context_provider_, is_using_raw_draw_);
     if (measure_raster_metric) {
       query->worker_raster_duration = timer->Elapsed();
       ri->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h
index a5e4459..a974cb00 100644
--- a/cc/raster/gpu_raster_buffer_provider.h
+++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -39,7 +39,6 @@
       viz::ResourceFormat tile_format,
       const gfx::Size& max_tile_size,
       bool unpremultiply_and_dither_low_bit_depth_tiles,
-      bool enable_oop_rasterization,
       RasterQueryQueue* const pending_raster_queries,
       float raster_metric_probability = kRasterMetricProbability);
   GpuRasterBufferProvider(const GpuRasterBufferProvider&) = delete;
@@ -69,7 +68,6 @@
 
   gpu::SyncToken PlaybackOnWorkerThread(
       gpu::Mailbox* mailbox,
-      GLenum texture_target,
       bool texture_is_overlay_candidate,
       const gpu::SyncToken& sync_token,
       const gfx::Size& resource_size,
@@ -129,7 +127,6 @@
     const bool depends_on_hardware_accelerated_jpeg_candidates_;
     const bool depends_on_hardware_accelerated_webp_candidates_;
     const gpu::SyncToken before_raster_sync_token_;
-    const GLenum texture_target_;
     const bool texture_is_overlay_candidate_;
 
     gpu::Mailbox mailbox_;
@@ -143,7 +140,6 @@
   bool ShouldUnpremultiplyAndDitherResource(viz::ResourceFormat format) const;
   gpu::SyncToken PlaybackOnWorkerThreadInternal(
       gpu::Mailbox* mailbox,
-      GLenum texture_target,
       bool texture_is_overlay_candidate,
       const gpu::SyncToken& sync_token,
       const gfx::Size& resource_size,
@@ -165,7 +161,6 @@
   const bool use_gpu_memory_buffer_resources_;
   const viz::ResourceFormat tile_format_;
   const gfx::Size max_tile_size_;
-  const bool enable_oop_rasterization_;
 
   const raw_ptr<RasterQueryQueue> pending_raster_queries_;
 
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index e168d9adc..78cd768 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -356,8 +356,8 @@
  public:
   // Overridden from testing::Test:
   void SetUp() override {
-    pending_raster_queries_ = std::make_unique<RasterQueryQueue>(
-        worker_context_provider_.get(), /*oop_rasterization_enabled=*/false);
+    pending_raster_queries_ =
+        std::make_unique<RasterQueryQueue>(worker_context_provider_.get());
 
     switch (GetParam()) {
       case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
@@ -379,7 +379,7 @@
         Create3dResourceProvider();
         raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>(
             compositor_context_provider_.get(), worker_context_provider_.get(),
-            false, viz::RGBA_8888, gfx::Size(), true, false,
+            false, viz::RGBA_8888, gfx::Size(), true,
             pending_raster_queries_.get());
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index c8c922e..e99aa98 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -67,7 +67,6 @@
   RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY,
   RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY,
   RASTER_BUFFER_PROVIDER_TYPE_GPU,
-  RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR,
   RASTER_BUFFER_PROVIDER_TYPE_BITMAP
 };
 
@@ -151,49 +150,6 @@
   raw_ptr<base::Lock> lock_;
 };
 
-class RasterImplementationForOOPR
-    : public gpu::raster::RasterImplementationGLES {
- public:
-  explicit RasterImplementationForOOPR(gpu::gles2::GLES2Interface* gl,
-                                       gpu::ContextSupport* support)
-      : gpu::raster::RasterImplementationGLES(gl, support) {}
-  ~RasterImplementationForOOPR() override = default;
-
-  void GetQueryObjectui64vEXT(GLuint id,
-                              GLenum pname,
-                              GLuint64* params) override {
-    // This is used for testing GL_COMMANDS_ISSUED_TIMESTAMP_QUERY, so we return
-    // the maximum that base::TimeDelta()::InMicroseconds() could return.
-    if (pname == GL_QUERY_RESULT_EXT) {
-      static_assert(std::is_same<decltype(base::TimeDelta().InMicroseconds()),
-                                 int64_t>::value,
-                    "Expected the return type of "
-                    "base::TimeDelta()::InMicroseconds() to be int64_t");
-      *params = std::numeric_limits<int64_t>::max();
-    } else {
-      NOTREACHED();
-    }
-  }
-  void BeginRasterCHROMIUM(GLuint sk_color,
-                           GLboolean needs_clear,
-                           GLuint msaa_sample_count,
-                           gpu::raster::MsaaMode msaa_mode,
-                           GLboolean can_use_lcd_text,
-                           const gfx::ColorSpace& color_space,
-                           const GLbyte* mailbox) override {}
-  void RasterCHROMIUM(const DisplayItemList* list,
-                      ImageProvider* provider,
-                      const gfx::Size& content_size,
-                      const gfx::Rect& full_raster_rect,
-                      const gfx::Rect& playback_rect,
-                      const gfx::Vector2dF& post_translate,
-                      const gfx::Vector2dF& post_scale,
-                      bool requires_clear,
-                      size_t* max_op_size_hint,
-                      bool preserve_recording = true) override {}
-  void EndRasterCHROMIUM() override {}
-};
-
 class RasterBufferProviderTest
     : public TestRasterTaskCompletionHandler,
       public testing::TestWithParam<RasterBufferProviderType> {
@@ -237,15 +193,8 @@
         Create3dResourceProvider();
         raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>(
             context_provider_.get(), worker_context_provider_.get(), false,
-            viz::RGBA_8888, gfx::Size(), true, false,
-            pending_raster_queries_.get(), 1);
-        break;
-      case RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR:
-        Create3dResourceProvider();
-        raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>(
-            context_provider_.get(), worker_context_provider_.get(), false,
-            viz::RGBA_8888, gfx::Size(), true, true,
-            pending_raster_queries_.get(), 1);
+            viz::RGBA_8888, gfx::Size(), true, pending_raster_queries_.get(),
+            1);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
         CreateSoftwareResourceProvider();
@@ -388,28 +337,14 @@
     context_provider_ = viz::TestContextProvider::Create(std::move(gl_owned));
     context_provider_->BindToCurrentThread();
 
-    bool oop_rasterization_enabled = false;
-    if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR) {
-      oop_rasterization_enabled = true;
-      auto worker_gl_owned = std::make_unique<viz::TestGLES2Interface>();
-      auto worker_support_owned = std::make_unique<viz::TestContextSupport>();
-      auto worker_ri_owned = std::make_unique<RasterImplementationForOOPR>(
-          worker_gl_owned.get(), worker_support_owned.get());
-      worker_context_provider_ = base::MakeRefCounted<viz::TestContextProvider>(
-          std::move(worker_support_owned), std::move(worker_gl_owned),
-          std::move(worker_ri_owned), nullptr /* sii */,
-          true /* support_locking */);
-      worker_context_provider_->BindToCurrentThread();
-    } else {
-      worker_context_provider_ = viz::TestContextProvider::CreateWorker();
-      DCHECK(worker_context_provider_);
-    }
+    worker_context_provider_ = viz::TestContextProvider::CreateWorker();
+    DCHECK(worker_context_provider_);
 
     layer_tree_frame_sink_ = FakeLayerTreeFrameSink::Create3d();
     resource_provider_ = std::make_unique<viz::ClientResourceProvider>();
 
-    pending_raster_queries_ = std::make_unique<RasterQueryQueue>(
-        worker_context_provider_.get(), oop_rasterization_enabled);
+    pending_raster_queries_ =
+        std::make_unique<RasterQueryQueue>(worker_context_provider_.get());
   }
 
   void CreateSoftwareResourceProvider() {
@@ -523,7 +458,6 @@
       array, run_loop.QuitClosure(), 0);
 
   if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU ||
-      GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR ||
       GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY) {
     EXPECT_TRUE(callback_id);
   }
@@ -554,7 +488,6 @@
   EXPECT_EQ(callback_id, callback_id_2);
 
   if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU ||
-      GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR ||
       GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY) {
     EXPECT_TRUE(callback_id);
   }
@@ -562,7 +495,6 @@
 
 TEST_P(RasterBufferProviderTest, WaitOnSyncTokenAfterReschedulingTask) {
   if (GetParam() != RASTER_BUFFER_PROVIDER_TYPE_GPU &&
-      GetParam() != RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR &&
       GetParam() != RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY) {
     return;
   }
@@ -603,8 +535,7 @@
 }
 
 TEST_P(RasterBufferProviderTest, MeasureGpuRasterDuration) {
-  if (GetParam() != RASTER_BUFFER_PROVIDER_TYPE_GPU &&
-      GetParam() != RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR) {
+  if (GetParam() != RASTER_BUFFER_PROVIDER_TYPE_GPU) {
     return;
   }
 
@@ -652,9 +583,8 @@
 
   // Poll the task and make sure histograms are logged.
   base::HistogramTester histogram_tester;
-  std::string duration_histogram("Renderer4.Renderer.RasterTaskTotalDuration.");
-  duration_histogram +=
-      GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR ? "Oop" : "Gpu";
+  std::string duration_histogram(
+      "Renderer4.Renderer.RasterTaskTotalDuration.Oop");
   std::string delay_histogram_all_tiles(
       "Renderer4.Renderer.RasterTaskSchedulingDelayNoAtRasterDecodes.All");
   std::string delay_histogram_jpeg_tiles(
@@ -672,13 +602,13 @@
   EXPECT_FALSE(has_pending_queries);
   histogram_tester.ExpectTotalCount(duration_histogram, 9);
 
-  // Only in Chrome OS with OOP-R, we should be measuring raster scheduling
-  // delay (and only for tasks that don't depend on at-raster image decodes).
+  // Only in Chrome OS, we should be measuring raster scheduling delay (and only
+  // for tasks that don't depend on at-raster image decodes).
   base::HistogramBase::Count expected_delay_histogram_all_tiles_count = 0;
   base::HistogramBase::Count expected_delay_histogram_jpeg_tiles_count = 0;
   base::HistogramBase::Count expected_delay_histogram_webp_tiles_count = 0;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR) {
+  if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_GPU) {
     expected_delay_histogram_all_tiles_count = 5;
     expected_delay_histogram_jpeg_tiles_count = 3;
     expected_delay_histogram_webp_tiles_count = 2;
@@ -698,7 +628,6 @@
     ::testing::Values(RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY,
                       RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY,
                       RASTER_BUFFER_PROVIDER_TYPE_GPU,
-                      RASTER_BUFFER_PROVIDER_TYPE_GPU_OOPR,
                       RASTER_BUFFER_PROVIDER_TYPE_BITMAP));
 
 }  // namespace
diff --git a/cc/raster/raster_query_queue.cc b/cc/raster/raster_query_queue.cc
index 1d9ab29..b44f90f 100644
--- a/cc/raster/raster_query_queue.cc
+++ b/cc/raster/raster_query_queue.cc
@@ -19,10 +19,8 @@
 RasterQuery::~RasterQuery() = default;
 
 RasterQueryQueue::RasterQueryQueue(
-    viz::RasterContextProvider* const worker_context_provider,
-    bool oop_rasterization_enabled)
-    : worker_context_provider_(worker_context_provider),
-      oop_rasterization_enabled_(oop_rasterization_enabled) {}
+    viz::RasterContextProvider* const worker_context_provider)
+    : worker_context_provider_(worker_context_provider) {}
 
 RasterQueryQueue::~RasterQueryQueue() = default;
 
@@ -123,17 +121,10 @@
       }
     }
 
-    if (oop_rasterization_enabled_) {
-      UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-          base::StringPrintf("Renderer4.%s.RasterTaskTotalDuration.Oop",
-                             client_name),
-          raster_duration);
-    } else {
-      UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-          base::StringPrintf("Renderer4.%s.RasterTaskTotalDuration.Gpu",
-                             client_name),
-          raster_duration);
-    }
+    UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
+        base::StringPrintf("Renderer4.%s.RasterTaskTotalDuration.Oop",
+                           client_name),
+        raster_duration);
 
     it = pending_raster_queries_.erase(it);
   }
diff --git a/cc/raster/raster_query_queue.h b/cc/raster/raster_query_queue.h
index 573d509..b8bbfeb 100644
--- a/cc/raster/raster_query_queue.h
+++ b/cc/raster/raster_query_queue.h
@@ -44,8 +44,8 @@
 
 class CC_EXPORT RasterQueryQueue {
  public:
-  RasterQueryQueue(viz::RasterContextProvider* const worker_context_provider,
-                   bool oop_rasterization_enabled);
+  explicit RasterQueryQueue(
+      viz::RasterContextProvider* const worker_context_provider);
   virtual ~RasterQueryQueue();
 
   // These functions should never be called with the raster context lock
@@ -56,7 +56,6 @@
 
  private:
   const raw_ptr<viz::RasterContextProvider> worker_context_provider_;
-  const bool oop_rasterization_enabled_;
 
   // Note that this lock should never be acquired while holding the raster
   // context lock.
diff --git a/cc/test/fake_raster_query_queue.cc b/cc/test/fake_raster_query_queue.cc
index 13763dd..d95a641 100644
--- a/cc/test/fake_raster_query_queue.cc
+++ b/cc/test/fake_raster_query_queue.cc
@@ -7,9 +7,8 @@
 namespace cc {
 
 FakeRasterQueryQueue::FakeRasterQueryQueue(
-    viz::RasterContextProvider* const worker_context_provider,
-    bool oop_rasterization_enabled)
-    : RasterQueryQueue(worker_context_provider, oop_rasterization_enabled) {}
+    viz::RasterContextProvider* const worker_context_provider)
+    : RasterQueryQueue(worker_context_provider) {}
 
 FakeRasterQueryQueue::~FakeRasterQueryQueue() = default;
 
diff --git a/cc/test/fake_raster_query_queue.h b/cc/test/fake_raster_query_queue.h
index d06388dd..04ee406 100644
--- a/cc/test/fake_raster_query_queue.h
+++ b/cc/test/fake_raster_query_queue.h
@@ -12,9 +12,8 @@
 // Fake RasterQueryQueue that just no-ops all calls.
 class FakeRasterQueryQueue : public RasterQueryQueue {
  public:
-  FakeRasterQueryQueue(
-      viz::RasterContextProvider* const worker_context_provider,
-      bool oop_rasterization_enabled);
+  explicit FakeRasterQueryQueue(
+      viz::RasterContextProvider* const worker_context_provider);
   ~FakeRasterQueryQueue() override;
 
   // RasterQueryQueue methods.
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc
index 009c151c..a3ce347 100644
--- a/cc/test/fake_tile_manager.cc
+++ b/cc/test/fake_tile_manager.cc
@@ -47,8 +47,7 @@
           PaintImage::kDefaultGeneratorClientId) {
   SetResources(resource_pool, &image_decode_cache_, GetGlobalTaskGraphRunner(),
                GetGlobalRasterBufferProvider(),
-               false /* use_gpu_rasterization */,
-               false /* use_oop_rasterization */, nullptr);
+               /*use_gpu_rasterization=*/false, nullptr);
   SetTileTaskManagerForTesting(std::make_unique<FakeTileTaskManagerImpl>());
 }
 
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 585ec96..eb6bb70 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -83,7 +83,6 @@
       return std::make_unique<GpuRasterBufferProvider>(
           compositor_context_provider, worker_context_provider, false,
           gpu_raster_format, gfx::Size(), true,
-          /*enable_oop_rasterization=*/true,
           host_impl->GetRasterQueryQueueForTesting());
     case TestRasterType::kZeroCopy:
       EXPECT_TRUE(compositor_context_provider);
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index 30d46fc2..7988e9d 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -3605,19 +3605,17 @@
 
 SkColorType test_color_types[] = {kN32_SkColorType, kARGB_4444_SkColorType,
                                   kRGBA_F16_SkColorType};
-bool false_array[] = {false};
-bool true_array[] = {true};
 
 INSTANTIATE_TEST_SUITE_P(
     GpuImageDecodeCacheTestsInProcessRaster,
     GpuImageDecodeCacheTest,
     testing::Combine(
         testing::ValuesIn(test_color_types),
-        testing::ValuesIn(false_array) /* use_transfer_cache */,
+        testing::Values(false) /* use_transfer_cache */,
         testing::Bool() /* do_yuv_decode */,
-        testing::ValuesIn(false_array) /* allow_accelerated_jpeg_decoding */,
-        testing::ValuesIn(false_array) /* allow_accelerated_webp_decoding */,
-        testing::ValuesIn(false_array) /* advertise_accelerated_decoding */,
+        testing::Values(false) /* allow_accelerated_jpeg_decoding */,
+        testing::Values(false) /* allow_accelerated_webp_decoding */,
+        testing::Values(false) /* advertise_accelerated_decoding */,
         testing::Bool() /* enable_clipped_image_scaling */));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3625,12 +3623,12 @@
     GpuImageDecodeCacheTest,
     testing::Combine(
         testing::ValuesIn(test_color_types),
-        testing::ValuesIn(true_array) /* use_transfer_cache */,
+        testing::Values(true) /* use_transfer_cache */,
         testing::Bool() /* do_yuv_decode */,
-        testing::ValuesIn(false_array) /* allow_accelerated_jpeg_decoding */,
-        testing::ValuesIn(false_array) /* allow_accelerated_webp_decoding */,
-        testing::ValuesIn(false_array) /* advertise_accelerated_decoding */,
-        testing::ValuesIn(false_array) /* enable_clipped_image_scaling */));
+        testing::Values(false) /* allow_accelerated_jpeg_decoding */,
+        testing::Values(false) /* allow_accelerated_webp_decoding */,
+        testing::Values(false) /* advertise_accelerated_decoding */,
+        testing::Values(false) /* enable_clipped_image_scaling */));
 
 class GpuImageDecodeCacheWithAcceleratedDecodesTest
     : public GpuImageDecodeCacheTest {
@@ -3941,12 +3939,12 @@
     GpuImageDecodeCacheWithAcceleratedDecodesTest,
     testing::Combine(
         testing::ValuesIn(test_color_types),
-        testing::ValuesIn(true_array) /* use_transfer_cache */,
+        testing::Values(true) /* use_transfer_cache */,
         testing::Bool() /* do_yuv_decode */,
-        testing::ValuesIn(true_array) /* allow_accelerated_jpeg_decoding */,
-        testing::ValuesIn(true_array) /* allow_accelerated_webp_decoding */,
-        testing::ValuesIn(true_array) /* advertise_accelerated_decoding */,
-        testing::ValuesIn(false_array) /* enable_clipped_image_scaling */));
+        testing::Values(true) /* allow_accelerated_jpeg_decoding */,
+        testing::Values(true) /* allow_accelerated_webp_decoding */,
+        testing::Values(true) /* advertise_accelerated_decoding */,
+        testing::Values(false) /* enable_clipped_image_scaling */));
 
 class GpuImageDecodeCacheWithAcceleratedDecodesFlagsTest
     : public GpuImageDecodeCacheWithAcceleratedDecodesTest {};
@@ -4084,12 +4082,12 @@
     GpuImageDecodeCacheWithAcceleratedDecodesFlagsTest,
     testing::Combine(
         testing::Values(kN32_SkColorType),
-        testing::ValuesIn(true_array) /* use_transfer_cache */,
+        testing::Values(true) /* use_transfer_cache */,
         testing::Bool() /* do_yuv_decode */,
         testing::Bool() /* allow_accelerated_jpeg_decoding */,
         testing::Bool() /* allow_accelerated_webp_decoding */,
         testing::Bool() /* advertise_accelerated_decoding */,
-        testing::ValuesIn(false_array) /* enable_clipped_image_scaling */));
+        testing::Values(false) /* enable_clipped_image_scaling */));
 
 #undef EXPECT_TRUE_IF_NOT_USING_TRANSFER_CACHE
 #undef EXPECT_FALSE_IF_NOT_USING_TRANSFER_CACHE
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 2dc90f96..afeac00b3 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -407,7 +407,6 @@
       scheduled_raster_task_limit_(scheduled_raster_task_limit),
       tile_manager_settings_(tile_manager_settings),
       use_gpu_rasterization_(false),
-      use_oop_rasterization_(false),
       all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
       did_check_for_completed_tasks_since_last_schedule_tasks_(true),
       did_oom_on_last_assign_(false),
@@ -478,13 +477,11 @@
                                TaskGraphRunner* task_graph_runner,
                                RasterBufferProvider* raster_buffer_provider,
                                bool use_gpu_rasterization,
-                               bool use_oop_rasterization,
                                RasterQueryQueue* pending_raster_queries) {
   DCHECK(!tile_task_manager_);
   DCHECK(task_graph_runner);
 
   use_gpu_rasterization_ = use_gpu_rasterization;
-  use_oop_rasterization_ = use_oop_rasterization;
   pending_raster_queries_ = pending_raster_queries;
   resource_pool_ = resource_pool;
   image_controller_.SetImageDecodeCache(image_decode_cache);
@@ -1326,10 +1323,8 @@
     settings->images_to_skip = std::move(images_to_skip);
     settings->image_to_current_frame_index =
         std::move(image_id_to_current_frame_index);
-    if (use_oop_rasterization_) {
+    if (use_gpu_rasterization_) {
       settings->raster_mode = PlaybackImageProvider::RasterMode::kOop;
-    } else if (use_gpu_rasterization_) {
-      settings->raster_mode = PlaybackImageProvider::RasterMode::kGpu;
     }
   }
 
diff --git a/cc/tiles/tile_manager.h b/cc/tiles/tile_manager.h
index 69d30b1..066c598 100644
--- a/cc/tiles/tile_manager.h
+++ b/cc/tiles/tile_manager.h
@@ -187,7 +187,6 @@
                     TaskGraphRunner* task_graph_runner,
                     RasterBufferProvider* raster_buffer_provider,
                     bool use_gpu_rasterization,
-                    bool use_oop_rasterization,
                     RasterQueryQueue* pending_raster_queries);
 
   // This causes any completed raster work to finalize, so that tiles get up to
@@ -458,7 +457,6 @@
 
   const TileManagerSettings tile_manager_settings_;
   bool use_gpu_rasterization_;
-  bool use_oop_rasterization_;
   raw_ptr<RasterQueryQueue> pending_raster_queries_ = nullptr;
 
   std::unordered_map<Tile::Id, Tile*> tiles_;
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index 792063e..4512197 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -3661,8 +3661,8 @@
 class TileManagerCheckRasterQueriesTest : public TileManagerTest {
  public:
   TileManagerCheckRasterQueriesTest()
-      : pending_raster_queries_(viz::TestContextProvider::CreateWorker().get(),
-                                /*oop_rasterization_enabled=*/false) {}
+      : pending_raster_queries_(
+            viz::TestContextProvider::CreateWorker().get()) {}
   ~TileManagerCheckRasterQueriesTest() override {
     // Ensure that the host impl doesn't outlive |raster_buffer_provider_|.
     TakeHostImpl();
@@ -3676,11 +3676,9 @@
  protected:
   class MockRasterQueryQueue : public FakeRasterQueryQueue {
    public:
-    MockRasterQueryQueue(
-        viz::RasterContextProvider* const worker_context_provider,
-        bool oop_rasterization_enabled)
-        : FakeRasterQueryQueue(worker_context_provider,
-                               oop_rasterization_enabled) {}
+    explicit MockRasterQueryQueue(
+        viz::RasterContextProvider* const worker_context_provider)
+        : FakeRasterQueryQueue(worker_context_provider) {}
     MOCK_METHOD0(CheckRasterFinishedQueries, bool());
   };
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index b41b71db..0b240e5 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2819,11 +2819,11 @@
 void LayerTreeHostImpl::GetGpuRasterizationCapabilities(
     bool* gpu_rasterization_enabled,
     bool* gpu_rasterization_supported,
-    int* max_msaa_samples,
+    bool* can_use_msaa,
     bool* supports_disable_msaa) {
   *gpu_rasterization_enabled = false;
   *gpu_rasterization_supported = false;
-  *max_msaa_samples = 0;
+  *can_use_msaa = false;
   *supports_disable_msaa = false;
 
   if (settings_.gpu_rasterization_disabled)
@@ -2844,42 +2844,10 @@
   if (!*gpu_rasterization_enabled)
     return;
 
-  bool use_msaa = !caps.msaa_is_slow && !caps.avoid_stencil_buffers;
-
-  if (can_use_oop_rasterization_) {
-    *gpu_rasterization_supported = true;
-    *supports_disable_msaa = caps.multisample_compatibility;
-    // For OOP raster, the gpu service side will disable msaa if the
-    // requested samples are not enough.  GPU raster does this same
-    // logic below client side.
-    if (use_msaa)
-      *max_msaa_samples = RequestedMSAASampleCount();
-    return;
-  }
-
-  if (!context_provider->ContextSupport()->HasGrContextSupport())
-    return;
-
-  // Do not check GrContext above. It is lazy-created, and we only want to
-  // create it if it might be used.
-  GrDirectContext* gr_context = context_provider->GrContext();
-  *gpu_rasterization_supported = !!gr_context;
-  if (!*gpu_rasterization_supported)
-    return;
-
+  DCHECK(caps.supports_oop_raster);
+  *gpu_rasterization_supported = true;
+  *can_use_msaa = !caps.msaa_is_slow && !caps.avoid_stencil_buffers;
   *supports_disable_msaa = caps.multisample_compatibility;
-  if (use_msaa) {
-    // Skia may block MSAA independently of Chrome. Query Skia for its max
-    // supported sample count. Assume gpu compositing + gpu raster for this, as
-    // that is what we are hoping to use.
-    viz::ResourceFormat tile_format = TileRasterBufferFormat(
-        settings_, layer_tree_frame_sink_->context_provider(),
-        /*use_gpu_rasterization=*/true);
-    SkColorType color_type = ResourceFormatToClosestSkColorType(
-        /*gpu_compositing=*/true, tile_format);
-    *max_msaa_samples =
-        gr_context->maxSurfaceSampleCountForColorType(color_type);
-  }
 }
 
 bool LayerTreeHostImpl::UpdateGpuRasterizationStatus() {
@@ -2894,18 +2862,15 @@
   if (!layer_tree_frame_sink_)
     return false;
 
-  int requested_msaa_samples = RequestedMSAASampleCount();
-  int max_msaa_samples = 0;
   bool gpu_rasterization_enabled = false;
   bool gpu_rasterization_supported = false;
+  bool can_use_msaa = false;
   bool supports_disable_msaa = false;
   GetGpuRasterizationCapabilities(&gpu_rasterization_enabled,
-                                  &gpu_rasterization_supported,
-                                  &max_msaa_samples, &supports_disable_msaa);
+                                  &gpu_rasterization_supported, &can_use_msaa,
+                                  &supports_disable_msaa);
 
   bool use_gpu = false;
-  bool can_use_msaa =
-      requested_msaa_samples > 0 && max_msaa_samples >= requested_msaa_samples;
 
   if (!gpu_rasterization_enabled) {
     if (gpu_rasterization_supported)
@@ -3489,7 +3454,7 @@
     // TODO(crbug.com/1189208): Unlocking decoded-image-tracker images causes
     // flickering in visible trees if Out-Of-Process rasterization is enabled.
 #if BUILDFLAG(IS_FUCHSIA)
-  if (use_oop_rasterization() && visible())
+  if (use_gpu_rasterization() && visible())
     return;
 #endif  // BUILDFLAG(IS_FUCHSIA)
 
@@ -3614,15 +3579,14 @@
   if (use_gpu_rasterization_) {
     image_decode_cache_ = std::make_unique<GpuImageDecodeCache>(
         layer_tree_frame_sink_->worker_context_provider(),
-        can_use_oop_rasterization_,
+        /*use_transfer_cache=*/true,
         viz::ResourceFormatToClosestSkColorType(/*gpu_compositing=*/true,
                                                 tile_format),
         settings_.decoded_image_working_set_budget_bytes, max_texture_size_,
         paint_image_generator_client_id_, dark_mode_filter_);
 
     pending_raster_queries_ = std::make_unique<RasterQueryQueue>(
-        layer_tree_frame_sink_->worker_context_provider(),
-        can_use_oop_rasterization_);
+        layer_tree_frame_sink_->worker_context_provider());
 
   } else {
     bool gpu_compositing = !!layer_tree_frame_sink_->context_provider();
@@ -3646,7 +3610,7 @@
 
   tile_manager_.SetResources(resource_pool_.get(), image_decode_cache_.get(),
                              task_graph_runner, raster_buffer_provider_.get(),
-                             use_gpu_rasterization_, use_oop_rasterization(),
+                             use_gpu_rasterization_,
                              pending_raster_queries_.get());
   tile_manager_.SetCheckerImagingForceDisabled(
       settings_.only_checker_images_with_gpu_raster && !use_gpu_rasterization_);
@@ -3678,7 +3642,7 @@
         settings_.resource_settings.use_gpu_memory_buffer_resources,
         tile_format, settings_.max_gpu_raster_tile_size,
         settings_.unpremultiply_and_dither_low_bit_depth_tiles,
-        can_use_oop_rasterization_, pending_raster_queries_.get());
+        pending_raster_queries_.get());
   }
 
   bool use_zero_copy = settings_.use_zero_copy;
@@ -3918,15 +3882,6 @@
       ResourcePool::kDefaultExpirationDelay,
       settings_.disallow_non_exact_resource_reuse);
 
-  auto* context = layer_tree_frame_sink_->worker_context_provider();
-  if (context) {
-    viz::RasterContextProvider::ScopedRasterContextLock hold(context);
-    can_use_oop_rasterization_ =
-        context->ContextCapabilities().supports_oop_raster;
-  } else {
-    can_use_oop_rasterization_ = false;
-  }
-
   // Since the new context may support GPU raster or be capable of MSAA, update
   // status here. We don't need to check the return value since we are
   // recreating all resources already.
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 0829860..ff8b8c3 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -596,13 +596,9 @@
 
   void GetGpuRasterizationCapabilities(bool* gpu_rasterization_enabled,
                                        bool* gpu_rasterization_supported,
-                                       int* max_msaa_samples,
+                                       bool* can_use_msaa,
                                        bool* supports_disable_msaa);
   bool use_gpu_rasterization() const { return use_gpu_rasterization_; }
-  bool can_use_oop_rasterization() const { return can_use_oop_rasterization_; }
-  bool use_oop_rasterization() const {
-    return use_gpu_rasterization_ && can_use_oop_rasterization_;
-  }
 
   GpuRasterizationStatus gpu_rasterization_status() const {
     return gpu_rasterization_status_;
@@ -1086,7 +1082,6 @@
 
   bool need_update_gpu_rasterization_status_ = false;
   bool use_gpu_rasterization_ = false;
-  bool can_use_oop_rasterization_ = false;
   GpuRasterizationStatus gpu_rasterization_status_ =
       GpuRasterizationStatus::OFF_DEVICE;
   std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
diff --git a/chrome/VERSION b/chrome/VERSION
index 7ad851d..3ebe92ff 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=100
 MINOR=0
-BUILD=4863
+BUILD=4864
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 3a55ad8..4341fdc 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -70,6 +70,7 @@
   "java/src/org/chromium/chrome/browser/app/appmenu/IncognitoMenuItemViewBinder.java",
   "java/src/org/chromium/chrome/browser/app/appmenu/ManagedByMenuItemViewBinder.java",
   "java/src/org/chromium/chrome/browser/app/appmenu/UpdateMenuItemViewBinder.java",
+  "java/src/org/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate.java",
   "java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java",
   "java/src/org/chromium/chrome/browser/app/feed/NavigationRecorder.java",
   "java/src/org/chromium/chrome/browser/app/feed/ProcessScopeDependencyProviderFactory.java",
@@ -585,6 +586,7 @@
   "java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java",
   "java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge.java",
   "java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideServiceFactory.java",
+  "java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils.java",
   "java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java",
   "java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java",
   "java/src/org/chromium/chrome/browser/feedback/ConnectivityFeedbackSource.java",
diff --git a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
index fcfe458..150e0f21 100644
--- a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
+++ b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
@@ -693,14 +693,17 @@
 
   global_data.event_to_record_if_stopped =
       CableV2MobileEvent::kStoppedWhileAwaitingTunnelServerConnection;
-  global_data.current_transaction =
-      device::cablev2::authenticator::TransactFromQRCode(
-          std::make_unique<AndroidPlatform>(env, cable_authenticator,
-                                            /*is_usb=*/false),
-          global_data.network_context, *global_data.root_secret,
-          ConvertJavaStringToUTF8(authenticator_name), decoded_qr->secret,
-          decoded_qr->peer_identity,
-          link ? global_data.registration->contact_id() : absl::nullopt);
+  global_data
+      .current_transaction = device::cablev2::authenticator::TransactFromQRCode(
+      std::make_unique<AndroidPlatform>(env, cable_authenticator,
+                                        /*is_usb=*/false),
+      global_data.network_context, *global_data.root_secret,
+      ConvertJavaStringToUTF8(authenticator_name), decoded_qr->secret,
+      decoded_qr->peer_identity,
+      link ? global_data.registration->contact_id() : absl::nullopt,
+      // If the QR code knows about at least two registered tunnel server
+      // domains then we consider it recent enough to use the new Crypter mode.
+      /*use_new_crypter_construction=*/decoded_qr->num_known_domains >= 2);
 
   return ++global_data.instance_num;
 }
@@ -739,7 +742,8 @@
           global_data.network_context, dummy_root_secret,
           dummy_authenticator_name, qr_secret,
           server_link_data->subspan<0, device::kP256X962Length>(),
-          absl::nullopt);
+          absl::nullopt,
+          /*use_new_crypter_construction=*/false);
 
   return ++global_data.instance_num;
 }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
index 2ea7162..cb969ab 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
@@ -66,7 +66,11 @@
  */
 @SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@Config(manifest = Config.NONE,
+        instrumentedPackages =
+                {
+                        "androidx.recyclerview.widget.RecyclerView" // required to mock final
+                })
 @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 public class TabGridItemTouchHelperCallbackUnitTest {
     @Rule
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index 01f7330..f7b54e2a 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -70,7 +70,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
@@ -84,6 +83,7 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
@@ -170,7 +170,12 @@
 @SuppressWarnings(
         {"ArraysAsListWithZeroOrOneArgument", "ResultOfMethodCallIgnored", "ConstantConditions"})
 @RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class})
+@Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class},
+        instrumentedPackages =
+                {
+                        "androidx.recyclerview.widget.RecyclerView" // required to mock final
+                })
+@LooperMode(LooperMode.Mode.LEGACY)
 // clang-format off
 @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
 @Features.DisableFeatures({
@@ -565,9 +570,6 @@
         verify(mTabModel).closeTab(eq(mTab2), eq(null), eq(false), eq(false), eq(true));
     }
 
-    // TODO(crbug.com/1288629): Ignore until we have a way to test onMove without mocking final
-    // methods.
-    @Ignore
     @Test
     public void sendsMoveTabSignalCorrectlyWithoutGroup() {
         initAndAssertAllProperties();
@@ -579,7 +581,6 @@
         verify(mTabModel).moveTab(eq(TAB1_ID), eq(2));
     }
 
-    @Ignore
     @Test
     public void sendsMoveTabSignalCorrectlyWithGroup() {
         setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER, TabListMode.GRID);
@@ -594,7 +595,6 @@
         verify(mTabGroupModelFilter).moveRelatedTabs(eq(TAB1_ID), eq(2));
     }
 
-    @Ignore
     @Test
     public void sendsMoveTabSignalCorrectlyWithinGroup() {
         setUpForTabGroupOperation(TabListMediatorType.TAB_GRID_DIALOG, TabListMode.GRID);
@@ -3122,6 +3122,7 @@
                                    .with(TabProperties.TAB_ID, id)
                                    .with(CARD_TYPE, TAB)
                                    .build();
+        doReturn(position).when(viewHolder).getAdapterPosition();
         return viewHolder;
     }
 
diff --git a/chrome/android/java/res/layout/autofill_server_card_editor.xml b/chrome/android/java/res/layout/autofill_server_card_editor.xml
index 87262476..d2d7854 100644
--- a/chrome/android/java/res/layout/autofill_server_card_editor.xml
+++ b/chrome/android/java/res/layout/autofill_server_card_editor.xml
@@ -35,8 +35,7 @@
             android:paddingStart="@dimen/pref_autofill_touch_target_padding"
             android:paddingTop="@dimen/pref_autofill_touch_target_padding"
             android:paddingBottom="@dimen/pref_autofill_touch_target_padding"
-            android:textColor="?android:attr/textColorLink"
-            android:textAllCaps="true"
+            android:textAppearance="@style/TextAppearance.TextMedium.Link"
             android:text="@string/autofill_wallet_management_link_text" />
 
         <TextView
@@ -60,8 +59,7 @@
             android:paddingStart="@dimen/pref_autofill_touch_target_padding"
             android:paddingTop="@dimen/pref_autofill_touch_target_padding"
             android:paddingBottom="@dimen/pref_autofill_touch_target_padding"
-            android:textColor="?android:attr/textColorLink"
-            android:textAllCaps="true"
+            android:textAppearance="@style/TextAppearance.TextMedium.Link"
             android:text="@string/autofill_clear_local_copy_button" />
 
         <TextView
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 8010ce0..d5a75dd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -87,6 +87,7 @@
 import org.chromium.chrome.browser.download.DownloadOpenSource;
 import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationUtils;
 import org.chromium.chrome.browser.feed.FeedSurfaceTracker;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
 import org.chromium.chrome.browser.flags.ActivityType;
@@ -948,6 +949,8 @@
         if (!isWarmOnResume()) {
             SuggestionsMetrics.recordArticlesListVisible();
         }
+
+        FeatureNotificationUtils.handleIntentIfApplicable(getIntent());
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/DEPS
index c65c5ff7..7319b62c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/DEPS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DEPS
@@ -105,6 +105,9 @@
   "DownloadUtils\.java": [
     "+chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java"
   ],
+  "FeatureNotificationGuideDelegate\.java": [
+    "+chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java"
+  ],
   "HistoryContentManager\.java": [
     "+chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java"
   ],
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/DIR_METADATA b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/DIR_METADATA
new file mode 100644
index 0000000..d91ed999
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//chrome/browser/feature_guide/notifications/COMMON_METADATA"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate.java
new file mode 100644
index 0000000..622595b
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate.java
@@ -0,0 +1,63 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// 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.app.feature_guide.notifications;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Browser;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationGuideService;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationUtils;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureType;
+import org.chromium.chrome.browser.settings.SettingsActivity;
+import org.chromium.components.embedder_support.util.UrlConstants;
+
+/**
+ * Provides chrome layer dependencies required for {@link FeatureNotificationGuideService}.
+ */
+public final class FeatureNotificationGuideDelegate
+        implements FeatureNotificationGuideService.Delegate {
+    /**
+     * Launches an activity to show IPH when a feature notification is clicked.
+     * @param featureType The type of the feature being promoed in the notification.
+     */
+    @Override
+    public void launchActivityToShowIph(@FeatureType int featureType) {
+        ThreadUtils.assertOnUiThread();
+        boolean shouldOpenNewTab = featureType == FeatureType.INCOGNITO_TAB
+                || featureType == FeatureType.VOICE_SEARCH
+                || featureType == FeatureType.NTP_SUGGESTION_CARD;
+        Class activityToLaunch = getActivityToLaunchForFeature(featureType);
+        Context context = ContextUtils.getApplicationContext();
+        Intent intent = new Intent(context, activityToLaunch);
+        if (shouldOpenNewTab) {
+            intent.setData(Uri.parse(UrlConstants.NTP_URL));
+            intent.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true);
+        }
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.putExtra(FeatureNotificationUtils.EXTRA_FEATURE_TYPE, featureType);
+        IntentHandler.startActivityForTrustedIntent(intent);
+    }
+
+    private Class getActivityToLaunchForFeature(@FeatureType int featureType) {
+        switch (featureType) {
+            case FeatureType.INCOGNITO_TAB:
+            case FeatureType.NTP_SUGGESTION_CARD:
+            case FeatureType.VOICE_SEARCH:
+            case FeatureType.DEFAULT_BROWSER:
+                return ChromeTabbedActivity.class;
+            case FeatureType.SIGN_IN:
+                return SettingsActivity.class;
+            default:
+                assert false : "Unexpected feature type " + featureType;
+                return ChromeTabbedActivity.class;
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/OWNERS
new file mode 100644
index 0000000..fec49a19
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feature_guide/notifications/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/feature_guide/notifications/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java
index 09b7905..9a60042 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java
@@ -73,7 +73,7 @@
         final String fileName = downloadInfo.getFileName();
         assert !TextUtils.isEmpty(fileName);
         final String newMimeType = MimeUtils.remapGenericMimeType(
-                downloadInfo.getMimeType(), downloadInfo.getUrl(), fileName);
+                downloadInfo.getMimeType(), downloadInfo.getUrl().getSpec(), fileName);
         new AsyncTask<Pair<String, File>>() {
             @Override
             protected Pair<String, File> doInBackground() {
@@ -91,12 +91,12 @@
                             downloadInfo, fullDirPath, externalStorageState)) {
                     return;
                 }
-                String url = sanitizeDownloadUrl(downloadInfo);
+                GURL url = sanitizeDownloadUrl(downloadInfo);
                 if (url == null) return;
                 DownloadInfo newInfo = DownloadInfo.Builder.fromDownloadInfo(downloadInfo)
                                                .setUrl(url)
                                                .setMimeType(newMimeType)
-                                               .setDescription(url)
+                                               .setDescription(url.getSpec())
                                                .setFileName(fileName)
                                                .setIsGETRequest(true)
                                                .build();
@@ -112,7 +112,7 @@
      *
      * @param downloadInfo Information about the download.
      */
-    protected String sanitizeDownloadUrl(DownloadInfo downloadInfo) {
+    protected GURL sanitizeDownloadUrl(DownloadInfo downloadInfo) {
         return downloadInfo.getUrl();
     }
 
@@ -198,9 +198,8 @@
         if (mTab == null) return true;
         String fileName =
                 URLUtil.guessFileName(url.getSpec(), null, MimeUtils.OMA_DRM_MESSAGE_MIME);
-        // TODO(https://crbug.com/783819): Convert DownloadInfo to GURL.
         final DownloadInfo downloadInfo =
-                new DownloadInfo.Builder().setUrl(url.getSpec()).setFileName(fileName).build();
+                new DownloadInfo.Builder().setUrl(url).setFileName(fileName).build();
         WindowAndroid window = mTab.getWindowAndroid();
         if (window.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) {
             onDownloadStartNoStream(downloadInfo);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
index 94b14f4..b0e0c9b5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
@@ -14,6 +14,7 @@
 import org.chromium.content_public.browser.BrowserStartupController;
 import org.chromium.ui.base.AndroidPermissionDelegate;
 import org.chromium.ui.base.WindowAndroid;
+import org.chromium.url.GURL;
 
 /**
  * Java counterpart of android DownloadController. Owned by native.
@@ -142,7 +143,7 @@
      * @param referrer Referrer to use.
      */
     @CalledByNative
-    private static void enqueueAndroidDownloadManagerRequest(String url, String userAgent,
+    private static void enqueueAndroidDownloadManagerRequest(GURL url, String userAgent,
             String fileName, String mimeType, String cookie, String referrer) {
         DownloadInfo downloadInfo = new DownloadInfo.Builder()
                 .setUrl(url)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
index 42f2f11..0e2d4c3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
@@ -164,7 +164,7 @@
         offlineItem.totalSizeBytes = downloadInfo.getBytesTotalSize();
         offlineItem.receivedBytes = downloadInfo.getBytesReceived();
         offlineItem.isResumable = downloadInfo.isResumable();
-        offlineItem.url = downloadInfo.getUrl();
+        offlineItem.url = downloadInfo.getUrl() == null ? null : downloadInfo.getUrl().getSpec();
         offlineItem.originalUrl = downloadInfo.getOriginalUrl();
         offlineItem.isOffTheRecord = downloadInfo.isOffTheRecord();
         offlineItem.otrProfileId = OTRProfileID.serialize(downloadInfo.getOTRProfileId());
@@ -197,7 +197,7 @@
             case DownloadState.INTERRUPTED:
                 @ResumeMode
                 int resumeMode = DownloadUtils.getResumeMode(
-                        downloadInfo.getUrl(), downloadInfo.getFailState());
+                        downloadInfo.getUrl().getSpec(), downloadInfo.getFailState());
                 if (resumeMode == ResumeMode.INVALID || resumeMode == ResumeMode.USER_RESTART) {
                     // Fail but can restart from the beginning. The UI should let the user to retry.
                     offlineItem.state = OfflineItemState.INTERRUPTED;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index f879934..a62dfb2e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -701,7 +701,7 @@
         }
 
         DownloadEnqueueRequest request = new DownloadEnqueueRequest();
-        request.url = item.getDownloadInfo().getUrl();
+        request.url = item.getDownloadInfo().getUrl().getSpec();
         request.fileName = item.getDownloadInfo().getFileName();
         request.description = item.getDownloadInfo().getDescription();
         request.mimeType = item.getDownloadInfo().getMimeType();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
index 35e24ca..c4dfff6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
@@ -51,6 +51,7 @@
 import org.chromium.components.offline_items_collection.OfflineItemState;
 import org.chromium.net.ChromiumNetworkAdapter;
 import org.chromium.net.NetworkTrafficAnnotationTag;
+import org.chromium.url.GURL;
 
 import java.io.DataOutputStream;
 import java.io.File;
@@ -738,12 +739,12 @@
             fileName = URLUtil.guessFileName(url, null, mimeType);
         }
         DownloadInfo newInfo = DownloadInfo.Builder.fromDownloadInfo(downloadInfo)
-                .setFileName(fileName)
-                .setUrl(url)
-                .setMimeType(mimeType)
-                .setDescription(omaInfo.getValue(OMA_DESCRIPTION))
-                .setBytesReceived(getSize(omaInfo))
-                .build();
+                                       .setFileName(fileName)
+                                       .setUrl(new GURL(url))
+                                       .setMimeType(mimeType)
+                                       .setDescription(omaInfo.getValue(OMA_DESCRIPTION))
+                                       .setBytesReceived(getSize(omaInfo))
+                                       .build();
         // If installNotifyURI is not empty, the downloaded content cannot
         // be used until the PostStatusTask gets a 200-series response.
         // Don't show complete notification until that happens.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge.java
index b1b6517..b311d81a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge.java
@@ -4,18 +4,14 @@
 
 package org.chromium.chrome.browser.feature_guide.notifications;
 
-import androidx.annotation.StringRes;
-
-import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.chrome.R;
 
 /**
  * Contains JNI methods needed by the feature notification guide.
  */
 @JNINamespace("feature_guide")
-public final class FeatureNotificationGuideBridge implements FeatureNotificationGuideService {
+public final class FeatureNotificationGuideBridge extends FeatureNotificationGuideService {
     private long mNativeFeatureNotificationGuideBridge;
 
     @CalledByNative
@@ -34,38 +30,31 @@
 
     @CalledByNative
     private String getNotificationTitle(@FeatureType int featureType) {
-        return ContextUtils.getApplicationContext().getResources().getString(
-                R.string.feature_notification_guide_notification_title);
+        return FeatureNotificationUtils.getNotificationTitle(featureType);
     }
 
     @CalledByNative
     private String getNotificationMessage(@FeatureType int featureType) {
-        @StringRes
-        int stringId = 0;
-        switch (featureType) {
-            case FeatureType.DEFAULT_BROWSER:
-                stringId = R.string.feature_notification_guide_notification_message_default_browser;
-                break;
-            case FeatureType.SIGN_IN:
-                stringId = R.string.feature_notification_guide_notification_message_sign_in;
-                break;
-            case FeatureType.INCOGNITO_TAB:
-                stringId = R.string.feature_notification_guide_notification_message_incognito_tab;
-                break;
-            case FeatureType.NTP_SUGGESTION_CARD:
-                stringId =
-                        R.string.feature_notification_guide_notification_message_ntp_suggestion_card;
-                break;
-            case FeatureType.VOICE_SEARCH:
-                stringId = R.string.feature_notification_guide_notification_message_voice_search;
-                break;
-            default:
-                assert false : "Found unknown feature type " + featureType;
-                break;
-        }
-        return ContextUtils.getApplicationContext().getResources().getString(stringId);
+        return FeatureNotificationUtils.getNotificationMessage(featureType);
     }
 
     @CalledByNative
-    private void onNotificationClick(@FeatureType int featureType) {}
+    private void onNotificationClick(@FeatureType int featureType) {
+        FeatureNotificationGuideService.getDelegate().launchActivityToShowIph(featureType);
+    }
+
+    @CalledByNative
+    private void closeNotification(String notificationGuid) {
+        FeatureNotificationUtils.closeNotification(notificationGuid);
+    }
+
+    @CalledByNative
+    private boolean shouldSkipFeature(@FeatureType int featureType) {
+        return FeatureNotificationUtils.shouldSkipFeature(featureType);
+    }
+
+    @CalledByNative
+    private String getNotificationParamGuidForFeature(@FeatureType int featureType) {
+        return FeatureNotificationUtils.getNotificationParamGuidForFeature(featureType);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils.java
new file mode 100644
index 0000000..233f3eb
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils.java
@@ -0,0 +1,163 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// 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.feature_guide.notifications;
+
+import android.content.Intent;
+
+import androidx.annotation.StringRes;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.IntentUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.components.browser_ui.notifications.NotificationManagerProxy;
+import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl;
+import org.chromium.components.feature_engagement.FeatureConstants;
+import org.chromium.components.feature_engagement.Tracker;
+
+/**
+ * Various utility methods needed by the feature notification guide and external clients to show
+ * IPH.
+ */
+public final class FeatureNotificationUtils {
+    /**
+     * The {@link FeatureType} of the feature being promoed through the notification.
+     */
+    public static final String EXTRA_FEATURE_TYPE = "feature_notification_guide_feature_type";
+
+    private static final String NOTIFICATION_PARAM_GUID_DEFAULT_BROWSER = "guid_default_browser";
+    private static final String NOTIFICATION_PARAM_GUID_SIGN_IN = "guid_sign_in";
+    private static final String NOTIFICATION_PARAM_GUID_INCOGNITO_TAB = "guid_incognito_tab";
+    private static final String NOTIFICATION_PARAM_GUID_NTP_SUGGESTION_CARD =
+            "guid_ntp_suggestion_card";
+    private static final String NOTIFICATION_PARAM_GUID_VOICE_SEARCH = "guid_voice_search";
+
+    /**
+     * Helper method used by activities to check if the incoming intent is from a feature
+     * notification click. Initiates a request to the IPH system to show the corresponding IPH.
+     */
+    public static void handleIntentIfApplicable(Intent intent) {
+        int featureType =
+                IntentUtils.safeGetIntExtra(intent, EXTRA_FEATURE_TYPE, FeatureType.INVALID);
+        if (featureType == FeatureType.INVALID) return;
+
+        Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedRegularProfile());
+        tracker.setPriorityNotification(
+                FeatureNotificationUtils.getIPHFeatureForNotificationFeatureType(featureType));
+    }
+
+    /**
+     * Helper method to register an IPH show callback for the feature type to show the IPH.
+     */
+    public static void registerIPHCallback(@FeatureType int featureType, Runnable showIphCallback) {
+        Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedRegularProfile());
+        tracker.registerPriorityNotificationHandler(
+                getIPHFeatureForNotificationFeatureType(featureType), showIphCallback);
+    }
+
+    /**
+     * Unregisters any IPH callbacks associated with the feature type.
+     */
+    public static void unregisterIPHCallback(@FeatureType int featureType) {
+        Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedRegularProfile());
+        tracker.unregisterPriorityNotificationHandler(
+                getIPHFeatureForNotificationFeatureType(featureType));
+    }
+
+    /* package */ static String getNotificationTitle(@FeatureType int featureType) {
+        return ContextUtils.getApplicationContext().getResources().getString(
+                R.string.feature_notification_guide_notification_title);
+    }
+
+    /* package */ static String getNotificationMessage(@FeatureType int featureType) {
+        @StringRes
+        int stringId = 0;
+        switch (featureType) {
+            case FeatureType.DEFAULT_BROWSER:
+                stringId = R.string.feature_notification_guide_notification_message_default_browser;
+                break;
+            case FeatureType.SIGN_IN:
+                stringId = R.string.feature_notification_guide_notification_message_sign_in;
+                break;
+            case FeatureType.INCOGNITO_TAB:
+                stringId = R.string.feature_notification_guide_notification_message_incognito_tab;
+                break;
+            case FeatureType.NTP_SUGGESTION_CARD:
+                stringId =
+                        R.string.feature_notification_guide_notification_message_ntp_suggestion_card;
+                break;
+            case FeatureType.VOICE_SEARCH:
+                stringId = R.string.feature_notification_guide_notification_message_voice_search;
+                break;
+            default:
+                assert false : "Found unknown feature type " + featureType;
+                break;
+        }
+        return ContextUtils.getApplicationContext().getResources().getString(stringId);
+    }
+
+    private static String getIPHFeatureForNotificationFeatureType(@FeatureType int featureType) {
+        switch (featureType) {
+            case FeatureType.DEFAULT_BROWSER:
+                return FeatureConstants.FEATURE_NOTIFICATION_GUIDE_DEFAULT_BROWSER_PROMO_FEATURE;
+            case FeatureType.SIGN_IN:
+                return FeatureConstants.FEATURE_NOTIFICATION_GUIDE_SIGN_IN_HELP_BUBBLE_FEATURE;
+            case FeatureType.INCOGNITO_TAB:
+                return FeatureConstants
+                        .FEATURE_NOTIFICATION_GUIDE_INCOGNITO_TAB_HELP_BUBBLE_FEATURE;
+            case FeatureType.NTP_SUGGESTION_CARD:
+                return FeatureConstants
+                        .FEATURE_NOTIFICATION_GUIDE_NTP_SUGGESTION_CARD_HELP_BUBBLE_FEATURE;
+            case FeatureType.VOICE_SEARCH:
+                return FeatureConstants.FEATURE_NOTIFICATION_GUIDE_VOICE_SEARCH_HELP_BUBBLE_FEATURE;
+            default:
+                assert false : "Found unknown feature type " + featureType;
+                break;
+        }
+        return FeatureConstants.FEATURE_NOTIFICATION_GUIDE_INCOGNITO_TAB_HELP_BUBBLE_FEATURE;
+    }
+
+    /* package */ static String getNotificationParamGuidForFeature(@FeatureType int featureType) {
+        switch (featureType) {
+            case FeatureType.DEFAULT_BROWSER:
+                return NOTIFICATION_PARAM_GUID_DEFAULT_BROWSER;
+            case FeatureType.SIGN_IN:
+                return NOTIFICATION_PARAM_GUID_SIGN_IN;
+            case FeatureType.INCOGNITO_TAB:
+                return NOTIFICATION_PARAM_GUID_INCOGNITO_TAB;
+            case FeatureType.NTP_SUGGESTION_CARD:
+                return NOTIFICATION_PARAM_GUID_NTP_SUGGESTION_CARD;
+            case FeatureType.VOICE_SEARCH:
+                return NOTIFICATION_PARAM_GUID_VOICE_SEARCH;
+            default:
+                assert false : "Found unknown feature type " + featureType;
+                return "";
+        }
+    }
+
+    /* package */ static void closeNotification(String notificationGuid) {
+        int notificationId = notificationGuid.hashCode();
+        NotificationManagerProxy notificationManager =
+                new NotificationManagerProxyImpl(ContextUtils.getApplicationContext());
+        notificationManager.cancel(notificationId);
+    }
+
+    /**
+     * Called to determine whether the feature should be skipped from notification as it is
+     * ineligible or not available on the device.
+     * @param featureType The given feature type.
+     * @return True if the feature should be skipped, false otherwise.
+     */
+    public static boolean shouldSkipFeature(@FeatureType int featureType) {
+        if (featureType == FeatureType.DEFAULT_BROWSER) return !shouldShowDefaultBrowserPromo();
+        return false;
+    }
+
+    private static boolean shouldShowDefaultBrowserPromo() {
+        // TODO(shaktisahu): Check if default browser is already enabled.
+        return false;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
index 3650798..cb79b57 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.firstrun;
 
 import android.content.Context;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.text.method.LinkMovementMethod;
@@ -23,6 +22,7 @@
 import androidx.fragment.app.Fragment;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.supplier.OneshotSupplierImpl;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
 import org.chromium.chrome.browser.signin.services.FREMobileIdentityConsistencyFieldTrial;
@@ -34,6 +34,9 @@
 import org.chromium.ui.text.SpanApplier;
 import org.chromium.ui.text.SpanApplier.SpanInfo;
 
+import java.util.LinkedList;
+import java.util.List;
+
 /**
  * The First Run Experience fragment that allows the user to accept Terms of Service ("ToS") and
  * Privacy Notice, and to opt-in to the usage statistics and crash reports collection ("UMA",
@@ -53,9 +56,12 @@
     private static ToSAndUMAFirstRunFragment.Observer sObserver;
 
     private boolean mNativeInitialized;
+    private boolean mPolicyServiceInitialized;
     private boolean mTosButtonClicked;
     // TODO(https://crbug.com/1274145): Rename mAllowCrashUpload field.
     private boolean mAllowCrashUpload;
+    private final OneshotSupplierImpl<Boolean> mIsMetricsReportingDisabledByPolicy =
+            new OneshotSupplierImpl<>();
 
     private Button mAcceptButton;
     private CheckBox mSendReportCheckBox;
@@ -74,14 +80,12 @@
     @Override
     public void onAttach(@NonNull Context context) {
         super.onAttach(context);
-        getPageDelegate().getPolicyLoadListener().onAvailable(
-                (ignored) -> tryMarkTermsAccepted(false));
+        getPageDelegate().getPolicyLoadListener().onAvailable(this::onPolicyServiceInitialized);
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mAllowCrashUpload = getUmaCheckBoxInitialState();
 
         mTitle = view.findViewById(R.id.title);
         mProgressSpinner = view.findViewById(R.id.progress_spinner);
@@ -90,75 +94,15 @@
         mSendReportCheckBox = (CheckBox) view.findViewById(R.id.send_report_checkbox);
         mTosAndPrivacy = (TextView) view.findViewById(R.id.tos_and_privacy);
 
+        // Register event listeners.
         mAcceptButton.setOnClickListener((v) -> onTosButtonClicked());
-
-        mSendReportCheckBox.setChecked(mAllowCrashUpload);
         mSendReportCheckBox.setOnCheckedChangeListener(
                 ((compoundButton, isChecked) -> mAllowCrashUpload = isChecked));
-        if (!canShowUmaCheckBox()) {
-            if (!FREMobileIdentityConsistencyFieldTrial.shouldShowOldFreWithUmaDialog()) {
-                mAllowCrashUpload = sShowUmaCheckBoxForTesting || VersionInfo.isOfficialBuild();
-            }
-            mSendReportCheckBox.setVisibility(View.GONE);
-        }
 
+        // Make TextView links clickable.
         mTosAndPrivacy.setMovementMethod(LinkMovementMethod.getInstance());
 
-        Resources resources = getResources();
-        final boolean showUmaDialog =
-                FREMobileIdentityConsistencyFieldTrial.shouldShowOldFreWithUmaDialog();
-        NoUnderlineClickableSpan clickableGoogleTermsSpan =
-                new NoUnderlineClickableSpan(resources, (view1) -> {
-                    if (!isAdded()) return;
-                    getPageDelegate().showInfoPage(R.string.google_terms_of_service_url);
-                });
-        NoUnderlineClickableSpan clickableChromeAdditionalTermsSpan =
-                new NoUnderlineClickableSpan(resources, (view1) -> {
-                    if (!isAdded()) return;
-                    getPageDelegate().showInfoPage(R.string.chrome_additional_terms_of_service_url);
-                });
-        NoUnderlineClickableSpan clickableFamilyLinkPrivacySpan =
-                new NoUnderlineClickableSpan(resources, (view1) -> {
-                    if (!isAdded()) return;
-                    getPageDelegate().showInfoPage(showUmaDialog
-                                    ? R.string.google_privacy_policy_url
-                                    : R.string.family_link_privacy_policy_url);
-                });
-
-        final CharSequence tosText;
-        Bundle freProperties = getPageDelegate().getProperties();
-        @ChildAccountStatus.Status
-        int childAccountStatus = freProperties.getInt(
-                SyncConsentFirstRunFragment.CHILD_ACCOUNT_STATUS, ChildAccountStatus.NOT_CHILD);
-        if (showUmaDialog) {
-            final NoUnderlineClickableSpan clickableUMADialogSpan =
-                    new NoUnderlineClickableSpan(resources, (view1) -> openUmaDialog());
-            if (childAccountStatus == ChildAccountStatus.REGULAR_CHILD) {
-                tosText = SpanApplier.applySpans(
-                        getString(R.string.signin_fre_footer_supervised_user),
-                        new SpanInfo("<TOS_LINK>", "</TOS_LINK>", clickableGoogleTermsSpan),
-                        new SpanInfo("<PRIVACY_LINK>", "</PRIVACY_LINK>",
-                                clickableFamilyLinkPrivacySpan),
-                        new SpanInfo("<UMA_LINK>", "</UMA_LINK>", clickableUMADialogSpan));
-            } else {
-                tosText = SpanApplier.applySpans(getString(R.string.signin_fre_footer),
-                        new SpanInfo("<TOS_LINK>", "</TOS_LINK>", clickableGoogleTermsSpan),
-                        new SpanInfo("<UMA_LINK>", "</UMA_LINK>", clickableUMADialogSpan));
-            }
-        } else {
-            if (childAccountStatus == ChildAccountStatus.REGULAR_CHILD) {
-                tosText = SpanApplier.applySpans(
-                        getString(R.string.fre_tos_and_privacy_child_account),
-                        new SpanInfo("<LINK1>", "</LINK1>", clickableGoogleTermsSpan),
-                        new SpanInfo("<LINK2>", "</LINK2>", clickableChromeAdditionalTermsSpan),
-                        new SpanInfo("<LINK3>", "</LINK3>", clickableFamilyLinkPrivacySpan));
-            } else {
-                tosText = SpanApplier.applySpans(getString(R.string.fre_tos),
-                        new SpanInfo("<LINK1>", "</LINK1>", clickableGoogleTermsSpan),
-                        new SpanInfo("<LINK2>", "</LINK2>", clickableChromeAdditionalTermsSpan));
-            }
-        }
-        mTosAndPrivacy.setText(tosText);
+        mIsMetricsReportingDisabledByPolicy.onAvailable((ignored) -> updateView());
 
         // If this page should be skipped, it can be one of the following cases:
         //   1. Native hasn't been initialized yet and this page will be skipped once that happens.
@@ -206,6 +150,10 @@
         mNativeInitialized = true;
         tryMarkTermsAccepted(false);
 
+        if (mPolicyServiceInitialized) {
+            onNativeAndPolicyServiceInitialized();
+        }
+
         if (sObserver != null) {
             sObserver.onNativeInitialized();
         }
@@ -227,12 +175,139 @@
         mAllowCrashUpload = allowCrashUpload;
     }
 
+    private void updateView() {
+        // Avoid early calls.
+        if (getPageDelegate() == null) {
+            return;
+        }
+
+        final boolean umaDialogMayBeShown =
+                FREMobileIdentityConsistencyFieldTrial.shouldShowOldFreWithUmaDialog();
+        final boolean hasChildAccount = getPageDelegate().getProperties().getInt(
+                                                SyncConsentFirstRunFragment.CHILD_ACCOUNT_STATUS,
+                                                ChildAccountStatus.NOT_CHILD)
+                == ChildAccountStatus.REGULAR_CHILD;
+        final boolean isMetricsReportingDisabledByPolicy =
+                !isWaitingForNativeAndPolicyInit() && mIsMetricsReportingDisabledByPolicy.get();
+
+        updateTosText(umaDialogMayBeShown, hasChildAccount, isMetricsReportingDisabledByPolicy);
+
+        updateReportCheckbox(umaDialogMayBeShown, isMetricsReportingDisabledByPolicy);
+    }
+
+    private SpanInfo buildTermsOfServiceLink() {
+        NoUnderlineClickableSpan clickableGoogleTermsSpan =
+                new NoUnderlineClickableSpan(getResources(), (view1) -> {
+                    if (!isAdded()) return;
+                    getPageDelegate().showInfoPage(R.string.google_terms_of_service_url);
+                });
+        return new SpanInfo("<TOS_LINK>", "</TOS_LINK>", clickableGoogleTermsSpan);
+    }
+
+    private SpanInfo buildAdditionalTermsOfServiceLink() {
+        NoUnderlineClickableSpan clickableChromeAdditionalTermsSpan =
+                new NoUnderlineClickableSpan(getResources(), (view1) -> {
+                    if (!isAdded()) return;
+                    getPageDelegate().showInfoPage(R.string.chrome_additional_terms_of_service_url);
+                });
+        return new SpanInfo("<ATOS_LINK>", "</ATOS_LINK>", clickableChromeAdditionalTermsSpan);
+    }
+
+    private SpanInfo buildPrivacyPolicyLink(boolean umaDialogMayBeShown) {
+        NoUnderlineClickableSpan clickableFamilyLinkPrivacySpan =
+                new NoUnderlineClickableSpan(getResources(), (view1) -> {
+                    if (!isAdded()) return;
+                    getPageDelegate().showInfoPage(umaDialogMayBeShown
+                                    ? R.string.google_privacy_policy_url
+                                    : R.string.family_link_privacy_policy_url);
+                });
+
+        return new SpanInfo("<PRIVACY_LINK>", "</PRIVACY_LINK>", clickableFamilyLinkPrivacySpan);
+    }
+
+    private SpanInfo buildMetricsAndCrashReportingLink() {
+        NoUnderlineClickableSpan clickableUMADialogSpan =
+                new NoUnderlineClickableSpan(getResources(), (view1) -> openUmaDialog());
+        return new SpanInfo("<UMA_LINK>", "</UMA_LINK>", clickableUMADialogSpan);
+    }
+
+    private void updateTosText(boolean umaDialogMayBeShown, boolean hasChildAccount,
+            boolean isMetricsReportingDisabledByPolicy) {
+        List<SpanInfo> spans = new LinkedList<SpanInfo>();
+
+        // Description always has a Terms of Service link.
+        spans.add(buildTermsOfServiceLink());
+
+        // Additional terms of service link.
+        if (!umaDialogMayBeShown) {
+            spans.add(buildAdditionalTermsOfServiceLink());
+        }
+
+        // Privacy policy link.
+        if (hasChildAccount) {
+            spans.add(buildPrivacyPolicyLink(umaDialogMayBeShown));
+        }
+
+        // Metrics and crash reporting link.
+        if (umaDialogMayBeShown && !isMetricsReportingDisabledByPolicy) {
+            spans.add(buildMetricsAndCrashReportingLink());
+        }
+
+        String tosString;
+        if (umaDialogMayBeShown) {
+            tosString =
+                    getString(hasChildAccount ? R.string.signin_fre_footer_tos_with_supervised_user
+                                              : R.string.signin_fre_footer_tos);
+
+            if (!isMetricsReportingDisabledByPolicy) {
+                tosString += "\n" + getString(R.string.signin_fre_footer_metrics_reporting);
+            }
+        } else {
+            tosString = getString(hasChildAccount ? R.string.fre_tos_and_privacy_child_account
+                                                  : R.string.fre_tos);
+        }
+
+        mTosAndPrivacy.setText(SpanApplier.applySpans(tosString, spans.toArray(new SpanInfo[0])));
+    }
+
+    private void updateReportCheckbox(
+            boolean umaDialogMayBeShown, boolean isMetricsReportingDisabledByPolicy) {
+        mAllowCrashUpload = getUmaCheckBoxInitialState();
+        mSendReportCheckBox.setChecked(mAllowCrashUpload);
+
+        if (!canShowUmaCheckBox()) {
+            if (!umaDialogMayBeShown) {
+                mAllowCrashUpload = (sShowUmaCheckBoxForTesting || VersionInfo.isOfficialBuild())
+                        && !isMetricsReportingDisabledByPolicy;
+            }
+            mSendReportCheckBox.setVisibility(View.GONE);
+        }
+    }
+
     private void openUmaDialog() {
         new FreUMADialogCoordinator(requireContext(),
                 ((ModalDialogManagerHolder) getActivity()).getModalDialogManager(), this,
                 mAllowCrashUpload);
     }
 
+    private void onPolicyServiceInitialized(boolean onDevicePolicyFound) {
+        assert !mPolicyServiceInitialized;
+
+        mPolicyServiceInitialized = true;
+        tryMarkTermsAccepted(false);
+
+        if (mNativeInitialized) {
+            onNativeAndPolicyServiceInitialized();
+        }
+    }
+
+    private void onNativeAndPolicyServiceInitialized() {
+        // Once we have native & policies, Check whether metrics reporting are permitted by policy
+        // and update interface accordingly.
+        mIsMetricsReportingDisabledByPolicy.set(
+                PrivacyPreferencesManagerImpl.getInstance().isMetricsReportingDisabledByPolicy());
+    }
+
     private void onTosButtonClicked() {
         mTosButtonClicked = true;
         mTosAcceptedTime = SystemClock.elapsedRealtime();
@@ -271,16 +346,25 @@
     }
 
     private boolean isWaitingForNativeAndPolicyInit() {
-        return !mNativeInitialized || getPageDelegate().getPolicyLoadListener().get() == null;
+        return !mNativeInitialized || !mPolicyServiceInitialized;
     }
 
     private boolean getUmaCheckBoxInitialState() {
-        // The shared preference behind PrivacyPreferencesManagerImpl#isMetricsUploadPermitted is
-        // set after ToS is accepted. If ToS is not accepted yet, use the default value.
-        return FirstRunUtils.didAcceptTermsOfService()
-                ? PrivacyPreferencesManagerImpl.getInstance()
-                          .isUsageAndCrashReportingPermittedByUser()
-                : FirstRunActivity.DEFAULT_METRICS_AND_CRASH_REPORTING;
+        // Metrics and crash reporting could not be permitted by policy.
+        if (!isWaitingForNativeAndPolicyInit()
+                && PrivacyPreferencesManagerImpl.getInstance()
+                           .isMetricsReportingDisabledByPolicy()) {
+            return false;
+        }
+
+        // A user could start FRE and accept terms of service, then close the browser and start
+        // again. In this case we rely on whatever state the user has already set.
+        if (FirstRunUtils.didAcceptTermsOfService()) {
+            return PrivacyPreferencesManagerImpl.getInstance()
+                    .isUsageAndCrashReportingPermittedByUser();
+        }
+
+        return FirstRunActivity.DEFAULT_METRICS_AND_CRASH_REPORTING;
     }
 
     // Exposed methods for ToSAndUMACCTFirstRunFragment
@@ -288,6 +372,9 @@
     protected void setTosAndUmaVisible(boolean isVisible) {
         int visibility = isVisible ? View.VISIBLE : View.GONE;
 
+        // Non-enterprise/policy users will not wait for native initialization to display FRE UI.
+        updateView();
+
         mAcceptButton.setVisibility(visibility);
         mTosAndPrivacy.setVisibility(visibility);
         // Avoid updating visibility if the UMA check box can't be shown right now.
@@ -306,7 +393,10 @@
      */
     protected boolean canShowUmaCheckBox() {
         return !FREMobileIdentityConsistencyFieldTrial.shouldShowOldFreWithUmaDialog()
-                && (sShowUmaCheckBoxForTesting || VersionInfo.isOfficialBuild());
+                && (sShowUmaCheckBoxForTesting || VersionInfo.isOfficialBuild())
+                && (isWaitingForNativeAndPolicyInit()
+                        || !PrivacyPreferencesManagerImpl.getInstance()
+                                    .isMetricsReportingDisabledByPolicy());
     }
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
index 8c211e82..fc4bf79 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -36,6 +36,7 @@
 import org.chromium.chrome.browser.DefaultBrowserInfo;
 import org.chromium.chrome.browser.DeferredStartupHandler;
 import org.chromium.chrome.browser.DevToolsServer;
+import org.chromium.chrome.browser.app.feature_guide.notifications.FeatureNotificationGuideDelegate;
 import org.chromium.chrome.browser.app.video_tutorials.VideoTutorialShareHelper;
 import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantHistoryDeletionObserver;
 import org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProvider;
@@ -48,6 +49,8 @@
 import org.chromium.chrome.browser.download.DownloadManagerService;
 import org.chromium.chrome.browser.download.OfflineContentAvailabilityStatusProvider;
 import org.chromium.chrome.browser.enterprise.util.EnterpriseInfo;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationGuideService;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationGuideServiceFactory;
 import org.chromium.chrome.browser.firstrun.TosDialogBehaviorSharedPrefInvalidator;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -69,6 +72,7 @@
 import org.chromium.chrome.browser.photo_picker.DecoderService;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
 import org.chromium.chrome.browser.query_tiles.QueryTileUtils;
 import org.chromium.chrome.browser.quickactionsearchwidget.QuickActionSearchWidgetProvider;
@@ -285,6 +289,7 @@
                 () -> PlatformContentCaptureController.getInstance()));
         HistoryDeletionBridge.getInstance().addObserver(
                 new AutofillAssistantHistoryDeletionObserver());
+        FeatureNotificationGuideService.setDelegate(new FeatureNotificationGuideDelegate());
     }
 
     /**
@@ -465,6 +470,12 @@
                 ShoppingPersistedTabData.onDeferredStartup();
             }
         });
+        deferredStartupHandler.addDeferredTask(() -> {
+            if (ChromeFeatureList.isEnabled(ChromeFeatureList.FEATURE_NOTIFICATION_GUIDE)) {
+                FeatureNotificationGuideServiceFactory.getForProfile(
+                        Profile.getLastUsedRegularProfile());
+            }
+        });
     }
 
     private void initChannelsAsync() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java
index a3d1710..7a5f4a7b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java
@@ -43,6 +43,11 @@
         return sInstance;
     }
 
+    @VisibleForTesting
+    public static void setInstanceForTesting(PrivacyPreferencesManagerImpl instance) {
+        sInstance = instance;
+    }
+
     protected boolean isNetworkAvailable() {
         ConnectivityManager connectivityManager =
                 (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -127,10 +132,6 @@
         return PrivacyPreferencesManagerImplJni.get().isMetricsReportingDisabledByPolicy();
     }
 
-    public static void setInstanceForTesting(PrivacyPreferencesManagerImpl instance) {
-        sInstance = instance;
-    }
-
     @NativeMethods
     public interface Natives {
         boolean isMetricsReportingEnabled();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/signin/OWNERS
index 1c49383..cad3ddf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/OWNERS
@@ -1,2 +1,3 @@
 bsazonov@chromium.org
 aliceywang@chromium.org
+triploblastic@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
index e23e1c2..2cdf13c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
@@ -21,6 +21,8 @@
 import org.chromium.chrome.browser.feature_engagement.ScreenshotMonitorDelegate;
 import org.chromium.chrome.browser.feature_engagement.ScreenshotTabObserver;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureNotificationUtils;
+import org.chromium.chrome.browser.feature_guide.notifications.FeatureType;
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver;
@@ -36,7 +38,6 @@
 import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.user_education.IPHCommandBuilder;
 import org.chromium.chrome.browser.user_education.UserEducationHelper;
-import org.chromium.chrome.browser.video_tutorials.FeatureType;
 import org.chromium.chrome.browser.video_tutorials.VideoTutorialServiceFactory;
 import org.chromium.chrome.browser.video_tutorials.iph.VideoTutorialTryNowTracker;
 import org.chromium.components.feature_engagement.EventConstants;
@@ -130,9 +131,13 @@
                 tracker.notifyEvent(EventConstants.USER_HAS_SEEN_DINO);
             }
         }, /*swapCallback=*/null);
+
+        FeatureNotificationUtils.registerIPHCallback(
+                FeatureType.INCOGNITO_TAB, this::showIncognitoTabIPH);
     }
 
     public void destroy() {
+        FeatureNotificationUtils.unregisterIPHCallback(FeatureType.INCOGNITO_TAB);
         mPageLoadObserver.destroy();
         mLifecycleDispatcher.unregister(this);
     }
@@ -232,6 +237,20 @@
                         .build());
     }
 
+    private void showIncognitoTabIPH() {
+        mUserEducationHelper.requestShowIPH(
+                new IPHCommandBuilder(mActivity.getResources(),
+                        FeatureConstants
+                                .FEATURE_NOTIFICATION_GUIDE_INCOGNITO_TAB_HELP_BUBBLE_FEATURE,
+                        R.string.feature_notification_guide_tooltip_message_incognito_tab,
+                        R.string.feature_notification_guide_tooltip_message_incognito_tab)
+                        .setAnchorView(mMenuButtonAnchorView)
+                        .setOnShowCallback(
+                                () -> turnOnHighlightForMenuItem(R.id.new_incognito_tab_menu_id))
+                        .setOnDismissCallback(this::turnOffHighlightForMenuItem)
+                        .build());
+    }
+
     /**
      * Show the download page in-product-help bubble. Also used by download page screenshot IPH.
      * @param tab The current tab.
@@ -285,7 +304,8 @@
     /** Show the Try Now UI for video tutorial download feature. */
     private void showVideoTutorialTryNowUIForDownload() {
         VideoTutorialTryNowTracker tryNowTracker = VideoTutorialServiceFactory.getTryNowTracker();
-        if (!tryNowTracker.didClickTryNowButton(FeatureType.DOWNLOAD)) {
+        if (!tryNowTracker.didClickTryNowButton(
+                    org.chromium.chrome.browser.video_tutorials.FeatureType.DOWNLOAD)) {
             return;
         }
 
@@ -301,7 +321,8 @@
                         .setOnShowCallback(() -> turnOnHighlightForMenuItem(menuItemId))
                         .setOnDismissCallback(this::turnOffHighlightForMenuItem)
                         .build());
-        tryNowTracker.tryNowUIShown(FeatureType.DOWNLOAD);
+        tryNowTracker.tryNowUIShown(
+                org.chromium.chrome.browser.video_tutorials.FeatureType.DOWNLOAD);
     }
 
     private void turnOnHighlightForMenuItem(Integer highlightMenuItemId) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index 2733eb0..5b4c161d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -2558,24 +2558,6 @@
     }
 
     /**
-     * Tests a bunch of taps in a row.
-     * We've had reliability problems with a sequence of simple taps, due to async dissolving
-     * of selection bounds, so this helps prevent a regression with that.
-     */
-    @Test
-    @LargeTest
-    @Feature({"ContextualSearch"})
-    @FlakyTest(message = "crbug.com/1036414, crbug.com/1039488")
-    public void testTapALot() throws Exception {
-        FeatureList.setTestFeatures(ENABLE_NONE);
-
-        for (int i = 0; i < 50; i++) {
-            clickToTriggerPrefetch();
-            assertSearchTermRequested();
-        }
-    }
-
-    /**
      * Tests ContextualSearchManager#shouldInterceptNavigation for a case that an external
      * navigation has a user gesture.
      */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/TosAndUmaFirstRunFragmentWithEnterpriseSupportTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/TosAndUmaFirstRunFragmentWithEnterpriseSupportTest.java
index fe6e7142..6882b4f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/TosAndUmaFirstRunFragmentWithEnterpriseSupportTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/TosAndUmaFirstRunFragmentWithEnterpriseSupportTest.java
@@ -120,6 +120,8 @@
     public FirstRunUtils.Natives mFirstRunUtils;
     @Mock
     public EnterpriseInfo mMockEnterpriseInfo;
+    @Mock
+    private PrivacyPreferencesManagerImpl mPrivacyPreferencesManagerMock;
 
     @Spy
     public ChromeBrowserInitializer mInitializer;
@@ -281,8 +283,8 @@
 
     @Test
     @SmallTest
-    // TODO(crbug.com/1120859): Test the policy check when native initializes before inflation.
-    // This will be possible when FragmentScenario is available.
+    // TODO(https://crbug.com/1120859): Test the policy check when native initializes before
+    // inflation. This will be possible when FragmentScenario is available.
     public void testDialogEnabled() throws Exception {
         setAppRestrictionsMockInitialized(true);
         launchFirstRunThroughCustomTab();
@@ -367,7 +369,6 @@
         setEnterpriseInfoInitializedWithDeviceOwner(false);
 
         launchFirstRunThroughCustomTab();
-        assertUIState(FragmentState.NO_POLICY);
 
         assertHistograms(false, SpeedComparedToInflation.FASTER, SpeedComparedToInflation.FASTER,
                 SpeedComparedToInflation.NOT_RECORDED);
@@ -522,6 +523,7 @@
         assertUIState(FragmentState.LOADING);
 
         // Clear the focus on view to avoid unexpected highlight on background.
+        // @TODO(https://crbug.com/c/1289293): Background sometimes are highlighted in render tests.
         View tosAndUmaFragment =
                 mActivity.getSupportFragmentManager().getFragments().get(0).getView();
         Assert.assertNotNull(tosAndUmaFragment);
@@ -604,6 +606,76 @@
         renderWithPortraitAndLandscape(tosAndUmaFragment, "fre_tosanduma_withpolicy");
     }
 
+    @Test
+    @SmallTest
+    @Feature({"RenderTest", "FirstRun"})
+    public void testRenderWhenMetricsReportingAreDisabled() throws Exception {
+        setPolicyServiceMockInitializedWithDialogEnabled(true);
+        Mockito.when(mPrivacyPreferencesManagerMock.isMetricsReportingDisabledByPolicy())
+                .thenReturn(true);
+        PrivacyPreferencesManagerImpl.setInstanceForTesting(mPrivacyPreferencesManagerMock);
+
+        launchFirstRunThroughCustomTab();
+        assertUIState(FragmentState.LOADING);
+
+        // Clear the focus on view to avoid unexpected highlight on background.
+        View tosAndUmaFragment =
+                mActivity.getSupportFragmentManager().getFragments().get(0).getView();
+        Assert.assertNotNull(tosAndUmaFragment);
+        TestThreadUtils.runOnUiThreadBlocking(tosAndUmaFragment::clearFocus);
+
+        setAppRestrictionsMockInitialized(true);
+        renderWithPortraitAndLandscape(tosAndUmaFragment, "fre_metricsreportingdisabled");
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"RenderTest", "FirstRun"})
+    public void testRenderWhenMetricsReportingAreDisabledWithUmaDialog() throws Exception {
+        setPolicyServiceMockInitializedWithDialogEnabled(true);
+        Mockito.when(mPrivacyPreferencesManagerMock.isMetricsReportingDisabledByPolicy())
+                .thenReturn(true);
+        PrivacyPreferencesManagerImpl.setInstanceForTesting(mPrivacyPreferencesManagerMock);
+
+        FREMobileIdentityConsistencyFieldTrial.setFirstRunTrialGroupForTesting(
+                FREMobileIdentityConsistencyFieldTrial.OLD_FRE_WITH_UMA_DIALOG_GROUP);
+        launchFirstRunThroughCustomTab();
+        setAppRestrictionsMockInitialized(true);
+        // Clear the focus on view to avoid unexpected highlight on background.
+        View tosAndUmaFragment =
+                mActivity.getSupportFragmentManager().getFragments().get(0).getView();
+        Assert.assertNotNull(tosAndUmaFragment);
+        TestThreadUtils.runOnUiThreadBlocking(tosAndUmaFragment::clearFocus);
+
+        renderWithPortraitAndLandscape(tosAndUmaFragment, "fre_metricsreportingdisabled_umadialog");
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"RenderTest", "FirstRun"})
+    public void testRenderWhenMetricsReportingAreDisabledWithUmaDialogForChildAccount()
+            throws Exception {
+        setPolicyServiceMockInitializedWithDialogEnabled(true);
+        Mockito.when(mPrivacyPreferencesManagerMock.isMetricsReportingDisabledByPolicy())
+                .thenReturn(true);
+        PrivacyPreferencesManagerImpl.setInstanceForTesting(mPrivacyPreferencesManagerMock);
+
+        FREMobileIdentityConsistencyFieldTrial.setFirstRunTrialGroupForTesting(
+                FREMobileIdentityConsistencyFieldTrial.OLD_FRE_WITH_UMA_DIALOG_GROUP);
+        mAccountManagerTestRule.addAccount(
+                AccountManagerTestRule.generateChildEmail("account@gmail.com"));
+        launchFirstRunThroughCustomTab();
+        setAppRestrictionsMockInitialized(true);
+        // Clear the focus on view to avoid unexpected highlight on background.
+        View tosAndUmaFragment =
+                mActivity.getSupportFragmentManager().getFragments().get(0).getView();
+        Assert.assertNotNull(tosAndUmaFragment);
+        TestThreadUtils.runOnUiThreadBlocking(tosAndUmaFragment::clearFocus);
+
+        renderWithPortraitAndLandscape(
+                tosAndUmaFragment, "fre_metricsreportingdisabled_umadialog_childaccount");
+    }
+
     private void launchFirstRunThroughCustomTab() throws TimeoutException {
         launchFirstRunThroughCustomTabPreNative();
         startNativeInitializationAndWait();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java
index 94fc53be2..a5670dd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.UiThreadTest;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.tab.MockTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
@@ -47,6 +48,7 @@
     @SmallTest
     @UiThreadTest
     @Test
+    @DisabledTest(message = "https://crbug.com/1292239")
     public void testCacheCallbacks() throws InterruptedException {
         Tab tab = MockTab.createAndInitialize(1, false);
         tab.setIsTabSaveEnabled(true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetricsTest.java
index 01d0bcf..fb29f2d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetricsTest.java
@@ -27,7 +27,6 @@
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.UiThreadTest;
 import org.chromium.base.test.util.Batch;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.app.metrics.LaunchCauseMetrics;
 import org.chromium.chrome.browser.app.metrics.LaunchCauseMetrics.LaunchCause;
 import org.chromium.chrome.browser.browserservices.intents.WebappInfo;
@@ -73,7 +72,6 @@
     @Test
     @SmallTest
     @UiThreadTest
-    @DisabledTest(message = "https://crbug.com/1292239")
     public void testHomescreenLaunch() throws Throwable {
         int otherCount = histogramCountForValue(LaunchCause.WEBAPK_OTHER_DISTRIBUTOR);
         int chromeCount = histogramCountForValue(LaunchCause.WEBAPK_CHROME_DISTRIBUTOR);
@@ -111,7 +109,6 @@
     @Test
     @SmallTest
     @UiThreadTest
-    @DisabledTest(message = "https://crbug.com/1287572")
     public void testViewIntentLaunch() throws Throwable {
         int count = histogramCountForValue(LaunchCause.EXTERNAL_VIEW_INTENT);
         Mockito.when(mWebappInfo.isLaunchedFromHomescreen()).thenReturn(false);
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index 792ef8a5..b9171643 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -318,16 +318,17 @@
 #define IDC_CONTENT_CONTEXT_SELECTALL 50146
 #define IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE 50147
 #define IDC_CONTENT_CONTEXT_COPYLINKTOTEXT 50148
-#define IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT 50149
+#define IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT 50149
+#define IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT 50150
 // Other items.
-#define IDC_CONTENT_CONTEXT_TRANSLATE 50150
-#define IDC_CONTENT_CONTEXT_INSPECTELEMENT 50151
-#define IDC_CONTENT_CONTEXT_VIEWPAGEINFO 50152
-#define IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS 50153
-#define IDC_CONTENT_CONTEXT_LOOK_UP 50154
-#define IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS 50155
-#define IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION 50156
-#define IDC_CONTENT_CONTEXT_SPELLING_TOGGLE 50157
+#define IDC_CONTENT_CONTEXT_TRANSLATE 50151
+#define IDC_CONTENT_CONTEXT_INSPECTELEMENT 50152
+#define IDC_CONTENT_CONTEXT_VIEWPAGEINFO 50153
+#define IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS 50154
+#define IDC_CONTENT_CONTEXT_LOOK_UP 50155
+#define IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS 50156
+#define IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION 50157
+#define IDC_CONTENT_CONTEXT_SPELLING_TOGGLE 50158
 // A gap here. Feel free to insert new IDs.
 #define IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE 50161
 #define IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP 50162
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 74b3a4f..f4d85c78f 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -717,7 +717,19 @@
       InitializeOnMainThread();
 #endif
 
-  base::HangWatcher::InitializeOnMainThread();
+  // Initialize the HangWatcher.
+  base::HangWatcher::ProcessType hang_watcher_process_type;
+  if (process_type.empty()) {
+    hang_watcher_process_type = base::HangWatcher::ProcessType::kBrowserProcess;
+  } else if (process_type == switches::kGpuProcess) {
+    hang_watcher_process_type = base::HangWatcher::ProcessType::kGPUProcess;
+  } else if (process_type == switches::kRendererProcess) {
+    hang_watcher_process_type =
+        base::HangWatcher::ProcessType::kRendererProcess;
+  } else {
+    hang_watcher_process_type = base::HangWatcher::ProcessType::kUnknownProcess;
+  }
+  base::HangWatcher::InitializeOnMainThread(hang_watcher_process_type);
 
   base::internal::TimerBase::InitializeFeatures();
   base::sequence_manager::internal::SequenceManagerImpl::InitializeFeatures();
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 4199806..3c41f107 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -646,6 +646,10 @@
             Remove highlight
           </message>
 
+          <message name="IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT" desc="The name of the Reshare Copy Link to Highlight command in the content area context menu">
+            Copy link to highlight
+          </message>
+
           <message name="IDS_CONTENT_CONTEXT_SAVEIMAGEAS" desc="The name of the Save Image As command in the content area context menu">
             Sa&amp;ve image as...
           </message>
@@ -890,6 +894,10 @@
             Remove Highlight
           </message>
 
+          <message name="IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT" desc="In Title Case: The name of the Reshare Copy Link to Highlight command in the content area context menu">
+            Copy Link to Highlight
+          </message>
+
           <message name="IDS_CONTENT_CONTEXT_SAVEIMAGEAS" desc="In Title Case: The name of the Save Image As command in the content area context menu">
             Sa&amp;ve Image As...
           </message>
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT.png.sha1
new file mode 100644
index 0000000..8304717
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT.png.sha1
@@ -0,0 +1 @@
+b07452ad184f7e6c3b4440994d6d30d0269125b4
\ No newline at end of file
diff --git a/chrome/app/theme/chrome_unscaled_resources.grd b/chrome/app/theme/chrome_unscaled_resources.grd
index 22f351f..d0373c7 100644
--- a/chrome/app/theme/chrome_unscaled_resources.grd
+++ b/chrome/app/theme/chrome_unscaled_resources.grd
@@ -108,9 +108,8 @@
         <include name="IDR_LOGO_BOREALIS_DEFAULT_192" file="borealis/logo_borealis_default_192.png" type="BINDATA" />
         <!-- Crostini icons -->
         <include name="IDR_LOGO_CROSTINI_TERMINAL" file="crostini/ic_terminal_256.png" type="BINDATA" />
-        <include name="IDR_LOGO_CROSTINI_TERMINAL_SSH" file="crostini/terminal_ssh_256.png" type="BINDATA" />
         <include name="IDR_LOGO_CROSTINI_DEFAULT" file="crostini/ic_linux_256.png" type="BINDATA" />
-        <include name="IDR_CROSTINI_MASCOT" file="crostini/crostini_mascot_256.png" type="BINDATA" />
+        <include name="IDR_CROSTINI_ICON" file="crostini/ic_linux.svg" type="BINDATA" />
         <include name="IDR_LINUX_ILLUSTRATION" file="crostini/linux_illustration_2x.png" type="BINDATA" />
         <include name="IDR_LINUX_SUCCESS_ILLUSTRATION" file="crostini/linux_success_illustration.svg" type="BINDATA" />
         <!-- PluginVm icons -->
diff --git a/chrome/app/theme/crostini/crostini_mascot_256.png b/chrome/app/theme/crostini/crostini_mascot_256.png
deleted file mode 100644
index f8394d5..0000000
--- a/chrome/app/theme/crostini/crostini_mascot_256.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/crostini/ic_linux.svg b/chrome/app/theme/crostini/ic_linux.svg
new file mode 100644
index 0000000..f1aa836
--- /dev/null
+++ b/chrome/app/theme/crostini/ic_linux.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><mask id="a" width="30" height="30" x="1" y="1" mask-type="alpha" maskUnits="userSpaceOnUse"><circle cx="16" cy="16" r="14.67" fill="#1A73E8"/></mask><g mask="url(#a)"><path fill="#1A73E8" d="M0 0h32v32H0z"/><path fill="#fff" fill-rule="evenodd" d="M7.37 23.34c1.14-.73 1.99-1.8 1.91-3.17a5.26 5.26 0 0 0-.92-2.33c-.7-1.21-1.52-2.61-1.25-4.96a6.35 6.35 0 0 1 3.47-4.92 4.03 4.03 0 0 1 5.26 1.28.2.2 0 0 0 .32 0c1-1.5 3.13-2.35 5.26-1.28a6.35 6.35 0 0 1 3.47 4.92c.27 2.35-.54 3.75-1.25 4.96a5.3 5.3 0 0 0-.92 2.33c-.08 1.37.77 2.44 1.91 3.17a11.3 11.3 0 0 1-17.26 0Z" clip-rule="evenodd"/><path fill="#8AB4F8" fill-rule="evenodd" d="M4.05 24.51a14.65 14.65 0 0 0 23.9 0 8.1 8.1 0 0 1-3.32-1.17 11.3 11.3 0 0 1-17.26 0 8.1 8.1 0 0 1-3.31 1.17Z" clip-rule="evenodd"/><circle cx="20" cy="12.17" r="1" fill="#1A73E8"/><circle cx="12" cy="12.17" r="1" fill="#1A73E8"/><path fill="#1A73E8" d="M16.3 15.74c-.13.1-.3.1-.43 0l-1.49-1.23a.33.33 0 0 1 .21-.6h2.98c.32 0 .46.4.22.6l-1.5 1.23Z"/><path fill="#1A73E8" d="M15.88 12.82a.33.33 0 0 1 .4 0l1.43 1.08c.25.2.12.6-.2.6h-2.85a.33.33 0 0 1-.2-.6l1.42-1.08Z"/></g></svg>
\ No newline at end of file
diff --git a/chrome/app/theme/crostini/terminal_ssh_256.png b/chrome/app/theme/crostini/terminal_ssh_256.png
deleted file mode 100644
index e189c6e..0000000
--- a/chrome/app/theme/crostini/terminal_ssh_256.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/favicon_ntp.png b/chrome/app/theme/default_100_percent/common/favicon_ntp.png
index 981dbb33..0585f49 100644
--- a/chrome/app/theme/default_100_percent/common/favicon_ntp.png
+++ b/chrome/app/theme/default_100_percent/common/favicon_ntp.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/favicon_ntp.png b/chrome/app/theme/default_200_percent/common/favicon_ntp.png
index 1561a58..d2bf55c 100644
--- a/chrome/app/theme/default_200_percent/common/favicon_ntp.png
+++ b/chrome/app/theme/default_200_percent/common/favicon_ntp.png
Binary files differ
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 26aaa75..e0d03bf 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1258,6 +1258,8 @@
     "prefetch/no_state_prefetch/no_state_prefetch_tab_helper.h",
     "prefetch/pref_names.cc",
     "prefetch/pref_names.h",
+    "prefetch/prefetch_headers.cc",
+    "prefetch/prefetch_headers.h",
     "prefetch/prefetch_prefs.cc",
     "prefetch/prefetch_prefs.h",
     "prefetch/prefetch_proxy/chrome_speculation_host_delegate.cc",
@@ -2444,6 +2446,7 @@
       "//ash/webui/shortcut_customization_ui",
       "//chrome/app/theme:chrome_unscaled_resources_grit",
       "//chrome/browser/ash/system_extensions",
+      "//chrome/browser/ash/system_extensions/api/hid",
       "//chrome/browser/ash/system_extensions/api/window_management",
       "//chrome/browser/nearby_sharing/common",
       "//chrome/browser/policy:onc",
@@ -4441,6 +4444,7 @@
       "//chrome/browser/ui/webui/access_code_cast:mojo_bindings",
       "//chrome/browser/ui/webui/tab_strip:mojo_bindings",
       "//chrome/browser/web_applications",
+      "//chrome/browser/web_applications/adjustments",
       "//chrome/browser/web_applications/app_service",
       "//chrome/common/apps/platform_apps",
       "//chrome/common/cart:mojo_bindings",
@@ -4488,6 +4492,10 @@
 
       # TODO(crbug.com/1200215): Remove cycles and simplify all dependencies.
       "//chrome/browser/web_applications",
+
+      # TODO(crbug.com/1292435): Remove once AppServiceProxy is extracted from
+      # //chrome/browser.
+      "//chrome/browser/web_applications/adjustments",
       "//chrome/browser/web_applications/app_service",
     ]
 
@@ -4868,10 +4876,6 @@
       "support_tool/ash/ui_hierarchy_data_collector.h",
       "sync/desk_sync_service_factory.cc",
       "sync/desk_sync_service_factory.h",
-      "sync/sync_error_notifier_ash.cc",
-      "sync/sync_error_notifier_ash.h",
-      "sync/sync_error_notifier_factory_ash.cc",
-      "sync/sync_error_notifier_factory_ash.h",
       "sync/wifi_configuration_sync_service_factory.cc",
       "sync/wifi_configuration_sync_service_factory.h",
       "task_manager/providers/arc/arc_process_task.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index dc20797e..1dd1232 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -694,6 +694,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 const char kLacrosAvailabilityIgnoreInternalName[] =
     "lacros-availability-ignore";
+const char kLacrosOnlyInternalName[] = "lacros-only";
 const char kLacrosPrimaryInternalName[] = "lacros-primary";
 const char kLacrosSupportInternalName[] = "lacros-support";
 const char kLacrosStabilityInternalName[] = "lacros-stability";
@@ -3191,6 +3192,9 @@
     {kLacrosPrimaryInternalName, flag_descriptions::kLacrosPrimaryName,
      flag_descriptions::kLacrosPrimaryDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kLacrosPrimary)},
+    {kLacrosOnlyInternalName, flag_descriptions::kLacrosOnlyName,
+     flag_descriptions::kLacrosOnlyDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kLacrosOnly)},
     {kLacrosAvailabilityIgnoreInternalName,
      flag_descriptions::kLacrosAvailabilityIgnoreName,
      flag_descriptions::kLacrosAvailabilityIgnoreDescription, kOsCrOS,
@@ -3939,6 +3943,13 @@
      flag_descriptions::kFeatureNotificationGuideName,
      flag_descriptions::kFeatureNotificationGuideDescription, kOsAll,
      FEATURE_VALUE_TYPE(feature_guide::features::kFeatureNotificationGuide)},
+    {"feature-notification-guide-skip-check-for-low-engaged-users",
+     flag_descriptions::
+         kFeatureNotificationGuideSkipCheckForLowEngagedUsersName,
+     flag_descriptions::
+         kFeatureNotificationGuideSkipCheckForLowEngagedUsersDescription,
+     kOsAll,
+     FEATURE_VALUE_TYPE(feature_guide::features::kSkipCheckForLowEngagedUsers)},
     {"offline-pages-live-page-sharing",
      flag_descriptions::kOfflinePagesLivePageSharingName,
      flag_descriptions::kOfflinePagesLivePageSharingDescription, kOsAndroid,
@@ -5183,10 +5194,10 @@
      flag_descriptions::kEnableNetworkLoggingToFileDescription, kOsAll,
      SINGLE_VALUE_TYPE(network::switches::kLogNetLog)},
 
-    {"enable-web-authentication-cable-v2-support",
-     flag_descriptions::kEnableWebAuthenticationCableV2SupportName,
-     flag_descriptions::kEnableWebAuthenticationCableV2SupportDescription,
-     kOsDesktop, FEATURE_VALUE_TYPE(device::kWebAuthPhoneSupport)},
+    {"enable-web-authentication-cable-disco-creds",
+     flag_descriptions::kEnableWebAuthenticationCableDiscoCredsName,
+     flag_descriptions::kEnableWebAuthenticationCableDiscoCredsDescription,
+     kOsAll, FEATURE_VALUE_TYPE(device::kWebAuthCableDisco)},
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     {"enable-web-authentication-chromeos-authenticator",
@@ -5743,6 +5754,16 @@
      flag_descriptions::kAllowTouchpadHapticClickSettingsDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(features::kAllowTouchpadHapticClickSettings)},
 
+    {"enable-neural-palm-adaptive-hold",
+     flag_descriptions::kEnableNeuralPalmAdaptiveHoldName,
+     flag_descriptions::kEnableNeuralPalmAdaptiveHoldDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ui::kEnableNeuralPalmAdaptiveHold)},
+
+    {"enable-neural-palm-rejection-model-v2",
+     flag_descriptions::kEnableNeuralPalmRejectionModelV2Name,
+     flag_descriptions::kEnableNeuralPalmRejectionModelV2Description, kOsCrOS,
+     FEATURE_VALUE_TYPE(ui::kEnableNeuralPalmRejectionModelV2)},
+
     {"enable-neural-stylus-palm-rejection",
      flag_descriptions::kEnableNeuralStylusPalmRejectionName,
      flag_descriptions::kEnableNeuralStylusPalmRejectionDescription, kOsCrOS,
@@ -7850,6 +7871,16 @@
      flag_descriptions::kTailoredSecurityIntegrationDescription, kOsAll,
      FEATURE_VALUE_TYPE(safe_browsing::kTailoredSecurityIntegration)},
 
+    {"autofill-enable-virtual-card-management-in-desktop-settings-page",
+     flag_descriptions::
+         kAutofillEnableVirtualCardManagementInDesktopSettingsPageName,
+     flag_descriptions::
+         kAutofillEnableVirtualCardManagementInDesktopSettingsPageDescription,
+     kOsDesktop,
+     FEATURE_VALUE_TYPE(
+         autofill::features::
+             kAutofillEnableVirtualCardManagementInDesktopSettingsPage)},
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
@@ -7923,6 +7954,10 @@
     return !crosapi::browser_util::IsLacrosAllowedToBeEnabled(channel);
   }
 
+  if (!strcmp(kLacrosOnlyInternalName, entry.internal_name)) {
+    return !crosapi::browser_util::IsLacrosOnlyFlagAllowed(channel);
+  }
+
   if (!strcmp(kLacrosPrimaryInternalName, entry.internal_name)) {
     return !crosapi::browser_util::IsLacrosPrimaryFlagAllowed(channel);
   }
diff --git a/chrome/browser/android/signin/OWNERS b/chrome/browser/android/signin/OWNERS
index 1c49383..cad3ddf 100644
--- a/chrome/browser/android/signin/OWNERS
+++ b/chrome/browser/android/signin/OWNERS
@@ -1,2 +1,3 @@
 bsazonov@chromium.org
 aliceywang@chromium.org
+triploblastic@chromium.org
diff --git a/chrome/browser/apps/app_service/browser_app_launcher.cc b/chrome/browser/apps/app_service/browser_app_launcher.cc
index 863e386..a5241d9 100644
--- a/chrome/browser/apps/app_service/browser_app_launcher.cc
+++ b/chrome/browser/apps/app_service/browser_app_launcher.cc
@@ -122,13 +122,13 @@
 
 BrowserAppLauncher::~BrowserAppLauncher() = default;
 
-// TODO(crbug.com/1244506): Make this interface only work for non-ChromeOS
-// platform after the clean up.
+#if !BUILDFLAG(IS_CHROMEOS)
 content::WebContents* BrowserAppLauncher::LaunchAppWithParams(
     AppLaunchParams params) {
   return LaunchAppWithParamsImpl(std::move(params), profile_,
                                  &web_app_launch_manager_);
 }
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 content::WebContents* BrowserAppLauncher::LaunchAppWithParamsForTesting(
     AppLaunchParams params) {
diff --git a/chrome/browser/apps/app_service/browser_app_launcher.h b/chrome/browser/apps/app_service/browser_app_launcher.h
index 8d045019..00628bfb 100644
--- a/chrome/browser/apps/app_service/browser_app_launcher.h
+++ b/chrome/browser/apps/app_service/browser_app_launcher.h
@@ -48,8 +48,14 @@
   BrowserAppLauncher(const BrowserAppLauncher&) = delete;
   BrowserAppLauncher& operator=(const BrowserAppLauncher&) = delete;
 
+#if !BUILDFLAG(IS_CHROMEOS)
   // Launches an app for the given `app_id` in a way specified by `params`.
+  //
+  // This interface is deprecated, please use
+  // AppServiceProxy::LaunchAppWithParams() in the future.
+  // TODO(crbug.com/1244506): Remove this interface in non-chrome OS platform.
   content::WebContents* LaunchAppWithParams(AppLaunchParams params);
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
   // Launches an app for the given `app_id` in a way specified by `params`. This
   // interface should only be used in testing code where reqired a sync launch
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index deb137e..0e9764e4 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -5172,3 +5172,138 @@
   EXPECT_EQ(false, content::EvalJs(guest, "!!chrome.webstorePrivate"));
   EXPECT_EQ(false, content::EvalJs(guest, "!!chrome.dashboardPrivate"));
 }
+
+// This is a base class for tests that enable site isolation in <webview>
+// guests.
+class SitePerProcessWebViewTest : public WebViewTest {
+ public:
+  SitePerProcessWebViewTest() = default;
+  ~SitePerProcessWebViewTest() override = default;
+  SitePerProcessWebViewTest(const SitePerProcessWebViewTest&) = delete;
+  SitePerProcessWebViewTest& operator=(const SitePerProcessWebViewTest&) =
+      delete;
+
+  void SetUp() override {
+    feature_list_.InitAndEnableFeature(features::kSiteIsolationForGuests);
+    WebViewTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Checks basic site isolation properties when a <webview> main frame and
+// subframe navigate cross-site.
+IN_PROC_BROWSER_TEST_F(SitePerProcessWebViewTest, SimpleNavigations) {
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Load an app with a <webview> guest that starts at a data: URL.
+  LoadAppWithGuest("web_view/simple");
+  content::WebContents* guest = GetGuestWebContents();
+  ASSERT_TRUE(guest);
+
+  // Ensure the <webview>'s SiteInstance is for a guest.
+  content::RenderFrameHost* main_frame = guest->GetMainFrame();
+  auto original_id = main_frame->GetGlobalId();
+  scoped_refptr<content::SiteInstance> starting_instance =
+      main_frame->GetSiteInstance();
+  EXPECT_TRUE(starting_instance->IsGuest());
+  EXPECT_TRUE(starting_instance->GetProcess()->IsForGuestsOnly());
+  EXPECT_FALSE(starting_instance->GetStoragePartitionConfig().is_default());
+
+  // Navigate <webview> to a cross-site page with a same-site iframe.
+  const GURL start_url =
+      embedded_test_server()->GetURL("a.test", "/iframe.html");
+  {
+    content::TestNavigationObserver load_observer(guest);
+    EXPECT_TRUE(
+        ExecuteScript(guest, "location.href = '" + start_url.spec() + "';"));
+    load_observer.Wait();
+  }
+
+  // Expect that the main frame swapped SiteInstances and RenderFrameHosts but
+  // stayed in the same BrowsingInstance and StoragePartition.
+  main_frame = guest->GetMainFrame();
+  EXPECT_TRUE(main_frame->GetSiteInstance()->IsGuest());
+  EXPECT_TRUE(main_frame->GetProcess()->IsForGuestsOnly());
+  EXPECT_NE(main_frame->GetGlobalId(), original_id);
+  EXPECT_NE(starting_instance, main_frame->GetSiteInstance());
+  EXPECT_TRUE(
+      starting_instance->IsRelatedSiteInstance(main_frame->GetSiteInstance()));
+  EXPECT_EQ(starting_instance->GetStoragePartitionConfig(),
+            main_frame->GetSiteInstance()->GetStoragePartitionConfig());
+  EXPECT_EQ(starting_instance->GetProcess()->GetStoragePartition(),
+            main_frame->GetProcess()->GetStoragePartition());
+
+  // Ensure the guest SiteInstance reflects the proper site and actually uses
+  // site isolation.
+  EXPECT_EQ("http://a.test/",
+            main_frame->GetSiteInstance()->GetSiteURL().spec());
+  EXPECT_TRUE(main_frame->GetSiteInstance()->RequiresDedicatedProcess());
+  EXPECT_TRUE(main_frame->GetProcess()->IsProcessLockedToSiteForTesting());
+
+  // Navigate <webview> subframe cross-site.  Check that it ends up in a
+  // separate guest SiteInstance and process, but same StoragePartition.
+  const GURL frame_url =
+      embedded_test_server()->GetURL("b.test", "/title1.html");
+  EXPECT_TRUE(NavigateIframeToURL(guest, "test", frame_url));
+  content::RenderFrameHost* subframe = content::ChildFrameAt(main_frame, 0);
+
+  EXPECT_NE(main_frame->GetSiteInstance(), subframe->GetSiteInstance());
+  EXPECT_NE(main_frame->GetProcess(), subframe->GetProcess());
+  EXPECT_TRUE(subframe->GetSiteInstance()->IsGuest());
+  EXPECT_TRUE(subframe->GetProcess()->IsForGuestsOnly());
+  EXPECT_TRUE(main_frame->GetSiteInstance()->IsRelatedSiteInstance(
+      subframe->GetSiteInstance()));
+  EXPECT_EQ(subframe->GetSiteInstance()->GetStoragePartitionConfig(),
+            main_frame->GetSiteInstance()->GetStoragePartitionConfig());
+  EXPECT_EQ(subframe->GetProcess()->GetStoragePartition(),
+            main_frame->GetProcess()->GetStoragePartition());
+  EXPECT_EQ("http://b.test/", subframe->GetSiteInstance()->GetSiteURL().spec());
+  EXPECT_TRUE(subframe->GetSiteInstance()->RequiresDedicatedProcess());
+  EXPECT_TRUE(subframe->GetProcess()->IsProcessLockedToSiteForTesting());
+}
+
+// Checks that a main frame navigation in a <webview> can swap
+// BrowsingInstances while staying in the same StoragePartition.
+IN_PROC_BROWSER_TEST_F(SitePerProcessWebViewTest, BrowsingInstanceSwap) {
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Load an app with a <webview> guest that starts at a data: URL.
+  LoadAppWithGuest("web_view/simple");
+  content::WebContents* guest = GetGuestWebContents();
+  ASSERT_TRUE(guest);
+
+  // Navigate <webview> to a page on a.test.
+  const GURL first_url =
+      embedded_test_server()->GetURL("a.test", "/iframe.html");
+  {
+    content::TestNavigationObserver load_observer(guest);
+    EXPECT_TRUE(
+        ExecuteScript(guest, "location.href = '" + first_url.spec() + "';"));
+    load_observer.Wait();
+  }
+  scoped_refptr<content::SiteInstance> first_instance =
+      guest->GetMainFrame()->GetSiteInstance();
+  EXPECT_TRUE(first_instance->IsGuest());
+  EXPECT_TRUE(first_instance->GetProcess()->IsForGuestsOnly());
+
+  // Navigate <webview> to a cross-site page and use a browser-initiated
+  // navigation to force a BrowsingInstance swap.
+  const GURL second_url =
+      embedded_test_server()->GetURL("b.test", "/title1.html");
+  EXPECT_TRUE(NavigateToURL(guest, second_url));
+  scoped_refptr<content::SiteInstance> second_instance =
+      guest->GetMainFrame()->GetSiteInstance();
+
+  // Ensure that a new unrelated guest SiteInstance was created, and that the
+  // StoragePartition didn't change.
+  EXPECT_TRUE(second_instance->IsGuest());
+  EXPECT_TRUE(second_instance->GetProcess()->IsForGuestsOnly());
+  EXPECT_NE(first_instance, second_instance);
+  EXPECT_FALSE(first_instance->IsRelatedSiteInstance(second_instance.get()));
+  EXPECT_EQ(first_instance->GetStoragePartitionConfig(),
+            second_instance->GetStoragePartitionConfig());
+  EXPECT_EQ(first_instance->GetProcess()->GetStoragePartition(),
+            second_instance->GetProcess()->GetStoragePartition());
+}
diff --git a/chrome/browser/apps/icon_standardizer.cc b/chrome/browser/apps/icon_standardizer.cc
index 4c46b97..fd4b4ee2 100644
--- a/chrome/browser/apps/icon_standardizer.cc
+++ b/chrome/browser/apps/icon_standardizer.cc
@@ -140,102 +140,126 @@
   return (max_distance == -1.0f) ? (sqrt(width * width * 2)) : max_distance;
 }
 
-// Returns whether the shape of the icon is roughly circle shaped.
-bool IsIconCircleShaped(const gfx::ImageSkia& image) {
-  bool is_icon_already_circle_shaped = false;
+bool IsIconRepCircleShaped(const gfx::ImageSkiaRep& rep) {
+  SkBitmap bitmap(rep.GetBitmap());
+  int width = bitmap.width();
+  int height = bitmap.height();
 
-  for (gfx::ImageSkiaRep rep : image.image_reps()) {
-    SkBitmap bitmap(rep.GetBitmap());
-    int width = bitmap.width();
-    int height = bitmap.height();
+  SkBitmap preview;
+  preview.allocN32Pixels(width, height);
+  preview.eraseColor(SK_ColorTRANSPARENT);
 
-    SkBitmap preview;
-    preview.allocN32Pixels(width, height);
-    preview.eraseColor(SK_ColorTRANSPARENT);
+  // |preview| will be the original icon with all visible pixels colored red.
+  for (int y = 0; y < height; y++) {
+    const SkColor* src_color =
+        reinterpret_cast<SkColor*>(bitmap.getAddr32(0, y));
+    SkColor* preview_color =
+        reinterpret_cast<SkColor*>(preview.getAddr32(0, y));
 
-    // |preview| will be the original icon with all visible pixels colored red.
-    for (int y = 0; y < height; y++) {
-      const SkColor* src_color =
-          reinterpret_cast<SkColor*>(bitmap.getAddr32(0, y));
-      SkColor* preview_color =
-          reinterpret_cast<SkColor*>(preview.getAddr32(0, y));
+    for (int x = 0; x < width; x++) {
+      SkColor target_color;
 
-      for (int x = 0; x < width; x++) {
-        SkColor target_color;
-
-        if (SkColorGetA(src_color[x]) < 1) {
-          target_color = SK_ColorTRANSPARENT;
-        } else {
-          target_color = SK_ColorRED;
-        }
-
-        preview_color[x] = target_color;
+      if (SkColorGetA(src_color[x]) < 1) {
+        target_color = SK_ColorTRANSPARENT;
+      } else {
+        target_color = SK_ColorRED;
       }
+
+      preview_color[x] = target_color;
     }
-
-    gfx::Rect visible_preview_bounds = GetVisibleIconBounds(preview);
-
-    float visible_icon_size_ratio =
-        static_cast<float>(visible_preview_bounds.width()) /
-        static_cast<float>(width);
-    // If the visible icon is too small then it should not be considered
-    // circular.
-    if (visible_icon_size_ratio < kMinimumVisibleCircularIconSizeRatio)
-      return false;
-
-    // Use a canvas to perform XOR and DST_OUT operations, which should
-    // generate a transparent bitmap for |preview| if the original icon is
-    // shaped like a circle.
-    SkCanvas canvas(preview);
-    SkPaint paint_circle_mask;
-    paint_circle_mask.setColor(SK_ColorBLUE);
-    paint_circle_mask.setStyle(SkPaint::kFill_Style);
-    paint_circle_mask.setAntiAlias(true);
-
-    // XOR operation to remove a circle.
-    paint_circle_mask.setBlendMode(SkBlendMode::kXor);
-    canvas.drawCircle(SkPoint::Make(width / 2.0f, height / 2.0f),
-                      visible_preview_bounds.width() / 2.0f, paint_circle_mask);
-
-    SkPaint paint_outline;
-    paint_outline.setColor(SK_ColorGREEN);
-    paint_outline.setStyle(SkPaint::kStroke_Style);
-
-    const float outline_stroke_width =
-        visible_preview_bounds.width() * kCircleOutlineStrokeWidthRatio;
-    const float radius_offset = outline_stroke_width / 8.0f;
-
-    paint_outline.setStrokeWidth(outline_stroke_width);
-    paint_outline.setAntiAlias(true);
-
-    // DST_OUT operation to remove an extra circle outline.
-    paint_outline.setBlendMode(SkBlendMode::kDstOut);
-    canvas.drawCircle(SkPoint::Make(width / 2.0f, height / 2.0f),
-                      visible_preview_bounds.width() / 2.0f + radius_offset,
-                      paint_outline);
-
-    // Compute the total pixel difference between the circle mask and the
-    // original icon.
-    int total_pixel_difference = 0;
-    for (int y = 0; y < preview.height(); ++y) {
-      SkColor* src_color = reinterpret_cast<SkColor*>(preview.getAddr32(0, y));
-      for (int x = 0; x < preview.width(); ++x) {
-        if (SkColorGetA(src_color[x]) >= kMinimumVisibleAlpha)
-          total_pixel_difference++;
-      }
-    }
-
-    float percentage_diff_pixels =
-        static_cast<float>(total_pixel_difference) /
-        (visible_preview_bounds.width() * visible_preview_bounds.height());
-
-    // If the pixel difference between a circle and the original icon is small
-    // enough, then the icon can be considered circle shaped.
-    if (percentage_diff_pixels < kCircleShapePixelDifferenceThreshold)
-      is_icon_already_circle_shaped = true;
   }
 
-  return is_icon_already_circle_shaped;
+  gfx::Rect visible_preview_bounds = GetVisibleIconBounds(preview);
+
+  float visible_icon_size_ratio =
+      static_cast<float>(visible_preview_bounds.width()) /
+      static_cast<float>(width);
+  // If the visible icon is too small then it should not be considered
+  // circular.
+  if (visible_icon_size_ratio < kMinimumVisibleCircularIconSizeRatio)
+    return false;
+
+  // Use a canvas to perform XOR and DST_OUT operations, which should
+  // generate a transparent bitmap for |preview| if the original icon is
+  // shaped like a circle.
+  SkCanvas canvas(preview);
+  SkPaint paint_circle_mask;
+  paint_circle_mask.setColor(SK_ColorBLUE);
+  paint_circle_mask.setStyle(SkPaint::kFill_Style);
+  paint_circle_mask.setAntiAlias(true);
+
+  // XOR operation to remove a circle.
+  paint_circle_mask.setBlendMode(SkBlendMode::kXor);
+  canvas.drawCircle(SkPoint::Make(width / 2.0f, height / 2.0f),
+                    visible_preview_bounds.width() / 2.0f, paint_circle_mask);
+
+  SkPaint paint_outline;
+  paint_outline.setColor(SK_ColorGREEN);
+  paint_outline.setStyle(SkPaint::kStroke_Style);
+
+  const float outline_stroke_width =
+      visible_preview_bounds.width() * kCircleOutlineStrokeWidthRatio;
+  const float radius_offset = outline_stroke_width / 8.0f;
+
+  paint_outline.setStrokeWidth(outline_stroke_width);
+  paint_outline.setAntiAlias(true);
+
+  // DST_OUT operation to remove an extra circle outline.
+  paint_outline.setBlendMode(SkBlendMode::kDstOut);
+  canvas.drawCircle(SkPoint::Make(width / 2.0f, height / 2.0f),
+                    visible_preview_bounds.width() / 2.0f + radius_offset,
+                    paint_outline);
+
+  // Compute the total pixel difference between the circle mask and the
+  // original icon.
+  int total_pixel_difference = 0;
+  for (int y = 0; y < preview.height(); ++y) {
+    SkColor* src_color = reinterpret_cast<SkColor*>(preview.getAddr32(0, y));
+    for (int x = 0; x < preview.width(); ++x) {
+      if (SkColorGetA(src_color[x]) >= kMinimumVisibleAlpha)
+        total_pixel_difference++;
+    }
+  }
+
+  float percentage_diff_pixels =
+      static_cast<float>(total_pixel_difference) /
+      (visible_preview_bounds.width() * visible_preview_bounds.height());
+
+  // If the pixel difference between a circle and the original icon is small
+  // enough, then the icon can be considered circle shaped.
+  return (percentage_diff_pixels < kCircleShapePixelDifferenceThreshold);
+}
+
+// Returns whether the shape of the icon is roughly circle shaped.
+bool IsIconCircleShaped(const gfx::ImageSkia& image) {
+  for (gfx::ImageSkiaRep rep : image.image_reps()) {
+    if (IsIconRepCircleShaped(rep))
+      return true;
+  }
+  return false;
+}
+
+absl::optional<gfx::ImageSkiaRep> StandardizeSizeOfImageRep(
+    const gfx::ImageSkiaRep& rep,
+    float scale) {
+  SkBitmap unscaled_bitmap(rep.GetBitmap());
+  int width = unscaled_bitmap.width();
+  int height = unscaled_bitmap.height();
+
+  if (width == height)
+    return absl::nullopt;
+
+  int longest_side = std::max(width, height);
+
+  SkBitmap final_bitmap;
+  final_bitmap.allocN32Pixels(longest_side, longest_side);
+  final_bitmap.eraseColor(SK_ColorTRANSPARENT);
+
+  SkCanvas canvas(final_bitmap);
+  canvas.drawImage(unscaled_bitmap.asImage(), (longest_side - width) / 2,
+                   (longest_side - height) / 2);
+
+  return gfx::ImageSkiaRep(final_bitmap, scale);
 }
 
 // Returns an image with equal width and height. If necessary, padding is
@@ -244,24 +268,12 @@
   gfx::ImageSkia final_image;
 
   for (gfx::ImageSkiaRep rep : image.image_reps()) {
-    SkBitmap unscaled_bitmap(rep.GetBitmap());
-    int width = unscaled_bitmap.width();
-    int height = unscaled_bitmap.height();
-
-    if (width == height)
+    absl::optional<gfx::ImageSkiaRep> new_rep =
+        StandardizeSizeOfImageRep(rep, rep.scale());
+    if (!new_rep)
       return image;
 
-    int longest_side = std::max(width, height);
-
-    SkBitmap final_bitmap;
-    final_bitmap.allocN32Pixels(longest_side, longest_side);
-    final_bitmap.eraseColor(SK_ColorTRANSPARENT);
-
-    SkCanvas canvas(final_bitmap);
-    canvas.drawImage(unscaled_bitmap.asImage(), (longest_side - width) / 2,
-                     (longest_side - height) / 2);
-
-    final_image.AddRepresentation(gfx::ImageSkiaRep(final_bitmap, rep.scale()));
+    final_image.AddRepresentation(new_rep.value());
   }
 
   return final_image;
@@ -269,117 +281,117 @@
 
 }  // namespace
 
-gfx::ImageSkia CreateStandardIconImage(const gfx::ImageSkia& image) {
-  gfx::ImageSkia final_image;
-  gfx::ImageSkia standard_size_image = apps::StandardizeSize(image);
+absl::optional<gfx::ImageSkiaRep> CreateStandardIconImageRep(
+    const gfx::ImageSkiaRep& base_rep,
+    float scale) {
+  absl::optional<gfx::ImageSkiaRep> resized_image_skia_rep =
+      StandardizeSizeOfImageRep(base_rep, scale);
+  const gfx::ImageSkiaRep& standard_size_rep =
+      resized_image_skia_rep.value_or(base_rep);
+
+  SkBitmap unscaled_bitmap(standard_size_rep.GetBitmap());
+  int width = unscaled_bitmap.width();
+  int height = unscaled_bitmap.height();
 
   // If icon is already circle shaped, then return the original image and make
   // sure the image is scaled down if its icon size takes up too much space
   // within the bitmap.
-  if (IsIconCircleShaped(standard_size_image)) {
-    for (gfx::ImageSkiaRep rep : standard_size_image.image_reps()) {
-      SkBitmap unscaled_bitmap(rep.GetBitmap());
-      int width = unscaled_bitmap.width();
-      int height = unscaled_bitmap.height();
+  if (IsIconRepCircleShaped(standard_size_rep)) {
+    float dis_to_center = GetFarthestVisiblePointFromCenter(unscaled_bitmap);
+    float icon_to_bitmap_size_ratio = dis_to_center * 2.0f / width;
 
-      SkBitmap final_bitmap;
-      final_bitmap.allocN32Pixels(width, height);
-      final_bitmap.eraseColor(SK_ColorTRANSPARENT);
-
-      float dis_to_center = GetFarthestVisiblePointFromCenter(unscaled_bitmap);
-      float icon_to_bitmap_size_ratio = dis_to_center * 2.0f / width;
-
-      if (icon_to_bitmap_size_ratio > kBackgroundCircleScale) {
-        SkCanvas canvas(final_bitmap);
-        SkPaint paint_icon;
-        paint_icon.setMaskFilter(nullptr);
-        paint_icon.setBlendMode(SkBlendMode::kSrcOver);
-
-        float icon_scale = kBackgroundCircleScale / icon_to_bitmap_size_ratio;
-
-        gfx::Size scaled_icon_size =
-            gfx::ScaleToRoundedSize(rep.pixel_size(), icon_scale);
-        const SkBitmap scaled_bitmap = skia::ImageOperations::Resize(
-            unscaled_bitmap, skia::ImageOperations::RESIZE_BEST,
-            scaled_icon_size.width(), scaled_icon_size.height());
-
-        int target_left = (width - scaled_icon_size.width()) / 2;
-        int target_top = (height - scaled_icon_size.height()) / 2;
-
-        // Draw the scaled down bitmap and add that to the final image.
-        canvas.drawImage(scaled_bitmap.asImage(), target_left, target_top,
-                         SkSamplingOptions(), &paint_icon);
-        final_image.AddRepresentation(
-            gfx::ImageSkiaRep(final_bitmap, rep.scale()));
-      } else {
-        // No need to scale down the icon, so just use the |unscaled_bitmap|.
-        final_image.AddRepresentation(
-            gfx::ImageSkiaRep(unscaled_bitmap, rep.scale()));
-      }
+    if (icon_to_bitmap_size_ratio <= kBackgroundCircleScale) {
+      // No need to scale down the icon, so just use the |unscaled_bitmap|.
+      return absl::nullopt;
     }
-
-    return final_image;
-  }
-
-  for (gfx::ImageSkiaRep rep : standard_size_image.image_reps()) {
-    SkBitmap unscaled_bitmap(rep.GetBitmap());
-    int width = unscaled_bitmap.width();
-    int height = unscaled_bitmap.height();
-
     SkBitmap final_bitmap;
     final_bitmap.allocN32Pixels(width, height);
     final_bitmap.eraseColor(SK_ColorTRANSPARENT);
-
-    // To draw to |final_bitmap|, create a canvas and draw a circle background
-    // with an app icon on top;
     SkCanvas canvas(final_bitmap);
-    SkPaint paint_background_circle;
-    paint_background_circle.setAntiAlias(true);
-    paint_background_circle.setColor(SK_ColorWHITE);
-    paint_background_circle.setStyle(SkPaint::kFill_Style);
-
-    float circle_diameter = width * kBackgroundCircleScale;
-
-    // Draw the background circle.
-    canvas.drawCircle(SkPoint::Make((width - 1) / 2.0f, (height - 1) / 2.0f),
-                      circle_diameter / 2.0f, paint_background_circle);
-
-    float dis_to_center = GetFarthestVisiblePointFromCenter(unscaled_bitmap);
-    float icon_diameter = dis_to_center * 2.0f;
-    float target_diameter = circle_diameter * kIconScaleToFit;
-
-    // If the icon is too big to fit correctly within the background circle,
-    // then set |icon_scale| to fit.
-    float icon_scale = (icon_diameter > target_diameter)
-                           ? target_diameter / icon_diameter
-                           : 1.0f;
-
     SkPaint paint_icon;
     paint_icon.setMaskFilter(nullptr);
     paint_icon.setBlendMode(SkBlendMode::kSrcOver);
 
-    if (icon_scale == 1.0f) {
-      // Draw the unscaled icon on top of the background.
-      canvas.drawImage(unscaled_bitmap.asImage(), 0, 0, SkSamplingOptions(),
-                       &paint_icon);
-    } else {
-      gfx::Size scaled_icon_size =
-          gfx::ScaleToRoundedSize(rep.pixel_size(), icon_scale);
-      const SkBitmap scaled_bitmap = skia::ImageOperations::Resize(
-          unscaled_bitmap, skia::ImageOperations::RESIZE_BEST,
-          scaled_icon_size.width(), scaled_icon_size.height());
+    float icon_scale = kBackgroundCircleScale / icon_to_bitmap_size_ratio;
 
-      int target_left = (width - scaled_icon_size.width()) / 2;
-      int target_top = (height - scaled_icon_size.height()) / 2;
+    gfx::Size scaled_icon_size =
+        gfx::ScaleToRoundedSize(standard_size_rep.pixel_size(), icon_scale);
+    const SkBitmap scaled_bitmap = skia::ImageOperations::Resize(
+        unscaled_bitmap, skia::ImageOperations::RESIZE_BEST,
+        scaled_icon_size.width(), scaled_icon_size.height());
 
-      // Draw the scaled icon on top of the background.
-      canvas.drawImage(scaled_bitmap.asImage(), target_left, target_top,
-                       SkSamplingOptions(), &paint_icon);
-    }
+    int target_left = (width - scaled_icon_size.width()) / 2;
+    int target_top = (height - scaled_icon_size.height()) / 2;
 
-    final_image.AddRepresentation(gfx::ImageSkiaRep(final_bitmap, rep.scale()));
+    // Draw the scaled down bitmap and add that to the final image.
+    canvas.drawImage(scaled_bitmap.asImage(), target_left, target_top,
+                     SkSamplingOptions(), &paint_icon);
+    return gfx::ImageSkiaRep(final_bitmap, scale);
   }
 
+  SkBitmap final_bitmap;
+  final_bitmap.allocN32Pixels(width, height);
+  final_bitmap.eraseColor(SK_ColorTRANSPARENT);
+
+  // To draw to |final_bitmap|, create a canvas and draw a circle background
+  // with an app icon on top;
+  SkCanvas canvas(final_bitmap);
+  SkPaint paint_background_circle;
+  paint_background_circle.setAntiAlias(true);
+  paint_background_circle.setColor(SK_ColorWHITE);
+  paint_background_circle.setStyle(SkPaint::kFill_Style);
+
+  float circle_diameter = width * kBackgroundCircleScale;
+
+  // Draw the background circle.
+  canvas.drawCircle(SkPoint::Make((width - 1) / 2.0f, (height - 1) / 2.0f),
+                    circle_diameter / 2.0f, paint_background_circle);
+
+  float dis_to_center = GetFarthestVisiblePointFromCenter(unscaled_bitmap);
+  float icon_diameter = dis_to_center * 2.0f;
+  float target_diameter = circle_diameter * kIconScaleToFit;
+
+  // If the icon is too big to fit correctly within the background circle,
+  // then set |icon_scale| to fit.
+  float icon_scale = (icon_diameter > target_diameter)
+                         ? target_diameter / icon_diameter
+                         : 1.0f;
+
+  SkPaint paint_icon;
+  paint_icon.setMaskFilter(nullptr);
+  paint_icon.setBlendMode(SkBlendMode::kSrcOver);
+
+  if (icon_scale == 1.0f) {
+    // Draw the unscaled icon on top of the background.
+    canvas.drawImage(unscaled_bitmap.asImage(), 0, 0, SkSamplingOptions(),
+                     &paint_icon);
+  } else {
+    gfx::Size scaled_icon_size =
+        gfx::ScaleToRoundedSize(standard_size_rep.pixel_size(), icon_scale);
+    const SkBitmap scaled_bitmap = skia::ImageOperations::Resize(
+        unscaled_bitmap, skia::ImageOperations::RESIZE_BEST,
+        scaled_icon_size.width(), scaled_icon_size.height());
+
+    int target_left = (width - scaled_icon_size.width()) / 2;
+    int target_top = (height - scaled_icon_size.height()) / 2;
+
+    // Draw the scaled icon on top of the background.
+    canvas.drawImage(scaled_bitmap.asImage(), target_left, target_top,
+                     SkSamplingOptions(), &paint_icon);
+  }
+
+  return gfx::ImageSkiaRep(final_bitmap, scale);
+}
+
+gfx::ImageSkia CreateStandardIconImage(const gfx::ImageSkia& image) {
+  gfx::ImageSkia final_image;
+  gfx::ImageSkia standard_size_image = StandardizeSize(image);
+
+  for (gfx::ImageSkiaRep rep : standard_size_image.image_reps()) {
+    absl::optional<gfx::ImageSkiaRep> standard_rep =
+        CreateStandardIconImageRep(rep, rep.scale());
+    final_image.AddRepresentation(standard_rep.value_or(rep));
+  }
   return final_image;
 }
 
diff --git a/chrome/browser/apps/icon_standardizer.h b/chrome/browser/apps/icon_standardizer.h
index 4ea8d19..c96e2d5 100644
--- a/chrome/browser/apps/icon_standardizer.h
+++ b/chrome/browser/apps/icon_standardizer.h
@@ -5,12 +5,14 @@
 #ifndef CHROME_BROWSER_APPS_ICON_STANDARDIZER_H_
 #define CHROME_BROWSER_APPS_ICON_STANDARDIZER_H_
 
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
 namespace gfx {
 class ImageSkia;
+class ImageSkiaRep;
 }  // namespace gfx
 
 namespace apps {
-
 // Takes an icon image and returns a standardized version of that icon. This
 // function consists of the following steps:
 // 1. Check if the original icon is already circle shaped. If it is, then
@@ -21,6 +23,11 @@
 //    generated icon as the standard icon.
 gfx::ImageSkia CreateStandardIconImage(const gfx::ImageSkia& image);
 
+// The same as CreateStandardIconImage but for ImageSkiaRep.
+// Returns nullopt if base_rep was not modified.
+absl::optional<gfx::ImageSkiaRep> CreateStandardIconImageRep(
+    const gfx::ImageSkiaRep& base_rep,
+    float scale);
 }  // namespace apps
 
 #endif  // CHROME_BROWSER_APPS_ICON_STANDARDIZER_H_
diff --git a/chrome/browser/apps/platform_apps/app_window_interactive_uitest.cc b/chrome/browser/apps/platform_apps/app_window_interactive_uitest.cc
index 14307f8..32bfd0c 100644
--- a/chrome/browser/apps/platform_apps/app_window_interactive_uitest.cc
+++ b/chrome/browser/apps/platform_apps/app_window_interactive_uitest.cc
@@ -248,10 +248,9 @@
   EXPECT_TRUE(GetFirstAppWindow()->GetBaseWindow()->IsFullscreen());
 }
 
-#if BUILDFLAG(IS_MAC) || defined(THREAD_SANITIZER) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_MAC) || defined(THREAD_SANITIZER)
 // http://crbug.com/404081
 // http://crbug.com/1263448 (tsan)
-// http://crbug.com/1263661 (linux)
 #define MAYBE_TestInnerBounds DISABLED_TestInnerBounds
 #else
 #define MAYBE_TestInnerBounds TestInnerBounds
diff --git a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc
index 26aa3c9..9f0a771 100644
--- a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc
+++ b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc
@@ -72,6 +72,15 @@
     arc_session_manager->RemoveObserver(this);
 }
 
+bool AppRestoreArcTaskHandler::IsAppPendingRestore(
+    const std::string& arc_app_id) const {
+  for (auto& handler : arc_app_launcher_handers_) {
+    if (handler && handler->IsAppPendingRestore(arc_app_id))
+      return true;
+  }
+  return false;
+}
+
 void AppRestoreArcTaskHandler::OnTaskCreated(int32_t task_id,
                                              const std::string& package_name,
                                              const std::string& activity,
@@ -117,6 +126,7 @@
 
 void AppRestoreArcTaskHandler::OnArcAppListPrefsDestroyed() {
   arc_prefs_observer_.Reset();
+  Shutdown();
 }
 
 void AppRestoreArcTaskHandler::OnArcPlayStoreEnabledChanged(bool enabled) {
@@ -139,6 +149,10 @@
   for (auto& handler : arc_app_launcher_handers_) {
     handler.reset();
   }
+  desks_templates_arc_app_launch_handler_observer_ = nullptr;
+  full_restore_arc_app_launch_handler_observer_ = nullptr;
+  window_predictor_arc_app_launch_handler_observer_ = nullptr;
+
   window_handler_.reset();
 }
 
diff --git a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h
index a6949ec..4b6e6627 100644
--- a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h
+++ b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h
@@ -18,6 +18,7 @@
 namespace ash {
 namespace full_restore {
 class ArcWindowHandler;
+class FullRestoreAppLaunchHandlerArcAppBrowserTest;
 }  // namespace full_restore
 
 namespace app_restore {
@@ -46,6 +47,12 @@
   }
 #endif
 
+  // Check if the AppId existed in any arc app launch handler restore queue.
+  // When different launch handler which corresponding to different restore
+  // purpose trying to restore the same ARC app, it will be confusing ARC that
+  // which window info should be applied.
+  bool IsAppPendingRestore(const std::string& arc_app_id) const;
+
   ArcAppLaunchHandler* desks_templates_arc_app_launch_handler() {
     return desks_templates_arc_app_launch_handler_observer_;
   }
@@ -78,10 +85,12 @@
   // Invoked when ChromeShelfController is created.
   void OnShelfReady();
 
- private:
   // KeyedService:
   void Shutdown() override;
 
+ private:
+  friend class ash::full_restore::FullRestoreAppLaunchHandlerArcAppBrowserTest;
+
   base::ScopedObservation<ArcAppListPrefs, ArcAppListPrefs::Observer>
       arc_prefs_observer_{this};
 
diff --git a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc
index 4679792e..d585b516 100644
--- a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc
+++ b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc
@@ -253,6 +253,10 @@
   RemoveWindowsForApp(app_id);
 }
 
+bool ArcAppLaunchHandler::IsAppPendingRestore(const std::string& app_id) const {
+  return base::Contains(app_ids_, app_id);
+}
+
 void ArcAppLaunchHandler::OnAppUpdate(const apps::AppUpdate& update) {
   if (!update.ReadinessChanged() ||
       update.AppType() != apps::mojom::AppType::kArc) {
diff --git a/chrome/browser/ash/app_restore/arc_app_launch_handler.h b/chrome/browser/ash/app_restore/arc_app_launch_handler.h
index 6250c79c..00d8d78 100644
--- a/chrome/browser/ash/app_restore/arc_app_launch_handler.h
+++ b/chrome/browser/ash/app_restore/arc_app_launch_handler.h
@@ -133,6 +133,8 @@
 
   void LaunchApp(const std::string& app_id);
 
+  bool IsAppPendingRestore(const std::string& app_id) const;
+
   // apps::AppRegistryCache::Observer:
   void OnAppUpdate(const apps::AppUpdate& update) override;
   void OnAppRegistryCacheWillBeDestroyed(
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
index a1a5b1ac..38a2458 100644
--- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
+++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -1117,9 +1117,18 @@
   void Restore() {
     test_full_restore_info_observer_.Reset();
 
+    auto* arc_task_hanlder =
+        app_restore::AppRestoreArcTaskHandler::GetForProfile(profile());
+    if (!arc_task_hanlder->full_restore_arc_app_launch_handler_observer_) {
+      arc_task_hanlder->full_restore_arc_app_launch_handler_observer_ =
+          arc_task_hanlder->arc_app_launcher_handers_
+              .emplace_back(
+                  std::make_unique<ash::app_restore::ArcAppLaunchHandler>())
+              .get();
+    }
+
     arc_app_launch_handler_ =
-        app_restore::AppRestoreArcTaskHandler::GetForProfile(profile())
-            ->full_restore_arc_app_launch_handler();
+        arc_task_hanlder->full_restore_arc_app_launch_handler();
     arc_app_launch_handler_->is_app_connection_ready_ = false;
 
     app_launch_handler_ =
diff --git a/chrome/browser/ash/app_restore/full_restore_service.cc b/chrome/browser/ash/app_restore/full_restore_service.cc
index 7ce1b27..6969db1 100644
--- a/chrome/browser/ash/app_restore/full_restore_service.cc
+++ b/chrome/browser/ash/app_restore/full_restore_service.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/browser_app_instance_registry.h"
+#include "chrome/browser/ash/app_restore/app_restore_arc_task_handler.h"
 #include "chrome/browser/ash/app_restore/full_restore_app_launch_handler.h"
 #include "chrome/browser/ash/app_restore/full_restore_data_handler.h"
 #include "chrome/browser/ash/app_restore/full_restore_prefs.h"
@@ -306,6 +307,10 @@
                                  const content::NotificationSource& source,
                                  const content::NotificationDetails& details) {
   DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type);
+  if (auto* arc_task_handler =
+          app_restore::AppRestoreArcTaskHandler::GetForProfile(profile_)) {
+    arc_task_handler->Shutdown();
+  }
   app_launch_handler_.reset();
   ::full_restore::FullRestoreSaveHandler::GetInstance()->SetShutDown();
 
diff --git a/chrome/browser/ash/arc/window_predictor/window_predictor_utils.cc b/chrome/browser/ash/arc/window_predictor/window_predictor_utils.cc
index a07ee9d..8f79af4 100644
--- a/chrome/browser/ash/arc/window_predictor/window_predictor_utils.cc
+++ b/chrome/browser/ash/arc/window_predictor/window_predictor_utils.cc
@@ -23,6 +23,11 @@
   if (!arc_task_handler)
     return false;
 
+  // Do not launch ghost window and App if it exist in any pending launch
+  // queue.
+  if (arc_task_handler->IsAppPendingRestore(arc_app_id))
+    return false;
+
   auto* arc_app_launch_handler =
       arc_task_handler->window_predictor_arc_app_launch_handler();
   if (!arc_app_launch_handler)
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util.cc b/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
index 75de508..dfd01a8 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ash/crosapi/browser_data_migrator_util.h"
 
+#include <unistd.h>
+
 #include <algorithm>
 
 #include "base/containers/contains.h"
@@ -281,6 +283,57 @@
   return true;
 }
 
+bool CreateHardLink(const base::FilePath& from_file,
+                    const base::FilePath& to_file) {
+  if (link(from_file.value().c_str(), to_file.value().c_str()) == -1) {
+    // Note that `link(from_file, to_file)` fails if `to_file` already exists.
+    PLOG(ERROR) << "link(" << from_file.value() << ", " << to_file.value()
+                << ") failed.";
+    return false;
+  }
+
+  return true;
+}
+
+bool CopyDirectoryByHardLinks(const base::FilePath& from_dir,
+                              const base::FilePath& to_dir) {
+  if (!base::DirectoryExists(from_dir)) {
+    LOG(ERROR) << "from_dir = " << from_dir.value() << " does not exist.";
+    return false;
+  }
+
+  if (base::PathExists(to_dir)) {
+    LOG(ERROR) << "to_dir = " << to_dir.value() << " already exists.";
+    return false;
+  }
+
+  if (!base::CreateDirectory(to_dir)) {
+    PLOG(ERROR) << "Failed base::CreateDirectory(" << to_dir.value() << ").";
+    return false;
+  }
+
+  base::FileEnumerator enumerator(from_dir, false /* recursive */,
+                                  base::FileEnumerator::FILES |
+                                      base::FileEnumerator::DIRECTORIES |
+                                      base::FileEnumerator::SHOW_SYM_LINKS);
+  for (base::FilePath entry = enumerator.Next(); !entry.empty();
+       entry = enumerator.Next()) {
+    const base::FileEnumerator::FileInfo& info = enumerator.GetInfo();
+
+    // Only create hard links for files/dirs and skip other types like symlink
+    // since creating hard links for those might introdue a security risk.
+    if (S_ISREG(info.stat().st_mode)) {
+      if (!CreateHardLink(entry, to_dir.Append(entry.BaseName())))
+        return false;
+    } else if (S_ISDIR(info.stat().st_mode)) {
+      if (!CopyDirectoryByHardLinks(entry, to_dir.Append(entry.BaseName())))
+        return false;
+    }
+  }
+
+  return true;
+}
+
 bool CopyTargetItems(const base::FilePath& to_dir,
                      const TargetItems& target_items,
                      CancelFlag* cancel_flag,
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util.h b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
index 7c776a5..0fbb5553 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util.h
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
@@ -248,6 +248,19 @@
                    CancelFlag* cancel_flag,
                    MigrationProgressTracker* progress_tracker);
 
+// Creates a hard link from `from_file` to `to_file`. Use it on a file and not a
+// directory. Any parent directory of `to_file` should already exist. This will
+// fail if `to_dir` already exists.
+bool CreateHardLink(const base::FilePath& from_file,
+                    const base::FilePath& to_file);
+
+// Copies the content of `from_dir` to `to_dir` recursively similar to
+// `CopyDirectory` while skipping symlinks. Unlike `CopyDirectory` it creates
+// hard links for the files from `from_dir` to `to_dir`. If `to_dir`
+// already exists, then this will fail.
+bool CopyDirectoryByHardLinks(const base::FilePath& from_dir,
+                              const base::FilePath& to_dir);
+
 // Records the sizes of `TargetItem`s.
 void RecordTargetItemSizes(const std::vector<TargetItem>& items);
 
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
index 95696c24..33299d93 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ash/crosapi/browser_data_migrator_util.h"
 
+#include <sys/stat.h>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -33,6 +35,25 @@
     return t1.path < t2.path;
   }
 };
+
+// Checks if the file paths point to the same inode.
+bool IsSameFile(const base::FilePath& file1, const base::FilePath& file2) {
+  struct stat st_1;
+  if (stat(file1.value().c_str(), &st_1) == -1) {
+    PLOG(ERROR) << "stat failed";
+    return false;
+  }
+
+  struct stat st_2;
+  if (stat(file2.value().c_str(), &st_2) == -1) {
+    PLOG(ERROR) << "stat failed";
+    return false;
+  }
+
+  // Make sure that they are indeed the same file.
+  return (st_1.st_ino == st_2.st_ino);
+}
+
 }  // namespace
 
 TEST(BrowserDataMigratorUtilTest, NoPathOverlaps) {
@@ -134,12 +155,39 @@
   histogram_tester.ExpectBucketCount(uma_name, size / 1024 / 1024, 1);
 }
 
+TEST(BrowserDataMigratorUtilTest, CreateHardLink) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath from_file =
+      scoped_temp_dir.GetPath().Append(FILE_PATH_LITERAL("from_file"));
+  const base::FilePath to_file =
+      scoped_temp_dir.GetPath().Append(FILE_PATH_LITERAL("to_file"));
+  base::WriteFile(from_file, "Hello, World", sizeof("Hello, World"));
+
+  ASSERT_TRUE(CreateHardLink(from_file, to_file));
+
+  EXPECT_TRUE(base::PathExists(to_file));
+
+  // Make sure that they are indeed the same file.
+  EXPECT_TRUE(IsSameFile(from_file, to_file));
+}
+
 TEST(BrowserDataMigratorUtilTest, CopyDirectory) {
   base::ScopedTempDir scoped_temp_dir;
   ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
 
+  const base::FilePath copy_from =
+      scoped_temp_dir.GetPath().Append("copy_from");
+
+  const char subdirectory[] = "Subdirectory";
+  const char data_file[] = "data";
+  const char original[] = "original";
+  const char symlink[] = "symlink";
+  const char sensitive[] = "sensitive";
+
   // Setup files/directories as described below.
-  // |- original
+  // |- sensitive/original
   // |- copy_from/
   //     |- data
   //     |- Subdirectory/
@@ -147,17 +195,9 @@
   //         |- Subdirectory/data
   //     |- symlink  /* symlink to original */
 
-  const base::FilePath copy_from =
-      scoped_temp_dir.GetPath().Append("copy_from");
-  const base::FilePath copy_to = scoped_temp_dir.GetPath().Append("copy_to");
-
-  const char subdirectory[] = "Subdirectory";
-  const char data_file[] = "data";
-  const char original[] = "original";
-  const char symlink[] = "symlink";
-
-  ASSERT_TRUE(base::WriteFile(scoped_temp_dir.GetPath().Append(original),
-                              kTextFileContent, kTextFileSize));
+  ASSERT_TRUE(base::WriteFile(
+      scoped_temp_dir.GetPath().Append(sensitive).Append(original),
+      kTextFileContent, kTextFileSize));
   ASSERT_TRUE(base::CreateDirectory(copy_from));
   ASSERT_TRUE(base::CreateDirectory(copy_from.Append(subdirectory)));
   ASSERT_TRUE(base::CreateDirectory(
@@ -169,11 +209,14 @@
   ASSERT_TRUE(base::WriteFile(
       copy_from.Append(subdirectory).Append(subdirectory).Append(data_file),
       kTextFileContent, kTextFileSize));
-  base::CreateSymbolicLink(scoped_temp_dir.GetPath().Append(original),
-                           copy_from.Append(symlink));
+  base::CreateSymbolicLink(
+      scoped_temp_dir.GetPath().Append(sensitive).Append(original),
+      copy_from.Append(symlink));
 
+  // Test `CopyDirectory()`.
   scoped_refptr<CancelFlag> cancelled = base::MakeRefCounted<CancelFlag>();
   FakeMigrationProgressTracker progress_tracker;
+  const base::FilePath copy_to = scoped_temp_dir.GetPath().Append("copy_to");
   ASSERT_TRUE(
       CopyDirectory(copy_from, copy_to, cancelled.get(), &progress_tracker));
 
@@ -188,8 +231,42 @@
   EXPECT_TRUE(base::PathExists(copy_to.Append(subdirectory).Append(data_file)));
   EXPECT_TRUE(base::PathExists(
       copy_to.Append(subdirectory).Append(subdirectory).Append(data_file)));
-  // Make sure that symlink does not get copied.
+  // Make sure that symlink is not copied.
   EXPECT_FALSE(base::PathExists(copy_to.Append(symlink)));
+  EXPECT_FALSE(base::PathExists(copy_to.Append(original)));
+
+  // Test `CopyDirectoryByHardLinks()`.
+  const base::FilePath copy_to_hard =
+      scoped_temp_dir.GetPath().Append("copy_to_hard");
+  ASSERT_TRUE(CopyDirectoryByHardLinks(copy_from, copy_to_hard));
+
+  // Expected `copy_to_hard` structure after `CopyDirectoryByHardLinks()`.
+  // |- copy_to_hard/
+  //     |- data
+  //     |- Subdirectory/
+  //         |- data
+  //         |- Subdirectory/data
+  EXPECT_TRUE(base::PathExists(copy_to_hard));
+  EXPECT_TRUE(base::PathExists(copy_to_hard.Append(data_file)));
+  EXPECT_TRUE(
+      base::PathExists(copy_to_hard.Append(subdirectory).Append(data_file)));
+  EXPECT_TRUE(base::PathExists(copy_to_hard.Append(subdirectory)
+                                   .Append(subdirectory)
+                                   .Append(data_file)));
+  // Make sure that symlink is not copied.
+  EXPECT_FALSE(base::PathExists(copy_to_hard.Append(symlink)));
+  EXPECT_FALSE(base::PathExists(copy_to_hard.Append(original)));
+
+  // Make sure that they are indeed the same file.
+  EXPECT_TRUE(
+      IsSameFile(copy_from.Append(data_file), copy_to_hard.Append(data_file)));
+  EXPECT_TRUE(IsSameFile(copy_from.Append(subdirectory).Append(data_file),
+                         copy_to_hard.Append(subdirectory).Append(data_file)));
+  EXPECT_TRUE(IsSameFile(
+      copy_from.Append(subdirectory).Append(subdirectory).Append(data_file),
+      copy_to_hard.Append(subdirectory)
+          .Append(subdirectory)
+          .Append(data_file)));
 }
 
 class BrowserDataMigratorUtilWithTargetsTest : public ::testing::Test {
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc
index 26b126e5..b4def30 100644
--- a/chrome/browser/ash/crosapi/browser_util.cc
+++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -478,8 +478,8 @@
 }
 
 bool IsAshWebBrowserEnabled(Channel channel) {
-  // If Lacros is not allowed or is not enabled, Ash browser is always enabled.
-  if (!IsLacrosEnabled(channel))
+  // If Lacros is not a primary browser, Ash browser is always enabled.
+  if (!IsLacrosPrimaryBrowser(channel))
     return true;
 
   switch (GetLaunchSwitch()) {
@@ -493,7 +493,7 @@
       return false;
   }
 
-  return true;
+  return !base::FeatureList::IsEnabled(chromeos::features::kLacrosOnly);
 }
 
 bool IsLacrosPrimaryBrowser() {
@@ -560,6 +560,32 @@
          (GetLaunchSwitch() == LacrosLaunchSwitch::kUserChoice);
 }
 
+bool IsLacrosOnlyBrowserAllowed(Channel channel) {
+  if (!IsLacrosAllowedToBeEnabled(channel))
+    return false;
+
+  switch (GetLaunchSwitch()) {
+    case LacrosLaunchSwitch::kLacrosDisallowed:
+      DCHECK_EQ(channel, Channel::UNKNOWN);
+      return false;
+    case LacrosLaunchSwitch::kLacrosOnly:
+      // Forcibly allow to use Lacros as a Primary respecting the policy.
+      return true;
+    case LacrosLaunchSwitch::kUserChoice:
+    case LacrosLaunchSwitch::kSideBySide:
+    case LacrosLaunchSwitch::kLacrosPrimary:
+      // Fallback others.
+      break;
+  }
+
+  return true;
+}
+
+bool IsLacrosOnlyFlagAllowed(Channel channel) {
+  return IsLacrosOnlyBrowserAllowed(channel) &&
+         (GetLaunchSwitch() == LacrosLaunchSwitch::kUserChoice);
+}
+
 bool IsLacrosAllowedToLaunch() {
   return user_manager::UserManager::Get()->GetLoggedInUsers().size() <= 1;
 }
diff --git a/chrome/browser/ash/crosapi/browser_util.h b/chrome/browser/ash/crosapi/browser_util.h
index af5c87a..060ab0a 100644
--- a/chrome/browser/ash/crosapi/browser_util.h
+++ b/chrome/browser/ash/crosapi/browser_util.h
@@ -207,6 +207,13 @@
 // Returns true if |chromeos::features::kLacrosPrimary| flag is allowed.
 bool IsLacrosPrimaryFlagAllowed(version_info::Channel channel);
 
+// Returns true if the lacros can be used as a only browser
+// for the current session.
+bool IsLacrosOnlyBrowserAllowed(version_info::Channel channel);
+
+// Returns true if |chromeos::features::kLacrosOnly| flag is allowed.
+bool IsLacrosOnlyFlagAllowed(version_info::Channel channel);
+
 // Returns true if Lacros is allowed to launch and show a window. This can
 // return false if the user is using multi-signin, which is mutually exclusive
 // with Lacros.
diff --git a/chrome/browser/ash/crosapi/browser_util_unittest.cc b/chrome/browser/ash/crosapi/browser_util_unittest.cc
index 79d17c39..6023404 100644
--- a/chrome/browser/ash/crosapi/browser_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_util_unittest.cc
@@ -343,6 +343,37 @@
   EXPECT_FALSE(browser_util::IsAshWebBrowserEnabled(Channel::STABLE));
 }
 
+TEST_F(BrowserUtilTest, IsAshWebBrowserDisabledByFlags) {
+  AddRegularUser("user@test.com");
+  { EXPECT_TRUE(browser_util::IsAshWebBrowserEnabled()); }
+
+  // Just enabling LacrosOnly feature is not enough.
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeature(chromeos::features::kLacrosOnly);
+    EXPECT_TRUE(browser_util::IsAshWebBrowserEnabled());
+  }
+
+  // LacrosSupport only is not enough.
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures(
+        {chromeos::features::kLacrosOnly, chromeos::features::kLacrosSupport},
+        {});
+    EXPECT_TRUE(browser_util::IsAshWebBrowserEnabled());
+  }
+
+  // All, LacrosOnly, LacrosPrimary and LacrosSupport are needed.
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures(
+        {chromeos::features::kLacrosOnly, chromeos::features::kLacrosPrimary,
+         chromeos::features::kLacrosSupport},
+        {});
+    EXPECT_FALSE(browser_util::IsAshWebBrowserEnabled());
+  }
+}
+
 TEST_F(LacrosSupportBrowserUtilTest, LacrosPrimaryBrowserByFlags) {
   AddRegularUser("user@test.com");
   { EXPECT_FALSE(browser_util::IsLacrosPrimaryBrowser()); }
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index eb0c07a7..38d82b8 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -454,7 +454,7 @@
 
   // TODO(crbug/1153210): Better numbers for timeouts once we have data.
   std::map<mojom::InstallerState, base::TimeDelta> stage_timeouts_ = {
-      {mojom::InstallerState::kStart, base::Minutes(5)},
+      {mojom::InstallerState::kStart, base::Minutes(2)},
       {mojom::InstallerState::kInstallImageLoader,
        base::Hours(6)},  // May need to download DLC or component
       {mojom::InstallerState::kCreateDiskImage, base::Minutes(5)},
@@ -464,11 +464,10 @@
       // messages that reset the countdown.
       {mojom::InstallerState::kCreateContainer, base::Minutes(5)},
       {mojom::InstallerState::kSetupContainer, base::Minutes(5)},
-      // StartContainer might need to do a UID remapping, which in the worst
-      // case can take a very long time.
-      // TODO(crbug/1197416) once the heartbeat change has landed in Tremplin
-      // and made it out, make this something shorter like a few minutes.
-      {mojom::InstallerState::kStartContainer, base::Days(5)},
+      // StartContainer sends heartbeat messages on a 30-second interval, but
+      // there's a bit of work that's not covered by heartbeat messages so to be
+      // safe set a 3 minute timeout.
+      {mojom::InstallerState::kStartContainer, base::Minutes(3)},
       // ConfigureContainer is special, it's not part of the restarter flow, so
       // it doesn't have a timeout.
       {mojom::InstallerState::kConfigureContainer, base::Hours(0)},
diff --git a/chrome/browser/ash/crostini/crostini_manager_unittest.cc b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
index 7e1295c2..920545b8 100644
--- a/chrome/browser/ash/crostini/crostini_manager_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
@@ -1265,12 +1265,12 @@
                      base::Unretained(this), run_loop()->QuitClosure()),
       this);
 
-  task_environment_.FastForwardBy(base::Days(4));
+  task_environment_.FastForwardBy(base::Minutes(2));
   crostini_manager_->OnLxdContainerStarting(signal);
-  task_environment_.FastForwardBy(base::Days(4));
+  task_environment_.FastForwardBy(base::Minutes(2));
   ASSERT_EQ(0, restart_crostini_callback_count_);
 
-  task_environment_.FastForwardBy(base::Days(4));
+  task_environment_.FastForwardBy(base::Minutes(2));
   ASSERT_EQ(1, restart_crostini_callback_count_);
 
   EXPECT_GE(fake_concierge_client_->create_disk_image_call_count(), 1);
diff --git a/chrome/browser/ash/dbus/ash_dbus_helper.cc b/chrome/browser/ash/dbus/ash_dbus_helper.cc
index b5602f8b..2a9aed53 100644
--- a/chrome/browser/ash/dbus/ash_dbus_helper.cc
+++ b/chrome/browser/ash/dbus/ash_dbus_helper.cc
@@ -40,6 +40,7 @@
 #include "chromeos/dbus/media_analytics/media_analytics_client.h"
 #include "chromeos/dbus/missive/missive_client.h"
 #include "chromeos/dbus/os_install/os_install_client.h"
+#include "chromeos/dbus/patchpanel/patchpanel_client.h"
 #include "chromeos/dbus/pciguard/pciguard_client.h"
 #include "chromeos/dbus/permission_broker/permission_broker_client.h"
 #include "chromeos/dbus/power/power_manager_client.h"
@@ -134,6 +135,7 @@
   InitializeDBusClient<chromeos::MediaAnalyticsClient>(bus);
   InitializeDBusClient<chromeos::MissiveClient>(bus);
   InitializeDBusClient<chromeos::OsInstallClient>(bus);
+  InitializeDBusClient<chromeos::PatchPanelClient>(bus);
   InitializeDBusClient<chromeos::PciguardClient>(bus);
   InitializeDBusClient<chromeos::PermissionBrokerClient>(bus);
   InitializeDBusClient<chromeos::PowerManagerClient>(bus);
@@ -217,6 +219,7 @@
   chromeos::PowerManagerClient::Shutdown();
   chromeos::PermissionBrokerClient::Shutdown();
   chromeos::PciguardClient::Shutdown();
+  chromeos::PatchPanelClient::Shutdown();
   chromeos::OsInstallClient::Shutdown();
   chromeos::MissiveClient::Shutdown();
   chromeos::MediaAnalyticsClient::Shutdown();
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.cc b/chrome/browser/ash/input_method/assistive_window_controller.cc
index 5cebefad..4fbd68a 100644
--- a/chrome/browser/ash/input_method/assistive_window_controller.cc
+++ b/chrome/browser/ash/input_method/assistive_window_controller.cc
@@ -64,8 +64,11 @@
   if (suggestion_window_view_)
     return;
   // suggestion_window_view_ is deleted by DialogDelegateView::DeleteDelegate.
-  suggestion_window_view_ =
-      ui::ime::SuggestionWindowView::Create(GetParentView(), this);
+  // TODO(b/215292569): Allow horizontal and vertical orientation to be toggled
+  // via some parameter.
+  suggestion_window_view_ = ui::ime::SuggestionWindowView::Create(
+      GetParentView(), this,
+      ui::ime::SuggestionWindowView::Orientation::kHorizontal);
   views::Widget* widget = suggestion_window_view_->GetWidget();
   widget->AddObserver(this);
   widget->Show();
diff --git a/chrome/browser/ash/input_method/native_input_method_engine.cc b/chrome/browser/ash/input_method/native_input_method_engine.cc
index f5aa4b8..7ba6b95 100644
--- a/chrome/browser/ash/input_method/native_input_method_engine.cc
+++ b/chrome/browser/ash/input_method/native_input_method_engine.cc
@@ -750,13 +750,14 @@
       OverrideXkbLayoutIfNeeded(InputMethodManager::Get()->GetImeKeyboard(),
                                 settings);
 
-      input_method_->OnFocus(mojom::InputFieldInfo::New(
-                                 TextInputTypeToMojoType(context.type),
-                                 AutocorrectFlagsToMojoType(context.flags),
-                                 context.should_do_learning
-                                     ? mojom::PersonalizationMode::kEnabled
-                                     : mojom::PersonalizationMode::kDisabled),
-                             prefs_ ? std::move(settings) : nullptr);
+      input_method_->OnFocusDeprecated(
+          mojom::InputFieldInfo::New(
+              TextInputTypeToMojoType(context.type),
+              AutocorrectFlagsToMojoType(context.flags),
+              context.should_do_learning
+                  ? mojom::PersonalizationMode::kEnabled
+                  : mojom::PersonalizationMode::kDisabled),
+          prefs_ ? std::move(settings) : nullptr);
 
       // TODO(b/202224495): Send the surrounding text as part of InputFieldInfo.
       SendSurroundingTextToNativeMojoEngine(last_surrounding_text_);
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc
index 09d6d92..37b71b9 100644
--- a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc
+++ b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc
@@ -92,10 +92,16 @@
 
   // ime::mojom::InputMethod:
   MOCK_METHOD(void,
-              OnFocus,
+              OnFocusDeprecated,
               (ime::mojom::InputFieldInfoPtr input_field_info,
                ime::mojom::InputMethodSettingsPtr settings),
               (override));
+  MOCK_METHOD(void,
+              OnFocus,
+              (ime::mojom::InputFieldInfoPtr input_field_info,
+               ime::mojom::InputMethodSettingsPtr settings,
+               OnFocusCallback callback),
+              (override));
   MOCK_METHOD(void, OnBlur, (), (override));
   MOCK_METHOD(void,
               ProcessKeyEvent,
@@ -165,6 +171,12 @@
     std::move(callback).Run(/*bound=*/true);
   }
 
+  void InitializeConnectionFactory(
+      mojo::PendingReceiver<ime::mojom::ConnectionFactory> connection_factory,
+      InitializeConnectionFactoryCallback callback) override {
+    std::move(callback).Run(/*bound=*/false);
+  }
+
  private:
   MockInputMethod* mock_input_method_;
 };
@@ -419,12 +431,13 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method,
-                OnFocus(MojoEq(ime::mojom::InputFieldInfo(
-                            ime::mojom::InputFieldType::kText,
-                            ime::mojom::AutocorrectMode::kEnabled,
-                            ime::mojom::PersonalizationMode::kEnabled)),
-                        _))
+    EXPECT_CALL(
+        mock_input_method,
+        OnFocusDeprecated(MojoEq(ime::mojom::InputFieldInfo(
+                              ime::mojom::InputFieldType::kText,
+                              ime::mojom::AutocorrectMode::kEnabled,
+                              ime::mojom::PersonalizationMode::kEnabled)),
+                          _))
         .WillOnce(
             ::testing::Invoke([](ime::mojom::InputFieldInfoPtr info,
                                  ime::mojom::InputMethodSettingsPtr settings) {
@@ -491,12 +504,13 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method,
-                OnFocus(MojoEq(ime::mojom::InputFieldInfo(
-                            ime::mojom::InputFieldType::kText,
-                            ime::mojom::AutocorrectMode::kEnabled,
-                            ime::mojom::PersonalizationMode::kEnabled)),
-                        _))
+    EXPECT_CALL(
+        mock_input_method,
+        OnFocusDeprecated(MojoEq(ime::mojom::InputFieldInfo(
+                              ime::mojom::InputFieldType::kText,
+                              ime::mojom::AutocorrectMode::kEnabled,
+                              ime::mojom::PersonalizationMode::kEnabled)),
+                          _))
         .WillOnce(
             ::testing::Invoke([](ime::mojom::InputFieldInfoPtr info,
                                  ime::mojom::InputMethodSettingsPtr settings) {
@@ -567,7 +581,7 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method, OnFocus(_, _));
+    EXPECT_CALL(mock_input_method, OnFocusDeprecated(_, _));
     EXPECT_CALL(mock_input_method, OnSurroundingTextChanged("", _, _));
 
     // Each character in "你好" is three UTF-8 code units.
@@ -609,7 +623,7 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method, OnFocus(_, _));
+    EXPECT_CALL(mock_input_method, OnFocusDeprecated(_, _));
     EXPECT_CALL(mock_input_method, OnSurroundingTextChanged(_, _, _));
 
     // TODO(https://crbug.com/1187982): Expect the actual arguments to the call
@@ -665,7 +679,7 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method, OnFocus(_, _));
+    EXPECT_CALL(mock_input_method, OnFocusDeprecated(_, _));
     EXPECT_CALL(mock_input_method, OnSurroundingTextChanged(_, _, _));
 
     // TODO(https://crbug.com/1187982): Expect the actual arguments to the call
@@ -722,7 +736,7 @@
 
   {
     testing::InSequence seq;
-    EXPECT_CALL(mock_input_method, OnFocus(_, _));
+    EXPECT_CALL(mock_input_method, OnFocusDeprecated(_, _));
     EXPECT_CALL(mock_input_method, OnSurroundingTextChanged(_, _, _));
     EXPECT_CALL(mock_input_method, ProcessKeyEvent(_, _)).Times(0);
   }
diff --git a/chrome/browser/ash/input_method/ui/suggestion_window_view.cc b/chrome/browser/ash/input_method/ui/suggestion_window_view.cc
index 59f9a5a..fed2856f 100644
--- a/chrome/browser/ash/input_method/ui/suggestion_window_view.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view.cc
@@ -66,10 +66,10 @@
 }  // namespace
 
 // static
-SuggestionWindowView* SuggestionWindowView::Create(
-    gfx::NativeView parent,
-    AssistiveDelegate* delegate) {
-  auto* const view = new SuggestionWindowView(parent, delegate);
+SuggestionWindowView* SuggestionWindowView::Create(gfx::NativeView parent,
+                                                   AssistiveDelegate* delegate,
+                                                   Orientation orientation) {
+  auto* const view = new SuggestionWindowView(parent, delegate, orientation);
   views::Widget* const widget =
       views::BubbleDialogDelegateView::CreateBubble(view);
   wm::SetWindowVisibilityAnimationTransition(widget->GetNativeView(),
@@ -152,7 +152,8 @@
 }
 
 SuggestionWindowView::SuggestionWindowView(gfx::NativeView parent,
-                                           AssistiveDelegate* delegate)
+                                           AssistiveDelegate* delegate,
+                                           Orientation orientation)
     : delegate_(delegate) {
   DCHECK(parent);
 
@@ -161,12 +162,28 @@
   set_parent_window(parent);
   set_margins(gfx::Insets());
 
-  SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical));
+  views::BoxLayout::Orientation layout_orientation;
+  switch (orientation) {
+    case Orientation::kVertical: {
+      layout_orientation = views::BoxLayout::Orientation::kVertical;
+      break;
+    }
+    case Orientation::kHorizontal: {
+      layout_orientation = views::BoxLayout::Orientation::kHorizontal;
+      break;
+    }
+    default: {
+      // Unimplemented orientation.
+      NOTREACHED();
+      break;
+    }
+  }
+
+  SetLayoutManager(std::make_unique<views::BoxLayout>(layout_orientation));
 
   candidate_area_ = AddChildView(std::make_unique<views::View>());
-  candidate_area_->SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical));
+  candidate_area_->SetLayoutManager(
+      std::make_unique<views::BoxLayout>(layout_orientation));
 
   setting_link_ = AddChildView(std::make_unique<views::Link>(
       l10n_util::GetStringUTF16(IDS_SUGGESTION_LEARN_MORE)));
diff --git a/chrome/browser/ash/input_method/ui/suggestion_window_view.h b/chrome/browser/ash/input_method/ui/suggestion_window_view.h
index 2ba05f63..6b38d47 100644
--- a/chrome/browser/ash/input_method/ui/suggestion_window_view.h
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view.h
@@ -40,12 +40,20 @@
 class UI_CHROMEOS_EXPORT SuggestionWindowView
     : public views::BubbleDialogDelegateView {
  public:
+  enum Orientation {
+    kHorizontal =
+        0,  // TODO(b/215292569): Orientation needs to follow UI specs.
+            // Currently only rotates the candidates horizontally.
+    kVertical,
+  };
+
   METADATA_HEADER(SuggestionWindowView);
 
   // Creates a bubble widget containing a SuggestionWindowView.  Returns a
   // pointer to the contained view.
   static SuggestionWindowView* Create(gfx::NativeView parent,
-                                      AssistiveDelegate* delegate);
+                                      AssistiveDelegate* delegate,
+                                      Orientation orientation);
 
   // views::BubbleDialogDelegateView:
   std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView(
@@ -72,7 +80,9 @@
   void OnThemeChanged() override;
 
  private:
-  SuggestionWindowView(gfx::NativeView parent, AssistiveDelegate* delegate);
+  SuggestionWindowView(gfx::NativeView parent,
+                       AssistiveDelegate* delegate,
+                       Orientation orientation);
   SuggestionWindowView(const SuggestionWindowView&) = delete;
   SuggestionWindowView& operator=(const SuggestionWindowView&) = delete;
   ~SuggestionWindowView() override;
diff --git a/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc b/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
index 4675872b..4065d292 100644
--- a/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
@@ -15,6 +15,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/link.h"
+#include "ui/views/layout/box_layout.h"
 
 namespace ui {
 namespace ime {
@@ -26,7 +27,9 @@
       const ui::ime::AssistiveWindowButton& button) const override {}
 };
 
-class SuggestionWindowViewTest : public ChromeViewsTestBase {
+class SuggestionWindowViewTest
+    : public ChromeViewsTestBase,
+      public ::testing::WithParamInterface<SuggestionWindowView::Orientation> {
  public:
   SuggestionWindowViewTest() {}
 
@@ -42,7 +45,7 @@
     window_.candidates = candidates_;
 
     suggestion_window_view_ =
-        SuggestionWindowView::Create(GetContext(), delegate_.get());
+        SuggestionWindowView::Create(GetContext(), delegate_.get(), GetParam());
     candidate_button_.id = ButtonId::kSuggestion;
     setting_link_view_.id = ButtonId::kSmartInputsSettingLink;
     learn_more_button_.id = ButtonId::kLearnMore;
@@ -89,7 +92,30 @@
   AssistiveWindowButton learn_more_button_;
 };
 
-TEST_F(SuggestionWindowViewTest, HighlightOneCandidateWhenIndexIsValid) {
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    SuggestionWindowViewTest,
+    testing::Values(SuggestionWindowView::Orientation::kHorizontal,
+                    SuggestionWindowView::Orientation::kVertical),
+    // Function to make the test name say ".../kHorizontal" etc.
+    [](const testing::TestParamInfo<SuggestionWindowViewTest::ParamType>&
+           info) {
+      std::string name;
+      switch (info.param) {
+        case SuggestionWindowView::Orientation::kHorizontal:
+          name = "Horizontal";
+          break;
+        case SuggestionWindowView::Orientation::kVertical:
+          name = "Vertical";
+          break;
+        default:
+          name = "UNKNOWN";
+          break;
+      }
+      return name;
+    });
+
+TEST_P(SuggestionWindowViewTest, HighlightOneCandidateWhenIndexIsValid) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   for (int index = 0; index < static_cast<int>(candidates_.size()); index++) {
     candidate_button_.index = index;
@@ -100,7 +126,7 @@
   }
 }
 
-TEST_F(SuggestionWindowViewTest, HighlightNoCandidateWhenIndexIsInvalid) {
+TEST_P(SuggestionWindowViewTest, HighlightNoCandidateWhenIndexIsInvalid) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   for (int index : {-1, static_cast<int>(candidates_.size())}) {
     candidate_button_.index = index;
@@ -111,7 +137,7 @@
   }
 }
 
-TEST_F(SuggestionWindowViewTest, HighlightTheSameCandidateWhenCalledTwice) {
+TEST_P(SuggestionWindowViewTest, HighlightTheSameCandidateWhenCalledTwice) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   int highlight_index = 0;
   candidate_button_.index = highlight_index;
@@ -122,7 +148,7 @@
   EXPECT_EQ(highlight_index, GetHighlightedIndex());
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        HighlightValidCandidateAfterGivingInvalidIndexThenValidIndex) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   int valid_index = 0;
@@ -135,7 +161,7 @@
   EXPECT_EQ(valid_index, GetHighlightedIndex());
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        KeepHighlightingValidCandidateWhenGivingValidThenInvalidIndex) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   int valid_index = 0;
@@ -148,7 +174,7 @@
   EXPECT_EQ(valid_index, GetHighlightedIndex());
 }
 
-TEST_F(SuggestionWindowViewTest, UnhighlightCandidateIfCurrentlyHighlighted) {
+TEST_P(SuggestionWindowViewTest, UnhighlightCandidateIfCurrentlyHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   candidate_button_.index = 0;
   suggestion_window_view_->SetButtonHighlighted(candidate_button_, true);
@@ -158,7 +184,7 @@
   EXPECT_FALSE(GetHighlightedIndex().has_value());
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        DoesNotUnhighlightCandidateIfNotCurrentlyHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   int highlight_index = 0;
@@ -171,7 +197,7 @@
   EXPECT_EQ(highlight_index, GetHighlightedIndex());
 }
 
-TEST_F(SuggestionWindowViewTest, DoesNotUnhighlightCandidateIfOutOfRange) {
+TEST_P(SuggestionWindowViewTest, DoesNotUnhighlightCandidateIfOutOfRange) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   int highlight_index = 0;
   candidate_button_.index = highlight_index;
@@ -186,7 +212,7 @@
   }
 }
 
-TEST_F(SuggestionWindowViewTest, HighlightsSettingLinkViewWhenNotHighlighted) {
+TEST_P(SuggestionWindowViewTest, HighlightsSettingLinkViewWhenNotHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(setting_link_view_, true);
 
@@ -195,7 +221,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        HighlightsSettingLinkViewWhenAlreadyHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(setting_link_view_, true);
@@ -206,7 +232,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest, UnhighlightsSettingLinkViewWhenHighlighted) {
+TEST_P(SuggestionWindowViewTest, UnhighlightsSettingLinkViewWhenHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(setting_link_view_, false);
 
@@ -215,7 +241,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        UnhighlightsKeepSettingLinkViewUnhighlightedWhenAlreadyNotHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(setting_link_view_, false);
@@ -226,7 +252,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest, HighlightsLearnMoreButtonWhenNotHighlighted) {
+TEST_P(SuggestionWindowViewTest, HighlightsLearnMoreButtonWhenNotHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(learn_more_button_, true);
 
@@ -235,7 +261,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        HighlightsLearnMoreButtonWhenAlreadyHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(learn_more_button_, true);
@@ -246,7 +272,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest, UnhighlightsLearnMoreButtonWhenHighlighted) {
+TEST_P(SuggestionWindowViewTest, UnhighlightsLearnMoreButtonWhenHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(learn_more_button_, false);
 
@@ -255,7 +281,7 @@
       nullptr);
 }
 
-TEST_F(SuggestionWindowViewTest,
+TEST_P(SuggestionWindowViewTest,
        UnhighlightsKeepLearnMoreButtonUnhighlightedWhenAlreadyNotHighlighted) {
   suggestion_window_view_->ShowMultipleCandidates(window_);
   suggestion_window_view_->SetButtonHighlighted(learn_more_button_, false);
@@ -266,5 +292,25 @@
       nullptr);
 }
 
+TEST_P(SuggestionWindowViewTest, DisplaysCorrectOrientationLayout) {
+  views::BoxLayout::Orientation expected_orientation;
+  switch (GetParam()) {
+    case SuggestionWindowView::Orientation::kHorizontal:
+      expected_orientation = views::BoxLayout::Orientation::kHorizontal;
+      break;
+    case SuggestionWindowView::Orientation::kVertical:
+      expected_orientation = views::BoxLayout::Orientation::kVertical;
+      break;
+    default:
+      abort();
+  }
+  suggestion_window_view_->ShowMultipleCandidates(window_);
+  views::BoxLayout::Orientation layout_orientation =
+      static_cast<views::BoxLayout*>(
+          suggestion_window_view_->GetLayoutManager())
+          ->GetOrientation();
+  EXPECT_EQ(layout_orientation, expected_orientation);
+}
+
 }  // namespace ime
 }  // namespace ui
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc
index c5632af..71c9bb4 100644
--- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc
+++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc
@@ -246,9 +246,7 @@
   if (install_attributes->IsCloudManaged()) {
     managed_session_service_ =
         std::make_unique<policy::ManagedSessionService>();
-    // TODO(b/199169968):: Pass managed_session_service_ to
-    // DeviceStatusCollector instance.
-    CreateStatusUploader();
+    CreateStatusUploader(managed_session_service_.get());
     syslog_uploader_ =
         std::make_unique<SystemLogUploader>(nullptr, task_runner_);
     heartbeat_scheduler_ = std::make_unique<HeartbeatScheduler>(
@@ -310,7 +308,8 @@
     observer.OnDeviceCloudPolicyManagerDisconnected();
 }
 
-void DeviceCloudPolicyManagerAsh::CreateStatusUploader() {
+void DeviceCloudPolicyManagerAsh::CreateStatusUploader(
+    ManagedSessionService* managed_session_service) {
   std::unique_ptr<StatusCollector> collector;
   bool granular_reporting_enabled;
   ash::CrosSettings* settings = ash::CrosSettings::Get();
@@ -322,7 +321,8 @@
 
   if (granular_reporting_enabled) {
     collector = std::make_unique<DeviceStatusCollector>(
-        local_state_, chromeos::system::StatisticsProvider::GetInstance());
+        local_state_, chromeos::system::StatisticsProvider::GetInstance(),
+        managed_session_service);
   } else {
     collector = std::make_unique<LegacyDeviceStatusCollector>(
         local_state_, chromeos::system::StatisticsProvider::GetInstance());
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h
index 3b6a3fcf..37934c5b 100644
--- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h
+++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h
@@ -161,7 +161,7 @@
   void NotifyDisconnected();
 
   // Factory function to create the StatusUploader.
-  void CreateStatusUploader();
+  void CreateStatusUploader(ManagedSessionService* managed_session_service);
 
   // Points to the same object as the base CloudPolicyManager::store(), but with
   // actual device policy specific type.
@@ -185,7 +185,7 @@
 
   // Object that monitors managed session related events used by reporting
   // services.
-  std::unique_ptr<policy::ManagedSessionService> managed_session_service_;
+  std::unique_ptr<ManagedSessionService> managed_session_service_;
 
   // Object that reports login/logout events to the server.
   std::unique_ptr<ash::reporting::LoginLogoutReporter> login_logout_reporter_;
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc
index 67f5fc0..fec2827 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -237,16 +237,17 @@
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                   std::move(allowlist), nullptr);
   }
-  if (policy.has_user_whitelist()) {
-    const em::UserWhitelistProto& container(policy.user_whitelist());
+  if (policy.has_user_whitelist()) {          // nocheck
+    const em::UserWhitelistProto& container(  // nocheck
+        policy.user_whitelist());             // nocheck
     base::Value list(base::Value::Type::LIST);
-    for (const auto& entry : container.user_whitelist())
+    for (const auto& entry : container.user_whitelist())  // nocheck
       list.Append(entry);
-    policies->Set(key::kDeviceUserWhitelist, POLICY_LEVEL_MANDATORY,
+    policies->Set(key::kDeviceUserWhitelist, POLICY_LEVEL_MANDATORY,  // nocheck
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list),
                   nullptr);
-    AddDeprecationWarning(key::kDeviceUserWhitelist, key::kDeviceUserAllowlist,
-                          policies);
+    AddDeprecationWarning(key::kDeviceUserWhitelist,  // nocheck
+                          key::kDeviceUserAllowlist, policies);
   }
 
   if (policy.has_family_link_accounts_allowed()) {
@@ -1545,9 +1546,9 @@
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                   std::move(allowlist), nullptr);
   }
-  if (policy.has_usb_detachable_whitelist()) {
-    const em::UsbDetachableWhitelistProto& container(
-        policy.usb_detachable_whitelist());
+  if (policy.has_usb_detachable_whitelist()) {         // nocheck
+    const em::UsbDetachableWhitelistProto& container(  // nocheck
+        policy.usb_detachable_whitelist());            // nocheck
     base::Value list(base::Value::Type::LIST);
     for (const auto& entry : container.id()) {
       base::Value ids(base::Value::Type::DICTIONARY);
@@ -1559,9 +1560,11 @@
       }
       list.Append(std::move(ids));
     }
-    policies->Set(key::kUsbDetachableWhitelist, POLICY_LEVEL_MANDATORY,
-                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list),
-                  nullptr);
+    policies->Set(
+        key::kUsbDetachableWhitelist, POLICY_LEVEL_MANDATORY,  // nocheck
+        POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr);
+    AddDeprecationWarning(key::kUsbDetachableWhitelist,  // nocheck
+                          key::kUsbDetachableAllowlist, policies);
   }
 
   if (policy.has_quirks_download_enabled()) {
@@ -1630,8 +1633,6 @@
     }
   }
 
-  // Use DevicePrintersBlocklist if present, fallback to
-  // DeviceNativePrintersBlacklist.
   if (policy.has_device_printers_blocklist()) {
     const em::DevicePrintersBlocklistProto& container(
         policy.device_printers_blocklist());
@@ -1642,20 +1643,21 @@
     policies->Set(key::kDevicePrintersBlocklist, POLICY_LEVEL_MANDATORY,
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                   std::move(blocklist), nullptr);
-  } else if (policy.has_native_device_printers_blacklist()) {
-    const em::DeviceNativePrintersBlacklistProto& container(
-        policy.native_device_printers_blacklist());
+  }
+  if (policy.has_native_device_printers_blacklist()) {        // nocheck
+    const em::DeviceNativePrintersBlacklistProto& container(  // nocheck
+        policy.native_device_printers_blacklist());           // nocheck
     base::Value list(base::Value::Type::LIST);
     for (const auto& entry : container.blacklist())  // nocheck
       list.Append(entry);
 
-    policies->Set(key::kDevicePrintersBlocklist, POLICY_LEVEL_MANDATORY,
-                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list),
-                  nullptr);
+    policies->Set(
+        key::kDeviceNativePrintersBlacklist, POLICY_LEVEL_MANDATORY,  // nocheck
+        POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr);
+    AddDeprecationWarning(key::kDeviceNativePrintersBlacklist,  // nocheck
+                          key::kDevicePrintersBlocklist, policies);
   }
 
-  // Use DevicePrintersAllowlist if present, fallback to
-  // DeviceNativePrintersWhitelist.
   if (policy.has_device_printers_allowlist()) {
     const em::DevicePrintersAllowlistProto& container(
         policy.device_printers_allowlist());
@@ -1666,16 +1668,19 @@
     policies->Set(key::kDevicePrintersAllowlist, POLICY_LEVEL_MANDATORY,
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                   std::move(allowlist), nullptr);
-  } else if (policy.has_native_device_printers_whitelist()) {
-    const em::DeviceNativePrintersWhitelistProto& container(
-        policy.native_device_printers_whitelist());
+  }
+  if (policy.has_native_device_printers_whitelist()) {        // nocheck
+    const em::DeviceNativePrintersWhitelistProto& container(  // nocheck
+        policy.native_device_printers_whitelist());           // nocheck
     base::Value list(base::Value::Type::LIST);
     for (const auto& entry : container.whitelist())  // nocheck
       list.Append(entry);
 
-    policies->Set(key::kDevicePrintersAllowlist, POLICY_LEVEL_MANDATORY,
-                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list),
-                  nullptr);
+    policies->Set(
+        key::kDeviceNativePrintersWhitelist, POLICY_LEVEL_MANDATORY,  // nocheck
+        POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr);
+    AddDeprecationWarning(key::kDeviceNativePrintersWhitelist,  // nocheck
+                          key::kDevicePrintersAllowlist, policies);
   }
 
   if (policy.has_external_print_servers_allowlist()) {
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
index 7aa7eda..30df2bb20 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
@@ -44,7 +44,7 @@
     "https://example.com/device_wallpaper.jpg";
 constexpr char kWallpaperHashPropertyName[] = "hash";
 constexpr char kWallpaperHashPropertyValue[] = "examplewallpaperhash";
-const char kUserWhitelist[] = "*@test-domain.com";
+const char kUserAllowlist[] = "*@test-domain.com";
 constexpr char kValidBluetoothServiceUUID4[] = "0x1124";
 constexpr char kValidBluetoothServiceUUID8[] = "0000180F";
 constexpr char kValidBluetoothServiceUUID32[] =
@@ -180,31 +180,35 @@
   EXPECT_TRUE(error.empty());
 }
 
-TEST_F(DevicePolicyDecoderTest, UserWhitelistWarning) {
+// Test checks that deprecation warning is shown for non-COIL policy.
+TEST_F(DevicePolicyDecoderTest, UserWhitelistWarning) {  // nocheck
   PolicyBundle bundle;
   PolicyMap& policies = bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, ""));
 
   base::WeakPtr<ExternalDataManager> external_data_manager;
 
   em::ChromeDeviceSettingsProto device_policy;
-  device_policy.mutable_user_whitelist()->add_user_whitelist()->assign(
-      kUserWhitelist);
+  device_policy
+      .mutable_user_whitelist()  // nocheck
+      ->add_user_whitelist()     // nocheck
+      ->assign(kUserAllowlist);
 
   DecodeDevicePolicy(device_policy, external_data_manager, &policies);
 
-  EXPECT_TRUE(policies.GetValue(key::kDeviceUserWhitelist));
+  EXPECT_TRUE(policies.GetValue(key::kDeviceUserWhitelist));  // nocheck
 
   std::vector<base::Value> list;
-  list.emplace_back(base::Value(kUserWhitelist));
+  list.emplace_back(base::Value(kUserAllowlist));
   EXPECT_EQ(base::ListValue(list),
-            *policies.GetValue(key::kDeviceUserWhitelist));
+            *policies.GetValue(key::kDeviceUserWhitelist));  // nocheck
 
   base::RepeatingCallback<std::u16string(int)> l10nlookup =
       base::BindRepeating(&l10n_util::GetStringUTF16);
 
   // Should have a deprecation warning.
   EXPECT_FALSE(
-      policies.Get(key::kDeviceUserWhitelist)
+      policies
+          .Get(key::kDeviceUserWhitelist)  // nocheck
           ->GetLocalizedMessages(PolicyMap::MessageType::kError, l10nlookup)
           .empty());
 }
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector.cc b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
index 4f61d1d..3c6aae6 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
@@ -1548,6 +1548,7 @@
 DeviceStatusCollector::DeviceStatusCollector(
     PrefService* pref_service,
     chromeos::system::StatisticsProvider* provider,
+    ManagedSessionService* managed_session_service,
     const VolumeInfoFetcher& volume_info_fetcher,
     const CPUStatisticsFetcher& cpu_statistics_fetcher,
     const CPUTempFetcher& cpu_temp_fetcher,
@@ -1571,7 +1572,7 @@
       graphics_status_fetcher_(graphics_status_fetcher),
       crash_report_info_fetcher_(crash_report_info_fetcher),
       power_manager_(chromeos::PowerManagerClient::Get()),
-      app_info_generator_(&managed_session_service_,
+      app_info_generator_(managed_session_service,
                           kMaxStoredPastActivityInterval,
                           clock_) {
   // protected fields of `StatusCollector`.
@@ -1718,10 +1719,12 @@
 
 DeviceStatusCollector::DeviceStatusCollector(
     PrefService* pref_service,
-    chromeos::system::StatisticsProvider* provider)
+    chromeos::system::StatisticsProvider* provider,
+    ManagedSessionService* managed_session_service)
     : DeviceStatusCollector(
           pref_service,
           provider,
+          managed_session_service,
           DeviceStatusCollector::VolumeInfoFetcher(),
           DeviceStatusCollector::CPUStatisticsFetcher(),
           DeviceStatusCollector::CPUTempFetcher(),
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector.h b/chrome/browser/ash/policy/status_collector/device_status_collector.h
index 7a01de7..d54d7ee 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector.h
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector.h
@@ -149,6 +149,7 @@
   DeviceStatusCollector(
       PrefService* pref_service,
       chromeos::system::StatisticsProvider* provider,
+      ManagedSessionService* managed_session_service,
       const VolumeInfoFetcher& volume_info_fetcher,
       const CPUStatisticsFetcher& cpu_statistics_fetcher,
       const CPUTempFetcher& cpu_temp_fetcher,
@@ -164,7 +165,8 @@
   // Blocking Pool. Caller is responsible for passing already initialized
   // |pref_service|.
   DeviceStatusCollector(PrefService* pref_service,
-                        chromeos::system::StatisticsProvider* provider);
+                        chromeos::system::StatisticsProvider* provider,
+                        ManagedSessionService* managed_session_service);
 
   DeviceStatusCollector(const DeviceStatusCollector&) = delete;
   DeviceStatusCollector& operator=(const DeviceStatusCollector&) = delete;
@@ -183,10 +185,6 @@
 
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
-  ManagedSessionService* GetManagedSessionServiceForTesting() {
-    return &managed_session_service_;
-  }
-
   // How often to poll to see if the user is idle.
   static constexpr base::TimeDelta kIdlePollInterval = base::Seconds(30);
 
@@ -480,8 +478,6 @@
   base::CallbackListSubscription app_info_subscription_;
   base::CallbackListSubscription stats_reporting_pref_subscription_;
 
-  ManagedSessionService managed_session_service_;
-
   AppInfoGenerator app_info_generator_;
 
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index b56f901b..e4db415 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -344,11 +344,13 @@
   TestingDeviceStatusCollector(
       PrefService* pref_service,
       chromeos::system::StatisticsProvider* provider,
+      policy::ManagedSessionService* managed_session_service,
       std::unique_ptr<TestingDeviceStatusCollectorOptions> options,
       base::SimpleTestClock* clock)
       : policy::DeviceStatusCollector(
             pref_service,
             provider,
+            managed_session_service,
             options->volume_info_fetcher,
             options->cpu_fetcher,
             options->cpu_temp_fetcher,
@@ -956,10 +958,15 @@
         ash::kReportDeviceNetworkStatus, false);
     scoped_testing_cros_settings_.device_settings()->SetBoolean(
         ash::kReportDeviceNetworkConfiguration, false);
+    managed_session_service_ =
+        std::make_unique<policy::ManagedSessionService>();
     RestartStatusCollector();
   }
 
-  void TearDown() override { status_collector_.reset(); }
+  void TearDown() override {
+    status_collector_.reset();
+    managed_session_service_.reset();
+  }
 
  protected:
   void AddMountPoint(const std::string& mount_point) {
@@ -972,10 +979,9 @@
   virtual void RestartStatusCollector(
       std::unique_ptr<TestingDeviceStatusCollectorOptions> options) {
     std::vector<em::VolumeInfo> expected_volume_info;
-    status_collector_.reset();
     status_collector_ = std::make_unique<TestingDeviceStatusCollector>(
-        &local_state_, &fake_statistics_provider_, std::move(options),
-        &test_clock_);
+        &local_state_, &fake_statistics_provider_,
+        managed_session_service_.get(), std::move(options), &test_clock_);
   }
 
   void DisableDefaultSettings() {
@@ -1215,6 +1221,7 @@
   em::SessionStatusReportRequest session_status_;
   bool got_session_status_;
   TestingPrefServiceSimple profile_pref_service_;
+  std::unique_ptr<policy::ManagedSessionService> managed_session_service_;
   std::unique_ptr<TestingDeviceStatusCollector> status_collector_;
   const policy::DeviceLocalAccount fake_kiosk_device_local_account_;
   const policy::ArcKioskAppBasicInfo fake_arc_kiosk_app_basic_info_;
@@ -3586,6 +3593,7 @@
 }
 
 TEST_F(DeviceStatusCollectorTest, TestUnsetTpmInfo) {
+  DisableDefaultSettings();
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
       ash::kReportDeviceVersionInfo, true);
   auto telemetry_info = cros_healthd::TelemetryInfo::New();
@@ -3741,8 +3749,7 @@
   MockRegularUserWithAffiliation(account_id, true);
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
       ash::kReportDeviceAppInfo, true);
-  status_collector_->GetManagedSessionServiceForTesting()->OnUserProfileLoaded(
-      account_id);
+  managed_session_service_->OnUserProfileLoaded(account_id);
   auto* app_proxy =
       apps::AppServiceProxyFactory::GetForProfile(testing_profile_.get());
   auto app1 = apps::mojom::App::New();
diff --git a/chrome/browser/ash/policy/uploading/status_uploader.cc b/chrome/browser/ash/policy/uploading/status_uploader.cc
index fdff2cd..88aa9d1 100644
--- a/chrome/browser/ash/policy/uploading/status_uploader.cc
+++ b/chrome/browser/ash/policy/uploading/status_uploader.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ash/policy/core/device_local_account.h"
 #include "chrome/browser/ash/policy/status_collector/device_status_collector.h"
 #include "chrome/browser/ash/policy/status_collector/legacy_device_status_collector.h"
+#include "chrome/browser/ash/policy/status_collector/managed_session_service.h"
 #include "chrome/browser/ash/policy/status_collector/status_collector.h"
 #include "chrome/browser/browser_process.h"
 #include "chromeos/system/statistics_provider.h"
@@ -132,8 +133,12 @@
 
   if (granular_reporting_enabled) {
     SYSLOG(INFO) << "Enabling granular reporting controls";
+    if (!managed_session_service_) {
+      managed_session_service_ = std::make_unique<ManagedSessionService>();
+    }
     collector_ = std::make_unique<DeviceStatusCollector>(
-        local_state, chromeos::system::StatisticsProvider::GetInstance());
+        local_state, chromeos::system::StatisticsProvider::GetInstance(),
+        managed_session_service_.get());
   } else {
     SYSLOG(INFO) << "Disabling granular reporting controls";
     collector_ = std::make_unique<LegacyDeviceStatusCollector>(
diff --git a/chrome/browser/ash/policy/uploading/status_uploader.h b/chrome/browser/ash/policy/uploading/status_uploader.h
index ee38d10..eea52a9 100644
--- a/chrome/browser/ash/policy/uploading/status_uploader.h
+++ b/chrome/browser/ash/policy/uploading/status_uploader.h
@@ -24,6 +24,7 @@
 namespace policy {
 
 class CloudPolicyClient;
+class ManagedSessionService;
 class StatusCollector;
 struct StatusCollectorParams;
 
@@ -91,6 +92,11 @@
   // CloudPolicyClient used to issue requests to the server.
   CloudPolicyClient* client_;
 
+  // Used to initialize a |ManagedSessionService| instance and pass the
+  // underlying raw ptr to |DeviceStatusCollector| whenever constructed in
+  // |UpdateStatusCollector|.
+  std::unique_ptr<ManagedSessionService> managed_session_service_;
+
   // StatusCollector that provides status for uploading.
   std::unique_ptr<StatusCollector> collector_;
 
diff --git a/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc b/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc
index e2a6516..658e611b 100644
--- a/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc
+++ b/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc
@@ -53,7 +53,7 @@
 class MockDeviceStatusCollector : public policy::DeviceStatusCollector {
  public:
   explicit MockDeviceStatusCollector(PrefService* local_state)
-      : DeviceStatusCollector(local_state, nullptr) {}
+      : DeviceStatusCollector(local_state, nullptr, nullptr) {}
   MOCK_METHOD1(GetStatusAsync, void(policy::StatusCollectorCallback));
 
   MOCK_METHOD0(OnSubmittedSuccessfully, void());
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc
index 1d9742c8e..cd0abbb 100644
--- a/chrome/browser/ash/settings/device_settings_provider.cc
+++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -318,8 +318,8 @@
   DecodeAllowedUsers(policy, new_values_cache);
 
   bool user_allowlist_enforced =
-      ((policy.has_user_whitelist() &&
-        policy.user_whitelist().user_whitelist_size() > 0) ||
+      ((policy.has_user_whitelist() &&                         // nocheck
+        policy.user_whitelist().user_whitelist_size() > 0) ||  // nocheck
        (policy.has_user_allowlist() &&
         policy.user_allowlist().user_allowlist_size() > 0));
   new_values_cache->SetBoolean(
@@ -358,10 +358,11 @@
       list.push_back(base::Value(value));
     }
   } else {
-    const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
-    const RepeatedPtrField<std::string>& whitelist =
-        whitelist_proto.user_whitelist();
-    for (const std::string& value : whitelist) {
+    const em::UserWhitelistProto& whitelist_proto =   // nocheck
+        policy.user_whitelist();                      // nocheck
+    const RepeatedPtrField<std::string>& whitelist =  // nocheck
+        whitelist_proto.user_whitelist();             // nocheck
+    for (const std::string& value : whitelist) {      // nocheck
       list.push_back(base::Value(value));
     }
   }
@@ -1076,7 +1077,7 @@
   }
   new_values_cache->SetInteger(kDevicePrintersAccessMode, access_mode);
 
-  // Use Blocklist policy if present, otherwise Blacklist version.
+  // Use Blocklist policy if present, otherwise Blacklist version.  // nocheck
   if (policy.has_device_printers_blocklist()) {
     base::Value list(base::Value::Type::LIST);
     const em::DevicePrintersBlocklistProto& proto(
@@ -1084,16 +1085,16 @@
     for (const auto& id : proto.blocklist())
       list.Append(id);
     new_values_cache->SetValue(kDevicePrintersBlocklist, std::move(list));
-  } else if (policy.has_native_device_printers_blacklist()) {
+  } else if (policy.has_native_device_printers_blacklist()) {  // nocheck
     base::Value list(base::Value::Type::LIST);
-    const em::DeviceNativePrintersBlacklistProto& proto(
-        policy.native_device_printers_blacklist());
-    for (const auto& id : proto.blacklist())
+    const em::DeviceNativePrintersBlacklistProto& proto(  // nocheck
+        policy.native_device_printers_blacklist());       // nocheck
+    for (const auto& id : proto.blacklist())              // nocheck
       list.Append(id);
     new_values_cache->SetValue(kDevicePrintersBlocklist, std::move(list));
   }
 
-  // Use Allowlist policy if present, otherwise Whitelist version.
+  // Use Allowlist policy if present, otherwise Whitelist version.  // nocheck
   if (policy.has_device_printers_allowlist()) {
     base::Value list(base::Value::Type::LIST);
     const em::DevicePrintersAllowlistProto& proto(
@@ -1101,11 +1102,11 @@
     for (const auto& id : proto.allowlist())
       list.Append(id);
     new_values_cache->SetValue(kDevicePrintersAllowlist, std::move(list));
-  } else if (policy.has_native_device_printers_whitelist()) {
+  } else if (policy.has_native_device_printers_whitelist()) {  // nocheck
     base::Value list(base::Value::Type::LIST);
-    const em::DeviceNativePrintersWhitelistProto& proto(
-        policy.native_device_printers_whitelist());
-    for (const auto& id : proto.whitelist())
+    const em::DeviceNativePrintersWhitelistProto& proto(  // nocheck
+        policy.native_device_printers_whitelist());       // nocheck
+    for (const auto& id : proto.whitelist())              // nocheck
       list.Append(id);
     new_values_cache->SetValue(kDevicePrintersAllowlist, std::move(list));
   }
@@ -1196,9 +1197,9 @@
       allowlist.Append(std::move(ids));
     }
     new_values_cache->SetValue(kUsbDetachableAllowlist, std::move(allowlist));
-  } else if (policy.has_usb_detachable_whitelist()) {
-    const em::UsbDetachableWhitelistProto& container =
-        policy.usb_detachable_whitelist();
+  } else if (policy.has_usb_detachable_whitelist()) {   // nocheck
+    const em::UsbDetachableWhitelistProto& container =  // nocheck
+        policy.usb_detachable_whitelist();              // nocheck
     base::Value allowlist(base::Value::Type::LIST);
     for (const auto& entry : container.id()) {
       base::Value ids(base::Value::Type::DICTIONARY);
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
index fc8856f..c948251 100644
--- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -390,11 +390,13 @@
     proto->set_access_mode(access_mode);
   }
 
-  void SetNativeDevicePrintersBlacklist(std::vector<std::string>& values) {
-    em::DeviceNativePrintersBlacklistProto* proto =
-        device_policy_->payload().mutable_native_device_printers_blacklist();
+  void SetNativeDevicePrintersBlacklist(  // nocheck
+      std::vector<std::string>& values) {
+    em::DeviceNativePrintersBlacklistProto* proto =  // nocheck
+        device_policy_->payload()
+            .mutable_native_device_printers_blacklist();  // nocheck
     for (auto const& value : values) {
-      proto->add_blacklist(value);
+      proto->add_blacklist(value);  // nocheck
     }
   }
 
@@ -406,11 +408,13 @@
     }
   }
 
-  void SetNativeDevicePrintersWhitelist(std::vector<std::string>& values) {
-    em::DeviceNativePrintersWhitelistProto* proto =
-        device_policy_->payload().mutable_native_device_printers_whitelist();
+  void SetNativeDevicePrintersWhitelist(  // nocheck
+      std::vector<std::string>& values) {
+    em::DeviceNativePrintersWhitelistProto* proto =  // nocheck
+        device_policy_->payload()
+            .mutable_native_device_printers_whitelist();  // nocheck
     for (auto const& value : values) {
-      proto->add_whitelist(value);
+      proto->add_whitelist(value);  // nocheck
     }
   }
 
@@ -1087,9 +1091,9 @@
 }
 
 TEST_F(DeviceSettingsProviderTest, DevicePrintersAccessMode_native) {
-  // WHITELIST => ALLOWLIST
-  SetNativeDevicePrinterAccessMode(
-      em::DeviceNativePrintersAccessModeProto::ACCESS_MODE_WHITELIST);
+  // WHITELIST => ALLOWLIST  // nocheck
+  SetNativeDevicePrinterAccessMode(em::DeviceNativePrintersAccessModeProto::
+                                       ACCESS_MODE_WHITELIST);  // nocheck
   BuildAndInstallDevicePolicy();
   base::Value expected_value(
       em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST);
@@ -1107,8 +1111,8 @@
 
 TEST_F(DeviceSettingsProviderTest, DevicePrintersAccessMode_both) {
   // If both are set use the DevicePrintersAccessMode
-  SetNativeDevicePrinterAccessMode(
-      em::DeviceNativePrintersAccessModeProto::ACCESS_MODE_BLACKLIST);
+  SetNativeDevicePrinterAccessMode(em::DeviceNativePrintersAccessModeProto::
+                                       ACCESS_MODE_BLACKLIST);  // nocheck
   SetDevicePrinterAccessMode(
       em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST);
   BuildAndInstallDevicePolicy();
@@ -1122,11 +1126,12 @@
   VerifyPolicyValue(kDevicePrintersBlocklist, nullptr);
 }
 
-TEST_F(DeviceSettingsProviderTest, DevicePrintersBlocklist_blacklist) {
+TEST_F(DeviceSettingsProviderTest,
+       DevicePrintersBlocklist_blacklist) {  // nocheck
   std::vector<std::string> values = {"foo", "bar"};
 
-  // If the blacklist only is set, use that.
-  SetNativeDevicePrintersBlacklist(values);
+  // If the blacklist only is set, use that.  // nocheck
+  SetNativeDevicePrintersBlacklist(values);  // nocheck
   BuildAndInstallDevicePolicy();
   VerifyDevicePrinterList(kDevicePrintersBlocklist, values);
 }
@@ -1145,7 +1150,7 @@
   std::vector<std::string> other_values = {"baz"};
 
   // If both are set use the blocklist
-  SetNativeDevicePrintersBlacklist(other_values);
+  SetNativeDevicePrintersBlacklist(other_values);  // nocheck
   SetDevicePrintersBlocklist(values);
   BuildAndInstallDevicePolicy();
   VerifyDevicePrinterList(kDevicePrintersBlocklist, values);
@@ -1156,11 +1161,12 @@
   VerifyPolicyValue(kDevicePrintersAllowlist, nullptr);
 }
 
-TEST_F(DeviceSettingsProviderTest, DevicePrintersAllowlist_whitelist) {
+TEST_F(DeviceSettingsProviderTest,
+       DevicePrintersAllowlist_whitelist) {  // nocheck
   std::vector<std::string> values = {"foo", "bar"};
 
-  // If the blacklist only is set, use that.
-  SetNativeDevicePrintersWhitelist(values);
+  // If the whitelist only is set, use that.  // nocheck
+  SetNativeDevicePrintersWhitelist(values);  // nocheck
   BuildAndInstallDevicePolicy();
   VerifyDevicePrinterList(kDevicePrintersAllowlist, values);
 }
@@ -1168,7 +1174,7 @@
 TEST_F(DeviceSettingsProviderTest, DevicePrintersAllowlist_allowlist) {
   std::vector<std::string> values = {"foo", "bar"};
 
-  // If the blocklist only is set, use that.
+  // If the allowlist only is set, use that.
   SetDevicePrintersAllowlist(values);
   BuildAndInstallDevicePolicy();
   VerifyDevicePrinterList(kDevicePrintersAllowlist, values);
@@ -1178,8 +1184,8 @@
   std::vector<std::string> values = {"foo", "bar"};
   std::vector<std::string> other_values = {"baz"};
 
-  // If both are set use the blocklist
-  SetNativeDevicePrintersWhitelist(other_values);
+  // If both are set use the allowlist
+  SetNativeDevicePrintersWhitelist(other_values);  // nocheck
   SetDevicePrintersAllowlist(values);
   BuildAndInstallDevicePolicy();
   VerifyDevicePrinterList(kDevicePrintersAllowlist, values);
diff --git a/chrome/browser/sync/sync_error_notifier_ash.cc b/chrome/browser/ash/sync/sync_error_notifier.cc
similarity index 98%
rename from chrome/browser/sync/sync_error_notifier_ash.cc
rename to chrome/browser/ash/sync/sync_error_notifier.cc
index 78e7618d..78c7a27 100644
--- a/chrome/browser/sync/sync_error_notifier_ash.cc
+++ b/chrome/browser/ash/sync/sync_error_notifier.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/sync/sync_error_notifier_ash.h"
+#include "chrome/browser/ash/sync/sync_error_notifier.h"
 
 #include "ash/public/cpp/notification_utils.h"
 #include "base/bind.h"
@@ -33,6 +33,7 @@
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/message_center/public/cpp/notification_delegate.h"
 
+namespace ash {
 namespace {
 
 const char kProfileSyncNotificationId[] = "chrome://settings/sync/";
@@ -190,3 +191,5 @@
                            /*metadata=*/nullptr);
   notification_displayed_ = true;
 }
+
+}  // namespace ash
diff --git a/chrome/browser/sync/sync_error_notifier_ash.h b/chrome/browser/ash/sync/sync_error_notifier.h
similarity index 86%
rename from chrome/browser/sync/sync_error_notifier_ash.h
rename to chrome/browser/ash/sync/sync_error_notifier.h
index 8c1845c8..4d80de5 100644
--- a/chrome/browser/sync/sync_error_notifier_ash.h
+++ b/chrome/browser/ash/sync/sync_error_notifier.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_ASH_H_
-#define CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_ASH_H_
+#ifndef CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_H_
+#define CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_H_
 
 #include <string>
 
@@ -12,6 +12,8 @@
 
 class Profile;
 
+namespace ash {
+
 // Shows sync-related errors as notifications in Ash.
 class SyncErrorNotifier : public syncer::SyncServiceObserver,
                           public KeyedService {
@@ -45,4 +47,6 @@
   std::string notification_id_;
 };
 
-#endif  // CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_ASH_H_
+}  // namespace ash
+
+#endif  // CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_H_
diff --git a/chrome/browser/sync/sync_error_notifier_factory_ash.cc b/chrome/browser/ash/sync/sync_error_notifier_factory.cc
similarity index 84%
rename from chrome/browser/sync/sync_error_notifier_factory_ash.cc
rename to chrome/browser/ash/sync/sync_error_notifier_factory.cc
index c8b42704..e4791ae1 100644
--- a/chrome/browser/sync/sync_error_notifier_factory_ash.cc
+++ b/chrome/browser/ash/sync/sync_error_notifier_factory.cc
@@ -2,14 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
+#include "chrome/browser/ash/sync/sync_error_notifier_factory.h"
 
+#include "chrome/browser/ash/sync/sync_error_notifier.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sync/sync_error_notifier_ash.h"
 #include "chrome/browser/sync/sync_service_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
+namespace ash {
+
 SyncErrorNotifierFactory::SyncErrorNotifierFactory()
     : BrowserContextKeyedServiceFactory(
           "SyncErrorNotifier",
@@ -17,7 +19,7 @@
   DependsOn(SyncServiceFactory::GetInstance());
 }
 
-SyncErrorNotifierFactory::~SyncErrorNotifierFactory() {}
+SyncErrorNotifierFactory::~SyncErrorNotifierFactory() = default;
 
 // static
 SyncErrorNotifier* SyncErrorNotifierFactory::GetForProfile(Profile* profile) {
@@ -41,3 +43,5 @@
 
   return new SyncErrorNotifier(sync_service, profile);
 }
+
+}  // namespace ash
diff --git a/chrome/browser/sync/sync_error_notifier_factory_ash.h b/chrome/browser/ash/sync/sync_error_notifier_factory.h
similarity index 84%
rename from chrome/browser/sync/sync_error_notifier_factory_ash.h
rename to chrome/browser/ash/sync/sync_error_notifier_factory.h
index 1dc3e3b1..9f6c42c 100644
--- a/chrome/browser/sync/sync_error_notifier_factory_ash.h
+++ b/chrome/browser/ash/sync/sync_error_notifier_factory.h
@@ -2,15 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_ASH_H_
-#define CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_ASH_H_
+#ifndef CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_H_
+#define CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_H_
 
 #include "base/memory/singleton.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 
-class SyncErrorNotifier;
 class Profile;
 
+namespace ash {
+
+class SyncErrorNotifier;
+
 // Singleton that owns all SyncErrorNotifiers and associates them with
 // Profiles. Listens for the Profile's destruction notification and cleans up
 // the associated SyncErrorNotifier.
@@ -37,4 +40,6 @@
       content::BrowserContext* profile) const override;
 };
 
-#endif  // CHROME_BROWSER_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_ASH_H_
+}  // namespace ash
+
+#endif  // CHROME_BROWSER_ASH_SYNC_SYNC_ERROR_NOTIFIER_FACTORY_H_
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/ash/sync/sync_error_notifier_unittest.cc
similarity index 97%
rename from chrome/browser/sync/sync_error_notifier_ash_unittest.cc
rename to chrome/browser/ash/sync/sync_error_notifier_unittest.cc
index 824ad68e..249cad9 100644
--- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
+++ b/chrome/browser/ash/sync/sync_error_notifier_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/sync/sync_error_notifier_ash.h"
+#include "chrome/browser/ash/sync/sync_error_notifier.h"
 
 #include <memory>
 
@@ -19,6 +19,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/message_center/public/cpp/notification.h"
 
+namespace ash {
+
 namespace {
 
 // Notification ID corresponding to kProfileSyncNotificationId + the test
@@ -122,3 +124,4 @@
 }
 
 }  // namespace
+}  // namespace ash
diff --git a/chrome/browser/ash/system_extensions/api/hid/BUILD.gn b/chrome/browser/ash/system_extensions/api/hid/BUILD.gn
new file mode 100644
index 0000000..d6f87c41
--- /dev/null
+++ b/chrome/browser/ash/system_extensions/api/hid/BUILD.gn
@@ -0,0 +1,21 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# 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")
+
+assert(is_chromeos_ash)
+
+source_set("hid") {
+  sources = [
+    "hid_impl.cc",
+    "hid_impl.h",
+  ]
+  deps = [
+    "//chrome/browser/profiles:profile",
+    "//content/public/browser",
+    "//services/device/hid",
+    "//services/device/public/mojom",
+    "//third_party/blink/public/mojom:mojom_platform",
+  ]
+}
diff --git a/chrome/browser/ash/system_extensions/api/hid/DEPS b/chrome/browser/ash/system_extensions/api/hid/DEPS
new file mode 100644
index 0000000..160568f0
--- /dev/null
+++ b/chrome/browser/ash/system_extensions/api/hid/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+    "+services/device/public/mojom/hid.mojom.h",
+    "+services/device/public/mojom/hid.mojom-forward.h",
+    "+services/device/hid/hid_service.h",
+]
\ No newline at end of file
diff --git a/chrome/browser/ash/system_extensions/api/hid/hid_impl.cc b/chrome/browser/ash/system_extensions/api/hid/hid_impl.cc
new file mode 100644
index 0000000..71a150ee
--- /dev/null
+++ b/chrome/browser/ash/system_extensions/api/hid/hid_impl.cc
@@ -0,0 +1,136 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/system_extensions/api/hid/hid_impl.h"
+
+#include <utility>
+
+#include "base/ranges/algorithm.h"
+#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/device_service.h"
+#include "services/device/hid/hid_service.h"
+#include "third_party/blink/public/mojom/hid/hid.mojom.h"
+
+namespace ash {
+
+HIDImpl::HIDImpl(content::BrowserContext* browser_context)
+    : browser_context_(browser_context) {
+  // TODO(b/214330822): Remove this when browser_context_ is used.
+  (void)browser_context_;
+}
+
+HIDImpl::~HIDImpl() {}
+
+void HIDImpl::AccessDevices(
+    std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+    AccessDevicesCallback callback) {
+  GetHidManager()->GetDevices(
+      base::BindOnce(&HIDImpl::OnGotDevices, weak_factory_.GetWeakPtr(),
+                     std::move(filters), std::move(callback)));
+}
+
+void HIDImpl::OnGotDevices(
+    std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+    AccessDevicesCallback callback,
+    std::vector<device::mojom::HidDeviceInfoPtr> devices) {
+  std::vector<device::mojom::HidDeviceInfoPtr> filtered_devices;
+  for (auto& device : devices) {
+    if (FilterMatchesAny(*device, filters))
+      filtered_devices.push_back(std::move(device));
+  }
+
+  std::move(callback).Run(std::move(filtered_devices));
+}
+
+bool HIDImpl::FilterMatchesAny(
+    const device::mojom::HidDeviceInfo& device,
+    const std::vector<blink::mojom::HidDeviceFilterPtr>& filters) const {
+  // TODO(b/216239205): Reuse HidChooserController::FilterMatchesAny after
+  // refactoring it.
+
+  if (filters.empty())
+    return true;
+
+  for (const auto& filter : filters) {
+    if (filter->device_ids) {
+      if (filter->device_ids->is_vendor()) {
+        if (filter->device_ids->get_vendor() != device.vendor_id)
+          continue;
+      } else if (filter->device_ids->is_vendor_and_product()) {
+        const auto& vendor_and_product =
+            filter->device_ids->get_vendor_and_product();
+        if (vendor_and_product->vendor != device.vendor_id)
+          continue;
+        if (vendor_and_product->product != device.product_id)
+          continue;
+      }
+    }
+
+    if (filter->usage) {
+      if (filter->usage->is_page()) {
+        const uint16_t usage_page = filter->usage->get_page();
+        if (!base::ranges::any_of(
+                device.collections,
+                [&usage_page](const device::mojom::HidCollectionInfoPtr& c) {
+                  return usage_page == c->usage->usage_page;
+                })) {
+          continue;
+        }
+      } else if (filter->usage->is_usage_and_page()) {
+        const auto& usage_and_page = filter->usage->get_usage_and_page();
+        if (!base::ranges::any_of(
+                device.collections,
+                [&usage_and_page](
+                    const device::mojom::HidCollectionInfoPtr& c) {
+                  return usage_and_page->usage_page == c->usage->usage_page &&
+                         usage_and_page->usage == c->usage->usage;
+                  ;
+                })) {
+          continue;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  return false;
+}
+
+void HIDImpl::EnsureHidManagerConnection() {
+  if (hid_manager_remote_)
+    return;
+
+  mojo::PendingRemote<device::mojom::HidManager> manager;
+  content::GetDeviceService().BindHidManager(
+      manager.InitWithNewPipeAndPassReceiver());
+  SetUpHidManagerConnection(std::move(manager));
+}
+
+void HIDImpl::SetUpHidManagerConnection(
+    mojo::PendingRemote<device::mojom::HidManager> manager) {
+  hid_manager_remote_.Bind(std::move(manager));
+
+  hid_manager_remote_->GetDevicesAndSetClient(
+      hid_manager_client_associated_receiver_.BindNewEndpointAndPassRemote(),
+      base::BindOnce(&HIDImpl::InitDeviceList, weak_factory_.GetWeakPtr()));
+}
+
+void HIDImpl::InitDeviceList(
+    std::vector<device::mojom::HidDeviceInfoPtr> devices) {
+  for (auto& device : devices)
+    device_map_.insert({device->guid, std::move(device)});
+
+  device_map_is_initialized_ = true;
+}
+
+device::mojom::HidManager* HIDImpl::GetHidManager() {
+  EnsureHidManagerConnection();
+  return hid_manager_remote_.get();
+}
+
+void HIDImpl::DeviceAdded(device::mojom::HidDeviceInfoPtr device_info) {}
+void HIDImpl::DeviceRemoved(device::mojom::HidDeviceInfoPtr device_info) {}
+void HIDImpl::DeviceChanged(device::mojom::HidDeviceInfoPtr device_info) {}
+}  // namespace ash
diff --git a/chrome/browser/ash/system_extensions/api/hid/hid_impl.h b/chrome/browser/ash/system_extensions/api/hid/hid_impl.h
new file mode 100644
index 0000000..23a86dc
--- /dev/null
+++ b/chrome/browser/ash/system_extensions/api/hid/hid_impl.h
@@ -0,0 +1,71 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_SYSTEM_EXTENSIONS_API_HID_HID_IMPL_H_
+#define CHROME_BROWSER_ASH_SYSTEM_EXTENSIONS_API_HID_HID_IMPL_H_
+
+#include <map>
+#include <vector>
+
+#include "base/containers/queue.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "services/device/public/mojom/hid.mojom.h"
+#include "third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom.h"
+#include "third_party/blink/public/mojom/hid/hid.mojom-forward.h"
+
+namespace content {
+class BrowserContext;
+}
+
+namespace ash {
+
+class HIDImpl : public blink::mojom::CrosHID,
+                public device::mojom::HidManagerClient {
+ public:
+  explicit HIDImpl(content::BrowserContext* browser_context);
+  ~HIDImpl() override;
+
+  void AccessDevices(std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+                     AccessDevicesCallback callback) override;
+
+  // device::mojom::HidManagerClient implementation:
+  void DeviceAdded(device::mojom::HidDeviceInfoPtr device_info) override;
+  void DeviceRemoved(device::mojom::HidDeviceInfoPtr device_info) override;
+  void DeviceChanged(device::mojom::HidDeviceInfoPtr device_info) override;
+
+  device::mojom::HidManager* GetHidManager();
+
+ private:
+  void OnGotDevices(std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+                    AccessDevicesCallback callback,
+                    std::vector<device::mojom::HidDeviceInfoPtr> devices);
+  bool FilterMatchesAny(
+      const device::mojom::HidDeviceInfo& device,
+      const std::vector<blink::mojom::HidDeviceFilterPtr>& filters) const;
+
+  void EnsureHidManagerConnection();
+  void SetUpHidManagerConnection(
+      mojo::PendingRemote<device::mojom::HidManager> manager);
+  void InitDeviceList(std::vector<device::mojom::HidDeviceInfoPtr> devices);
+
+  content::BrowserContext* browser_context_;
+
+  mojo::Remote<device::mojom::HidManager> hid_manager_remote_;
+  mojo::AssociatedReceiver<device::mojom::HidManagerClient>
+      hid_manager_client_associated_receiver_{this};
+
+  // Map from device GUID to device info.
+  std::map<std::string, device::mojom::HidDeviceInfoPtr> device_map_;
+  bool device_map_is_initialized_ = false;
+
+  // Last member definition.
+  base::WeakPtrFactory<HIDImpl> weak_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // CHROME_BROWSER_ASH_SYSTEM_EXTENSIONS_API_HID_HID_IMPL_H_
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
index c43de5f..b0c9452 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
@@ -179,11 +179,21 @@
 
 }  // namespace
 
-class PersonalizationAppWallpaperProviderImplTest : public testing::Test {
+class PersonalizationAppWallpaperProviderImplTest
+    : public testing::Test,
+      public testing::WithParamInterface<bool /* google_photos_enabled */> {
  public:
   PersonalizationAppWallpaperProviderImplTest()
       : scoped_user_manager_(std::make_unique<ash::FakeChromeUserManager>()),
-        profile_manager_(TestingBrowserProcess::GetGlobal()) {}
+        profile_manager_(TestingBrowserProcess::GetGlobal()) {
+    std::vector<base::Feature> features = {ash::features::kWallpaperWebUI};
+    if (GooglePhotosEnabled())
+      features.push_back(ash::features::kWallpaperGooglePhotosIntegration);
+    // Note: `scoped_feature_list_` should be initialized before `SetUp()`
+    // (see crbug.com/846380).
+    scoped_feature_list_.InitWithFeatures(features, /*disabled_features=*/{});
+  }
+
   PersonalizationAppWallpaperProviderImplTest(
       const PersonalizationAppWallpaperProviderImplTest&) = delete;
   PersonalizationAppWallpaperProviderImplTest& operator=(
@@ -193,7 +203,6 @@
  protected:
   // testing::Test:
   void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(ash::features::kWallpaperWebUI);
     wallpaper_controller_client_ =
         std::make_unique<WallpaperControllerClientImpl>();
     wallpaper_controller_client_->InitForTesting(&test_wallpaper_controller_);
@@ -221,6 +230,10 @@
     wallpaper_provider_->image_asset_id_map_.insert({asset_id, image_info});
   }
 
+  // Returns true if the test should run with the Google Photos Wallpaper
+  // integration enabled, false otherwise.
+  bool GooglePhotosEnabled() const { return GetParam(); }
+
   TestWallpaperController* test_wallpaper_controller() {
     return &test_wallpaper_controller_;
   }
@@ -247,6 +260,9 @@
   }
 
  private:
+  // Note: `scoped_feature_list_` should be destroyed after `task_environment_`
+  // (see crbug.com/846380).
+  base::test::ScopedFeatureList scoped_feature_list_;
   content::BrowserTaskEnvironment task_environment_;
   TestingPrefServiceSimple pref_service_;
   // Required for |ScopedTestCrosSettings|.
@@ -269,10 +285,13 @@
       wallpaper_provider_remote_;
   TestWallpaperObserver test_wallpaper_observer_;
   std::unique_ptr<PersonalizationAppWallpaperProviderImpl> wallpaper_provider_;
-  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-TEST_F(PersonalizationAppWallpaperProviderImplTest, SelectWallpaper) {
+INSTANTIATE_TEST_SUITE_P(All,
+                         PersonalizationAppWallpaperProviderImplTest,
+                         /*google_photos_enabled=*/::testing::Values(false));
+
+TEST_P(PersonalizationAppWallpaperProviderImplTest, SelectWallpaper) {
   test_wallpaper_controller()->ClearCounts();
 
   const uint64_t asset_id = 1;
@@ -305,7 +324,7 @@
             test_wallpaper_controller()->wallpaper_info().value());
 }
 
-TEST_F(PersonalizationAppWallpaperProviderImplTest, PreviewWallpaper) {
+TEST_P(PersonalizationAppWallpaperProviderImplTest, PreviewWallpaper) {
   test_wallpaper_controller()->ClearCounts();
 
   const uint64_t asset_id = 1;
@@ -338,7 +357,7 @@
             test_wallpaper_controller()->wallpaper_info().value());
 }
 
-TEST_F(PersonalizationAppWallpaperProviderImplTest,
+TEST_P(PersonalizationAppWallpaperProviderImplTest,
        ObserveWallpaperFiresWhenBound) {
   // This will create the data url referenced below in expectation.
   test_wallpaper_controller()->ShowWallpaperImage(
@@ -385,30 +404,12 @@
 }
 
 class PersonalizationAppWallpaperProviderImplGooglePhotosTest
-    : public PersonalizationAppWallpaperProviderImplTest,
-      public testing::WithParamInterface<bool /* google_photos_enabled */> {
- public:
-  // Returns true if the test should run with the Google Photos Wallpaper
-  // integration enabled, false otherwise.
-  bool GooglePhotosEnabled() const { return GetParam(); }
-
+    : public PersonalizationAppWallpaperProviderImplTest {
  protected:
   // The number of times to start each idempotent API query.
   static constexpr size_t kNumFetches = 2;
-
   // Resume token value used across several tests.
   const std::string kResumeToken = "token";
-
-  // PersonalizationAppWallpaperProviderImplTest:
-  void SetUp() override {
-    PersonalizationAppWallpaperProviderImplTest::SetUp();
-    scoped_feature_list_.InitWithFeatureState(
-        ash::features::kWallpaperGooglePhotosIntegration,
-        GooglePhotosEnabled());
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/attribution_reporting/android/internal/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProviderImplRobolectricTest.java b/chrome/browser/attribution_reporting/android/internal/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProviderImplRobolectricTest.java
index 050a2af..e2e1a5f 100644
--- a/chrome/browser/attribution_reporting/android/internal/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProviderImplRobolectricTest.java
+++ b/chrome/browser/attribution_reporting/android/internal/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProviderImplRobolectricTest.java
@@ -30,6 +30,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.annotation.internal.DoNotInstrument;
 import org.robolectric.shadows.ShadowSystemClock;
 
@@ -57,6 +58,7 @@
         manifest = Config.NONE,
         shadows = {AttributionReportingProviderImplRobolectricTest.ShadowProvider.class,
                 ShadowSystemClock.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 @DoNotInstrument
 public class AttributionReportingProviderImplRobolectricTest {
     @Implements(SplitCompatContentProvider.Impl.class)
diff --git a/chrome/browser/background/background_contents.cc b/chrome/browser/background/background_contents.cc
index c90aac1..b1d2e43 100644
--- a/chrome/browser/background/background_contents.cc
+++ b/chrome/browser/background/background_contents.cc
@@ -33,7 +33,7 @@
     content::RenderFrameHost* opener,
     bool is_new_browsing_instance,
     Delegate* delegate,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace)
     : delegate_(delegate),
       extension_host_delegate_(extensions::ExtensionsBrowserClient::Get()
@@ -51,7 +51,7 @@
   if (session_storage_namespace) {
     content::SessionStorageNamespaceMap session_storage_namespace_map;
     session_storage_namespace_map.insert(
-        std::make_pair(partition_id, session_storage_namespace));
+        std::make_pair(partition_config, session_storage_namespace));
     web_contents_ = WebContents::CreateWithSessionStorage(
         create_params, session_storage_namespace_map);
   } else {
diff --git a/chrome/browser/background/background_contents.h b/chrome/browser/background/background_contents.h
index 7064f93..4553ec87f 100644
--- a/chrome/browser/background/background_contents.h
+++ b/chrome/browser/background/background_contents.h
@@ -64,7 +64,7 @@
       content::RenderFrameHost* opener,
       bool is_new_browsing_instance,
       Delegate* delegate,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace);
 
   BackgroundContents(const BackgroundContents&) = delete;
diff --git a/chrome/browser/background/background_contents_service.cc b/chrome/browser/background/background_contents_service.cc
index a75b218..28d9f4e8 100644
--- a/chrome/browser/background/background_contents_service.cc
+++ b/chrome/browser/background/background_contents_service.cc
@@ -587,7 +587,8 @@
 
   BackgroundContents* contents = CreateBackgroundContents(
       SiteInstance::CreateForURL(profile_, url), nullptr, true, frame_name,
-      application_id, content::StoragePartitionId(profile_), nullptr);
+      application_id, content::StoragePartitionConfig::CreateDefault(profile_),
+      nullptr);
 
   contents->CreateRendererSoon(url);
 }
@@ -598,10 +599,10 @@
     bool is_new_browsing_instance,
     const std::string& frame_name,
     const std::string& application_id,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace) {
   auto contents = std::make_unique<BackgroundContents>(
-      std::move(site), opener, is_new_browsing_instance, this, partition_id,
+      std::move(site), opener, is_new_browsing_instance, this, partition_config,
       session_storage_namespace);
   BackgroundContents* contents_ptr = contents.get();
   AddBackgroundContents(std::move(contents), application_id, frame_name);
diff --git a/chrome/browser/background/background_contents_service.h b/chrome/browser/background/background_contents_service.h
index 81b2db9..029b901 100644
--- a/chrome/browser/background/background_contents_service.h
+++ b/chrome/browser/background/background_contents_service.h
@@ -132,7 +132,7 @@
       bool is_new_browsing_instance,
       const std::string& frame_name,
       const std::string& application_id,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace);
 
   // Removes |contents| from |contents_map_|, deleting it.
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index 7ac7011..7427835 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -435,11 +435,18 @@
 void BackgroundModeManager::LaunchBackgroundApplication(
     Profile* profile,
     const Extension* extension) {
+#if !BUILDFLAG(IS_CHROMEOS)
   apps::AppServiceProxyFactory::GetForProfile(profile)
       ->BrowserAppLauncher()
       ->LaunchAppWithParams(CreateAppLaunchParamsUserContainer(
           profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
           apps::mojom::LaunchSource::kFromBackgroundMode));
+#else
+  // background mode is not used in Chrome OS platform.
+  // TODO(crbug.com/1291803): Remove the background mode manager from Chrome OS
+  // build.
+  NOTIMPLEMENTED();
+#endif
 }
 
 // static
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 917de2a..2f2a897 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -63,6 +63,7 @@
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/chrome_browser_field_trials.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
+#include "chrome/browser/component_updater/first_party_sets_component_installer.h"
 #include "chrome/browser/component_updater/registration.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/first_party_sets/first_party_sets_util.h"
@@ -1610,6 +1611,9 @@
   // called inside PostProfileInit and depends on it.
   if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) {
     component_updater::RegisterComponentsForUpdate();
+  } else {
+    component_updater::FirstPartySetsComponentInstallerPolicy::
+        SendFileToNetworkService(base::File());
   }
 
   // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts.
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index 5565969..42b1f58 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -59,12 +59,14 @@
 #include "chrome/browser/win/conflicts/module_database.h"
 #include "chrome/browser/win/conflicts/module_event_sink_impl.h"
 #elif BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/system_extensions/api/hid/hid_impl.h"
 #include "chrome/browser/ash/system_extensions/api/window_management/window_management_impl.h"
 #include "chrome/browser/ash/system_extensions/system_extension.h"
 #include "chrome/browser/ash/system_extensions/system_extensions_provider.h"
 #include "chromeos/components/cdm_factory_daemon/cdm_factory_daemon_proxy_ash.h"
 #include "components/performance_manager/public/performance_manager.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom.h"
 #include "third_party/blink/public/mojom/chromeos/system_extensions/window_management/cros_window_management.mojom.h"
 #if defined(ARCH_CPU_X86_64)
 #include "chrome/browser/performance_manager/mechanisms/userspace_swap_chromeos.h"
@@ -390,6 +392,38 @@
         }));
   }
 #endif
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // TODO(b/210738172): Only add this mapping if the System Extension type
+  // is HID.
+  if (SystemExtensionsProvider::IsEnabled()) {
+    map->Add<blink::mojom::CrosHID>(base::BindRepeating(
+        [](const content::ServiceWorkerVersionBaseInfo& info,
+           mojo::PendingReceiver<blink::mojom::CrosHID> receiver) {
+          DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+          if (!SystemExtensionsProvider::IsDebugMode() &&
+              !SystemExtension::IsSystemExtensionOrigin(
+                  info.storage_key.origin())) {
+            return;
+          }
+
+          content::RenderProcessHost* render_process_host =
+              content::RenderProcessHost::FromID(info.process_id);
+          if (!render_process_host)
+            return;
+
+          // TODO(crbug.com/1253318): Once system extensions are site-isolated,
+          // ensure that the render_process_host is origin-locked via
+          // ChildProcessSecurityPolicy::CanAccessDataForOrigin().
+
+          mojo::MakeSelfOwnedReceiver(
+              std::make_unique<ash::HIDImpl>(
+                  render_process_host->GetBrowserContext()),
+              std::move(receiver));
+        }));
+  }
+#endif
 }
 
 void ChromeContentBrowserClient::
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index a48e5275..034018d 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -274,6 +274,8 @@
     "//chromeos/dbus/oobe_config",
     "//chromeos/dbus/oobe_config:proto",
     "//chromeos/dbus/os_install",
+    "//chromeos/dbus/patchpanel",
+    "//chromeos/dbus/patchpanel:patchpanel_proto",
     "//chromeos/dbus/pciguard",
     "//chromeos/dbus/permission_broker",
     "//chromeos/dbus/power",
@@ -3076,6 +3078,10 @@
     "../ash/sync/os_sync_util.h",
     "../ash/sync/os_syncable_service_model_type_controller.cc",
     "../ash/sync/os_syncable_service_model_type_controller.h",
+    "../ash/sync/sync_error_notifier.cc",
+    "../ash/sync/sync_error_notifier.h",
+    "../ash/sync/sync_error_notifier_factory.cc",
+    "../ash/sync/sync_error_notifier_factory.h",
     "../ash/system/automatic_reboot_manager.cc",
     "../ash/system/automatic_reboot_manager.h",
     "../ash/system/automatic_reboot_manager_observer.h",
@@ -4596,6 +4602,7 @@
     "../ash/smb_client/smbfs_share_unittest.cc",
     "../ash/startup_settings_cache_unittest.cc",
     "../ash/sync/os_sync_util_unittest.cc",
+    "../ash/sync/sync_error_notifier_unittest.cc",
     "../ash/system/automatic_reboot_manager_unittest.cc",
     "../ash/system/device_disabling_manager_unittest.cc",
     "../ash/system/kernel_feature_manager_unittest.cc",
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc
index 082c525..4db7ca7 100644
--- a/chrome/browser/client_hints/client_hints_browsertest.cc
+++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -91,10 +91,10 @@
 using ::testing::Not;
 using ::testing::Optional;
 
-constexpr unsigned expected_client_hints_number = 17u;
+constexpr unsigned expected_client_hints_number = 18u;
 constexpr unsigned expected_default_third_party_client_hints_number = 3u;
-constexpr unsigned expected_requested_third_party_client_hints_number = 20u;
-constexpr unsigned expected_pre_merge_third_party_client_hints_number = 12u;
+constexpr unsigned expected_requested_third_party_client_hints_number = 21u;
+constexpr unsigned expected_pre_merge_third_party_client_hints_number = 13u;
 
 // An interceptor that records count of fetches and client hint headers for
 // requests to https://{foo|bar}.com/non-existing-{image.jpg|iframe.html}.
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactoryTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactoryTest.java
index ed003d7..c0d8643 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactoryTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactoryTest.java
@@ -16,6 +16,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -29,6 +30,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class MerchantTrustSignalsStorageFactoryTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
@@ -131,4 +133,4 @@
         factory.destroy();
         Assert.assertEquals(0, MerchantTrustSignalsStorageFactory.sProfileToStorage.size());
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/browser/component_updater/first_party_sets_component_installer.cc b/chrome/browser/component_updater/first_party_sets_component_installer.cc
index 023a351..d7e6020 100644
--- a/chrome/browser/component_updater/first_party_sets_component_installer.cc
+++ b/chrome/browser/component_updater/first_party_sets_component_installer.cc
@@ -202,14 +202,19 @@
   GetConfigPathInstance().clear();
 }
 
+// static
+void FirstPartySetsComponentInstallerPolicy::SendFileToNetworkService(
+    base::File sets_file) {
+  VLOG(1) << "Received First-Party Sets";
+  content::GetNetworkService()->SetFirstPartySets(std::move(sets_file));
+}
+
 void RegisterFirstPartySetsComponent(ComponentUpdateService* cus) {
   VLOG(1) << "Registering First-Party Sets component.";
 
   auto policy = std::make_unique<FirstPartySetsComponentInstallerPolicy>(
-      /*on_sets_ready=*/base::BindOnce([](base::File sets_file) {
-        VLOG(1) << "Received First-Party Sets";
-        content::GetNetworkService()->SetFirstPartySets(std::move(sets_file));
-      }));
+      /*on_sets_ready=*/base::BindOnce(
+          &FirstPartySetsComponentInstallerPolicy::SendFileToNetworkService));
 
   FirstPartySetsComponentInstallerPolicy* raw_policy = policy.get();
   // Dereferencing `raw_policy` this way is safe because the closure is invoked
diff --git a/chrome/browser/component_updater/first_party_sets_component_installer.h b/chrome/browser/component_updater/first_party_sets_component_installer.h
index 72f4807f..6d954bd4 100644
--- a/chrome/browser/component_updater/first_party_sets_component_installer.h
+++ b/chrome/browser/component_updater/first_party_sets_component_installer.h
@@ -46,6 +46,10 @@
   static void ReconfigureAfterNetworkRestart(
       SetsReadyOnceCallback on_sets_ready);
 
+  // Sends the given file to the NetworkService to initialize the FirstPartySets
+  // instance. Should only be called once at runtime.
+  static void SendFileToNetworkService(base::File sets_file);
+
   void OnRegistrationComplete();
 
   // Resets static state. Should only be used to clear state during testing.
diff --git a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
index 5f41632..8ecc39a 100644
--- a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
+++ b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
@@ -123,14 +123,22 @@
           component_install_dir_.GetPath())));
 
   base::RunLoop run_loop;
-  FirstPartySetsComponentInstallerPolicy(
+  int callback_calls = 0;
+  FirstPartySetsComponentInstallerPolicy policy(
       base::BindLambdaForTesting([&](base::File file) {
         EXPECT_FALSE(file.IsValid());
+        callback_calls++;
         run_loop.Quit();
-      }))
-      .OnRegistrationComplete();
+      }));
+  policy.OnRegistrationComplete();
 
   run_loop.Run();
+  EXPECT_EQ(callback_calls, 1);
+
+  // Only one call has any effect.
+  policy.OnRegistrationComplete();
+  env_.RunUntilIdle();
+  EXPECT_EQ(callback_calls, 1);
 }
 
 TEST_F(FirstPartySetsComponentInstallerFeatureEnabledTest,
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer.cc b/chrome/browser/component_updater/pki_metadata_component_installer.cc
index 03e37e0..b0edd30 100644
--- a/chrome/browser/component_updater/pki_metadata_component_installer.cc
+++ b/chrome/browser/component_updater/pki_metadata_component_installer.cc
@@ -229,6 +229,17 @@
       base::Seconds(proto->log_list().timestamp().seconds()) +
       base::Nanoseconds(proto->log_list().timestamp().nanos());
   network_service->UpdateCtLogList(std::move(log_list_mojo), update_time);
+
+  // Send the updated popular SCTs list to the network service, if available.
+  std::vector<std::vector<uint8_t>> popular_scts;
+  popular_scts.reserve(proto->popular_scts().size());
+  std::transform(
+      proto->popular_scts().begin(), proto->popular_scts().end(),
+      popular_scts.begin(), [](std::string sct) {
+        const uint8_t* raw_data = reinterpret_cast<const uint8_t*>(sct.data());
+        return std::vector<uint8_t>(raw_data, raw_data + sct.length());
+      });
+  network_service->UpdateCtKnownPopularSCTs(std::move(popular_scts));
 #endif  // BUILDFLAG(IS_CT_SUPPORTED)
 }
 
diff --git a/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java b/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java
index 7e63d88..7d9e94842 100644
--- a/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java
+++ b/chrome/browser/continuous_search/android/junit/src/org/chromium/chrome/browser/continuous_search/ContinuousSearchContainerMediatorTest.java
@@ -13,6 +13,7 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
@@ -31,6 +32,7 @@
  * Tests for {@link ContinuousSearchContainerMediator}.
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ContinuousSearchContainerMediatorTest {
     @Mock
     private LayoutStateProvider mLayoutStateProvider;
diff --git a/chrome/browser/download/android/BUILD.gn b/chrome/browser/download/android/BUILD.gn
index a16ac6c..386e1a8 100644
--- a/chrome/browser/download/android/BUILD.gn
+++ b/chrome/browser/download/android/BUILD.gn
@@ -101,6 +101,7 @@
     "//third_party/androidx:androidx_fragment_fragment_java",
     "//third_party/androidx:androidx_preference_preference_java",
     "//ui/android:ui_java",
+    "//url:gurl_java",
   ]
 
   srcjar_deps = [ "//chrome:download_enum_javagen" ]
diff --git a/chrome/browser/download/android/download_controller.cc b/chrome/browser/download/android/download_controller.cc
index 252e378f..c0e2f68 100644
--- a/chrome/browser/download/android/download_controller.cc
+++ b/chrome/browser/download/android/download_controller.cc
@@ -56,6 +56,7 @@
 #include "ui/android/window_android.h"
 #include "ui/base/device_form_factor.h"
 #include "ui/base/page_transition_types.h"
+#include "url/android/gurl_android.h"
 
 using base::android::ConvertUTF8ToJavaString;
 using base::android::JavaParamRef;
@@ -372,8 +373,8 @@
                                 std::string(),  // referrer_charset
                                 std::string(),  // suggested_name
                                 info.original_mime_type, default_file_name_);
-  ScopedJavaLocalRef<jstring> jurl =
-      ConvertUTF8ToJavaString(env, info.url.spec());
+  ScopedJavaLocalRef<jobject> jurl =
+      url::GURLAndroid::FromNativeGURL(env, info.url);
   ScopedJavaLocalRef<jstring> juser_agent =
       ConvertUTF8ToJavaString(env, info.user_agent);
   ScopedJavaLocalRef<jstring> jmime_type =
diff --git a/chrome/browser/download/android/download_manager_service.cc b/chrome/browser/download/android/download_manager_service.cc
index fa9c1cb024..e8be426 100644
--- a/chrome/browser/download/android/download_manager_service.cc
+++ b/chrome/browser/download/android/download_manager_service.cc
@@ -51,6 +51,7 @@
 #include "net/url_request/referrer_policy.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
+#include "url/android/gurl_android.h"
 #include "url/origin.h"
 
 using base::android::ConvertJavaStringToUTF8;
@@ -172,7 +173,7 @@
       env, ConvertUTF8ToJavaString(env, item->GetGuid()),
       ConvertUTF8ToJavaString(env, item->GetFileNameToReportUser().value()),
       ConvertUTF8ToJavaString(env, item->GetTargetFilePath().value()),
-      ConvertUTF8ToJavaString(env, item->GetURL().spec()),
+      url::GURLAndroid::FromNativeGURL(env, item->GetURL()),
       ConvertUTF8ToJavaString(env, item->GetMimeType()),
       item->GetReceivedBytes(), item->GetTotalBytes(), otr_profile_id,
       item->GetState(), item->PercentComplete(), item->IsPaused(),
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
index b18b3424..3f486a5 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
@@ -19,20 +19,24 @@
 import org.chromium.components.offline_items_collection.OfflineItemState;
 import org.chromium.components.offline_items_collection.OfflineItemVisuals;
 import org.chromium.components.offline_items_collection.PendingState;
+import org.chromium.url.GURL;
 
 /**
  * Class representing the state of a single download.
  */
 public final class DownloadInfo {
-    private final String mUrl;
+    private final GURL mUrl;
     private final String mUserAgent;
     private final String mMimeType;
     private final String mCookie;
     private final String mFileName;
     private final String mDescription;
     private final String mFilePath;
+
+    // TODO(https://crbug.com/1278805): Migrate mReferrer and mOriginalUrl to GURL
     private final String mReferrer;
     private final String mOriginalUrl;
+
     private final long mBytesReceived;
     private final long mBytesTotalSize;
     private final String mDownloadGuid;
@@ -105,7 +109,7 @@
         mSchedule = builder.mSchedule;
     }
 
-    public String getUrl() {
+    public GURL getUrl() {
         return mUrl;
     }
 
@@ -295,7 +299,10 @@
                 .setLastAccessTime(item.lastAccessedTimeMs)
                 .setIsOpenable(item.isOpenable)
                 .setMimeType(item.mimeType)
-                .setUrl(item.url)
+
+                // TODO(https://crbug.com/1278805): Continue migration for OfflineItem
+                .setUrl(new GURL(item.url))
+
                 .setOriginalUrl(item.originalUrl)
                 .setOTRProfileId(OTRProfileID.deserialize(item.otrProfileId))
                 .setState(state)
@@ -318,7 +325,7 @@
      * Helper class for building the DownloadInfo object.
      */
     public static class Builder {
-        private String mUrl;
+        private GURL mUrl;
         private String mUserAgent;
         private String mMimeType;
         private String mCookie;
@@ -355,7 +362,7 @@
         private boolean mShouldPromoteOrigin;
         private OfflineItemSchedule mSchedule;
 
-        public Builder setUrl(String url) {
+        public Builder setUrl(GURL url) {
             mUrl = url;
             return this;
         }
@@ -569,12 +576,12 @@
 
     @CalledByNative
     private static DownloadInfo createDownloadInfo(String downloadGuid, String fileName,
-            String filePath, String url, String mimeType, long bytesReceived, long bytesTotalSize,
+            String filePath, GURL url, String mimeType, long bytesReceived, long bytesTotalSize,
             OTRProfileID otrProfileId, int state, int percentCompleted, boolean isPaused,
             boolean hasUserGesture, boolean isResumable, boolean isParallelDownload,
             String originalUrl, String referrerUrl, long timeRemainingInMs, long lastAccessTime,
             boolean isDangerous, @FailState int failState, OfflineItemSchedule schedule) {
-        String remappedMimeType = MimeUtils.remapGenericMimeType(mimeType, url, fileName);
+        String remappedMimeType = MimeUtils.remapGenericMimeType(mimeType, url.getSpec(), fileName);
 
         Progress progress = new Progress(bytesReceived,
                 percentCompleted == -1 ? null : bytesTotalSize, OfflineItemProgressUnit.BYTES);
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 44d94c5..beb483d 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -612,6 +612,10 @@
     base::OnceClosure internal_complete_callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 #if BUILDFLAG(FULL_SAFE_BROWSING)
+  // If this is a chrome triggered download, return true;
+  if (!item->RequireSafetyChecks())
+    return true;
+
   if (!download_prefs_->safebrowsing_for_trusted_sources_enabled() &&
       download_prefs_->IsFromTrustedSource(*item)) {
     return true;
diff --git a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
index fd4dfeb..4309fcca 100644
--- a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
@@ -1602,6 +1602,8 @@
       .WillOnce(Return(kParameters.verdict));
   EXPECT_CALL(*download_item, GetDangerType())
       .WillRepeatedly(Return(kParameters.initial_danger_type));
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(true));
 
   if (kParameters.initial_danger_level != DownloadFileType::NOT_DANGEROUS) {
     DownloadItemModel(download_item.get())
@@ -1631,6 +1633,22 @@
   run_loop.Run();
 }
 
+TEST_P(ChromeDownloadManagerDelegateTestWithSafeBrowsing,
+       SkipCheckClientDownload) {
+  const SafeBrowsingTestParameters& kParameters = GetParam();
+
+  std::unique_ptr<download::MockDownloadItem> download_item =
+      CreateActiveDownloadItem(0);
+  EXPECT_CALL(*download_item, GetDangerType())
+      .WillRepeatedly(Return(kParameters.initial_danger_type));
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(false));
+
+  base::RunLoop run_loop;
+  ASSERT_TRUE(delegate()->ShouldCompleteDownload(download_item.get(),
+                                                 run_loop.QuitClosure()));
+}
+
 TEST_F(ChromeDownloadManagerDelegateTestWithSafeBrowsing,
        TrustedSourcesPolicyNotTrusted) {
   GURL download_url("http://untrusted.com/best-download-ever.exe");
@@ -1639,7 +1657,8 @@
   std::unique_ptr<download::MockDownloadItem> download_item =
       CreateActiveDownloadItem(0);
   EXPECT_CALL(*download_item, GetURL()).WillRepeatedly(ReturnRef(download_url));
-
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(true));
   EXPECT_CALL(*delegate(), GetDownloadProtectionService());
   EXPECT_CALL(*download_protection_service(), MockCheckClientDownload())
       .WillOnce(Return(safe_browsing::DownloadCheckResult::SAFE));
@@ -1666,6 +1685,8 @@
   std::unique_ptr<download::MockDownloadItem> download_item =
       CreateActiveDownloadItem(0);
   EXPECT_CALL(*download_item, GetURL()).WillRepeatedly(ReturnRef(download_url));
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(true));
   EXPECT_CALL(*delegate(), GetDownloadProtectionService()).Times(0);
   EXPECT_TRUE(delegate()->ShouldCompleteDownload(download_item.get(),
                                                  base::OnceClosure()));
diff --git a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoTest.java b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoTest.java
index 8f10449c..865ba296 100644
--- a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoTest.java
+++ b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoTest.java
@@ -18,6 +18,7 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.task.TaskTraits;
@@ -32,6 +33,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowPostTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class EnterpriseInfoTest {
     @Mock
     public EnterpriseInfo.Natives mNatives;
diff --git a/chrome/browser/extensions/api/declarative_content/content_action.cc b/chrome/browser/extensions/api/declarative_content/content_action.cc
index b71326a..64c5f4f 100644
--- a/chrome/browser/extensions/api/declarative_content/content_action.cc
+++ b/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -420,11 +420,6 @@
       extensions::image_util::IsIconSufficientlyVisible(bitmap);
   base::UmaHistogramBoolean("Extensions.DeclarativeSetIconWasVisible",
                             is_sufficiently_visible);
-  const bool is_sufficiently_visible_rendered =
-      extensions::ui_util::IsRenderedIconSufficientlyVisibleForBrowserContext(
-          bitmap, browser_context);
-  base::UmaHistogramBoolean("Extensions.DeclarativeSetIconWasVisibleRendered",
-                            is_sufficiently_visible_rendered);
   if (!is_sufficiently_visible && !g_allow_invisible_icons_content_action) {
     *error = kIconNotSufficientlyVisible;
     return nullptr;
diff --git a/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc b/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
index 19fe3a6..9846fda 100644
--- a/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_content/content_action_unittest.cc
@@ -276,9 +276,6 @@
     EXPECT_THAT(histogram_tester.GetAllSamples(
                     "Extensions.DeclarativeSetIconWasVisible"),
                 testing::ElementsAre(base::Bucket(1, 1)));
-    EXPECT_THAT(histogram_tester.GetAllSamples(
-                    "Extensions.DeclarativeSetIconWasVisibleRendered"),
-                testing::ElementsAre(base::Bucket(1, 1)));
     histogram_tester.ExpectUniqueSample(
         "Extensions.DeclarativeContentActionCreated",
         ContentActionType::kSetIcon, 1);
@@ -337,9 +334,6 @@
   EXPECT_THAT(
       histogram_tester.GetAllSamples("Extensions.DeclarativeSetIconWasVisible"),
       testing::ElementsAre(base::Bucket(0, 1)));
-  EXPECT_THAT(histogram_tester.GetAllSamples(
-                  "Extensions.DeclarativeSetIconWasVisibleRendered"),
-              testing::ElementsAre(base::Bucket(0, 1)));
   histogram_tester.ExpectTotalCount(
       "Extensions.DeclarativeContentActionCreated", 0);
 }
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index 15faa72..605ce55 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -490,8 +490,6 @@
 
   const std::string histogram_name =
       "Extensions.DynamicExtensionActionIconWasVisible";
-  const std::string new_histogram_name =
-      "Extensions.DynamicExtensionActionIconWasVisibleRendered";
   {
     base::HistogramTester histogram_tester;
     std::string result;
@@ -504,8 +502,6 @@
         initial_bar_icon, GetBrowserActionsBar()->GetIcon(extension->id())));
     EXPECT_THAT(histogram_tester.GetAllSamples(histogram_name),
                 testing::ElementsAre(base::Bucket(0, 1)));
-    EXPECT_THAT(histogram_tester.GetAllSamples(new_histogram_name),
-                testing::ElementsAre(base::Bucket(0, 1)));
   }
 
   {
@@ -520,8 +516,6 @@
         initial_bar_icon, GetBrowserActionsBar()->GetIcon(extension->id())));
     EXPECT_THAT(histogram_tester.GetAllSamples(histogram_name),
                 testing::ElementsAre(base::Bucket(1, 1)));
-    EXPECT_THAT(histogram_tester.GetAllSamples(new_histogram_name),
-                testing::ElementsAre(base::Bucket(1, 1)));
   }
 }
 
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 5bb82d2..c2e6907 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -483,12 +483,6 @@
     const bool is_visible = image_util::IsIconSufficientlyVisible(bitmap);
     UMA_HISTOGRAM_BOOLEAN("Extensions.DynamicExtensionActionIconWasVisible",
                           is_visible);
-    const bool is_visible_rendered =
-        extensions::ui_util::IsRenderedIconSufficientlyVisibleForBrowserContext(
-            bitmap, browser_context());
-    UMA_HISTOGRAM_BOOLEAN(
-        "Extensions.DynamicExtensionActionIconWasVisibleRendered",
-        is_visible_rendered);
 
     if (!is_visible && g_report_error_for_invisible_icon)
       return RespondNow(Error("Icon not sufficiently visible."));
diff --git a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
index d8fc9a8..16989cb 100644
--- a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
+++ b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -80,7 +80,7 @@
     return testing::AssertionFailure() <<
         "Expected: " << GetJson(*expected) << ", actual NULL";
   }
-  if (!expected->Equals(actual)) {
+  if (*expected != *actual) {
     return testing::AssertionFailure() <<
         "Expected: " << GetJson(*expected) << ", actual: " << GetJson(*actual);
   }
@@ -380,7 +380,7 @@
     EXPECT_EQ(1u, sync_processor_->changes().size());
     SettingSyncData* change = sync_processor_->GetOnlyChange("s1", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
 
     GetSyncableService(model_type)->StopSyncing(model_type);
   });
@@ -411,10 +411,10 @@
     EXPECT_EQ(2u, sync_processor_->changes().size());
     SettingSyncData* change = sync_processor_->GetOnlyChange("s1", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value1.Equals(&change->value()));
+    EXPECT_EQ(value1, change->value());
     change = sync_processor_->GetOnlyChange("s2", "bar");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
 
     GetSyncableService(model_type)->StopSyncing(model_type);
   });
@@ -578,16 +578,16 @@
 
     SettingSyncData* change = sync_processor_->GetOnlyChange("s1", "bar");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
     sync_processor_->GetOnlyChange("s2", "bar");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
     change = sync_processor_->GetOnlyChange("s3", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value1.Equals(&change->value()));
+    EXPECT_EQ(value1, change->value());
     change = sync_processor_->GetOnlyChange("s4", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change->change_type());
-    EXPECT_TRUE(value1.Equals(&change->value()));
+    EXPECT_EQ(value1, change->value());
 
     // Change something locally, storage1/3 the new setting and storage2/4 the
     // initial setting, for all combinations of local vs sync intialisation and
@@ -600,16 +600,16 @@
 
     change = sync_processor_->GetOnlyChange("s1", "bar");
     EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change->change_type());
-    EXPECT_TRUE(value1.Equals(&change->value()));
+    EXPECT_EQ(value1, change->value());
     change = sync_processor_->GetOnlyChange("s2", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
     change = sync_processor_->GetOnlyChange("s3", "bar");
     EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change->change_type());
-    EXPECT_TRUE(value1.Equals(&change->value()));
+    EXPECT_EQ(value1, change->value());
     change = sync_processor_->GetOnlyChange("s4", "foo");
     EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change->change_type());
-    EXPECT_TRUE(value2.Equals(&change->value()));
+    EXPECT_EQ(value2, change->value());
 
     // Remove something locally, storage1/3 the new setting and storage2/4 the
     // initial setting, for all combinations of local vs sync intialisation and
@@ -1434,7 +1434,7 @@
       EXPECT_EQ(syncer::SyncChange::ACTION_ADD, sync_data->change_type());
       EXPECT_EQ("ext", sync_data->extension_id());
       EXPECT_EQ("key.with.spot", sync_data->key());
-      EXPECT_TRUE(sync_data->value().Equals(string_value.get()));
+      EXPECT_EQ(sync_data->value(), *string_value);
     }
   });
 }
diff --git a/chrome/browser/extensions/extension_action_icon_factory.cc b/chrome/browser/extensions/extension_action_icon_factory.cc
index 7bd2b057..89ca161 100644
--- a/chrome/browser/extensions/extension_action_icon_factory.cc
+++ b/chrome/browser/extensions/extension_action_icon_factory.cc
@@ -75,11 +75,6 @@
           extensions::image_util::IsIconSufficientlyVisible(*bitmap);
       UMA_HISTOGRAM_BOOLEAN("Extensions.ManifestIconSetIconWasVisibleForPacked",
                             is_sufficiently_visible);
-      const bool is_sufficiently_visible_rendered = extensions::ui_util::
-          IsRenderedIconSufficientlyVisibleForBrowserContext(*bitmap, profile_);
-      UMA_HISTOGRAM_BOOLEAN(
-          "Extensions.ManifestIconSetIconWasVisibleForPackedRendered",
-          is_sufficiently_visible_rendered);
       if (!is_sufficiently_visible && !g_allow_invisible_icons) {
         icon = action_->GetPlaceholderIconImage();
       }
diff --git a/chrome/browser/extensions/extension_action_icon_factory_unittest.cc b/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
index 184ca0a..59c0f627 100644
--- a/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
+++ b/chrome/browser/extensions/extension_action_icon_factory_unittest.cc
@@ -238,9 +238,6 @@
   EXPECT_THAT(histogram_tester.GetAllSamples(
                   "Extensions.ManifestIconSetIconWasVisibleForPacked"),
               testing::ElementsAre(base::Bucket(0, 1)));
-  EXPECT_THAT(histogram_tester.GetAllSamples(
-                  "Extensions.ManifestIconSetIconWasVisibleForPackedRendered"),
-              testing::ElementsAre(base::Bucket(0, 1)));
 
   // Reset the flag for testing.
   ExtensionActionIconFactory::SetAllowInvisibleIconsForTest(true);
diff --git a/chrome/browser/extensions/extension_ui_util.cc b/chrome/browser/extensions/extension_ui_util.cc
index a9f64fb..22a9cfc 100644
--- a/chrome/browser/extensions/extension_ui_util.cc
+++ b/chrome/browser/extensions/extension_ui_util.cc
@@ -67,15 +67,5 @@
                    : std::u16string();
 }
 
-bool IsRenderedIconSufficientlyVisibleForBrowserContext(
-    const SkBitmap& bitmap,
-    content::BrowserContext* browser_context) {
-  Profile* const profile = Profile::FromBrowserContext(browser_context);
-  const ui::ThemeProvider& provider =
-      ThemeService::GetThemeProviderForProfile(profile);
-  return extensions::image_util::IsRenderedIconSufficientlyVisible(
-      bitmap, provider.GetColor(ThemeProperties::COLOR_TOOLBAR));
-}
-
 }  // namespace ui_util
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_ui_util.h b/chrome/browser/extensions/extension_ui_util.h
index a08c7967..7d1f5442 100644
--- a/chrome/browser/extensions/extension_ui_util.h
+++ b/chrome/browser/extensions/extension_ui_util.h
@@ -11,8 +11,6 @@
 class BrowserContext;
 }
 
-class SkBitmap;
-
 namespace extensions {
 
 class Extension;
@@ -43,12 +41,6 @@
 std::u16string GetEnabledExtensionNameForUrl(const GURL& url,
                                              content::BrowserContext* context);
 
-// Returns true if the icon, rendered in the toolbar of the current context,
-// would be sufficiently visible to the user.
-bool IsRenderedIconSufficientlyVisibleForBrowserContext(
-    const SkBitmap& bitmap,
-    content::BrowserContext* browser_context);
-
 }  // namespace ui_util
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc b/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
index 61862dcc..121de4a 100644
--- a/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
+++ b/chrome/browser/extensions/forced_extensions/force_installed_metrics.cc
@@ -475,7 +475,7 @@
   base::UmaHistogramCounts100(
       "Extensions.ForceInstalledTimedOutAndNotInstalledCount",
       installed_missing_count);
-  base::UmaHistogramCounts100("Extensions.ForceInstalledAndBlackListed",
+  base::UmaHistogramCounts100("Extensions.ForceInstalledAndBlockListed",
                               blocklisted_count);
   LOG(WARNING) << "Failed to install " << installed_missing_count
                << " forced extensions.";
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
index cc1fb2af..d1605e8 100644
--- a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
+++ b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
@@ -123,7 +123,7 @@
     "Extensions.ForceInstalledSessionsWithNonMisconfigurationFailureOccured";
 constexpr char kDisableReason[] =
     "Extensions.ForceInstalledNotLoadedDisableReason";
-constexpr char kBlocklisted[] = "Extensions.ForceInstalledAndBlackListed";
+constexpr char kBlocklisted[] = "Extensions.ForceInstalledAndBlockListed";
 constexpr char kWebStoreExtensionManifestInvalid[] =
     "Extensions.WebStore_ForceInstalledFailureManifestInvalidErrorDetail2";
 constexpr char kOffStoreExtensionManifestInvalid[] =
diff --git a/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.cc b/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.cc
index 1f5e45d..515e9364 100644
--- a/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.cc
+++ b/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.cc
@@ -62,4 +62,27 @@
       env, java_obj_, static_cast<int>(feature));
 }
 
+void FeatureNotificationGuideBridge::CloseNotification(
+    const std::string& notification_guid) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_FeatureNotificationGuideBridge_closeNotification(
+      env, java_obj_,
+      base::android::ConvertUTF8ToJavaString(env, notification_guid));
+}
+
+bool FeatureNotificationGuideBridge::ShouldSkipFeature(FeatureType feature) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  return Java_FeatureNotificationGuideBridge_shouldSkipFeature(
+      env, java_obj_, static_cast<int>(feature));
+}
+
+std::string FeatureNotificationGuideBridge::GetNotificationParamGuidForFeature(
+    FeatureType feature) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  auto j_guid =
+      Java_FeatureNotificationGuideBridge_getNotificationParamGuidForFeature(
+          env, java_obj_, static_cast<int>(feature));
+  return base::android::ConvertJavaStringToUTF8(env, j_guid);
+}
+
 }  // namespace feature_guide
diff --git a/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.h b/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.h
index 633bca4..31541ec 100644
--- a/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.h
+++ b/chrome/browser/feature_guide/notifications/android/feature_notification_guide_bridge.h
@@ -30,6 +30,9 @@
   std::u16string GetNotificationTitle(FeatureType feature) override;
   std::u16string GetNotificationMessage(FeatureType feature) override;
   void OnNotificationClick(FeatureType feature) override;
+  void CloseNotification(const std::string& notification_guid) override;
+  bool ShouldSkipFeature(FeatureType feature) override;
+  std::string GetNotificationParamGuidForFeature(FeatureType feature) override;
 
  private:
   // A reference to the Java counterpart of this class.  See
diff --git a/chrome/browser/feature_guide/notifications/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideService.java b/chrome/browser/feature_guide/notifications/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideService.java
index 0d8edf2d..39c0307 100644
--- a/chrome/browser/feature_guide/notifications/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideService.java
+++ b/chrome/browser/feature_guide/notifications/android/java/src/org/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideService.java
@@ -7,4 +7,34 @@
 /**
  * Central class representing feature notification guide.
  */
-public interface FeatureNotificationGuideService {}
+public abstract class FeatureNotificationGuideService {
+    /**
+     * Delegate to be provide chrome app layer dependencies. Owned by the {@link
+     * FeatureNotificationGuideService}, so shouldn't hold any reference to the activities.
+     */
+    public interface Delegate {
+        /**
+         * Launches an activity to show IPH when a feature notification is clicked.
+         * @param featureType The type of the feature being promoed in the notification.
+         */
+        void launchActivityToShowIph(@FeatureType int featureType);
+    }
+
+    /**
+     * The delegate is designed as static so that it can be set even before the service
+     * is instantiated.
+     */
+    private static Delegate sDelegate;
+
+    /** Called to set the delegate. */
+    public static void setDelegate(Delegate delegate) {
+        assert sDelegate == null && delegate != null;
+        sDelegate = delegate;
+    }
+
+    /** @return The {@link Delegate} to provide chrome app layer dependencies. */
+    public static Delegate getDelegate() {
+        assert sDelegate != null;
+        return sDelegate;
+    }
+}
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc
index 46ecde9..293f031 100644
--- a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc
@@ -11,6 +11,11 @@
 
 const base::Feature kFeatureNotificationGuide{
     "FeatureNotificationGuide", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kSkipCheckForLowEngagedUsers{
+    "FeatureNotificationGuideSkipCheckForLowEngagedUsers",
+    base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 
 FeatureNotificationGuideService::FeatureNotificationGuideService() = default;
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h
index a90ea26..717c9e2 100644
--- a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h
@@ -26,6 +26,9 @@
 // Main feature flag for the feature notification guide feature.
 extern const base::Feature kFeatureNotificationGuide;
 
+// Feature flag to determine whether to skip check for the low engaged users.
+extern const base::Feature kSkipCheckForLowEngagedUsers;
+
 }  // namespace features
 
 // The central class responsible for managing feature notification guide in
@@ -47,6 +50,19 @@
     // clicked.
     virtual void OnNotificationClick(FeatureType feature) = 0;
 
+    // Called to cancel the notification from notification drawer if the feature
+    // has been already used.
+    virtual void CloseNotification(const std::string& notification_guid) = 0;
+
+    // Called to determine if we should skip the feature feature notification.
+    virtual bool ShouldSkipFeature(FeatureType feature) = 0;
+
+    // Called to get the guid that should be used for displaying the
+    // notification. The actual android notification id is derived as the hash
+    // code of this guid.
+    virtual std::string GetNotificationParamGuidForFeature(
+        FeatureType feature) = 0;
+
     // Getter/Setter method for the service.
     FeatureNotificationGuideService* GetService();
     void SetService(FeatureNotificationGuideService* service);
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc
index cf0acf1..f8be8ff 100644
--- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc
@@ -54,6 +54,7 @@
       clock_(clock),
       config_(config) {
   DCHECK(notification_scheduler_);
+  DCHECK(delegate_);
   delegate_->SetService(this);
 }
 
@@ -62,9 +63,7 @@
 
 void FeatureNotificationGuideServiceImpl::OnSchedulerInitialized(
     const std::set<std::string>& guids) {
-  for (const std::string& guid : guids) {
-    scheduled_features_.emplace(NotificationIdToFeature(guid));
-  }
+  scheduled_feature_guids_ = guids;
 
   tracker_->AddOnInitializedCallback(
       base::BindOnce(&FeatureNotificationGuideServiceImpl::OnTrackerInitialized,
@@ -83,22 +82,38 @@
           weak_ptr_factory_.GetWeakPtr()));
 }
 
+void FeatureNotificationGuideServiceImpl::CloseRedundantNotifications() {
+  for (auto feature : config_.enabled_features) {
+    // TODO(shaktisahu): Check if the feature was used.
+    std::string notification_guid =
+        delegate_->GetNotificationParamGuidForFeature(feature);
+    delegate_->CloseNotification(notification_guid);
+  }
+}
+
 void FeatureNotificationGuideServiceImpl::OnQuerySegmentationPlatform(
     const segmentation_platform::SegmentSelectionResult& result) {
-  if (!result.is_ready || !result.segment.has_value())
-    return;
-  if (result.segment.value() !=
-      optimization_guide::proto::OptimizationTarget::
-          OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT) {
+  if (base::FeatureList::IsEnabled(
+          feature_guide::features::kSkipCheckForLowEngagedUsers)) {
+    StartCheckingForEligibleFeatures();
     return;
   }
 
+  bool is_low_engaged_user =
+      result.is_ready && result.segment.has_value() &&
+      result.segment.value() ==
+          optimization_guide::proto::OptimizationTarget::
+              OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT;
+  if (!is_low_engaged_user)
+    return;
+
   StartCheckingForEligibleFeatures();
 }
 
 void FeatureNotificationGuideServiceImpl::StartCheckingForEligibleFeatures() {
   for (auto feature : config_.enabled_features) {
-    if (base::Contains(scheduled_features_, feature))
+    std::string guid = delegate_->GetNotificationParamGuidForFeature(feature);
+    if (base::Contains(scheduled_feature_guids_, guid))
       continue;
 
 #if BUILDFLAG(IS_ANDROID)
@@ -110,6 +125,9 @@
 
     ScheduleNotification(feature);
   }
+
+  // TODO(shaktisahu): Maybe post a task with few seconds delay.
+  CloseRedundantNotifications();
 }
 
 void FeatureNotificationGuideServiceImpl::ScheduleNotification(
@@ -134,6 +152,7 @@
   auto params = std::make_unique<notifications::NotificationParams>(
       notifications::SchedulerClientType::kFeatureGuide, std::move(data),
       std::move(schedule_params));
+  params->guid = delegate_->GetNotificationParamGuidForFeature(feature);
   notification_scheduler_->Schedule(std::move(params));
 }
 
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h
index 6f2eeac5..4bffde1 100644
--- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h
@@ -57,6 +57,7 @@
       const segmentation_platform::SegmentSelectionResult& result);
   void StartCheckingForEligibleFeatures();
   void ScheduleNotification(FeatureType feature);
+  void CloseRedundantNotifications();
 
   std::unique_ptr<FeatureNotificationGuideService::Delegate> delegate_;
   raw_ptr<notifications::NotificationScheduleService> notification_scheduler_;
@@ -66,7 +67,7 @@
   base::Clock* clock_;
   Config config_;
 
-  std::set<FeatureType> scheduled_features_;
+  std::set<std::string> scheduled_feature_guids_;
   absl::optional<base::Time> last_notification_schedule_time_;
 
   base::WeakPtrFactory<FeatureNotificationGuideServiceImpl> weak_ptr_factory_{
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc
index 5cdbc3c..e5d5a7f 100644
--- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc
@@ -40,6 +40,11 @@
   }
 
   void OnNotificationClick(FeatureType feature) override {}
+  void CloseNotification(const std::string& notification_guid) override {}
+  bool ShouldSkipFeature(FeatureType feature) override { return false; }
+  std::string GetNotificationParamGuidForFeature(FeatureType feature) override {
+    return std::string();
+  }
 
   ~TestDelegate() override = default;
 };
diff --git a/chrome/browser/feature_guide/notifications/internal/utils.cc b/chrome/browser/feature_guide/notifications/internal/utils.cc
index e288153..7be8c021 100644
--- a/chrome/browser/feature_guide/notifications/internal/utils.cc
+++ b/chrome/browser/feature_guide/notifications/internal/utils.cc
@@ -14,13 +14,6 @@
 
 constexpr char kCustomDataKeyForFeatureType[] = "feature_type";
 
-constexpr char kNotificationIdDefaultBroser[] = "feature_guide_default_browser";
-constexpr char kNotificationIdSignIn[] = "feature_guide_sign_in";
-constexpr char kNotificationIdIncognitoTab[] = "feature_guide_incognito_tab";
-constexpr char kNotificationIdVoiceSearch[] = "feature_guide_voice_search";
-constexpr char kNotificationIdNTPSuggestionCard[] =
-    "feature_guide_ntp_suggestion_card";
-
 }  // namespace
 
 void FeatureToCustomData(FeatureType feature,
@@ -39,39 +32,6 @@
   return static_cast<FeatureType>(parsed_value);
 }
 
-std::string NotificationIdForFeature(FeatureType feature) {
-  switch (feature) {
-    case FeatureType::kDefaultBrowser:
-      return kNotificationIdDefaultBroser;
-    case FeatureType::kSignIn:
-      return kNotificationIdSignIn;
-    case FeatureType::kIncognitoTab:
-      return kNotificationIdIncognitoTab;
-    case FeatureType::kNTPSuggestionCard:
-      return kNotificationIdNTPSuggestionCard;
-    case FeatureType::kVoiceSearch:
-      return kNotificationIdVoiceSearch;
-    default:
-      NOTREACHED();
-      return std::string();
-  }
-}
-
-FeatureType NotificationIdToFeature(const std::string& notification_id) {
-  if (notification_id == kNotificationIdDefaultBroser) {
-    return FeatureType::kDefaultBrowser;
-  } else if (notification_id == kNotificationIdSignIn) {
-    return FeatureType::kSignIn;
-  } else if (notification_id == kNotificationIdIncognitoTab) {
-    return FeatureType::kIncognitoTab;
-  } else if (notification_id == kNotificationIdNTPSuggestionCard) {
-    return FeatureType::kNTPSuggestionCard;
-  } else if (notification_id == kNotificationIdVoiceSearch) {
-    return FeatureType::kVoiceSearch;
-  }
-  return FeatureType::kInvalid;
-}
-
 #if BUILDFLAG(IS_ANDROID)
 base::Feature GetNotificationIphFeatureForFeature(FeatureType& feature) {
   switch (feature) {
diff --git a/chrome/browser/feature_guide/notifications/internal/utils.h b/chrome/browser/feature_guide/notifications/internal/utils.h
index d2c94f4..7b1c911e 100644
--- a/chrome/browser/feature_guide/notifications/internal/utils.h
+++ b/chrome/browser/feature_guide/notifications/internal/utils.h
@@ -22,12 +22,6 @@
 FeatureType FeatureFromCustomData(
     const std::map<std::string, std::string>& custom_data);
 
-// Get a fixed notification ID for the given feature.
-std::string NotificationIdForFeature(FeatureType feature);
-
-// Returns the feature type from the notification ID.
-FeatureType NotificationIdToFeature(const std::string& notification_id);
-
 #if BUILDFLAG(IS_ANDROID)
 // Returns the notification IPH feature for the given feature.
 base::Feature GetNotificationIphFeatureForFeature(FeatureType& feature);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/ScrollTrackerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/ScrollTrackerTest.java
index 0325235..31c3fc9 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/ScrollTrackerTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/ScrollTrackerTest.java
@@ -11,6 +11,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.task.test.ShadowPostTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -22,6 +23,7 @@
 /** Tests for {@link ScrollTracker}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ShadowPostTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class ScrollTrackerTest {
     // The delay time used when scheduling the report task.
     private static final long DELAY_TIME_MS = 200L;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java
index 72f1ae0..177d6492 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java
@@ -92,12 +92,13 @@
      * subscribed, recently subscribed, or recommended Web Feed.
      * @param tab The tab showing the page.
      * @param url The URL for which the status is being requested.
+     * @param reason The reason why the information is being requested.
      * @param callback The callback to receive the Web Feed metadata, or null if it is not found.
      */
-    public static void getWebFeedMetadataForPage(
-            Tab tab, GURL url, Callback<WebFeedMetadata> callback) {
+    public static void getWebFeedMetadataForPage(Tab tab, GURL url,
+            @WebFeedPageInformationRequestReason int reason, Callback<WebFeedMetadata> callback) {
         WebFeedBridgeJni.get().findWebFeedInfoForPage(
-                new WebFeedPageInformation(url, tab), callback);
+                new WebFeedPageInformation(url, tab), reason, callback);
     }
 
     /**
@@ -236,8 +237,9 @@
         void followWebFeed(WebFeedPageInformation pageInfo, Callback<FollowResults> callback);
         void followWebFeedById(byte[] webFeedId, Callback<FollowResults> callback);
         void unfollowWebFeed(byte[] webFeedId, Callback<UnfollowResults> callback);
-        void findWebFeedInfoForPage(
-                WebFeedPageInformation pageInfo, Callback<WebFeedMetadata> callback);
+        void findWebFeedInfoForPage(WebFeedPageInformation pageInfo,
+                @WebFeedPageInformationRequestReason int reason,
+                Callback<WebFeedMetadata> callback);
         void findWebFeedInfoForWebFeedId(byte[] webFeedId, Callback<WebFeedMetadata> callback);
         void getAllSubscriptions(Callback<Object[]> callback);
         void refreshSubscriptions(Callback<Boolean> callback);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroController.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroController.java
index c747316..815e0f8 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroController.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroController.java
@@ -416,9 +416,9 @@
                 return;
             }
 
-            WebFeedBridge.getWebFeedMetadataForPage(request.tab, request.url, result -> {
-                // Shouldn't be recommended if there's no metadata, ID doesn't exist, or if it
-                // is already followed.
+            Callback<WebFeedBridge.WebFeedMetadata> metadata_callback = result -> {
+                // Shouldn't be recommended if there's no metadata, ID doesn't exist, or if it is
+                // already followed.
                 if (result != null && result.id != null && result.id.length > 0
                         && result.isRecommended
                         && result.subscriptionStatus == WebFeedSubscriptionStatus.NOT_SUBSCRIBED) {
@@ -440,7 +440,10 @@
 
                     sendResult(request, null);
                 }
-            });
+            };
+
+            WebFeedBridge.getWebFeedMetadataForPage(request.tab, request.url,
+                    WebFeedPageInformationRequestReason.FOLLOW_RECOMMENDATION, metadata_callback);
         }
         private void sendResult(Request request, RecommendedWebFeedInfo result) {
             if (mRequest == request) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
index 6957e412..e4ff63a 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
@@ -8,6 +8,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.when;
@@ -23,13 +24,12 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLog;
 
 import org.chromium.base.Callback;
@@ -66,6 +66,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ShadowPostTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class WebFeedFollowIntroControllerTest {
     private static final long SAFE_INTRO_WAIT_TIME_MILLIS = 3 * 1000 + 100;
     private static final GURL sTestUrl = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
@@ -99,8 +100,6 @@
     private PrefService mPrefService;
     @Mock
     private UserPrefs.Natives mUserPrefsJniMock;
-    @Captor
-    private ArgumentCaptor<WebFeedBridge.WebFeedPageInformation> mPageInformationCaptor;
 
     private Activity mActivity;
     private EmptyTabObserver mEmptyTabObserver;
@@ -459,13 +458,18 @@
         WebFeedBridge.WebFeedMetadata webFeedMetadata =
                 new WebFeedBridge.WebFeedMetadata(sWebFeedId, "title", sTestUrl, subscriptionStatus,
                         WebFeedAvailabilityStatus.ACTIVE, isRecommended, sFaviconUrl);
+
         doAnswer(invocation -> {
-            invocation.<Callback<WebFeedBridge.WebFeedMetadata>>getArgument(1).onResult(
+            assertEquals("Incorrect WebFeedPageInformationRequestReason was used.",
+                    WebFeedPageInformationRequestReason.FOLLOW_RECOMMENDATION,
+                    invocation.<Integer>getArgument(1).intValue());
+            invocation.<Callback<WebFeedBridge.WebFeedMetadata>>getArgument(2).onResult(
                     webFeedMetadata);
             return null;
         })
                 .when(mWebFeedBridgeJniMock)
-                .findWebFeedInfoForPage(mPageInformationCaptor.capture(), any(Callback.class));
+                .findWebFeedInfoForPage(any(WebFeedBridge.WebFeedPageInformation.class), anyInt(),
+                        any(Callback.class));
 
         mEmptyTabObserver.onPageLoadStarted(mTab, sTestUrl);
         mEmptyTabObserver.didFirstVisuallyNonEmptyPaint(mTab);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java
index c6e03cf3..673caec 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java
@@ -15,6 +15,7 @@
 
 import androidx.annotation.DrawableRes;
 
+import org.chromium.base.Callback;
 import org.chromium.chrome.browser.feed.FeedFeatures;
 import org.chromium.chrome.browser.feed.R;
 import org.chromium.chrome.browser.feed.componentinterfaces.SurfaceCoordinator.StreamTabId;
@@ -92,14 +93,16 @@
         mFaviconFetcher = faviconFetcher;
         mWebFeedSnackbarController = new WebFeedSnackbarController(
                 mContext, feedLauncher, dialogManager, snackbarManager);
-        WebFeedBridge.getWebFeedMetadataForPage(mTab, mUrl, result -> {
+        Callback<WebFeedMetadata> metadata_callback = result -> {
             initializeFavicon(result);
             initializeText(result);
             initializeChipView(result);
             if (mChipView != null && mTab.isShowingErrorPage()) {
                 mChipView.setEnabled(false);
             }
-        });
+        };
+        WebFeedBridge.getWebFeedMetadataForPage(mTab, mUrl,
+                WebFeedPageInformationRequestReason.MENU_ITEM_PRESENTATION, metadata_callback);
     }
 
     private void initializeFavicon(WebFeedMetadata webFeedMetadata) {
@@ -188,8 +191,9 @@
             });
         }
         postDelayed(()
-                            -> WebFeedBridge.getWebFeedMetadataForPage(
-                                    mTab, mUrl, this::initializeChipView),
+                            -> WebFeedBridge.getWebFeedMetadataForPage(mTab, mUrl,
+                                    WebFeedPageInformationRequestReason.MENU_ITEM_PRESENTATION,
+                                    this::initializeChipView),
                 LOADING_REFRESH_TIME_MS);
     }
 
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
index 127f1e3..d3b12e11 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 
@@ -29,6 +30,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLog;
 import org.robolectric.shadows.ShadowLooper;
 
@@ -57,6 +59,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 @SmallTest
 public final class WebFeedMainMenuItemTest {
     private static final GURL TEST_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
@@ -107,12 +110,16 @@
 
         // Add requests for web feed information to mWaitingMetadataCallbacks.
         doAnswer(invocation -> {
+            assertEquals("Incorrect WebFeedPageInformationRequestReason was used.",
+                    WebFeedPageInformationRequestReason.MENU_ITEM_PRESENTATION,
+                    invocation.<Integer>getArgument(1).intValue());
             mWaitingMetadataCallbacks.add(
-                    invocation.<Callback<WebFeedBridge.WebFeedMetadata>>getArgument(1));
+                    invocation.<Callback<WebFeedBridge.WebFeedMetadata>>getArgument(2));
             return null;
         })
                 .when(mWebFeedBridgeJniMock)
-                .findWebFeedInfoForPage(any(), any(Callback.class));
+                .findWebFeedInfoForPage(any(WebFeedBridge.WebFeedPageInformation.class), anyInt(),
+                        any(Callback.class));
 
         mWebFeedMainMenuItem = (WebFeedMainMenuItem) (LayoutInflater.from(mActivity).inflate(
                 R.layout.web_feed_main_menu_item, null));
diff --git a/chrome/browser/feed/android/web_feed_bridge.cc b/chrome/browser/feed/android/web_feed_bridge.cc
index 4f2c1bc..fdd3cb7 100644
--- a/chrome/browser/feed/android/web_feed_bridge.cc
+++ b/chrome/browser/feed/android/web_feed_bridge.cc
@@ -8,8 +8,10 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/bind.h"
+#include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
 #include "base/notreached.h"
 #include "base/task/cancelable_task_tracker.h"
@@ -97,13 +99,19 @@
   std::move(callback).Run(absl::nullopt);
 }
 
+// TODO(carlosk): Move this class into its own file and add tests.
 class WebFeedPageInformationFetcher
     : public base::RefCounted<WebFeedPageInformationFetcher> {
  public:
   // Fetches the canonical URL and RSS URLs for a web page, and then calls
   // `callback` with the results.
   static void Start(const PageInformation& page_info,
+                    const WebFeedPageInformationRequestReason reason,
                     base::OnceCallback<void(WebFeedPageInformation)> callback) {
+    DVLOG(2) << "PageInformationRequested reason=" << reason;
+    base::UmaHistogramEnumeration(
+        "ContentSuggestions.Feed.WebFeed.PageInformationRequested", reason);
+
     // Perform two async operations, and call `callback` only after both are
     // complete. Keep state as RefCounted, owned by the callbacks.
     auto self = base::MakeRefCounted<WebFeedPageInformationFetcher>(
@@ -263,7 +271,8 @@
       };
   PageInformation page_info = ToNativePageInformation(env, pageInfo);
   WebFeedPageInformationFetcher::Start(
-      page_info, base::BindOnce(on_page_info_fetched, std::move(callback)));
+      page_info, WebFeedPageInformationRequestReason::kUserRequestedFollow,
+      base::BindOnce(on_page_info_fetched, std::move(callback)));
 }
 
 static void JNI_WebFeedBridge_FollowWebFeedById(
@@ -301,6 +310,7 @@
 static void JNI_WebFeedBridge_FindWebFeedInfoForPage(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& pageInfo,
+    const int reason,
     const base::android::JavaParamRef<jobject>& j_callback) {
   base::OnceCallback<void(WebFeedMetadata)> callback =
       AdaptCallbackForJava<WebFeedMetadata>(env, j_callback);
@@ -317,7 +327,8 @@
       };
   PageInformation page_info = ToNativePageInformation(env, pageInfo);
   WebFeedPageInformationFetcher::Start(
-      page_info, base::BindOnce(on_page_info_fetched, std::move(callback)));
+      page_info, static_cast<WebFeedPageInformationRequestReason>(reason),
+      base::BindOnce(on_page_info_fetched, std::move(callback)));
 }
 
 static void JNI_WebFeedBridge_FindWebFeedInfoForWebFeedId(
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 3a329c2..9191745 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -445,6 +445,11 @@
     "owners": [ "siyua", "jsaul@google.com", "aneeshali@google.com" ],
     "expiry_milestone": 100
   },
+    {
+    "name": "autofill-enable-virtual-card-management-in-desktop-settings-page",
+    "owners": [ "siyua", "jsaul@google.com"],
+    "expiry_milestone": 105
+  },
   {
     "name": "autofill-enable-virtual-cards-risk-based-authentication",
     "owners": [ "siyua", "jsaul@google.com" ],
@@ -2341,6 +2346,16 @@
     "expiry_milestone": 98
   },
   {
+    "name": "enable-neural-palm-adaptive-hold",
+    "owners": [ "robsc", "napper", "alanlxl" ],
+    "expiry_milestone": 130
+  },
+  {
+    "name": "enable-neural-palm-rejection-model-v2",
+    "owners": [ "robsc", "napper", "alanlxl" ],
+    "expiry_milestone": 130
+  },
+  {
     "name": "enable-neural-stylus-palm-rejection",
     "owners": [ "robsc", "napper", "adlr" ],
     // We add a neural net to change how fingers are handled. We set a milestone
@@ -2878,9 +2893,9 @@
     "expiry_milestone": 100
   },
   {
-    "name": "enable-web-authentication-cable-v2-support",
+    "name": "enable-web-authentication-cable-disco-creds",
     "owners": [ "webauthn-team@google.com" ],
-    "expiry_milestone": 103
+    "expiry_milestone": 112
   },
   {
     "name": "enable-web-authentication-chromeos-authenticator",
@@ -3153,6 +3168,11 @@
     "expiry_milestone": 110
   },
   {
+    "name": "feature-notification-guide-skip-check-for-low-engaged-users",
+    "owners": [ "shaktisahu"],
+    "expiry_milestone": 110
+  },
+  {
     "name": "fedcm",
     "owners": [ "goto", "webid-core@google.com"],
     "expiry_milestone": 110
@@ -3704,6 +3724,14 @@
     "expiry_milestone": 130
   },
   {
+    "name": "lacros-only",
+    "owners": [ "hidehiko", "erikchen", "lacros-team@google.com" ],
+    // Once Lacros is launched, this flag can be removed. Until then, this
+    // absolutely must not expire. We do not yet have a launch milestone.
+    // TODO(https://crbug.com/1148474).
+    "expiry_milestone": 130
+  },
+  {
     "name": "lacros-primary",
     "owners": [ "hidehiko", "erikchen", "lacros-team@google.com" ],
     // Once Lacros is launched, this flag can be removed. Until then, this
@@ -5811,7 +5839,7 @@
   {
     "name": "web-feed",
     "owners": [ "//chrome/android/feed/OWNERS", "feed@chromium.org" ],
-    "expiry_milestone": 99
+    "expiry_milestone": 110
   },
   {
     "name": "web-feed-ios",
@@ -5821,7 +5849,7 @@
   {
     "name": "web-feed-sort",
     "owners": ["//chrome/android/feed/OWNERS", "feed@chromium.org" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 110
   },
   {
     "name": "web-midi",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index c348e3c..61b9207 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -366,6 +366,15 @@
     "When enabled, if all requirements are met, Autofill will offer to use "
     "virtual credit cards in form filling.";
 
+const char kAutofillEnableVirtualCardManagementInDesktopSettingsPageName[] =
+    "Enable virtual card enrollment management in desktop payments settings "
+    "page";
+const char
+    kAutofillEnableVirtualCardManagementInDesktopSettingsPageDescription[] =
+        "When enabled, chrome://settings/payments will offer the option to "
+        "enroll in virtual card if the card is eligible and to unenroll if the "
+        "card has been enrolled.";
+
 const char kAutofillEnableVirtualCardsRiskBasedAuthenticationName[] =
     "Enable risk based authentication for Autofill Virtual Card Numbers";
 const char kAutofillEnableVirtualCardsRiskBasedAuthenticationDescription[] =
@@ -1230,10 +1239,11 @@
 const char kEnableUseZoomForDsfChoiceEnabled[] = "Enabled";
 const char kEnableUseZoomForDsfChoiceDisabled[] = "Disabled";
 
-const char kEnableWebAuthenticationCableV2SupportName[] =
-    "Web Authentication caBLE v2 QR codes";
-const char kEnableWebAuthenticationCableV2SupportDescription[] =
-    "Enable display of QR codes for using Android phones as security keys.";
+const char kEnableWebAuthenticationCableDiscoCredsName[] =
+    "Discoverable credentials over caBLEv2";
+const char kEnableWebAuthenticationCableDiscoCredsDescription[] =
+    "Enable the creation and use of Web Authentication discoverable "
+    "credentials over the caBLEv2 transport";
 
 const char kEnableWebAuthenticationChromeOSAuthenticatorName[] =
     "ChromeOS platform Web Authentication support";
@@ -3120,6 +3130,11 @@
 const char kFeatureNotificationGuideDescription[] =
     "Enables notifications about chrome features.";
 
+const char kFeatureNotificationGuideSkipCheckForLowEngagedUsersName[] =
+    "Feature notification guide - Skip check for low engaged users";
+const char kFeatureNotificationGuideSkipCheckForLowEngagedUsersDescription[] =
+    "Skips check for low engaged users.";
+
 const char kFeedBackToTopName[] = "Back to top of the feeds";
 const char kFeedBackToTopDescription[] =
     "Enables showing a callout to help users return to the top of the feeds "
@@ -4519,6 +4534,15 @@
     "Enable normalization of scores from different providers to the "
     "launcher.";
 
+const char kEnableNeuralPalmAdaptiveHoldName[] = "Palm Rejection Adaptive Hold";
+const char kEnableNeuralPalmAdaptiveHoldDescription[] =
+    "Enable adaptive hold in palm rejection.  Not compatible with all devices.";
+
+const char kEnableNeuralPalmRejectionModelV2Name[] = "Palm Rejection Model V2";
+const char kEnableNeuralPalmRejectionModelV2Description[] =
+    "Uses an updated model for palm rejection.  Not compatible with all "
+    "devices.";
+
 const char kEnableNeuralStylusPalmRejectionName[] =
     "Enable Neural Palm Detection";
 const char kEnableNeuralStylusPalmRejectionDescription[] =
@@ -4867,6 +4891,11 @@
     "Makes the lacros-availability policy have no effect. Instead Lacros "
     "availability will be controlled by experiment and/or user flags.";
 
+const char kLacrosOnlyName[] = "Lacros is the only browser";
+const char kLacrosOnlyDescription[] =
+    "Use Lacros-chrome as the only web browser on Chrome OS. "
+    "This flag is ignored if Lacros support or primary is disabled.";
+
 const char kLacrosPrimaryName[] = "Lacros as the primary browser";
 const char kLacrosPrimaryDescription[] =
     "Use Lacros-chrome as the primary web browser on Chrome OS. "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index bfa3677..52e841f 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -208,6 +208,11 @@
 extern const char kAutofillEnableVirtualCardName[];
 extern const char kAutofillEnableVirtualCardDescription[];
 
+extern const char
+    kAutofillEnableVirtualCardManagementInDesktopSettingsPageName[];
+extern const char
+    kAutofillEnableVirtualCardManagementInDesktopSettingsPageDescription[];
+
 extern const char kAutofillEnableVirtualCardsRiskBasedAuthenticationName[];
 extern const char
     kAutofillEnableVirtualCardsRiskBasedAuthenticationDescription[];
@@ -700,8 +705,8 @@
 extern const char kEnableUseZoomForDsfChoiceEnabled[];
 extern const char kEnableUseZoomForDsfChoiceDisabled[];
 
-extern const char kEnableWebAuthenticationCableV2SupportName[];
-extern const char kEnableWebAuthenticationCableV2SupportDescription[];
+extern const char kEnableWebAuthenticationCableDiscoCredsName[];
+extern const char kEnableWebAuthenticationCableDiscoCredsDescription[];
 
 extern const char kEnableWebAuthenticationChromeOSAuthenticatorName[];
 extern const char kEnableWebAuthenticationChromeOSAuthenticatorDescription[];
@@ -1774,6 +1779,10 @@
 extern const char kFeatureNotificationGuideName[];
 extern const char kFeatureNotificationGuideDescription[];
 
+extern const char kFeatureNotificationGuideSkipCheckForLowEngagedUsersName[];
+extern const char
+    kFeatureNotificationGuideSkipCheckForLowEngagedUsersDescription[];
+
 extern const char kFeedBackToTopName[];
 extern const char kFeedBackToTopDescription[];
 
@@ -2583,6 +2592,12 @@
 extern const char kEnableLibinputToHandleTouchpadName[];
 extern const char kEnableLibinputToHandleTouchpadDescription[];
 
+extern const char kEnableNeuralPalmAdaptiveHoldName[];
+extern const char kEnableNeuralPalmAdaptiveHoldDescription[];
+
+extern const char kEnableNeuralPalmRejectionModelV2Name[];
+extern const char kEnableNeuralPalmRejectionModelV2Description[];
+
 extern const char kEnableNeuralStylusPalmRejectionName[];
 extern const char kEnableNeuralStylusPalmRejectionDescription[];
 
@@ -2799,6 +2814,9 @@
 extern const char kLacrosAvailabilityIgnoreName[];
 extern const char kLacrosAvailabilityIgnoreDescription[];
 
+extern const char kLacrosOnlyName[];
+extern const char kLacrosOnlyDescription[];
+
 extern const char kLacrosPrimaryName[];
 extern const char kLacrosPrimaryDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 7e02d70..c4207a8 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -138,6 +138,7 @@
     &feature_engagement::kIPHTabSwitcherButtonFeature,
     &feature_engagement::kUseClientConfigIPH,
     &feature_guide::features::kFeatureNotificationGuide,
+    &feature_guide::features::kSkipCheckForLowEngagedUsers,
     &feed::kFeedBackToTop,
     &feed::kFeedClearImageMemoryCache,
     &feed::kFeedImageMemoryCacheSizePercentage,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java
index 354661e..2cb9f9c 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java
@@ -13,6 +13,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.FeatureList;
 import org.chromium.base.task.test.ShadowPostTask;
@@ -31,6 +32,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ShadowPostTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class CachedFeatureFlagsSafeModeUnitTest {
     private static final String CRASHY_FEATURE = "CrashyFeature";
     private static final String OK_FEATURE = "OkFeature";
diff --git a/chrome/browser/headless/headless_mode_util.cc b/chrome/browser/headless/headless_mode_util.cc
index e2c4d27..5bf2ceb 100644
--- a/chrome/browser/headless/headless_mode_util.cc
+++ b/chrome/browser/headless/headless_mode_util.cc
@@ -6,10 +6,10 @@
 
 #include "build/build_config.h"
 
-// Native headless is currently available only on Linux and Windows platforms.
+// Native headless is currently available on Linux, Windows and Mac platforms.
 // More platforms will be added later, so avoid function level clutter by
 // providing stub implementations at the end of the file.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 
 #include <cstdlib>
 #include <vector>
@@ -64,7 +64,7 @@
 
 }  // namespace headless
 
-#else  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+#else  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 
 namespace headless {
 
@@ -76,4 +76,4 @@
 
 }  // namespace headless
 
-#endif  // BUILDFLAG(IS_LINUX)
+#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc
index c0e9a71c..fd59780 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc
@@ -25,6 +25,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_status_code.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
@@ -33,6 +34,8 @@
 namespace media_router {
 
 namespace {
+using AddSinkResultCode = access_code_cast::mojom::AddSinkResultCode;
+
 bool command_line_enabled_for_testing = false;
 
 // TODO(b/206131520): Add Policy Switches to
@@ -70,6 +73,10 @@
 constexpr char kJsonAudioIn[] = "audioIn";
 constexpr char kJsonDevMode[] = "devMode";
 
+constexpr char kJsonError[] = "error";
+constexpr char kJsonErrorCode[] = "code";
+constexpr char kJsonErrorMessage[] = "message";
+
 const int64_t kTimeoutMs = 30000;
 
 const net::NetworkTrafficAnnotationTag kTrafficAnnotation =
@@ -123,20 +130,83 @@
   return std::string(kDefaultDiscoveryEndpoint) + kDiscoveryServicePath;
 }
 
+AddSinkResultCode GetErrorFromResponse(const base::Value& response) {
+  const base::Value* error = response.FindKey(kJsonError);
+  if (!error) {
+    return AddSinkResultCode::OK;
+  }
+
+  // Get the HTTP code
+  absl::optional<int> http_code = error->FindIntKey(kJsonErrorCode);
+  if (!http_code) {
+    return AddSinkResultCode::RESPONSE_MALFORMED;
+  }
+
+  const std::string* error_message = error->FindStringKey(kJsonErrorMessage);
+  DVLOG(1) << "Error: HTTP " << *http_code << ": ("
+           << (error_message ? *error_message : "") << ")";
+
+  switch (*http_code) {
+    // 401
+    case net::HTTP_UNAUTHORIZED:
+      ABSL_FALLTHROUGH_INTENDED;
+    // 403
+    case net::HTTP_FORBIDDEN:
+      return AddSinkResultCode::AUTH_ERROR;
+
+    // 404
+    case net::HTTP_NOT_FOUND:
+      return AddSinkResultCode::ACCESS_CODE_NOT_FOUND;
+
+    // 408
+    case net::HTTP_REQUEST_TIMEOUT:
+      ABSL_FALLTHROUGH_INTENDED;
+    // 502
+    case net::HTTP_GATEWAY_TIMEOUT:
+      return AddSinkResultCode::SERVER_ERROR;
+
+    // 412
+    case net::HTTP_PRECONDITION_FAILED:
+      ABSL_FALLTHROUGH_INTENDED;
+    // 417
+    case net::HTTP_EXPECTATION_FAILED:
+      return AddSinkResultCode::INVALID_ACCESS_CODE;
+
+    // 429
+    case net::HTTP_TOO_MANY_REQUESTS:
+      return AddSinkResultCode::TOO_MANY_REQUESTS;
+
+    // 501
+    case net::HTTP_INTERNAL_SERVER_ERROR:
+      return AddSinkResultCode::SERVER_ERROR;
+
+    // 503
+    case net::HTTP_SERVICE_UNAVAILABLE:
+      return AddSinkResultCode::SERVICE_NOT_PRESENT;
+
+    case net::HTTP_OK:
+      NOTREACHED();
+      ABSL_FALLTHROUGH_INTENDED;
+    default:
+      return AddSinkResultCode::HTTP_RESPONSE_CODE_ERROR;
+  }
+}
+
 // TODO(b/206997996): Add an enum to the EndpointResponse struct so that we can
 // check the enum instead of the string
-bool IsResponseValid(const absl::optional<base::Value>& response) {
+AddSinkResultCode IsResponseValid(const absl::optional<base::Value>& response) {
   if (!response || !response->is_dict()) {
     DVLOG(1) << "response_body was of unexpected format.";
-    return false;
+    return AddSinkResultCode::RESPONSE_MALFORMED;
   }
 
   if (response->DictEmpty()) {
     DVLOG(1) << "Response does not have value. Response: "
              << response->DebugString();
-    return false;
+    return AddSinkResultCode::EMPTY_RESPONSE;
   }
-  return true;
+
+  return GetErrorFromResponse(*response);
 }
 
 bool HasAuthenticationError(const std::string& response) {
@@ -252,8 +322,10 @@
 
   absl::optional<base::Value> response_value =
       base::JSONReader::Read(response->response);
-  if (!IsResponseValid(response_value)) {
-    ReportError(AddSinkResultCode::RESPONSE_MALFORMED);
+
+  AddSinkResultCode result_code = IsResponseValid(response_value);
+  if (result_code != AddSinkResultCode::OK) {
+    ReportError(result_code);
     return;
   }
 
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc
index cd397da..1528b38 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc
@@ -42,6 +42,7 @@
 using ::testing::Eq;
 using ::testing::Invoke;
 using ::testing::InvokeArgument;
+using ::testing::Mock;
 using ::testing::NiceMock;
 using ::testing::Return;
 
@@ -139,6 +140,16 @@
       }
     })";
 
+// videoOut is a string instead of a bool in this test case
+const char kErrorResponseFmt[] =
+    R"({
+      "error": {
+        "code": %d,
+        "message": "%s",
+        "status": "%s"
+      }
+    })";
+
 }  // namespace
 
 MATCHER_P(DiscoveryDeviceProtoEquals, message, "") {
@@ -207,6 +218,26 @@
                                          response_data, status);
   }
 
+  std::string ConstructErrorResponse(net::HttpStatusCode code) {
+    return base::StringPrintf(kErrorResponseFmt, code,
+                              GetHttpReasonPhrase(code),
+                              GetHttpReasonPhrase(code));
+  }
+
+  void ErrorMappingTestHelper(net::HttpStatusCode http_response,
+                              AddSinkResultCode expected) {
+    SetEndpointFetcherMockResponse(GURL(kMockEndpoint),
+                                   ConstructErrorResponse(http_response),
+                                   http_response, net::OK);
+
+    MockDiscoveryDeviceCallback mock_callback;
+
+    EXPECT_CALL(mock_callback, Run(Eq(absl::nullopt), expected));
+
+    stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get());
+    base::RunLoop().RunUntilIdle();
+  }
+
   void SignIn() {
     identity_test_env_.MakePrimaryAccountAvailable(kEmail,
                                                    signin::ConsentLevel::kSync);
@@ -276,6 +307,29 @@
   base::RunLoop().RunUntilIdle();
 }
 
+TEST_F(AccessCodeCastDiscoveryInterfaceTest, HttpErrorMapping) {
+  ErrorMappingTestHelper(net::HTTP_UNAUTHORIZED, AddSinkResultCode::AUTH_ERROR);
+  ErrorMappingTestHelper(net::HTTP_FORBIDDEN, AddSinkResultCode::AUTH_ERROR);
+  ErrorMappingTestHelper(net::HTTP_NOT_FOUND,
+                         AddSinkResultCode::ACCESS_CODE_NOT_FOUND);
+  ErrorMappingTestHelper(net::HTTP_REQUEST_TIMEOUT,
+                         AddSinkResultCode::SERVER_ERROR);
+  ErrorMappingTestHelper(net::HTTP_PRECONDITION_FAILED,
+                         AddSinkResultCode::INVALID_ACCESS_CODE);
+  ErrorMappingTestHelper(net::HTTP_EXPECTATION_FAILED,
+                         AddSinkResultCode::INVALID_ACCESS_CODE);
+  ErrorMappingTestHelper(net::HTTP_TOO_MANY_REQUESTS,
+                         AddSinkResultCode::TOO_MANY_REQUESTS);
+  ErrorMappingTestHelper(net::HTTP_INTERNAL_SERVER_ERROR,
+                         AddSinkResultCode::SERVER_ERROR);
+  ErrorMappingTestHelper(net::HTTP_SERVICE_UNAVAILABLE,
+                         AddSinkResultCode::SERVICE_NOT_PRESENT);
+
+  // Some random error
+  ErrorMappingTestHelper(net::HTTP_INVALID_XPRIVET_TOKEN,
+                         AddSinkResultCode::HTTP_RESPONSE_CODE_ERROR);
+}
+
 TEST_F(AccessCodeCastDiscoveryInterfaceTest, ServerResponseMalformedError) {
   // Test to validate that a malformed server response is propagated from the
   // discovery interface.
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index 41fbe3e..447f305 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -150,16 +149,9 @@
     NetworkContextType::kOnDiskAppWithIncognitoProfile,
 };
 
-enum class ForceDiskCache {
-  kDontForce,
-  kForceEnable,
-  kForceDisable,
-};
-
 struct TestCase {
   NetworkServiceState network_service_state;
   NetworkContextType network_context_type;
-  ForceDiskCache force_disk_cache;
 };
 
 // Waits for the network connection type to be the specified value.
@@ -230,12 +222,6 @@
     // the test server here.
     EXPECT_TRUE(embedded_test_server()->InitializeAndListen());
     EXPECT_TRUE(https_server()->InitializeAndListen());
-
-    if (GetParam().force_disk_cache == ForceDiskCache::kForceEnable) {
-      feature_list_.InitAndEnableFeature(features::kDisableHttpDiskCache);
-    } else if (GetParam().force_disk_cache == ForceDiskCache::kForceDisable) {
-      feature_list_.InitAndDisableFeature(features::kDisableHttpDiskCache);
-    }
   }
 
   // Returns a cacheable response (10 hours) that is some random text.
@@ -1093,8 +1079,7 @@
   simple_loader_helper.WaitForCallback();
 
   // The request should only succeed if there is an on-disk cache.
-  if (GetHttpCacheType() != StorageType::kDisk ||
-      base::FeatureList::IsEnabled(features::kDisableHttpDiskCache)) {
+  if (GetHttpCacheType() != StorageType::kDisk) {
     EXPECT_FALSE(simple_loader_helper.response_body());
   } else {
     DCHECK_NE(GetParam().network_service_state,
@@ -2187,29 +2172,24 @@
 // Instantiates tests with a prefix indicating which NetworkContext is being
 // tested, and a suffix of "/0" if the network service is enabled, "/1" if it's
 // enabled and restarted.
-#define TEST_CASES(network_context_type, force_disk_cache)              \
-  TestCase({NetworkServiceState::kEnabled, network_context_type,        \
-            force_disk_cache}),                                         \
-      TestCase({NetworkServiceState::kRestarted, network_context_type,  \
-               force_disk_cache})
+#define TEST_CASES(network_context_type)                           \
+  TestCase({NetworkServiceState::kEnabled, network_context_type}), \
+      TestCase({NetworkServiceState::kRestarted, network_context_type})
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #define INSTANTIATE_EXTENSION_TESTS(TestFixture)                        \
   INSTANTIATE_TEST_SUITE_P(                                             \
       OnDiskApp, TestFixture,                                           \
-      ::testing::Values(TEST_CASES(NetworkContextType::kOnDiskApp,      \
-                                   ForceDiskCache::kDontForce)));       \
+      ::testing::Values(TEST_CASES(NetworkContextType::kOnDiskApp)));   \
                                                                         \
   INSTANTIATE_TEST_SUITE_P(                                             \
       InMemoryApp, TestFixture,                                         \
-      ::testing::Values(TEST_CASES(NetworkContextType::kInMemoryApp,    \
-                                   ForceDiskCache::kDontForce)));       \
+      ::testing::Values(TEST_CASES(NetworkContextType::kInMemoryApp))); \
                                                                         \
   INSTANTIATE_TEST_SUITE_P(                                             \
       OnDiskAppWithIncognitoProfile, TestFixture,                       \
       ::testing::Values(                                                \
-          TEST_CASES(NetworkContextType::kOnDiskAppWithIncognitoProfile,\
-                     ForceDiskCache::kDontForce)));
+          TEST_CASES(NetworkContextType::kOnDiskAppWithIncognitoProfile)));
 #else  // !BUILDFLAG(ENABLE_EXTENSIONS)
 #define INSTANTIATE_EXTENSION_TESTS(TestFixture)
 #endif  // !BUILDFLAG(ENABLE_EXTENSIONS)
@@ -2218,27 +2198,19 @@
   INSTANTIATE_EXTENSION_TESTS(TestFixture)                               \
   INSTANTIATE_TEST_SUITE_P(                                              \
       SystemNetworkContext, TestFixture,                                 \
-      ::testing::Values(TEST_CASES(NetworkContextType::kSystem,          \
-                                   ForceDiskCache::kDontForce)));        \
+      ::testing::Values(TEST_CASES(NetworkContextType::kSystem)));       \
                                                                          \
   INSTANTIATE_TEST_SUITE_P(                                              \
       SafeBrowsingNetworkContext, TestFixture,                           \
-      ::testing::Values(TEST_CASES(NetworkContextType::kSafeBrowsing,    \
-                                   ForceDiskCache::kDontForce)));        \
+      ::testing::Values(TEST_CASES(NetworkContextType::kSafeBrowsing))); \
                                                                          \
   INSTANTIATE_TEST_SUITE_P(                                              \
       ProfileMainNetworkContext, TestFixture,                            \
-      ::testing::Values(TEST_CASES(NetworkContextType::kProfile,         \
-                                   ForceDiskCache::kDontForce),          \
-                        TEST_CASES(NetworkContextType::kProfile,         \
-                                   ForceDiskCache::kForceEnable),        \
-                        TEST_CASES(NetworkContextType::kProfile,         \
-                                   ForceDiskCache::kForceDisable)));     \
+      ::testing::Values(TEST_CASES(NetworkContextType::kProfile)));      \
                                                                          \
   INSTANTIATE_TEST_SUITE_P(                                              \
       IncognitoProfileMainNetworkContext, TestFixture,                   \
-      ::testing::Values(TEST_CASES(NetworkContextType::kIncognitoProfile,\
-                                   ForceDiskCache::kDontForce)))
+      ::testing::Values(TEST_CASES(NetworkContextType::kIncognitoProfile)))
 
 INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(NetworkContextConfigurationBrowserTest);
 INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index d89552a..ea7d8c5a 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -727,25 +727,10 @@
         local_state->GetFilePath(prefs::kDiskCacheDir);
     if (!disk_cache_dir.empty())
       base_cache_path = disk_cache_dir.Append(base_cache_path.BaseName());
-    base::FilePath http_cache_path =
+    network_context_params->http_cache_path =
         base_cache_path.Append(chrome::kCacheDirname);
-    if (base::FeatureList::IsEnabled(features::kDisableHttpDiskCache)) {
-      // Clear any existing on-disk cache first since if the user tries to
-      // remove the cache it would only affect the in-memory cache while in the
-      // experiment.
-      base::ThreadPool::PostTask(
-          FROM_HERE,
-          {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
-           base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-          base::BindOnce(base::GetDeletePathRecursivelyCallback(),
-                         http_cache_path));
-      network_context_params->http_cache_max_size =
-          features::kDisableHttpDiskCacheMemoryCacheSizeParam.Get();
-    } else {
-      network_context_params->http_cache_path = http_cache_path;
-      network_context_params->http_cache_max_size =
-          local_state->GetInteger(prefs::kDiskCacheSize);
-    }
+    network_context_params->http_cache_max_size =
+        local_state->GetInteger(prefs::kDiskCacheSize);
 
     network_context_params->file_paths =
         ::network::mojom::NetworkContextFilePaths::New();
diff --git a/chrome/browser/net/profile_network_context_service_browsertest.cc b/chrome/browser/net/profile_network_context_service_browsertest.cc
index 6214873..fdb16e1 100644
--- a/chrome/browser/net/profile_network_context_service_browsertest.cc
+++ b/chrome/browser/net/profile_network_context_service_browsertest.cc
@@ -141,8 +141,7 @@
                                 &expected_cache_path);
   expected_cache_path = expected_cache_path.Append(chrome::kCacheDirname);
   base::ScopedAllowBlockingForTesting allow_blocking;
-  EXPECT_NE(base::FeatureList::IsEnabled(features::kDisableHttpDiskCache),
-            base::PathExists(expected_cache_path));
+  EXPECT_TRUE(base::PathExists(expected_cache_path));
 }
 
 IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceBrowsertest,
@@ -466,18 +465,12 @@
 // Test subclass that adds switches::kDiskCacheDir and switches::kDiskCacheSize
 // to the command line, to make sure they're respected.
 class ProfileNetworkContextServiceDiskCacheBrowsertest
-    : public ProfileNetworkContextServiceBrowsertest,
-      public testing::WithParamInterface<bool> {
+    : public ProfileNetworkContextServiceBrowsertest {
  public:
   const int64_t kCacheSize = 7;
 
   ProfileNetworkContextServiceDiskCacheBrowsertest() {
     EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
-    if (GetParam()) {
-      feature_list_.InitAndEnableFeature(features::kDisableHttpDiskCache);
-    } else {
-      feature_list_.InitAndDisableFeature(features::kDisableHttpDiskCache);
-    }
   }
 
   ~ProfileNetworkContextServiceDiskCacheBrowsertest() override {}
@@ -493,11 +486,10 @@
 
  private:
   base::ScopedTempDir temp_dir_;
-  base::test::ScopedFeatureList feature_list_;
 };
 
 // Makes sure switches::kDiskCacheDir is hooked up correctly.
-IN_PROC_BROWSER_TEST_P(ProfileNetworkContextServiceDiskCacheBrowsertest,
+IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceDiskCacheBrowsertest,
                        DiskCacheLocation) {
   // Make sure command line switch is hooked up to the pref.
   ASSERT_EQ(TempPath(), g_browser_process->local_state()->GetFilePath(
@@ -524,12 +516,11 @@
           .Append(browser()->profile()->GetBaseName())
           .Append(chrome::kCacheDirname);
   base::ScopedAllowBlockingForTesting allow_blocking;
-  EXPECT_NE(base::FeatureList::IsEnabled(features::kDisableHttpDiskCache),
-            base::PathExists(expected_cache_path));
+  EXPECT_TRUE(base::PathExists(expected_cache_path));
 }
 
 // Makes sure switches::kDiskCacheSize is hooked up correctly.
-IN_PROC_BROWSER_TEST_P(ProfileNetworkContextServiceDiskCacheBrowsertest,
+IN_PROC_BROWSER_TEST_F(ProfileNetworkContextServiceDiskCacheBrowsertest,
                        DiskCacheSize) {
   // Make sure command line switch is hooked up to the pref.
   ASSERT_EQ(kCacheSize, g_browser_process->local_state()->GetInteger(
@@ -547,17 +538,9 @@
   profile_network_context_service->ConfigureNetworkContextParams(
       /*in_memory=*/false, empty_relative_partition_path,
       &network_context_params, &cert_verifier_creation_params);
-  if (base::FeatureList::IsEnabled(features::kDisableHttpDiskCache)) {
-    EXPECT_EQ(0, network_context_params.http_cache_max_size);
-  } else {
-    EXPECT_EQ(kCacheSize, network_context_params.http_cache_max_size);
-  }
+  EXPECT_EQ(kCacheSize, network_context_params.http_cache_max_size);
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ProfileNetworkContextServiceDiskCacheBrowsertest,
-                         testing::Values(true, false));
-
 #if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
 namespace {
 void UnblockOnProfileCreation(base::RunLoop* run_loop,
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 6b8c003..bbb7041 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -126,6 +126,13 @@
   auth_dynamic_params->allowed_schemes =
       base::SplitString(local_state->GetString(prefs::kAuthSchemes), ",",
                         base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+  for (const base::Value& item :
+       local_state->GetList(prefs::kAllHttpAuthSchemesAllowedForOrigins)
+           ->GetList()) {
+    auth_dynamic_params->patterns_allowed_to_use_all_schemes.push_back(
+        item.GetString());
+  }
   auth_dynamic_params->server_allowlist =
       local_state->GetString(prefs::kAuthServerAllowlist);
   auth_dynamic_params->delegate_allowlist =
@@ -367,6 +374,8 @@
                              auth_pref_callback);
   pref_change_registrar_.Add(prefs::kBasicAuthOverHttpEnabled,
                              auth_pref_callback);
+  pref_change_registrar_.Add(prefs::kAllHttpAuthSchemesAllowedForOrigins,
+                             auth_pref_callback);
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
   pref_change_registrar_.Add(prefs::kAuthNegotiateDelegateByKdcPolicy,
@@ -420,6 +429,8 @@
         // !BUILDFLAG(IS_CHROMEOS_ASH)
 
   // Dynamic auth params.
+  registry->RegisterListPref(prefs::kAllHttpAuthSchemesAllowedForOrigins,
+                             base::Value(base::Value::Type::LIST));
   registry->RegisterBooleanPref(prefs::kDisableAuthNegotiateCnameLookup, false);
   registry->RegisterBooleanPref(prefs::kEnableAuthNegotiatePort, false);
   registry->RegisterBooleanPref(prefs::kBasicAuthOverHttpEnabled, true);
diff --git a/chrome/browser/net/system_network_context_manager_browsertest.cc b/chrome/browser/net/system_network_context_manager_browsertest.cc
index e41e2b4..af96aacca4 100644
--- a/chrome/browser/net/system_network_context_manager_browsertest.cc
+++ b/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -18,8 +18,10 @@
 #include "chrome/browser/net/stub_resolver_config_reader.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/test_launcher_utils.h"
 #include "components/prefs/pref_service.h"
 #include "components/version_info/version_info.h"
 #include "content/public/browser/network_service_instance.h"
@@ -112,6 +114,7 @@
   EXPECT_EQ("", dynamic_params->server_allowlist);
   EXPECT_EQ("", dynamic_params->delegate_allowlist);
   EXPECT_FALSE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   PrefService* local_state = g_browser_process->local_state();
 
@@ -126,6 +129,7 @@
   EXPECT_EQ("", dynamic_params->server_allowlist);
   EXPECT_EQ("", dynamic_params->delegate_allowlist);
   EXPECT_FALSE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   local_state->SetBoolean(prefs::kEnableAuthNegotiatePort, true);
   dynamic_params =
@@ -138,6 +142,7 @@
   EXPECT_EQ("", dynamic_params->server_allowlist);
   EXPECT_EQ("", dynamic_params->delegate_allowlist);
   EXPECT_FALSE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   local_state->SetBoolean(prefs::kBasicAuthOverHttpEnabled, false);
   dynamic_params =
@@ -150,6 +155,7 @@
   EXPECT_EQ("", dynamic_params->server_allowlist);
   EXPECT_EQ("", dynamic_params->delegate_allowlist);
   EXPECT_FALSE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   const char kServerAllowList[] = "foo";
   local_state->SetString(prefs::kAuthServerAllowlist, kServerAllowList);
@@ -162,6 +168,7 @@
   EXPECT_FALSE(dynamic_params->basic_over_http_enabled);
   EXPECT_EQ(kServerAllowList, dynamic_params->server_allowlist);
   EXPECT_EQ("", dynamic_params->delegate_allowlist);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   const char kDelegateAllowList[] = "bar, baz";
   local_state->SetString(prefs::kAuthNegotiateDelegateAllowlist,
@@ -176,6 +183,7 @@
   EXPECT_FALSE(dynamic_params->basic_over_http_enabled);
   EXPECT_EQ(kDelegateAllowList, dynamic_params->delegate_allowlist);
   EXPECT_FALSE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 
   local_state->SetString(prefs::kAuthSchemes, "basic");
   dynamic_params =
@@ -200,6 +208,7 @@
   EXPECT_EQ(kServerAllowList, dynamic_params->server_allowlist);
   EXPECT_EQ(kDelegateAllowList, dynamic_params->delegate_allowlist);
   EXPECT_TRUE(dynamic_params->delegate_by_kdc_policy);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -210,7 +219,25 @@
   dynamic_params =
       SystemNetworkContextManager::GetHttpAuthDynamicParamsForTesting();
   EXPECT_TRUE(dynamic_params->allow_gssapi_library_load);
+  EXPECT_TRUE(dynamic_params->patterns_allowed_to_use_all_schemes.empty());
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+  base::Value patterns_allowed_to_use_all_schemes(base::Value::Type::LIST);
+  patterns_allowed_to_use_all_schemes.Append(
+      base::Value("*.allowed.google.com"));
+  patterns_allowed_to_use_all_schemes.Append(base::Value("*.youtube.com"));
+  local_state->Set(prefs::kAllHttpAuthSchemesAllowedForOrigins,
+                   std::move(patterns_allowed_to_use_all_schemes));
+  dynamic_params =
+      SystemNetworkContextManager::GetHttpAuthDynamicParamsForTesting();
+
+  EXPECT_TRUE(dynamic_params->negotiate_disable_cname_lookup);
+  EXPECT_TRUE(dynamic_params->enable_negotiate_port);
+  EXPECT_EQ(kServerAllowList, dynamic_params->server_allowlist);
+  EXPECT_FALSE(dynamic_params->basic_over_http_enabled);
+  EXPECT_EQ(kDelegateAllowList, dynamic_params->delegate_allowlist);
+  EXPECT_EQ((std::vector<std::string>{"*.allowed.google.com", "*.youtube.com"}),
+            dynamic_params->patterns_allowed_to_use_all_schemes);
 }
 
 class SystemNetworkContextManagerWithFirstPartySetComponentBrowserTest
@@ -230,9 +257,18 @@
                                  GetComponentContents());
   }
 
-  bool UseV2Format() const { return GetParam(); }
+ protected:
+  void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
+    base::CommandLine default_command_line(base::CommandLine::NO_PROGRAM);
+    SystemNetworkContextManagerBrowsertest::SetUpDefaultCommandLine(
+        &default_command_line);
+    test_launcher_utils::RemoveCommandLineSwitch(
+        default_command_line, switches::kDisableComponentUpdate, command_line);
+  }
 
  private:
+  bool UseV2Format() const { return GetParam(); }
+
   std::string GetComponentContents() const {
     if (UseV2Format()) {
       // Use the V2 format of the component.
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorTest.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorTest.java
index 994f744..3399f8b 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorTest.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorTest.java
@@ -26,6 +26,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLog;
 import org.robolectric.shadows.ShadowNotificationManager;
 import org.robolectric.shadows.ShadowPendingIntent;
@@ -47,7 +48,7 @@
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(shadows = {ShadowNotificationManager.class, ShadowPendingIntent.class,
                 ShadowRecordHistogram.class})
-
+@LooperMode(LooperMode.Mode.LEGACY)
 public class NotificationIntentInterceptorTest {
     private static final String TEST_NOTIFICATION_TITLE = "Test notification title";
     private static final String TEST_NOTIFICATION_ACTION_TITLE = "Test notification action title";
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
index 6e1c087..f6a97b1 100644
--- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -325,7 +325,6 @@
 
 void OptimizationGuideKeyedService::ClearData() {
   hints_manager_->ClearFetchedHints();
-  prediction_manager_->ClearHostModelFeatures();
 }
 
 void OptimizationGuideKeyedService::Shutdown() {
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.cc b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
index 9834cbd5..511aed1 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
@@ -50,8 +50,7 @@
 
 namespace {
 
-// Provide a random time delta in seconds before fetching models and host model
-// features.
+// Provide a random time delta in seconds before fetching models.
 base::TimeDelta RandomFetchDelay() {
   return base::Seconds(base::RandInt(
       optimization_guide::features::PredictionModelFetchRandomMinDelaySecs(),
@@ -152,7 +151,7 @@
       changed);
 }
 
-// Returns whether models and host model features should be fetched from the
+// Returns whether models should be fetched from the
 // remote Optimization Guide Service.
 bool ShouldFetchModels(Profile* profile) {
   return optimization_guide::features::IsRemoteFetchingEnabled() &&
@@ -188,39 +187,12 @@
 
 namespace optimization_guide {
 
-struct PredictionDecisionParams {
-  PredictionDecisionParams(proto::OptimizationTarget optimization_target,
-                           OptimizationTargetDecisionCallback callback,
-                           int64_t version,
-                           base::TimeTicks model_evaluation_start_time)
-      : optimization_target(optimization_target),
-        callback(std::move(callback)),
-        version(version),
-        model_evaluation_start_time(model_evaluation_start_time) {}
-
-  ~PredictionDecisionParams() = default;
-
-  PredictionDecisionParams(const PredictionDecisionParams&) = delete;
-  PredictionDecisionParams& operator=(const PredictionDecisionParams&) = delete;
-
-  // Target of the prediction.
-  proto::OptimizationTarget optimization_target;
-  // Callback to be invoked once a OptimizationTargetDecision is made.
-  OptimizationTargetDecisionCallback callback;
-  // Model version.
-  int64_t version;
-  // Time when the model evaluation is initiated.
-  base::TimeTicks model_evaluation_start_time;
-};
-
 PredictionManager::PredictionManager(
     base::WeakPtr<OptimizationGuideStore> model_and_features_store,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     PrefService* pref_service,
     Profile* profile)
-    : host_model_features_cache_(
-          std::max(features::MaxHostModelFeaturesCacheSize(), size_t(1))),
-      prediction_model_download_manager_(nullptr),
+    : prediction_model_download_manager_(nullptr),
       model_and_features_store_(model_and_features_store),
       url_loader_factory_(url_loader_factory),
       pref_service_(pref_service),
@@ -306,13 +278,7 @@
   if (!fetch_timer_.IsRunning())
     MaybeScheduleModelFetch();
 
-  // Start loading the host model features if they are not already.
-  if (!host_model_features_loaded_) {
-    LoadHostModelFeatures();
-    return;
-  }
-  // Otherwise, the host model features are loaded, so load prediction models
-  // for any newly registered targets.
+  // Otherwise, load prediction models for any newly registered targets.
   LoadPredictionModels({optimization_target});
 }
 
@@ -345,11 +311,6 @@
   return nullptr;
 }
 
-const HostModelFeaturesLRUCache*
-PredictionManager::GetHostModelFeaturesForTesting() const {
-  return &host_model_features_cache_;
-}
-
 void PredictionManager::SetPredictionModelFetcherForTesting(
     std::unique_ptr<PredictionModelFetcher> prediction_model_fetcher) {
   prediction_model_fetcher_ = std::move(prediction_model_fetcher);
@@ -371,8 +332,8 @@
   if (!ShouldFetchModels(profile_))
     return;
 
-  // Models and host model features should not be fetched if there are no
-  // optimization targets registered.
+  // Models should not be fetched if there are no optimization targets
+  // registered.
   if (registered_optimization_targets_and_metadata_.empty())
     return;
 
@@ -491,47 +452,15 @@
 
   SetLastModelFetchSuccessTime(clock_->Now());
 
-  // Update host model features, even if empty so the store metadata
-  // that contains the update time for new models and features to be fetched
-  // from the remote Optimization Guide Service is updated.
-  UpdateHostModelFeatures((*get_models_response_data)->host_model_features());
-
   if ((*get_models_response_data)->models_size() > 0) {
-    // Stash the response so the models can be stored once the host
-    // model features are stored.
-    get_models_response_data_to_store_ = std::move(*get_models_response_data);
+    UpdatePredictionModels((*get_models_response_data)->models());
   }
 
+  // Purge any inactive models from the store.
+  model_and_features_store_->PurgeInactiveModels();
+
   fetch_timer_.Stop();
-  fetch_timer_.Start(FROM_HERE, features::PredictionModelFetchInterval(), this,
-                     &PredictionManager::ScheduleModelsFetch);
-}
-
-void PredictionManager::UpdateHostModelFeatures(
-    const google::protobuf::RepeatedPtrField<proto::HostModelFeatures>&
-        host_model_features) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!model_and_features_store_)
-    return;
-
-  std::unique_ptr<StoreUpdateData> host_model_features_update_data =
-      StoreUpdateData::CreateHostModelFeaturesStoreUpdateData(
-          /*host_model_features_update_time=*/clock_->Now() +
-              features::PredictionModelFetchInterval(),
-          /*expiry_time=*/clock_->Now() +
-              features::StoredHostModelFeaturesFreshnessDuration());
-  for (const auto& features : host_model_features) {
-    if (ProcessAndStoreHostModelFeatures(features)) {
-      host_model_features_update_data->CopyHostModelFeaturesIntoUpdateData(
-          features);
-    }
-  }
-
-  model_and_features_store_->UpdateHostModelFeatures(
-      std::move(host_model_features_update_data),
-      base::BindOnce(&PredictionManager::OnHostModelFeaturesStored,
-                     ui_weak_ptr_factory_.GetWeakPtr()));
+  ScheduleModelsFetch();
 }
 
 std::unique_ptr<PredictionModel> PredictionManager::CreatePredictionModel(
@@ -677,30 +606,6 @@
       "OptimizationGuide.PredictionManager.PredictionModelsStored", true);
 }
 
-void PredictionManager::OnHostModelFeaturesStored() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!model_and_features_store_)
-    return;
-
-  LOCAL_HISTOGRAM_BOOLEAN(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", true);
-
-  if (get_models_response_data_to_store_ &&
-      get_models_response_data_to_store_->models_size() > 0) {
-    UpdatePredictionModels(get_models_response_data_to_store_->models());
-  }
-  // Clear any data remaining in the stored get models response.
-  get_models_response_data_to_store_.reset();
-
-  // Purge any expired host model features and inactive models from the store.
-  model_and_features_store_->PurgeExpiredHostModelFeatures();
-  model_and_features_store_->PurgeInactiveModels();
-
-  fetch_timer_.Stop();
-  ScheduleModelsFetch();
-}
-
 void PredictionManager::OnStoreInitialized() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   store_is_ready_ = true;
@@ -720,58 +625,20 @@
     prediction_model_download_manager_->AddObserver(this);
   }
 
-  // Only load host model features if there are optimization targets registered.
+  // Only load models if there are optimization targets registered.
   if (registered_optimization_targets_and_metadata_.empty())
     return;
 
-  // The store is ready so start loading host model features and the models for
-  // the registered optimization targets.  Once the host model features are
-  // loaded, prediction models for the registered optimization targets will be
-  // loaded.
-  LoadHostModelFeatures();
+  // The store is ready so start loading models for the registered optimization
+  // targets.
+  LoadPredictionModels(GetRegisteredOptimizationTargets());
 
   MaybeScheduleModelFetch();
 }
 
-void PredictionManager::LoadHostModelFeatures() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!model_and_features_store_)
-    return;
-
-  // Load the host model features first, each prediction model requires the set
-  // of host model features to be known before creation.
-  model_and_features_store_->LoadAllHostModelFeatures(
-      base::BindOnce(&PredictionManager::OnLoadHostModelFeatures,
-                     ui_weak_ptr_factory_.GetWeakPtr()));
-}
-
-void PredictionManager::OnLoadHostModelFeatures(
-    std::unique_ptr<std::vector<proto::HostModelFeatures>>
-        all_host_model_features) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // If the store returns an empty vector of host model features, the store
-  // contains no host model features. However, the load is otherwise complete
-  // and prediction models can be loaded but they will require no host model
-  // feature information.
-  host_model_features_loaded_ = true;
-  if (all_host_model_features) {
-    for (const auto& host_model_features : *all_host_model_features)
-      ProcessAndStoreHostModelFeatures(host_model_features);
-  }
-  UMA_HISTOGRAM_COUNTS_1000(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesMapSize",
-      host_model_features_cache_.size());
-
-  // Load the prediction models for all the registered optimization targets now
-  // that it is not blocked by loading the host model features.
-  LoadPredictionModels(GetRegisteredOptimizationTargets());
-}
-
 void PredictionManager::LoadPredictionModels(
     const base::flat_set<proto::OptimizationTarget>& optimization_targets) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(host_model_features_loaded_);
 
   if (switches::IsModelOverridePresent()) {
     for (proto::OptimizationTarget optimization_target : optimization_targets) {
@@ -951,44 +818,6 @@
       optimization_target, std::move(prediction_model));
 }
 
-bool PredictionManager::ProcessAndStoreHostModelFeatures(
-    const proto::HostModelFeatures& host_model_features) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!host_model_features.has_host())
-    return false;
-  if (host_model_features.model_features_size() == 0)
-    return false;
-
-  base::flat_map<std::string, float> model_features_for_host;
-  model_features_for_host.reserve(host_model_features.model_features_size());
-  for (const auto& model_feature : host_model_features.model_features()) {
-    if (!model_feature.has_feature_name())
-      continue;
-    switch (model_feature.feature_value_case()) {
-      case proto::ModelFeature::kDoubleValue:
-        // Loss of precision from double is acceptable for features supported
-        // by the prediction models.
-        model_features_for_host.emplace(
-            model_feature.feature_name(),
-            static_cast<float>(model_feature.double_value()));
-        break;
-      case proto::ModelFeature::kInt64Value:
-        model_features_for_host.emplace(
-            model_feature.feature_name(),
-            static_cast<float>(model_feature.int64_value()));
-        break;
-      case proto::ModelFeature::FEATURE_VALUE_NOT_SET:
-        NOTREACHED();
-        break;
-    }
-  }
-  if (model_features_for_host.empty())
-    return false;
-  host_model_features_cache_.Put(host_model_features.host(),
-                                 model_features_for_host);
-  return true;
-}
-
 void PredictionManager::MaybeScheduleModelFetch() {
   if (!ShouldFetchModels(profile_))
     return;
@@ -1053,20 +882,6 @@
   clock_ = clock;
 }
 
-void PredictionManager::ClearHostModelFeatures() {
-  host_model_features_cache_.Clear();
-  if (model_and_features_store_)
-    model_and_features_store_->ClearHostModelFeaturesFromDatabase();
-}
-
-absl::optional<base::flat_map<std::string, float>>
-PredictionManager::GetHostModelFeaturesForHost(const std::string& host) const {
-  auto it = host_model_features_cache_.Peek(host);
-  if (it == host_model_features_cache_.end())
-    return absl::nullopt;
-  return it->second;
-}
-
 void PredictionManager::OverrideTargetModelForTesting(
     proto::OptimizationTarget optimization_target,
     std::unique_ptr<ModelInfo> model_info) {
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.h b/chrome/browser/optimization_guide/prediction/prediction_manager.h
index 507935e..937e6a7 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager.h
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.h
@@ -41,12 +41,6 @@
 class PredictionModelFetcher;
 class ModelInfo;
 
-using HostModelFeaturesLRUCache =
-    base::HashingLRUCache<std::string, base::flat_map<std::string, float>>;
-
-using OptimizationTargetDecisionCallback =
-    base::OnceCallback<void(optimization_guide::OptimizationTargetDecision)>;
-
 using PostModelLoadCallback =
     base::OnceCallback<void(std::unique_ptr<proto::PredictionModel>, bool)>;
 
@@ -112,10 +106,6 @@
   // Override |clock_| for testing.
   void SetClockForTesting(const base::Clock* clock);
 
-  // Clear host model features from the in memory host model features map and
-  // from the models and features store.
-  void ClearHostModelFeatures();
-
   // Override the model file returned to observers for |optimization_target|.
   // Use |TestModelInfoBuilder| to construct the model files. For
   // testing purposes only.
@@ -132,29 +122,10 @@
   PredictionModel* GetPredictionModelForTesting(
       proto::OptimizationTarget optimization_target) const;
 
-  // Return the host model features for all hosts used by this
-  // PredictionManager for testing.
-  const HostModelFeaturesLRUCache* GetHostModelFeaturesForTesting() const;
-
-  // Returns the host model features for a host if available.
-  absl::optional<base::flat_map<std::string, float>>
-  GetHostModelFeaturesForHost(const std::string& host) const;
-
-  // Return the set of features that each host in |host_model_features_map_|
-  // contains for testing.
-  base::flat_set<std::string> GetSupportedHostModelFeaturesForTesting() const;
-
   // Create a PredictionModel, virtual for testing.
   virtual std::unique_ptr<PredictionModel> CreatePredictionModel(
       const proto::PredictionModel& model) const;
 
-  // Process |host_model_features| to be stored in memory in the host model
-  // features map for immediate use and asynchronously write them to the model
-  // and features store to be persisted.
-  void UpdateHostModelFeatures(
-      const google::protobuf::RepeatedPtrField<proto::HostModelFeatures>&
-          host_model_features);
-
   // Process |prediction_models| to be stored in the in memory optimization
   // target prediction model map for immediate use and asynchronously write the
   // models to the model and features store to be persisted.
@@ -191,26 +162,6 @@
   // |model_and_features_store_|.
   void OnPredictionModelsStored();
 
-  // Callback run after host model features are stored in
-  // |model_and_features_store_|. |fetch_timer_| is stopped and the timer is
-  // rescheduled based on when models and host model features should be fetched
-  // again.
-  void OnHostModelFeaturesStored();
-
-  // Request the store to load all the host model features it contains. This
-  // must be completed before any prediction models can be loaded from the
-  // store.
-  void LoadHostModelFeatures();
-
-  // Callback run after host model features are loaded from the store and are
-  // ready to be processed and placed in |host_model_features_map_|.
-  // |host_model_features_loaded_| is set to true when called. Prediction models
-  // for all registered optimization targets that are not already loaded are
-  // requested to be loaded.
-  void OnLoadHostModelFeatures(
-      std::unique_ptr<std::vector<proto::HostModelFeatures>>
-          all_host_model_features);
-
   // Load models for every target in |optimization_targets| that have not yet
   // been loaded from the store.
   void LoadPredictionModels(
@@ -246,13 +197,6 @@
   // Post-processing callback invoked after processing |model|.
   void OnProcessLoadedModel(const proto::PredictionModel& model, bool success);
 
-  // Process |host_model_features| from the into host model features
-  // usable by the PredictionManager. The processed host model features are
-  // stored in |host_model_features_map_|. Return true if host model features
-  // can be constructed and successfully stored, otherwise, return false.
-  bool ProcessAndStoreHostModelFeatures(
-      const proto::HostModelFeatures& host_model_features);
-
   // Return the time when a prediction model fetch was last attempted.
   base::Time GetLastFetchAttemptTime() const;
 
@@ -303,9 +247,6 @@
            base::ObserverList<OptimizationTargetModelObserver>>
       registered_observers_for_optimization_targets_;
 
-  // A LRU cache of host to host model features known to the prediction manager.
-  HostModelFeaturesLRUCache host_model_features_cache_;
-
   // The fetcher that handles making requests to update the models and host
   // model features from the remote Optimization Guide Service.
   std::unique_ptr<PredictionModelFetcher> prediction_model_fetcher_;
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
index 60bffe6..6398d9fa 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
@@ -387,8 +387,6 @@
       "OptimizationGuide.PredictionModelLoadedVersion.PainfulPageLoad", 1);
 
   histogram_tester.ExpectUniqueSample(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", true, 1);
-  histogram_tester.ExpectUniqueSample(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", true, 1);
   histogram_tester.ExpectUniqueSample(
       "OptimizationGuide.PredictionModelUpdateVersion.PainfulPageLoad", 2, 1);
@@ -414,9 +412,6 @@
       "OptimizationGuide.PredictionModelFetcher.GetModelsResponse.Status",
       net::HTTP_NOT_FOUND, 1);
 
-  // TODO(crbug/1183507): Remove host model features checking
-  histogram_tester.ExpectTotalCount(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", 0);
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", 0);
   histogram_tester.ExpectTotalCount(
@@ -630,8 +625,8 @@
          const ModelInfo& model_info) { FAIL() << "Should not be called"; }));
 
   RetryForHistogramUntilCountReached(
-      &histogram_tester,
-      "OptimizationGuide.PredictionManager.HostModelFeaturesMapSize", 1);
+      &histogram_tester, "OptimizationGuide.PredictionManager.StoreInitialized",
+      1);
 
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionModelDownloadManager.DownloadStatus", 0);
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
index 70b85cb2..d67d4e7 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
@@ -67,7 +67,6 @@
 
   proto::ModelInfo* model_info = prediction_model.mutable_model_info();
   model_info->set_version(1);
-  model_info->add_supported_host_model_features("host_feat1");
   model_info->set_optimization_target(
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD);
   model_info->add_supported_model_engine_versions(
@@ -88,8 +87,6 @@
 
   proto::PredictionModel prediction_model =
       CreatePredictionModel(output_model_as_download_url);
-  prediction_model.mutable_model_info()->add_supported_host_model_features(
-      "host_feat1");
   prediction_model.mutable_model_info()->set_version(2);
   *get_models_response->add_models() = std::move(prediction_model);
 
@@ -342,18 +339,12 @@
   }
 
   void RunInitCallback(bool load_models = true,
-                       bool load_host_model_features = true,
                        bool have_models_in_store = true) {
     load_models_ = load_models;
-    load_host_model_features_ = load_host_model_features;
     have_models_in_store_ = have_models_in_store;
     std::move(init_callback_).Run();
   }
 
-  void RunUpdateHostModelFeaturesCallback() {
-    std::move(update_host_models_callback_).Run();
-  }
-
   void LoadPredictionModel(const EntryKey& prediction_model_entry_key,
                            PredictionModelLoadedCallback callback) override {
     model_loaded_ = true;
@@ -365,26 +356,6 @@
     }
   }
 
-  void LoadAllHostModelFeatures(
-      AllHostModelFeaturesLoadedCallback callback) override {
-    host_model_features_loaded_ = true;
-    if (load_host_model_features_) {
-      proto::HostModelFeatures host_model_features;
-      host_model_features.set_host("foo.com");
-      proto::ModelFeature* model_feature =
-          host_model_features.add_model_features();
-      model_feature->set_feature_name("host_feat1");
-      model_feature->set_double_value(2.0);
-      std::unique_ptr<std::vector<proto::HostModelFeatures>>
-          all_host_model_features =
-              std::make_unique<std::vector<proto::HostModelFeatures>>();
-      all_host_model_features->emplace_back(host_model_features);
-      std::move(callback).Run(std::move(all_host_model_features));
-    } else {
-      std::move(callback).Run(nullptr);
-    }
-  }
-
   bool FindPredictionModelEntryKey(
       proto::OptimizationTarget optimization_target,
       OptimizationGuideStore::EntryKey* out_prediction_model_entry_key)
@@ -401,14 +372,6 @@
     return false;
   }
 
-  void UpdateHostModelFeatures(
-      std::unique_ptr<StoreUpdateData> host_model_features_update_data,
-      base::OnceClosure callback) override {
-    host_model_features_update_time_ =
-        *host_model_features_update_data->update_time();
-    update_host_models_callback_ = std::move(callback);
-  }
-
   void UpdatePredictionModels(
       std::unique_ptr<StoreUpdateData> prediction_models_update_data,
       base::OnceClosure callback) override {
@@ -416,17 +379,11 @@
   }
 
   bool WasModelLoaded() const { return model_loaded_; }
-  bool WasHostModelFeaturesLoaded() const {
-    return host_model_features_loaded_;
-  }
 
  private:
   base::OnceClosure init_callback_;
-  base::OnceClosure update_host_models_callback_;
   bool model_loaded_ = false;
-  bool host_model_features_loaded_ = false;
   bool load_models_ = true;
-  bool load_host_model_features_ = true;
   bool have_models_in_store_ = true;
 };
 
@@ -455,15 +412,7 @@
     create_valid_prediction_model_ = create_valid_prediction_model;
   }
 
-  using PredictionManager::GetHostModelFeaturesForHost;
-  using PredictionManager::GetHostModelFeaturesForTesting;
   using PredictionManager::GetPredictionModelForTesting;
-
-  void UpdateHostModelFeaturesForTesting(
-      proto::GetModelsResponse* get_models_response) {
-    UpdateHostModelFeatures(get_models_response->host_model_features());
-  }
-
   void UpdatePredictionModelsForTesting(
       proto::GetModelsResponse* get_models_response) {
     UpdatePredictionModels(get_models_response->models());
@@ -539,10 +488,9 @@
   }
 
   void SetStoreInitialized(bool load_models = true,
-                           bool load_host_model_features = true,
                            bool have_models_in_store = true) {
-    models_and_features_store()->RunInitCallback(
-        load_models, load_host_model_features, have_models_in_store);
+    models_and_features_store()->RunInitCallback(load_models,
+                                                 have_models_in_store);
     RunUntilIdle();
     // Move clock forward for any short delays added for the fetcher.
     MoveClockForwardBy(base::Seconds(2));
@@ -679,7 +627,6 @@
   prediction_manager()->AddObserverForOptimizationTargetModel(
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, model_metadata, &observer);
   SetStoreInitialized(/* load_models= */ false,
-                      /* load_host_model_features= */ false,
                       /* have_models_in_store= */ false);
 
   EXPECT_TRUE(prediction_model_fetcher()->models_fetched());
@@ -771,7 +718,6 @@
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
       /*model_metadata=*/absl::nullopt, &observer1);
   SetStoreInitialized(/* load_models= */ false,
-                      /* load_host_model_features= */ false,
                       /* have_models_in_store= */ false);
 
   proto::ModelInfo model_info;
@@ -837,7 +783,6 @@
   prediction_manager()->AddObserverForOptimizationTargetModel(
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, model_metadata, &observer);
   SetStoreInitialized(/* load_models= */ false,
-                      /* load_host_model_features= */ false,
                       /* have_models_in_store= */ false);
 
   // Make sure no models are fetched.
@@ -1049,9 +994,6 @@
   EXPECT_TRUE(prediction_model_fetcher()->models_fetched());
   EXPECT_TRUE(prediction_model_download_manager()->cancel_downloads_called());
 
-  models_and_features_store()->RunUpdateHostModelFeaturesCallback();
-  histogram_tester.ExpectUniqueSample(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", true, 1);
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", 0);
   histogram_tester.ExpectUniqueSample(
@@ -1090,8 +1032,7 @@
 
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", 1);
-  histogram_tester.ExpectTotalCount(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", 0);
+
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionModelLoadedVersion.PainfulPageLoad", 0);
 }
@@ -1112,8 +1053,7 @@
 
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", 1);
-  histogram_tester.ExpectTotalCount(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", 0);
+
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionModelLoadedVersion.PainfulPageLoad", 0);
 }
@@ -1141,8 +1081,7 @@
 
   histogram_tester.ExpectTotalCount(
       "OptimizationGuide.PredictionManager.PredictionModelsStored", 1);
-  histogram_tester.ExpectTotalCount(
-      "OptimizationGuide.PredictionManager.HostModelFeaturesStored", 0);
+
   histogram_tester.ExpectBucketCount(
       "OptimizationGuide.PredictionModelLoadedVersion.PainfulPageLoad", 3, 1);
   histogram_tester.ExpectBucketCount(
@@ -1205,14 +1144,10 @@
   FakeOptimizationTargetModelObserver observer;
   prediction_manager()->AddObserverForOptimizationTargetModel(
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, absl::nullopt, &observer);
-  EXPECT_FALSE(models_and_features_store()->WasHostModelFeaturesLoaded());
   EXPECT_FALSE(models_and_features_store()->WasModelLoaded());
-  EXPECT_FALSE(prediction_manager()->GetHostModelFeaturesForHost("foo.com"));
 
   SetStoreInitialized();
-  EXPECT_TRUE(models_and_features_store()->WasHostModelFeaturesLoaded());
   EXPECT_TRUE(models_and_features_store()->WasModelLoaded());
-  EXPECT_TRUE(prediction_manager()->GetHostModelFeaturesForHost("foo.com"));
 
   EXPECT_FALSE(prediction_model_fetcher()->models_fetched());
   histogram_tester.ExpectUniqueSample(
@@ -1229,17 +1164,13 @@
           PredictionModelFetcherEndState::kFetchFailed));
   SetStoreInitialized();
 
-  EXPECT_FALSE(models_and_features_store()->WasHostModelFeaturesLoaded());
   EXPECT_FALSE(models_and_features_store()->WasModelLoaded());
-  EXPECT_FALSE(prediction_manager()->GetHostModelFeaturesForHost("foo.com"));
   FakeOptimizationTargetModelObserver observer;
   prediction_manager()->AddObserverForOptimizationTargetModel(
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, absl::nullopt, &observer);
   RunUntilIdle();
 
-  EXPECT_TRUE(models_and_features_store()->WasHostModelFeaturesLoaded());
   EXPECT_TRUE(models_and_features_store()->WasModelLoaded());
-  EXPECT_TRUE(prediction_manager()->GetHostModelFeaturesForHost("foo.com"));
 
   EXPECT_FALSE(prediction_model_fetcher()->models_fetched());
   histogram_tester.ExpectUniqueSample(
diff --git a/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc
index 0165dcd..4a5d2ebf 100644
--- a/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.cc
@@ -22,6 +22,10 @@
 const char kURLFirstMeaningfulPaint[] =
     "Omnibox.SuggestionUsed.URL.Experimental.NavigationToFirstMeaningfulPaint";
 
+const char kSearchLargestContentfulPaint2[] =
+    "Omnibox.SuggestionUsed.Search.NavigationToLargestContentfulPaint2";
+const char kURLLargestContentfulPaint2[] =
+    "Omnibox.SuggestionUsed.URL.NavigationToLargestContentfulPaint2";
 }  // namespace
 
 OmniboxSuggestionUsedMetricsObserver::OmniboxSuggestionUsedMetricsObserver() =
@@ -76,3 +80,39 @@
     }
   }
 }
+
+page_load_metrics::PageLoadMetricsObserver::ObservePolicy
+OmniboxSuggestionUsedMetricsObserver::FlushMetricsOnAppEnterBackground(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  if (GetDelegate().DidCommit())
+    RecordSessionEndHistograms(timing);
+  return STOP_OBSERVING;
+}
+
+void OmniboxSuggestionUsedMetricsObserver::OnComplete(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  RecordSessionEndHistograms(timing);
+}
+
+void OmniboxSuggestionUsedMetricsObserver::RecordSessionEndHistograms(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  DCHECK(GetDelegate().DidCommit());
+
+  const page_load_metrics::ContentfulPaintTimingInfo& largest_contentful_paint =
+      GetDelegate()
+          .GetLargestContentfulPaintHandler()
+          .MergeMainFrameAndSubframes();
+  if (largest_contentful_paint.ContainsValidTime() &&
+      page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
+          largest_contentful_paint.Time(), GetDelegate())) {
+    if (ui::PageTransitionCoreTypeIs(transition_type_,
+                                     ui::PAGE_TRANSITION_GENERATED)) {
+      PAGE_LOAD_HISTOGRAM(kSearchLargestContentfulPaint2,
+                          largest_contentful_paint.Time().value());
+    } else if (ui::PageTransitionCoreTypeIs(transition_type_,
+                                            ui::PAGE_TRANSITION_TYPED)) {
+      PAGE_LOAD_HISTOGRAM(kURLLargestContentfulPaint2,
+                          largest_contentful_paint.Time().value());
+    }
+  }
+}
diff --git a/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h
index 498f967..de69998 100644
--- a/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h
@@ -31,7 +31,15 @@
   void OnFirstMeaningfulPaintInMainFrameDocument(
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
 
+  ObservePolicy FlushMetricsOnAppEnterBackground(
+      const page_load_metrics::mojom::PageLoadTiming& timing) override;
+  void OnComplete(
+      const page_load_metrics::mojom::PageLoadTiming& timing) override;
+
  private:
+  void RecordSessionEndHistograms(
+      const page_load_metrics::mojom::PageLoadTiming& timing);
+
   ui::PageTransition transition_type_ = ui::PAGE_TRANSITION_LINK;
 };
 
diff --git a/chrome/browser/performance_hints/performance_hints_observer.cc b/chrome/browser/performance_hints/performance_hints_observer.cc
index 0440aab..6f1ae691 100644
--- a/chrome/browser/performance_hints/performance_hints_observer.cc
+++ b/chrome/browser/performance_hints/performance_hints_observer.cc
@@ -4,12 +4,9 @@
 
 #include "chrome/browser/performance_hints/performance_hints_observer.h"
 
-#include <string>
-
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/strcat.h"
-#include "build/build_config.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/performance_hints/performance_hints_features.h"
@@ -17,7 +14,6 @@
 #include "components/optimization_guide/core/optimization_guide_permissions_util.h"
 #include "components/optimization_guide/core/url_pattern_with_wildcards.h"
 #include "components/optimization_guide/proto/performance_hints_metadata.pb.h"
-#include "content/public/browser/web_contents.h"
 
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/jni_string.h"
@@ -101,8 +97,7 @@
 
 PerformanceHintsObserver::PerformanceHintsObserver(
     content::WebContents* web_contents)
-    : content::WebContentsObserver(web_contents),
-      content::WebContentsUserData<PerformanceHintsObserver>(*web_contents) {
+    : content::WebContentsUserData<PerformanceHintsObserver>(*web_contents) {
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
@@ -300,33 +295,35 @@
 }
 
 bool PerformanceHintsObserver::DoesPageSupportHints() {
-  // page_url_ is not set for error pages.
-  return page_url_.has_value() && page_url_->is_valid() &&
-         page_url_->SchemeIsHTTPOrHTTPS();
+  // The error pages do not support hints.
+  const GURL page_url = GetWebContents().GetLastCommittedURL();
+  return page_url.is_valid() && page_url.SchemeIsHTTPOrHTTPS() &&
+         !GetWebContents().GetMainFrame()->IsErrorDocument();
 }
 
-void PerformanceHintsObserver::PopulateLinkHints() {
-  DCHECK(page_url_);
-  if (!page_url_)
+void PerformanceHintsObserver::PopulateLinkHints(PageData& page_data) {
+  if (!optimization_guide_decider_ || !DoesPageSupportHints())
     return;
 
+  const GURL& page_url = GetWebContents().GetLastCommittedURL();
   const google::protobuf::RepeatedPtrField<PerformanceHint>* link_hints =
       nullptr;
+
   // Metadata variables are scoped here to share the same scope as link_hints.
   optimization_guide::OptimizationMetadata metadata;
   absl::optional<LinkPerformanceMetadata> link_metadata;
   if (features::AreLinkPerformanceHintsEnabled()) {
-    link_hints_decision_ = optimization_guide_decider_->CanApplyOptimization(
-        page_url_.value(), optimization_guide::proto::LINK_PERFORMANCE,
-        &metadata);
+    page_data.SetLinkHintDecision(
+        optimization_guide_decider_->CanApplyOptimization(
+            page_url, optimization_guide::proto::LINK_PERFORMANCE, &metadata));
     link_metadata = metadata.ParsedMetadata<LinkPerformanceMetadata>();
     if (!link_metadata)
       return;
     link_hints = &link_metadata->link_hints();
   } else {
-    link_hints_decision_ = optimization_guide_decider_->CanApplyOptimization(
-        page_url_.value(), optimization_guide::proto::PERFORMANCE_HINTS,
-        &metadata);
+    page_data.SetLinkHintDecision(
+        optimization_guide_decider_->CanApplyOptimization(
+            page_url, optimization_guide::proto::PERFORMANCE_HINTS, &metadata));
     if (!metadata.performance_hints_metadata())
       return;
     link_hints =
@@ -334,12 +331,7 @@
   }
 
   DCHECK(link_hints);
-  if (link_hints_decision_ == OptimizationGuideDecision::kTrue) {
-    for (const PerformanceHint& link_hint : *link_hints) {
-      link_hints_.emplace_back(
-          URLPatternWithWildcards(link_hint.wildcard_pattern()), link_hint);
-    }
-  }
+  page_data.SetLinkHints(*link_hints);
 }
 
 std::tuple<PerformanceHintsObserver::SourceLookupStatus,
@@ -349,10 +341,14 @@
     return {SourceLookupStatus::kNoMatch, absl::nullopt};
   }
 
-  if (link_hints_decision_ == OptimizationGuideDecision::kUnknown) {
-    PopulateLinkHints();
+  PerformanceHintsObserver::PageData* page_data =
+      PageData::GetOrCreateForPage(GetWebContents().GetPrimaryPage());
+
+  if (page_data->GetLinkHintDecision() == OptimizationGuideDecision::kUnknown) {
+    PopulateLinkHints(*page_data);
   }
-  switch (link_hints_decision_) {
+
+  switch (page_data->GetLinkHintDecision()) {
     case OptimizationGuideDecision::kUnknown:
       return {SourceLookupStatus::kNotReady, absl::nullopt};
     case OptimizationGuideDecision::kFalse:
@@ -366,14 +362,7 @@
       replacements.ClearQuery();
       replacements.ClearPort();
       replacements.ClearRef();
-      GURL scheme_host_path = url.ReplaceComponents(replacements);
-
-      for (const auto& pattern_hint : link_hints_) {
-        if (pattern_hint.first.Matches(scheme_host_path.spec())) {
-          return {SourceLookupStatus::kHintFound, pattern_hint.second};
-        }
-      }
-      return {SourceLookupStatus::kNoMatch, absl::nullopt};
+      return page_data->GetLinkHintForURL(url.ReplaceComponents(replacements));
     }
   }
 }
@@ -427,26 +416,35 @@
   }
 }
 
-void PerformanceHintsObserver::PrimaryPageChanged(content::Page& page) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+PerformanceHintsObserver::PageData::PageData(content::Page& page)
+    : PageUserData(page) {}
 
-  // We've navigated to a new page, so clear out any existing cached hints.
-  link_hints_.clear();
-  link_hints_decision_ = OptimizationGuideDecision::kUnknown;
-  page_url_.reset();
+PerformanceHintsObserver::PageData::~PageData() = default;
 
-  if (!optimization_guide_decider_) {
-    return;
+void PerformanceHintsObserver::PageData::SetLinkHints(
+    const google::protobuf::RepeatedPtrField<PerformanceHint>& link_hints) {
+  DCHECK(link_hints_.empty());
+  if (link_hints_decision_ == OptimizationGuideDecision::kTrue) {
+    for (const PerformanceHint& link_hint : link_hints) {
+      link_hints_.emplace_back(
+          URLPatternWithWildcards(link_hint.wildcard_pattern()), link_hint);
+    }
   }
-
-  if (page.GetMainDocument().IsErrorDocument()) {
-    // Don't provide hints on Chrome error pages.
-    return;
-  }
-
-  page_url_ = page.GetMainDocument().GetLastCommittedURL();
 }
 
+std::tuple<PerformanceHintsObserver::SourceLookupStatus,
+           absl::optional<PerformanceHint>>
+PerformanceHintsObserver::PageData::GetLinkHintForURL(const GURL& url) const {
+  for (const auto& pattern_hint : link_hints_) {
+    if (pattern_hint.first.Matches(url.spec())) {
+      return {PerformanceHintsObserver::SourceLookupStatus::kHintFound,
+              pattern_hint.second};
+    }
+  }
+  return {SourceLookupStatus::kNoMatch, absl::nullopt};
+}
+
+PAGE_USER_DATA_KEY_IMPL(PerformanceHintsObserver::PageData);
 WEB_CONTENTS_USER_DATA_KEY_IMPL(PerformanceHintsObserver);
 
 }  // namespace performance_hints
diff --git a/chrome/browser/performance_hints/performance_hints_observer.h b/chrome/browser/performance_hints/performance_hints_observer.h
index ca67eb7..3d9bab2 100644
--- a/chrome/browser/performance_hints/performance_hints_observer.h
+++ b/chrome/browser/performance_hints/performance_hints_observer.h
@@ -5,21 +5,13 @@
 #ifndef CHROME_BROWSER_PERFORMANCE_HINTS_PERFORMANCE_HINTS_OBSERVER_H_
 #define CHROME_BROWSER_PERFORMANCE_HINTS_PERFORMANCE_HINTS_OBSERVER_H_
 
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "base/feature_list.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "chrome/browser/performance_hints/rewrite_handler.h"
-#include "components/optimization_guide/content/browser/optimization_guide_decider.h"
-#include "components/optimization_guide/proto/hints.pb.h"
-#include "components/optimization_guide/proto/performance_hints_metadata.pb.h"
-#include "content/public/browser/web_contents_observer.h"
+#include "components/optimization_guide/core/optimization_guide_decision.h"
+#include "content/public/browser/page_user_data.h"
 #include "content/public/browser/web_contents_user_data.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace content {
 class WebContents;
@@ -27,20 +19,18 @@
 
 namespace optimization_guide {
 class URLPatternWithWildcards;
+class OptimizationGuideDecider;
 namespace proto {
 class PerformanceHint;
 }  // namespace proto
 }  // namespace optimization_guide
 
-class GURL;
-
 namespace performance_hints {
 
 // Provides an interface to access PerformanceHints for the associated
 // WebContents and links within it.
 class PerformanceHintsObserver
-    : public content::WebContentsObserver,
-      public content::WebContentsUserData<PerformanceHintsObserver> {
+    : public content::WebContentsUserData<PerformanceHintsObserver> {
  public:
   ~PerformanceHintsObserver() override;
   PerformanceHintsObserver(const PerformanceHintsObserver&) = delete;
@@ -68,17 +58,6 @@
   friend class content::WebContentsUserData<PerformanceHintsObserver>;
   friend class PerformanceHintsObserverTest;
 
-  // content::WebContentsObserver.
-  void PrimaryPageChanged(content::Page& page) override;
-
-  // Returns true if the current page supports hints (not an error page,
-  // must be HTTP/HTTPS, etc).
-  bool DoesPageSupportHints();
-
-  // Populates |link_hints_| with performance information for links on the
-  // current page.
-  void PopulateLinkHints();
-
   // SourceLookupStatus represents the result of a querying a single source
   // (page hints or link hints) for performance information. Tracking this
   // separately from the overall HintForURLStatus (below) allows us to determine
@@ -101,6 +80,53 @@
     kMaxValue = kHintFound,
   };
 
+  // Data scoped to a single page. PageData has the same lifetime as the page's
+  // main document.
+  class PageData : public content::PageUserData<PageData> {
+   public:
+    explicit PageData(content::Page& page);
+    PageData(const PageData&) = delete;
+    PageData& operator=(const PageData&) = delete;
+    ~PageData() override;
+
+    void SetLinkHintDecision(
+        optimization_guide::OptimizationGuideDecision decision) {
+      link_hints_decision_ = decision;
+    }
+
+    optimization_guide::OptimizationGuideDecision GetLinkHintDecision() const {
+      return link_hints_decision_;
+    }
+
+    void SetLinkHints(const google::protobuf::RepeatedPtrField<
+                      optimization_guide::proto::PerformanceHint>& link_hints);
+
+    // |url| should be stripped to scheme://host/path.
+    std::tuple<SourceLookupStatus,
+               absl::optional<optimization_guide::proto::PerformanceHint>>
+    GetLinkHintForURL(const GURL& url) const;
+
+    PAGE_USER_DATA_KEY_DECL();
+
+   private:
+    // Link URLs that match |first| should use the Performance hint in |second|.
+    std::vector<std::pair<optimization_guide::URLPatternWithWildcards,
+                          optimization_guide::proto::PerformanceHint>>
+        link_hints_;
+
+    // The fetch status for link hints.
+    optimization_guide::OptimizationGuideDecision link_hints_decision_ =
+        optimization_guide::OptimizationGuideDecision::kUnknown;
+  };
+
+  // Returns true if the current page supports hints (not an error page,
+  // must be HTTP/HTTPS, etc).
+  bool DoesPageSupportHints();
+
+  // Populates |link_hints_| in PageData with performance information for links
+  // on the current page.
+  void PopulateLinkHints(PageData& page_data);
+
   // Attempts to retrieve a PerformanceHint for |url| from the link hints of the
   // current page.
   std::tuple<SourceLookupStatus,
@@ -171,19 +197,6 @@
   raw_ptr<optimization_guide::OptimizationGuideDecider>
       optimization_guide_decider_ = nullptr;
 
-  // The URL of the main frame of the associated WebContents. This is not set if
-  // the current page is an error page.
-  absl::optional<GURL> page_url_;
-
-  // Link URLs that match |first| should use the Performance hint in |second|.
-  std::vector<std::pair<optimization_guide::URLPatternWithWildcards,
-                        optimization_guide::proto::PerformanceHint>>
-      link_hints_;
-
-  // The fetch status for link hints.
-  optimization_guide::OptimizationGuideDecision link_hints_decision_ =
-      optimization_guide::OptimizationGuideDecision::kUnknown;
-
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<PerformanceHintsObserver> weak_factory_{this};
diff --git a/chrome/browser/permissions/chrome_permission_manager_unittest.cc b/chrome/browser/permissions/chrome_permission_manager_unittest.cc
index 0755993..05b2e602 100644
--- a/chrome/browser/permissions/chrome_permission_manager_unittest.cc
+++ b/chrome/browser/permissions/chrome_permission_manager_unittest.cc
@@ -10,6 +10,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/permissions/features.h"
 #include "components/permissions/permission_manager.h"
+#include "extensions/buildflags/buildflags.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -95,21 +96,23 @@
 TEST_F(ChromePermissionManagerTest, GetCanonicalOriginPermissionDelegation) {
   const GURL requesting_origin("https://www.requesting.com");
   const GURL embedding_origin("https://www.google.de");
-  const GURL extensions_requesting_origin(
-      "chrome-extension://abcdefghijklmnopqrstuvxyz");
 
-  // The embedding origin should be returned
-  // except in the case of extensions and notifications.
+  // The embedding origin should be returned except in the case of notifications
+  // and, if they're enabled, extensions.
   EXPECT_EQ(embedding_origin,
             GetPermissionControllerDelegate()->GetCanonicalOrigin(
                 ContentSettingsType::GEOLOCATION, requesting_origin,
                 embedding_origin));
-  EXPECT_EQ(extensions_requesting_origin,
-            GetPermissionControllerDelegate()->GetCanonicalOrigin(
-                ContentSettingsType::GEOLOCATION, extensions_requesting_origin,
-                embedding_origin));
   EXPECT_EQ(requesting_origin,
             GetPermissionControllerDelegate()->GetCanonicalOrigin(
                 ContentSettingsType::NOTIFICATIONS, requesting_origin,
                 embedding_origin));
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  const GURL extensions_requesting_origin(
+      "chrome-extension://abcdefghijklmnopqrstuvxyz");
+  EXPECT_EQ(extensions_requesting_origin,
+            GetPermissionControllerDelegate()->GetCanonicalOrigin(
+                ContentSettingsType::GEOLOCATION, extensions_requesting_origin,
+                embedding_origin));
+#endif
 }
diff --git a/chrome/browser/permissions/chrome_permissions_client.cc b/chrome/browser/permissions/chrome_permissions_client.cc
index 7b1853b1..fc39b69 100644
--- a/chrome/browser/permissions/chrome_permissions_client.cc
+++ b/chrome/browser/permissions/chrome_permissions_client.cc
@@ -42,7 +42,7 @@
 #include "components/subresource_filter/content/browser/subresource_filter_content_settings_manager.h"
 #include "components/subresource_filter/content/browser/subresource_filter_profile_context.h"
 #include "components/ukm/content/source_url_recorder.h"
-#include "extensions/common/constants.h"
+#include "extensions/buildflags/buildflags.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "url/origin.h"
 
@@ -68,6 +68,10 @@
 #include "components/user_manager/user_manager.h"
 #endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/common/constants.h"
+#endif
+
 namespace {
 
 #if BUILDFLAG(IS_ANDROID)
@@ -318,15 +322,20 @@
 bool ChromePermissionsClient::CanBypassEmbeddingOriginCheck(
     const GURL& requesting_origin,
     const GURL& embedding_origin) {
-  // The New Tab Page is excluded from origin checks as its effective requesting
-  // origin may be the Default Search Engine origin. Extensions are also
-  // excluded as currently they can request permission from iframes when
-  // embedded in non-secure contexts (https://crbug.com/530507).
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  // Extensions are excluded from origin checks as currently they can request
+  // permission from iframes when embedded in non-secure contexts
+  // (https://crbug.com/530507).
+  if (requesting_origin.SchemeIs(extensions::kExtensionScheme))
+    return true;
+#endif
+
+  // The New Tab Page is excluded from origin checks as its effective
+  // requesting origin may be the Default Search Engine origin.
   return embedding_origin ==
              GURL(chrome::kChromeUINewTabURL).DeprecatedGetOriginAsURL() ||
          embedding_origin ==
-             GURL(chrome::kChromeUINewTabPageURL).DeprecatedGetOriginAsURL() ||
-         requesting_origin.SchemeIs(extensions::kExtensionScheme);
+             GURL(chrome::kChromeUINewTabPageURL).DeprecatedGetOriginAsURL();
 }
 
 absl::optional<GURL> ChromePermissionsClient::OverrideCanonicalOrigin(
@@ -342,6 +351,7 @@
     return requesting_origin;
   }
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
   // Note that currently chrome extensions are allowed to use permissions even
   // when in embedded in non-secure contexts. This is unfortunate and we
   // should remove this at some point, but for now always use the requesting
@@ -349,6 +359,7 @@
   if (requesting_origin.SchemeIs(extensions::kExtensionScheme)) {
     return requesting_origin;
   }
+#endif
 
   return absl::nullopt;
 }
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index b47c997..c7370acd 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -84,6 +84,7 @@
 #include "components/policy/core/browser/configuration_policy_handler_list.h"
 #include "components/policy/core/browser/configuration_policy_handler_parameters.h"
 #include "components/policy/core/browser/url_blocklist_policy_handler.h"
+#include "components/policy/core/browser/url_scheme_list_policy_handler.h"
 #include "components/policy/core/common/policy_details.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/core/common/policy_pref_names.h"
@@ -1719,15 +1720,15 @@
   handlers->AddHandler(
       std::make_unique<safe_browsing::SafeBrowsingPolicyHandler>());
   handlers->AddHandler(std::make_unique<SimpleDeprecatingPolicyHandler>(
-      std::make_unique<SimplePolicyHandler>(key::kAuthServerWhitelist,
-                                            prefs::kAuthServerAllowlist,
-                                            base::Value::Type::STRING),
+      std::make_unique<SimplePolicyHandler>(
+          key::kAuthServerWhitelist,  // nocheck
+          prefs::kAuthServerAllowlist, base::Value::Type::STRING),
       std::make_unique<SimplePolicyHandler>(key::kAuthServerAllowlist,
                                             prefs::kAuthServerAllowlist,
                                             base::Value::Type::STRING)));
   handlers->AddHandler(std::make_unique<SimpleDeprecatingPolicyHandler>(
       std::make_unique<SimplePolicyHandler>(
-          key::kAuthNegotiateDelegateWhitelist,
+          key::kAuthNegotiateDelegateWhitelist,  // nocheck
           prefs::kAuthNegotiateDelegateAllowlist, base::Value::Type::STRING),
       std::make_unique<SimplePolicyHandler>(
           key::kAuthNegotiateDelegateAllowlist,
@@ -2278,6 +2279,10 @@
       SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
 #endif  // !BUILDFLAG(IS_ANDROID)
 
+  handlers->AddHandler(std::make_unique<URLSchemeListPolicyHandler>(
+      key::kAllHttpAuthSchemesAllowedForOrigins,
+      prefs::kAllHttpAuthSchemesAllowedForOrigins));
+
   return handlers;
 }
 
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc
index 6df2515..3cb5e55 100644
--- a/chrome/browser/policy/profile_policy_connector.cc
+++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -232,7 +232,8 @@
   migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
       policy::key::kDeviceNativePrinters, policy::key::kDevicePrinters));
   migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
-      policy::key::kDeviceUserWhitelist, policy::key::kDeviceUserAllowlist));
+      policy::key::kDeviceUserWhitelist,  // nocheck
+      policy::key::kDeviceUserAllowlist));
   migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
       policy::key::kNativePrintersBulkConfiguration,
       policy::key::kPrintersBulkConfiguration));
diff --git a/chrome/browser/prefetch/prefetch_headers.cc b/chrome/browser/prefetch/prefetch_headers.cc
new file mode 100644
index 0000000..554daf6
--- /dev/null
+++ b/chrome/browser/prefetch/prefetch_headers.cc
@@ -0,0 +1,22 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/prefetch/prefetch_headers.h"
+
+namespace prefetch::headers {
+
+// The header used to indicate the purpose of a request. It should have one of
+// the two values below.
+const char kSecPurposeHeaderName[] = "Sec-Purpose";
+
+// This value indicates that the request is a prefetch request made directly to
+// the server.
+const char kSecPurposePrefetchHeaderValue[] = "prefetch";
+
+// This value indicates that the request is a prefetch request made via an
+// anonymous client IP proxy.
+const char kSecPurposePrefetchAnonymousClientIpHeaderValue[] =
+    "prefetch;anonymous-client-ip";
+
+}  // namespace prefetch::headers
diff --git a/chrome/browser/prefetch/prefetch_headers.h b/chrome/browser/prefetch/prefetch_headers.h
new file mode 100644
index 0000000..591fed7
--- /dev/null
+++ b/chrome/browser/prefetch/prefetch_headers.h
@@ -0,0 +1,18 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_HEADERS_H_
+#define CHROME_BROWSER_PREFETCH_PREFETCH_HEADERS_H_
+
+namespace prefetch::headers {
+
+extern const char kSecPurposeHeaderName[];
+
+extern const char kSecPurposePrefetchHeaderValue[];
+
+extern const char kSecPurposePrefetchAnonymousClientIpHeaderValue[];
+
+}  // namespace prefetch::headers
+
+#endif  // CHROME_BROWSER_PREFETCH_PREFETCH_HEADERS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
index fa54a7b..02c3652 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -97,6 +97,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/sync_call_restrictions.h"
 #include "net/base/proxy_string_util.h"
+#include "net/base/url_util.h"
 #include "net/cert/cert_database.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/cert/x509_certificate.h"
@@ -512,6 +513,18 @@
     host_resolver()->AddRule("resolve-success.com", "127.0.0.1");
 
     host_resolver()->AddSimulatedFailure("resolve-fail.com");
+
+    PrefetchProxyTabHelper::SetHostNonUniqueFilterForTest(
+        [](base::StringPiece host) {
+          // Treat *.test as real public hostnames, even though they aren't.
+          return net::IsHostnameNonUnique(std::string{host}) &&
+                 !net::IsSubdomainOf(host, "test");
+        });
+  }
+
+  void TearDownOnMainThread() override {
+    PrefetchProxyTabHelper::ResetHostNonUniqueFilterForTest();
+    InProcessBrowserTest::TearDownOnMainThread();
   }
 
   void SetUpCommandLine(base::CommandLine* cmd) override {
@@ -756,6 +769,31 @@
     EXPECT_EQ(paths.size(), verified_url_count);
   }
 
+  // Verifies that the "Sec-Purpose" header with the expected value
+  // ("prefetch;anonymous-client-ip" for requests that go through the proxy, and
+  // "prefetch" for non-private prefetches) was included on all requests for
+  // main resources. Subresources are fetched using NSP which does not add the
+  // "Sec-Purpose" header.
+  void VerifyPrefetchRequestsSecPurposeHeader(
+      const std::set<std::string>& main_resource_paths,
+      bool are_requests_anonymous_client_ip) {
+    size_t verified_header_count = 0;
+    for (const auto& request : origin_server_requests()) {
+      const GURL& url = request.GetURL();
+      if (main_resource_paths.find(url.path()) == main_resource_paths.end()) {
+        continue;
+      }
+
+      SCOPED_TRACE(request.GetURL().spec());
+      EXPECT_EQ(request.headers.find("Sec-Purpose")->second,
+                are_requests_anonymous_client_ip
+                    ? "prefetch;anonymous-client-ip"
+                    : "prefetch");
+      verified_header_count++;
+    }
+    EXPECT_EQ(main_resource_paths.size(), verified_header_count);
+  }
+
   size_t OriginServerRequestCount() const {
     base::RunLoop().RunUntilIdle();
     return origin_server_request_count_;
@@ -810,7 +848,11 @@
 
     bool is_prefetch =
         request.headers.find("Purpose") != request.headers.end() &&
-        request.headers.find("Purpose")->second == "prefetch";
+        request.headers.find("Purpose")->second == "prefetch" &&
+        request.headers.find("Sec-Purpose") != request.headers.end() &&
+        (request.headers.find("Sec-Purpose")->second == "prefetch" ||
+         request.headers.find("Sec-Purpose")->second ==
+             "prefetch;anonymous-client-ip");
 
     if (request.relative_url == "/404_on_prefetch") {
       std::unique_ptr<net::test_server::BasicHttpResponse> resp =
@@ -1349,6 +1391,9 @@
   EXPECT_EQ(u"Title Of Awesomeness", GetWebContents()->GetTitle());
 
   VerifyOriginRequestsAreIsolated({prefetch_url.path()});
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {prefetch_url.path()},
+      /*are_requests_anonymous_client_ip=*/true);
 
   // The origin server should not have served this request.
   EXPECT_EQ(starting_origin_request_count, OriginServerRequestCount());
@@ -1416,6 +1461,14 @@
       eligible_link_3.path(),
   });
 
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {
+          eligible_link_1.path(),
+          eligible_link_2.path(),
+          eligible_link_3.path(),
+      },
+      /*are_requests_anonymous_client_ip=*/true);
+
   using UkmEntry = ukm::TestUkmRecorder::HumanReadableUkmEntry;
   auto expected_entries = std::vector<UkmEntry>{
       // eligible_link_1
@@ -2984,6 +3037,9 @@
       "/prefetch/prefetch_proxy/prefetch.js",
       eligible_link.path(),
   });
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {eligible_link.path()},
+      /*are_requests_anonymous_client_ip=*/true);
 
   // Verify the resource load was reported to the subresource manager.
   PrefetchProxyService* service =
@@ -4136,6 +4192,9 @@
       "/prefetch/prefetch_proxy/prefetch.js",
       eligible_link.path(),
   });
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {eligible_link.path()},
+      /*are_requests_anonymous_client_ip=*/true);
 
   // Verify the resource load was reported to the subresource manager.
   PrefetchProxyService* service =
@@ -4257,6 +4316,9 @@
   EXPECT_EQ(u"Title Of Awesomeness", GetWebContents()->GetTitle());
 
   VerifyOriginRequestsAreIsolated({prefetch_url.path()});
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {prefetch_url.path()},
+      /*are_requests_anonymous_client_ip=*/true);
 
   // The origin server should not have served this request.
   EXPECT_EQ(starting_origin_request_count, OriginServerRequestCount());
@@ -4689,6 +4751,10 @@
             content::GetCookies(
                 browser()->profile(), eligible_link,
                 net::CookieOptions::SameSiteCookieContext::MakeInclusive()));
+
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {eligible_link.path()},
+      /*are_requests_anonymous_client_ip=*/false);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -4729,7 +4795,7 @@
 
   // The prefetch requests shouldn't use the proxy and should  go directly to
   // the origin server.
-  EXPECT_EQ(proxy_server_requests().size(), (unsigned int)0);
+  EXPECT_EQ(proxy_server_requests().size(), 0U);
 
   // The prefetch should be made using the default network context, so the
   // cookie should be present once the prefetch is complete.
@@ -4752,4 +4818,8 @@
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 0, 1);
   histogram_tester.ExpectUniqueSample(
       "PrefetchProxy.Prefetch.Mainframe.CookiesToCopy", 0, 1);
+
+  VerifyPrefetchRequestsSecPurposeHeader(
+      {eligible_link.path()},
+      /*are_requests_anonymous_client_ip=*/false);
 }
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h
index 7c54091d..8f6f413 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h
@@ -41,8 +41,8 @@
   kPrefetchNotEligibleSchemeIsNotHttps = 7,
 
   // The url was not eligible to be prefetched because its host was an IP
-  // address.
-  kPrefetchNotEligibleHostIsIPAddress = 8,
+  // address. [DEPRECATED]
+  // kPrefetchNotEligibleHostIsIPAddress = 8,
 
   // The url was not eligible to be prefetched because it uses a non-default
   // storage partition.
@@ -122,6 +122,11 @@
   // The prefetch was redirected, but following redirects was disabled.
   // See crbug.com/1266876 for more details.
   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
+  // registry-controlled) but the prefetch was to be proxied.
+  kPrefetchNotEligibleHostIsNonUnique = 36,
 };
 
 #endif  // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_STATUS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
index 9fbf61a..c0f65a3 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h"
 #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
+#include "chrome/browser/prefetch/prefetch_headers.h"
 #include "chrome/browser/prefetch/prefetch_prefs.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h"
@@ -55,6 +56,7 @@
 #include "net/base/isolation_info.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
+#include "net/base/url_util.h"
 #include "net/cookies/cookie_store.h"
 #include "net/http/http_status_code.h"
 #include "net/http/http_util.h"
@@ -73,6 +75,8 @@
 
 namespace {
 
+bool (*g_host_non_unique_filter)(base::StringPiece) = nullptr;
+
 absl::optional<base::TimeDelta> GetTotalPrefetchTime(
     network::mojom::URLResponseHead* head) {
   DCHECK(head);
@@ -180,12 +184,12 @@
       return true;
     case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain:
     case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps:
-    case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress:
     case PrefetchProxyPrefetchStatus::
         kPrefetchNotEligibleNonDefaultStoragePartition:
     case PrefetchProxyPrefetchStatus::kPrefetchPositionIneligible:
     case PrefetchProxyPrefetchStatus::kPrefetchIneligibleRetryAfter:
     case PrefetchProxyPrefetchStatus::kPrefetchProxyNotAvailable:
+    case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique:
       // These statuses don't relate to any user state, so don't send a decoy
       // request.
       return false;
@@ -283,6 +287,17 @@
   g_service_worker_context_for_test = context;
 }
 
+// static
+void PrefetchProxyTabHelper::SetHostNonUniqueFilterForTest(
+    bool (*filter)(base::StringPiece)) {
+  g_host_non_unique_filter = filter;
+}
+
+// static
+void PrefetchProxyTabHelper::ResetHostNonUniqueFilterForTest() {
+  g_host_non_unique_filter = nullptr;
+}
+
 PrefetchProxyTabHelper::PrefetchProxyTabHelper(
     content::WebContents* web_contents)
     : content::WebContentsObserver(web_contents),
@@ -465,7 +480,6 @@
     case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies:
     case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker:
     case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps:
-    case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress:
     case PrefetchProxyPrefetchStatus::
         kPrefetchNotEligibleNonDefaultStoragePartition:
     case PrefetchProxyPrefetchStatus::kPrefetchNotFinishedInTime:
@@ -481,6 +495,7 @@
     case PrefetchProxyPrefetchStatus::kPrefetchIsPrivacyDecoy:
     case PrefetchProxyPrefetchStatus::kPrefetchNotUsedCookiesChanged:
     case PrefetchProxyPrefetchStatus::kPrefetchFailedRedirectsDisabled:
+    case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique:
       return prefetch_container->GetPrefetchStatus();
     // These statuses we are going to update to, and this is the only place that
     // they are set so they are not expected to be passed in.
@@ -822,6 +837,11 @@
   request->load_flags = net::LOAD_DISABLE_CACHE | net::LOAD_PREFETCH;
   request->credentials_mode = network::mojom::CredentialsMode::kInclude;
   request->headers.SetHeader(content::kCorsExemptPurposeHeaderName, "prefetch");
+  request->headers.SetHeader(
+      prefetch::headers::kSecPurposeHeaderName,
+      prefetch_container->GetPrefetchType().IsProxyRequired()
+          ? prefetch::headers::kSecPurposePrefetchAnonymousClientIpHeaderValue
+          : prefetch::headers::kSecPurposePrefetchHeaderValue);
   // Remove the user agent header if it was set so that the network context's
   // default is used.
   request->headers.RemoveHeader("User-Agent");
@@ -1390,10 +1410,16 @@
         false, PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain);
   }
 
-  if (url.HostIsIPAddress()) {
+  // While a registry-controlled domain could still resolve to a non-publicly
+  // routable IP, this allows hosts which are very unlikely to work via the
+  // proxy to be discarded immediately.
+  if (prefetch_type.IsProxyRequired() &&
+      (g_host_non_unique_filter
+           ? g_host_non_unique_filter(url.HostNoBracketsPiece())
+           : net::IsHostnameNonUnique(url.HostNoBrackets()))) {
     return std::make_pair(
         false,
-        PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress);
+        PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique);
   }
 
   if (!url.SchemeIs(url::kHttpsScheme)) {
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h
index 2d86d32..80500c3 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h
@@ -235,6 +235,10 @@
   static void SetServiceWorkerContextForTest(
       content::ServiceWorkerContext* context);
 
+  // Overrides the logic for determining which hostnames should not be proxied.
+  static void SetHostNonUniqueFilterForTest(bool (*filter)(base::StringPiece));
+  static void ResetHostNonUniqueFilterForTest();
+
  protected:
   // Exposed for testing.
   explicit PrefetchProxyTabHelper(content::WebContents* web_contents);
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
index 16ed973..346839e 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
@@ -561,12 +561,12 @@
       "PrefetchProxy.Prefetch.Mainframe.TotalRedirects", 0);
 }
 
-TEST_F(PrefetchProxyTabHelperTest, DontFetchIPAddresses) {
+TEST_F(PrefetchProxyTabHelperTest, DontFetchPrivateIPAddresses) {
   base::HistogramTester histogram_tester;
 
   NavigateSomewhere();
   GURL doc_url("https://www.google.com/search?q=cats");
-  GURL prediction_url("https://123.234.123.234/meow");
+  GURL prediction_url("https://172.27.123.234/meow");
   MakeNavigationPrediction(web_contents(), doc_url, {prediction_url});
 
   EXPECT_EQ(RequestCount(), 0);
@@ -588,7 +588,77 @@
 
   NavigateAndVerifyPrefetchStatus(
       prediction_url,
-      PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress);
+      PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique);
+  EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U);
+  EXPECT_EQ(absl::optional<size_t>(0), after_srp_clicked_link_srp_position());
+
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.TotalRedirects", 0);
+}
+
+TEST_F(PrefetchProxyTabHelperTest, DontFetchPrivateHostnames) {
+  base::HistogramTester histogram_tester;
+
+  NavigateSomewhere();
+  GURL doc_url("https://www.google.com/search?q=cats");
+  GURL prediction_url("https://bananas.contoso/meow");
+  MakeNavigationPrediction(web_contents(), doc_url, {prediction_url});
+
+  EXPECT_EQ(RequestCount(), 0);
+  EXPECT_EQ(predicted_urls_count(), 1U);
+  EXPECT_EQ(prefetch_eligible_count(), 0U);
+  EXPECT_EQ(prefetch_attempted_count(), 0U);
+  EXPECT_EQ(prefetch_successful_count(), 0U);
+  EXPECT_EQ(prefetch_total_redirect_count(), 0U);
+  EXPECT_FALSE(navigation_to_prefetch_start().has_value());
+
+  histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode",
+                                    0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.BodyLength", 0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.TotalTime", 0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.ConnectTime", 0);
+
+  NavigateAndVerifyPrefetchStatus(
+      prediction_url,
+      PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique);
+  EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U);
+  EXPECT_EQ(absl::optional<size_t>(0), after_srp_clicked_link_srp_position());
+
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.TotalRedirects", 0);
+}
+
+TEST_F(PrefetchProxyTabHelperTest, DontFetchLocalhost) {
+  base::HistogramTester histogram_tester;
+
+  NavigateSomewhere();
+  GURL doc_url("https://www.google.com/search?q=cats");
+  GURL prediction_url("https://localhost/meow");
+  MakeNavigationPrediction(web_contents(), doc_url, {prediction_url});
+
+  EXPECT_EQ(RequestCount(), 0);
+  EXPECT_EQ(predicted_urls_count(), 1U);
+  EXPECT_EQ(prefetch_eligible_count(), 0U);
+  EXPECT_EQ(prefetch_attempted_count(), 0U);
+  EXPECT_EQ(prefetch_successful_count(), 0U);
+  EXPECT_EQ(prefetch_total_redirect_count(), 0U);
+  EXPECT_FALSE(navigation_to_prefetch_start().has_value());
+
+  histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode",
+                                    0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.BodyLength", 0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.TotalTime", 0);
+  histogram_tester.ExpectTotalCount(
+      "PrefetchProxy.Prefetch.Mainframe.ConnectTime", 0);
+
+  NavigateAndVerifyPrefetchStatus(
+      prediction_url,
+      PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsNonUnique);
   EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U);
   EXPECT_EQ(absl::optional<size_t>(0), after_srp_clicked_link_srp_position());
 
diff --git a/chrome/browser/prefetch/search_prefetch/base_search_prefetch_request.cc b/chrome/browser/prefetch/search_prefetch/base_search_prefetch_request.cc
index 8fa921d..76e16d45 100644
--- a/chrome/browser/prefetch/search_prefetch/base_search_prefetch_request.cc
+++ b/chrome/browser/prefetch/search_prefetch/base_search_prefetch_request.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "build/build_config.h"
+#include "chrome/browser/prefetch/prefetch_headers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/common/pref_names.h"
@@ -189,6 +190,9 @@
   resource_request->headers.SetHeader(content::kCorsExemptPurposeHeaderName,
                                       "prefetch");
   resource_request->headers.SetHeader(
+      prefetch::headers::kSecPurposeHeaderName,
+      prefetch::headers::kSecPurposePrefetchHeaderValue);
+  resource_request->headers.SetHeader(
       net::HttpRequestHeaders::kAccept,
       content::FrameAcceptHeaderValue(/*allow_sxg_responses=*/true, profile));
 
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
index 67633e0..17123c988 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
+++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -455,7 +455,9 @@
 
     bool is_prefetch =
         request.headers.find("Purpose") != request.headers.end() &&
-        request.headers.find("Purpose")->second == "prefetch";
+        request.headers.find("Purpose")->second == "prefetch" &&
+        request.headers.find("Sec-Purpose") != request.headers.end() &&
+        request.headers.find("Sec-Purpose")->second == "prefetch";
 
     content::GetUIThreadTaskRunner({})->PostTask(
         FROM_HERE,
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index b7b33a5..b958d9a7 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -194,6 +194,7 @@
 #include "chrome/browser/apps/platform_apps/browser_context_keyed_service_factories.h"
 #include "chrome/browser/extensions/browser_context_keyed_service_factories.h"
 #include "chrome/browser/ui/web_applications/web_app_metrics_factory.h"
+#include "chrome/browser/web_applications/adjustments/web_app_adjustments.h"
 #include "chrome/browser/web_applications/web_app_provider_factory.h"
 #include "extensions/browser/browser_context_keyed_service_factories.h"
 #endif
@@ -544,6 +545,7 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   web_app::WebAppMetricsFactory::GetInstance();
   web_app::WebAppProviderFactory::GetInstance();
+  web_app::WebAppAdjustmentsFactory::GetInstance();
 #endif
   WebDataServiceFactory::GetInstance();
   webrtc_event_logging::WebRtcEventLogManagerKeyedServiceFactory::GetInstance();
diff --git a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc
index 2836350..8a772406 100644
--- a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc
+++ b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc
@@ -97,7 +97,7 @@
 
 void LinkToTextMenuObserver::InitMenu(
     const content::ContextMenuParams& params) {
-  link_needs_generation_ = !params.selection_text.empty();
+  open_from_new_selection_ = !params.selection_text.empty();
   raw_url_ = params.page_url;
   if (params.page_url.has_ref()) {
     GURL::Replacements replacements;
@@ -107,23 +107,28 @@
     url_ = params.page_url;
   }
 
-  proxy_->AddMenuItem(
-      IDC_CONTENT_CONTEXT_COPYLINKTOTEXT,
-      l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_COPYLINKTOTEXT));
-  if (params.opened_from_highlight) {
+  // It is possible that there is a new text selection on top of a highlight, in
+  // which case, both open_from_new_selection_ and opened_from_highlight are
+  // true. Consequently, a context menu for new text selection is created.
+  if (open_from_new_selection_) {
+    proxy_->AddMenuItem(
+        IDC_CONTENT_CONTEXT_COPYLINKTOTEXT,
+        l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_COPYLINKTOTEXT));
+    RequestLinkGeneration();
+  } else if (params.opened_from_highlight) {
+    proxy_->AddMenuItem(
+        IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT,
+        l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_RESHARELINKTOTEXT));
     proxy_->AddMenuItem(
         IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT,
         l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_REMOVELINKTOTEXT));
   }
-
-  if (link_needs_generation_) {
-    RequestLinkGeneration();
-  }
 }
 
 bool LinkToTextMenuObserver::IsCommandIdSupported(int command_id) {
   return command_id == IDC_CONTENT_CONTEXT_COPYLINKTOTEXT ||
-         command_id == IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT;
+         command_id == IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT ||
+         command_id == IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT;
 }
 
 bool LinkToTextMenuObserver::IsCommandIdEnabled(int command_id) {
@@ -132,7 +137,7 @@
 
   // If a link generation was needed, only enable the command if a link was
   // successfully generated.
-  if (link_needs_generation_) {
+  if (open_from_new_selection_) {
     return generated_link_.has_value();
   }
 
@@ -145,11 +150,9 @@
   DCHECK(IsCommandIdSupported(command_id));
 
   if (command_id == IDC_CONTENT_CONTEXT_COPYLINKTOTEXT) {
-    if (!link_needs_generation_) {
-      ReshareLink();
-    } else {
-      CopyLinkToClipboard();
-    }
+    CopyLinkToClipboard();
+  } else if (command_id == IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT) {
+    ReshareLink();
   } else if (command_id == IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT) {
     RemoveHighlights();
   }
diff --git a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.h b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.h
index 2254aeb..fafe3b3 100644
--- a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.h
+++ b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.h
@@ -104,7 +104,7 @@
   size_t get_frames_existing_selectors_counter_;
 
   // True when the context menu was opened with text selected.
-  bool link_needs_generation_ = false;
+  bool open_from_new_selection_ = false;
 
   absl::optional<std::string> generated_link_;
 
diff --git a/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc b/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc
index 745baa0..382c255 100644
--- a/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc
+++ b/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc
@@ -163,9 +163,9 @@
   EXPECT_EQ(2u, menu()->GetMenuSize());
   MockRenderViewContextMenu::MockMenuItem item;
 
-  // Check Copy item.
+  // Check Reshare item.
   menu()->GetMenuItem(0, &item);
-  EXPECT_EQ(IDC_CONTENT_CONTEXT_COPYLINKTOTEXT, item.command_id);
+  EXPECT_EQ(IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT, item.command_id);
   EXPECT_FALSE(item.checked);
   EXPECT_FALSE(item.hidden);
   EXPECT_TRUE(item.enabled);
@@ -335,7 +335,7 @@
   params.opened_from_highlight = true;
   observer()->SetReshareSelector("hello%20world");
   InitMenu(params);
-  menu()->ExecuteCommand(IDC_CONTENT_CONTEXT_COPYLINKTOTEXT, 0);
+  menu()->ExecuteCommand(IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT, 0);
 
   // Verify that the copy type metric was correctly set
   histogram_tester.ExpectTotalCount("SharedHighlights.Desktop.CopiedLinkType",
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 71664688..ec4bd6a 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -85,6 +85,7 @@
 #include "chrome/browser/ui/exclusive_access/keyboard_lock_controller.h"
 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
 #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h"
+#include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h"
 #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
@@ -401,9 +402,6 @@
        {IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS_TOGGLE_ONCE, 100},
        {IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS, 101},
        {IDC_SEND_TAB_TO_SELF, 102},
-       {IDC_CONTENT_LINK_SEND_TAB_TO_SELF, 103},
-       {IDC_SEND_TAB_TO_SELF_SINGLE_TARGET, 104},
-       {IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET, 105},
        {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, 106},
        {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, 107},
        {IDC_CONTENT_CONTEXT_SHARING_SHARED_CLIPBOARD_SINGLE_DEVICE, 108},
@@ -415,13 +413,14 @@
        {IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT, 114},
        {IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH, 115},
        {IDC_CONTENT_CONTEXT_WEB_REGION_SEARCH, 116},
+       {IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT, 117},
        // To add new items:
        //   - Add one more line above this comment block, using the UMA value
        //     from the line below this comment block.
        //   - Increment the UMA value in that latter line.
        //   - Add the new item to the RenderViewContextMenuItem enum in
        //     tools/metrics/histograms/enums.xml.
-       {0, 117}});
+       {0, 118}});
 
   // These UMA values are for the the ContextMenuOptionDesktop enum, used for
   // the ContextMenu.SelectedOptionDesktop histograms.
@@ -450,13 +449,14 @@
        {IDC_CONTENT_CONTEXT_SEARCHLENSFORIMAGE, 21},
        {IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH, 22},
        {IDC_CONTENT_CONTEXT_WEB_REGION_SEARCH, 23},
+       {IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT, 24},
        // To add new items:
        //   - Add one more line above this comment block, using the UMA value
        //     from the line below this comment block.
        //   - Increment the UMA value in that latter line.
        //   - Add the new item to the ContextMenuOptionDesktop enum in
        //     tools/metrics/histograms/enums.xml.
-       {0, 24}});
+       {0, 25}});
 
   return *(type == UmaEnumIdLookupType::GeneralEnumId ? kGeneralMap
                                                       : kSpecificMap);
@@ -1414,45 +1414,6 @@
     if (!ShouldUseShareMenu() && params_.has_image_contents)
       AppendQRCodeGeneratorItem(/*for_image=*/true, /*draw_icon=*/true);
 
-    const bool should_offer_to_share_url =
-        send_tab_to_self::ShouldOfferToShareUrl(
-            SendTabToSelfSyncServiceFactory::GetForProfile(profile),
-            params_.link_url);
-    if (browser && !ShouldUseShareMenu() && should_offer_to_share_url) {
-      if (send_tab_to_self::GetValidDeviceCount(GetProfile()) == 1) {
-#if BUILDFLAG(IS_MAC)
-        menu_model_.AddItem(
-            IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET,
-            l10n_util::GetStringFUTF16(
-                IDS_LINK_MENU_SEND_TAB_TO_SELF_SINGLE_TARGET,
-                send_tab_to_self::GetSingleTargetDeviceName(GetProfile())));
-#else
-        menu_model_.AddItemWithIcon(
-            IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET,
-            l10n_util::GetStringFUTF16(
-                IDS_LINK_MENU_SEND_TAB_TO_SELF_SINGLE_TARGET,
-                send_tab_to_self::GetSingleTargetDeviceName(GetProfile())),
-            ui::ImageModel::FromVectorIcon(kSendTabToSelfIcon));
-#endif
-      } else {
-        send_tab_to_self_sub_menu_model_ =
-            std::make_unique<send_tab_to_self::SendTabToSelfSubMenuModel>(
-                source_web_contents_,
-                send_tab_to_self::SendTabToSelfMenuType::kLink,
-                params_.link_url);
-#if BUILDFLAG(IS_MAC)
-        menu_model_.AddSubMenuWithStringId(
-            IDC_CONTENT_LINK_SEND_TAB_TO_SELF, IDS_LINK_MENU_SEND_TAB_TO_SELF,
-            send_tab_to_self_sub_menu_model_.get());
-#else
-        menu_model_.AddSubMenuWithStringIdAndIcon(
-            IDC_CONTENT_LINK_SEND_TAB_TO_SELF, IDS_LINK_MENU_SEND_TAB_TO_SELF,
-            send_tab_to_self_sub_menu_model_.get(),
-            ui::ImageModel::FromVectorIcon(kSendTabToSelfIcon));
-#endif
-      }
-    }
-
 #if !BUILDFLAG(IS_FUCHSIA)
     AppendClickToCallItem();
 #endif
@@ -1730,37 +1691,16 @@
       send_tab_to_self::ShouldOfferFeature(source_web_contents_)) {
     menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
     send_tab_to_self_menu_present = true;
-    if (send_tab_to_self::GetValidDeviceCount(GetProfile()) == 1) {
 #if BUILDFLAG(IS_MAC)
-      menu_model_.AddItem(
-          IDC_SEND_TAB_TO_SELF_SINGLE_TARGET,
-          l10n_util::GetStringFUTF16(
-              IDS_CONTEXT_MENU_SEND_TAB_TO_SELF_SINGLE_TARGET,
-              send_tab_to_self::GetSingleTargetDeviceName(GetProfile())));
+    menu_model_.AddItem(
+        IDC_SEND_TAB_TO_SELF,
+        l10n_util::GetStringUTF16(IDS_CONTEXT_MENU_SEND_TAB_TO_SELF));
 #else
-      menu_model_.AddItemWithIcon(
-          IDC_SEND_TAB_TO_SELF_SINGLE_TARGET,
-          l10n_util::GetStringFUTF16(
-              IDS_CONTEXT_MENU_SEND_TAB_TO_SELF_SINGLE_TARGET,
-              send_tab_to_self::GetSingleTargetDeviceName(GetProfile())),
-          ui::ImageModel::FromVectorIcon(kSendTabToSelfIcon));
+    menu_model_.AddItemWithIcon(
+        IDC_SEND_TAB_TO_SELF,
+        l10n_util::GetStringUTF16(IDS_CONTEXT_MENU_SEND_TAB_TO_SELF),
+        ui::ImageModel::FromVectorIcon(kSendTabToSelfIcon));
 #endif
-    } else {
-      send_tab_to_self_sub_menu_model_ =
-          std::make_unique<send_tab_to_self::SendTabToSelfSubMenuModel>(
-              source_web_contents_,
-              send_tab_to_self::SendTabToSelfMenuType::kContent);
-#if BUILDFLAG(IS_MAC)
-      menu_model_.AddSubMenuWithStringId(
-          IDC_SEND_TAB_TO_SELF, IDS_CONTEXT_MENU_SEND_TAB_TO_SELF,
-          send_tab_to_self_sub_menu_model_.get());
-#else
-      menu_model_.AddSubMenuWithStringIdAndIcon(
-          IDC_SEND_TAB_TO_SELF, IDS_CONTEXT_MENU_SEND_TAB_TO_SELF,
-          send_tab_to_self_sub_menu_model_.get(),
-          ui::ImageModel::FromVectorIcon(kSendTabToSelfIcon));
-#endif
-    }
   }
 
   // Context menu item for QR Code Generator.
@@ -2394,9 +2334,7 @@
     case IDC_SPELLPANEL_TOGGLE:
     case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS:
     case IDC_SEND_TAB_TO_SELF:
-    case IDC_SEND_TAB_TO_SELF_SINGLE_TARGET:
     case IDC_CONTENT_LINK_SEND_TAB_TO_SELF:
-    case IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET:
       return true;
 
     case IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH:
@@ -2648,17 +2586,10 @@
       embedder_web_contents_->OnSavePage();
       break;
 
-    case IDC_SEND_TAB_TO_SELF_SINGLE_TARGET:
-      send_tab_to_self::ShareToSingleTarget(source_web_contents_);
-      send_tab_to_self::RecordDeviceClicked(
-          send_tab_to_self::ShareEntryPoint::kContentMenu);
-      break;
-
-    case IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET:
-      send_tab_to_self::ShareToSingleTarget(source_web_contents_,
-                                            params_.link_url);
-      send_tab_to_self::RecordDeviceClicked(
-          send_tab_to_self::ShareEntryPoint::kLinkMenu);
+    case IDC_SEND_TAB_TO_SELF:
+      send_tab_to_self::SendTabToSelfBubbleController::
+          CreateOrGetFromWebContents(source_web_contents_)
+              ->ShowBubble();
       break;
 
     case IDC_CONTENT_CONTEXT_GENERATE_QR_CODE: {
diff --git a/chrome/browser/resources/chromeos/crostini_installer/app.html b/chrome/browser/resources/chromeos/crostini_installer/app.html
index 9e3ee11..17cb7bb 100644
--- a/chrome/browser/resources/chromeos/crostini_installer/app.html
+++ b/chrome/browser/resources/chromeos/crostini_installer/app.html
@@ -7,7 +7,6 @@
   }
 
   #icon {
-    fill: var(--google-blue-600);
     height: 32px;
     margin-top: 28px;
     width: 32px;
@@ -100,11 +99,7 @@
 </style>
 
 <div id="main">
-  <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116 121">
-    <path fill-rule="evenodd"
-      d="M33.525 111.127C18.692 103.147 9.128 87.46 8.81 66.719c-1.433.726-3.064.848-4.943.163-5.377-1.96-4.169-8.51-2.197-14.348 1.633-4.835 7.21-8.365 9.942-9.103C17.969 19.072 32.883 0 58 0c25.416 0 40.433 18.285 46.611 43.495 2.8.862 8.129 4.332 9.719 9.04 1.972 5.838 3.18 12.386-2.197 14.347-1.878.685-3.51.563-4.942-.163-.29 20.873-9.852 36.5-24.678 44.438.894.72 1.4 1.651 1.4 2.843 0 3.866 1.882 7-11.913 7-10.067 0-11.785-2.13-11.98-4.447-.668-.422-1.342-1.053-2.02-1.053-.68 0-1.355.682-2.025 1.103C55.76 118.901 53.994 121 44 121c-13.795 0-11.914-3.134-11.914-7 0-1.208.521-2.15 1.439-2.873zM58 107c28.664 0 39-20.35 39-47.4 0-22.444-9.4-43.056-25-46.497C67 12 63.5 24 58 24s-9.5-12-14-10.897C28.334 16.943 19 38.342 19 59.6 19 85.125 29.336 107 58 107zM40 47a6 6 0 110-12 6 6 0 010 12zm36 0a6 6 0 110-12 6 6 0 010 12zm-16.914 3.24l8.234 3.613a2.78 2.78 0 01.934 4.442l-8.188 8.802a2.85 2.85 0 01-4.166-.006l-8.16-8.824a2.77 2.77 0 01.18-3.945c.222-.2.476-.365.75-.487l8.114-3.591a2.856 2.856 0 012.302-.004z">
-    </path>
-  </svg>
+  <img id="icon" src="images/crostini_icon.svg">
   <div id="status-container" role="status" aria-atomic="false">
     <div id="title">[[getTitle_(state_, error_)]]</div>
 
diff --git a/chrome/browser/resources/chromeos/crostini_upgrader/app.html b/chrome/browser/resources/chromeos/crostini_upgrader/app.html
index a70beb8..342d1ff 100644
--- a/chrome/browser/resources/chromeos/crostini_upgrader/app.html
+++ b/chrome/browser/resources/chromeos/crostini_upgrader/app.html
@@ -18,7 +18,6 @@
   }
 
   #icon {
-    fill: var(--cros-icon-color-prominent);
     height: 32px;
     margin-top: 28px;
     width: 32px;
@@ -98,9 +97,7 @@
 </style>
 
 <div id="main">
-  <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116 121">
-    <path fill-rule="evenodd" d="M33.525 111.127C18.692 103.147 9.128 87.46 8.81 66.719c-1.433.726-3.064.848-4.943.163-5.377-1.96-4.169-8.51-2.197-14.348 1.633-4.835 7.21-8.365 9.942-9.103C17.969 19.072 32.883 0 58 0c25.416 0 40.433 18.285 46.611 43.495 2.8.862 8.129 4.332 9.719 9.04 1.972 5.838 3.18 12.386-2.197 14.347-1.878.685-3.51.563-4.942-.163-.29 20.873-9.852 36.5-24.678 44.438.894.72 1.4 1.651 1.4 2.843 0 3.866 1.882 7-11.913 7-10.067 0-11.785-2.13-11.98-4.447-.668-.422-1.342-1.053-2.02-1.053-.68 0-1.355.682-2.025 1.103C55.76 118.901 53.994 121 44 121c-13.795 0-11.914-3.134-11.914-7 0-1.208.521-2.15 1.439-2.873zM58 107c28.664 0 39-20.35 39-47.4 0-22.444-9.4-43.056-25-46.497C67 12 63.5 24 58 24s-9.5-12-14-10.897C28.334 16.943 19 38.342 19 59.6 19 85.125 29.336 107 58 107zM40 47a6 6 0 110-12 6 6 0 010 12zm36 0a6 6 0 110-12 6 6 0 010 12zm-16.914 3.24l8.234 3.613a2.78 2.78 0 01.934 4.442l-8.188 8.802a2.85 2.85 0 01-4.166-.006l-8.16-8.824a2.77 2.77 0 01.18-3.945c.222-.2.476-.365.75-.487l8.114-3.591a2.856 2.856 0 012.302-.004z"></path>
-  </svg>
+  <img id="icon" src="images/crostini_icon.svg">
   <div id="status-container" role="status" aria-atomic="false">
     <div id="main-title">[[getTitle_(state_)]]</div>
 
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.js
index c37cd728..f94055b 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.js
@@ -8,7 +8,7 @@
 import {beforeNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {createCustomEvent, EMOJI_BUTTON_CLICK, EMOJI_VARIANTS_SHOWN} from './events.js';
-import {Emoji} from './types.js';
+import {CategoryEnum, Emoji} from './types.js';
 
 export class EmojiButton extends PolymerElement {
   static get is() {
@@ -56,11 +56,12 @@
     if (this.disabled)
       return;
     this.dispatchEvent(createCustomEvent(EMOJI_BUTTON_CLICK, {
-      emoji: this.emoji,
+      text: this.emoji,
       isVariant: this.variant,
       baseEmoji: this.base,
       allVariants: this.allVariants ? this.allVariants : this.variants,
-      name: this.tooltip
+      name: this.tooltip,
+      category: CategoryEnum.EMOJI,
     }));
   }
 
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html
index 84049605..d244a3e4 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html
@@ -346,9 +346,9 @@
       whereas the other groups are created from the emoji metadata.
     -->
     <div data-group="history">
-      <template is="dom-if" if="[[history.emoji.length]]">
-        <emoji-group data="[[history]]" preferred="{}" clearable class="group"
-          v2-enabled$="[[v2Enabled]]">
+      <template is="dom-if" if="[[emojiHistory.emoji.length]]">
+        <emoji-group data="[[emojiHistory]]" preferred="{}" clearable
+          class="group" v2-enabled$="[[v2Enabled]]">
         </emoji-group>
       </template>
     </div>
@@ -361,6 +361,13 @@
     </template>
     <div class="category-gap"></div>
     <template is="dom-if" if="[[v2Enabled]]">
+      <div data-group="emoticon-history">
+        <template is="dom-if" if="[[emoticonHistory.emoji.length]]">
+            <emoticon-group data="[[emoticonHistory]]" class="group"
+              data-group="emoticon-history">
+            </emoticon-group>
+        </template>
+      </div>
       <template is="dom-repeat" items="[[emoticonData]]">
         <div data-group$="[[getDataGroupIndex('emoticon', index)]]">
           <emoticon-group data="[[item]]" class="group">
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
index 54b1587..1797c18 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
@@ -19,8 +19,8 @@
 import {EmojiPickerApiProxy, EmojiPickerApiProxyImpl} from './emoji_picker_api_proxy.js';
 import {CATEGORY_BUTTON_CLICK, createCustomEvent, EMOJI_BUTTON_CLICK, EMOJI_CLEAR_RECENTS_CLICK, EMOJI_DATA_LOADED, EMOJI_REMAINING_DATA_LOADED, EMOJI_VARIANTS_SHOWN, EmojiVariantsShownEvent, GROUP_BUTTON_CLICK, V2_CONTENT_LOADED} from './events.js';
 import {V2_SUBCATEGORY_TABS} from './metadata_extension.js';
-import {RecentEmojiStore} from './store.js';
-import {Emoji, EmojiGroup, EmojiGroupData, EmojiVariants, StoredEmoji, SubcategoryData} from './types.js';
+import {RecentlyUsedStore} from './store.js';
+import {CategoryEnum, Emoji, EmojiGroup, EmojiGroupData, EmojiVariants, StoredItem, SubcategoryData} from './types.js';
 
 const EMOJI_ORDERING_JSON_TEMPLATE = '/emoji_14_0_ordering';
 const EMOTICON_ORDERING_JSON = '/emoticon_test_ordering.json';
@@ -104,7 +104,7 @@
  * Constructs the emoji group data structure from a given list of recent emoji
  * data from localstorage.
  *
- * @param {!Array<StoredEmoji>} recentEmoji list of recently used emoji strings.
+ * @param {!Array<StoredItem>} recentEmoji list of recently used emoji strings.
  * @return {!Array<EmojiVariants>} list of emoji data structures
  */
 function makeRecentlyUsed(recentEmoji) {
@@ -143,7 +143,9 @@
       /** @private {Object<string,string>} */
       preferenceMapping: {type: Object},
       /** @private {!EmojiGroup} */
-      history: {type: Object},
+      emojiHistory: {type: Object},
+      /** @private {!EmojiGroup} */
+      emoticonHistory: {type: Object},
       /** @private {string} */
       search: {type: String, value: '', observer: 'onSearchChanged'},
       /** @private {boolean} */
@@ -161,12 +163,17 @@
   constructor() {
     super();
 
-    /** @type {!RecentEmojiStore} */
-    this.recentEmojiStore = new RecentEmojiStore();
+    /** @type {!RecentlyUsedStore} */
+    this.recentEmojiStore = new RecentlyUsedStore('emoji-recently-used');
+    /** @type {!RecentlyUsedStore} */
+    this.recentEmoticonStore = new RecentlyUsedStore('emoticon-recently-used');
 
     this.emojiGroupTabs = GROUP_TABS;
     this.emojiData = [];
-    this.history = {'group': 'Recently used', 'emoji': []};
+
+    // TODO(b/216475720): rename the data structure below for a generic naming.
+    this.emojiHistory = {'group': 'Recently used', 'emoji': []};
+    this.emoticonHistory = {'group': 'Recently used', 'emoji': []};
 
     this.preferenceMapping = {};
 
@@ -200,10 +207,7 @@
     this.addEventListener(
         GROUP_BUTTON_CLICK, ev => this.selectGroup(ev.detail.group));
     this.addEventListener(
-        EMOJI_BUTTON_CLICK,
-        ev => this.insertEmoji(
-            ev.detail.emoji, ev.detail.isVariant, ev.detail.baseEmoji,
-            ev.detail.allVariants, ev.detail.name));
+        EMOJI_BUTTON_CLICK, (ev) => this.onEmojiButtonClick(ev));
     this.addEventListener(
         EMOJI_CLEAR_RECENTS_CLICK, ev => this.clearRecentEmoji());
     // variant popup related handlers
@@ -228,16 +232,21 @@
   async getHistory() {
     const incognito = (await this.apiProxy_.isIncognitoTextField()).incognito;
     if (incognito) {
-      this.set(['history', 'emoji'], makeRecentlyUsed([]));
+      this.set(['emojiHistory', 'emoji'], makeRecentlyUsed([]));
+      this.set(['emoticonHistory', 'emoji'], makeRecentlyUsed([]));
     } else {
       this.set(
-          ['history', 'emoji'],
+          ['emojiHistory', 'emoji'],
           makeRecentlyUsed(this.recentEmojiStore.data.history || []));
       this.set(
+          ['emoticonHistory', 'emoji'],
+          makeRecentlyUsed(this.recentEmoticonStore.data.history || []));
+      this.set(
           ['preferenceMapping'], this.recentEmojiStore.getPreferenceMapping());
     }
     this.set(
-        ['emojiGroupTabs', 0, 'disabled'], this.history.emoji.length === 0);
+        ['emojiGroupTabs', 0, 'disabled'],
+        this.emojiHistory.emoji.length === 0);
     // Make highlight bar visible (now we know where it should be) and
     // add smooth sliding.
     this.updateActiveGroup(/*updateTabsScroll=*/ true);
@@ -325,32 +334,58 @@
   }
 
   /**
-   * @param {!string} emoji
-   * @param {boolean} isVariant
-   * @param {!string} baseEmoji
-   * @param {!Array<!string>} allVariants
-   * @param {!string} name
+   * @private
+   * @param {Event} ev
    */
-  async insertEmoji(emoji, isVariant, baseEmoji, allVariants, name) {
-    this.$.message.textContent = emoji + ' inserted.';
+  onEmojiButtonClick(ev) {
+    const category = ev.detail.category;
+    delete ev.detail.category;
+    this.insertText(category, ev.detail);
+  }
+
+  /**
+   * @param {CategoryEnum} category
+   * @param {{emoji: string, isVariant: boolean, baseEmoji: string, allVariants:
+   *     !Array<!string>, name: string}} item
+   */
+  async insertText(category, item) {
+    const {text, isVariant, baseEmoji, allVariants, name} = item;
+    this.$.message.textContent = text + ' inserted.';
     const incognito = (await this.apiProxy_.isIncognitoTextField()).incognito;
+
     if (!incognito) {
-      this.recentEmojiStore.bumpEmoji(
-          {base: emoji, alternates: allVariants, name: name});
-      this.recentEmojiStore.savePreferredVariant(baseEmoji, emoji);
-      this.set(
-          ['history', 'emoji'],
-          makeRecentlyUsed(this.recentEmojiStore.data.history));
+      switch (category) {
+        case CategoryEnum.EMOJI:
+          this.recentEmojiStore.bumpItem(
+              {base: text, alternates: allVariants, name: name});
+          this.recentEmojiStore.savePreferredVariant(baseEmoji, text);
+          this.set(
+              ['emojiHistory', 'emoji'],
+              makeRecentlyUsed(this.recentEmojiStore.data.history));
+          break;
+
+        case CategoryEnum.EMOTICON:
+          this.recentEmoticonStore.bumpItem({base: text, name, alternates: []});
+          this.set(
+              ['emoticonHistory', 'emoji'],
+              makeRecentlyUsed(this.recentEmoticonStore.data.history));
+          break;
+
+        default:
+          throw new Error('Unknown category');
+      }
     }
     const searchLength = this.$['search-container']
                              .shadowRoot.querySelector('cr-search-field')
                              .getSearchInput()
                              .value.length;
-    this.apiProxy_.insertEmoji(emoji, isVariant, searchLength);
+
+    // TODO(b/217276960): change to a more generic name
+    this.apiProxy_.insertEmoji(text, isVariant, searchLength);
   }
 
   clearRecentEmoji() {
-    this.set(['history', 'emoji'], makeRecentlyUsed([]));
+    this.set(['emojiHistory', 'emoji'], makeRecentlyUsed([]));
     this.set(['emojiGroupTabs', 0, 'disabled'], true);
     this.recentEmojiStore.clearRecents();
     afterNextRender(
@@ -412,7 +447,7 @@
       this.$.tabs.scrollLeft = 0;
       this.scrollToGroup(GROUP_TABS[0].groupId);
       this.groupTabsMoving = true;
-      if (this.history.emoji.length > 0) {
+      if (this.emojiHistory.emoji.length > 0) {
         this.$.bar.style.left = '0';
       } else {
         this.$.bar.style.left = EMOJI_PICKER_TOTAL_EMOJI_WIDTH_PX;
@@ -530,7 +565,7 @@
     });
 
     // Ensure that the history tab is not set as active if it is empty.
-    if (index === 0 && this.history.emoji.length === 0) {
+    if (index === 0 && this.emojiHistory.emoji.length === 0) {
       this.set(['emojiGroupTabs', 0, 'active'], false);
       this.set(['emojiGroupTabs', 1, 'active'], true);
       index = 1;
@@ -606,7 +641,7 @@
 
   hideDialogs() {
     this.hideEmojiVariants();
-    if (this.history.emoji.length > 0) {
+    if (this.emojiHistory.emoji.length > 0) {
       this.shadowRoot.querySelector(`div[data-group="history"]`)
           .querySelector('emoji-group')
           .showClearRecents = false;
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoticon_group.js b/chrome/browser/resources/chromeos/emoji_picker/emoticon_group.js
index b582ac2..e8d8726 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoticon_group.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoticon_group.js
@@ -4,7 +4,7 @@
 
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createCustomEvent, EMOJI_BUTTON_CLICK} from './events.js';
-import {EmojiGroup} from './types.js';
+import {CategoryEnum, EmojiGroup} from './types.js';
 
 class EmoticonGroupComponent extends PolymerElement {
   static get is() {
@@ -26,11 +26,12 @@
     const emoticonString = ev.target.getAttribute('emoticon-string');
     const emoticonName = ev.target.getAttribute('emoticon-name');
     this.dispatchEvent(createCustomEvent(EMOJI_BUTTON_CLICK, {
-      emoji: emoticonString,
+      text: emoticonString,
       isVariant: false,
       baseEmoji: emoticonString,
       allVariants: [],
       name: emoticonName,
+      category: CategoryEnum.EMOTICON
     }));
   }
 }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/store.js b/chrome/browser/resources/chromeos/emoji_picker/store.js
index 500a2a1..b08411a 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/store.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/store.js
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {StoredEmoji} from './types.js';
+import {StoredItem} from './types.js';
 
-const LOCALSTORAGE_KEY = 'emoji-recently-used';
 const MAX_RECENTS = 18;
 
 /**
- * @return {{history:!Array<StoredEmoji>, preference:Object<string,string>}}
+ * @param {string} keyName Keyname of the object stored in storage
+ * @return {{history:!Array<StoredItem>, preference:Object<string,string>}}
  *     recently used emoji, most recent first.
  */
-function load() {
-  const stored = window.localStorage.getItem(LOCALSTORAGE_KEY);
+function load(keyName) {
+  const stored = window.localStorage.getItem(keyName);
   if (!stored) {
     return {history: [], preference: {}};
   }
@@ -22,16 +22,17 @@
 }
 
 /**
- * @param {{history:!Array<StoredEmoji>, preference:Object<string,string>}} data
+ * @param {{history:!Array<StoredItem>, preference:Object<string,string>}} data
  *     recently used emoji, most recent first.
  */
-function save(data) {
-  window.localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(data));
+function save(keyName, data) {
+  window.localStorage.setItem(keyName, JSON.stringify(data));
 }
 
-export class RecentEmojiStore {
-  constructor() {
-    this.data = load();
+export class RecentlyUsedStore {
+  constructor(name) {
+    this.storeName = name;
+    this.data = load(name);
   }
 
   savePreferredVariant(baseEmoji, variant) {
@@ -39,7 +40,7 @@
       return;
     }
     this.data.preference[baseEmoji] = variant;
-    save(this.data);
+    save(this.storeName, this.data);
   }
 
   getPreferenceMapping() {
@@ -48,29 +49,29 @@
 
   clearRecents() {
     this.data.history = [];
-    save(this.data);
+    save(this.storeName, this.data);
   }
 
   /**
-   * Moves the given emoji to the front of the MRU list, inserting it if
+   * Moves the given item to the front of the MRU list, inserting it if
    * it did not previously exist.
-   * @param {!StoredEmoji} newEmoji most recently used emoji.
+   * @param {!StoredItem} newItem most recently used item.
    */
-  bumpEmoji(newEmoji) {
-    // Find and remove newEmoji from array if it previously existed.
-    // Note, this explicitly allows for multiple recent emoji entries for the
+  bumpItem(newItem) {
+    // Find and remove newItem from array if it previously existed.
+    // Note, this explicitly allows for multiple recent item entries for the
     // same "base" emoji just with a different variant.
-    const oldIndex = this.data.history.findIndex(x => x.base === newEmoji.base);
+    const oldIndex = this.data.history.findIndex(x => x.base === newItem.base);
     if (oldIndex !== -1) {
       this.data.history.splice(oldIndex, 1);
     }
-    // insert newEmoji to the front of the array.
-    this.data.history.unshift(newEmoji);
+    // insert newItem to the front of the array.
+    this.data.history.unshift(newItem);
     // slice from end of array if it exceeds MAX_RECENTS.
     if (this.data.history.length > MAX_RECENTS) {
       // setting length is sufficient to truncate an array.
       this.data.history.length = MAX_RECENTS;
     }
-    save(this.data);
+    save(this.storeName, this.data);
   }
 }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/types.js b/chrome/browser/resources/chromeos/emoji_picker/types.js
index 93157c1..fde0e39 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/types.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/types.js
@@ -29,12 +29,20 @@
 
 /**
  * @typedef {{base:string, alternates:!Array<!string>, name:!string}}
- * StoredEmoji
+ * StoredItem
  */
-export let StoredEmoji;
+export let StoredItem;
 
 /**
  * @typedef {{name: string, icon: string, groupId: string, active: boolean,
  *          disabled: boolean, pagination: ?number}} SubcategoryData
  */
-export let SubcategoryData;
\ No newline at end of file
+export let SubcategoryData;
+
+/**
+ * @enum {string}
+ */
+export const CategoryEnum = {
+  EMOJI: 'emoji',
+  EMOTICON: 'emoticon'
+};
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
index b7e52619..5dbd632 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import './strings.m.js';
 
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrivacySandboxDialogBrowserProxy} from './privacy_sandbox_dialog_browser_proxy.js';
@@ -20,6 +22,19 @@
     return html`{__html_template__}`;
   }
 
+  static get properties() {
+    return {
+      isConsent_: {
+        type: Boolean,
+        value: () => {
+          return loadTimeData.getBoolean('isConsent');
+        },
+      },
+    };
+  }
+
+  isConsent_: boolean;
+
   private onClose_() {
     PrivacySandboxDialogBrowserProxy.getInstance().closeDialog();
   }
diff --git a/chrome/browser/resources/read_later/side_panel/bookmark_folder.html b/chrome/browser/resources/read_later/side_panel/bookmark_folder.html
index ecb2422..67ca11a3 100644
--- a/chrome/browser/resources/read_later/side_panel/bookmark_folder.html
+++ b/chrome/browser/resources/read_later/side_panel/bookmark_folder.html
@@ -27,14 +27,22 @@
     width: 100%;
   }
 
-  :host-context([hover-visible]) .row:not([empty]):hover,
+  :host-context([hover-visible]) .row:not([empty]):hover {
+    background-color: var(--mwb-list-item-hover-background-color);
+  }
+
+  :host-context(.focus-outline-visible) .row:focus,
+  :host-context(.focus-outline-visible) .row:focus:hover {
+    background-color: var(--mwb-list-item-selected-background-color);
+    outline: none;
+  }
+
   .row:focus-visible:focus {
-    background-color: var(--cr-hover-background-color);
     outline: none;
   }
 
   :host-context([hover-visible]) .row:not([empty]):active,
-  .row:not([empty]):focus-visible:active {
+  :host-context(.focus-outline-visible) .row:not([empty]):active {
     background-color: var(--cr-active-background-color);
   }
 
diff --git a/chrome/browser/resources/read_later/side_panel/bookmarks_list.ts b/chrome/browser/resources/read_later/side_panel/bookmarks_list.ts
index d5eab06..7a047591 100644
--- a/chrome/browser/resources/read_later/side_panel/bookmarks_list.ts
+++ b/chrome/browser/resources/read_later/side_panel/bookmarks_list.ts
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import {CrA11yAnnouncerElement} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {afterNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -51,6 +52,7 @@
       BookmarksApiProxyImpl.getInstance();
   private bookmarksDragManager_: BookmarksDragManager =
       new BookmarksDragManager(this);
+  private focusOutlineManager_: FocusOutlineManager;
   private readLaterApi_: ReadLaterApiProxy =
       ReadLaterApiProxyImpl.getInstance();
   private listeners_ = new Map<string, Function>();
@@ -72,6 +74,7 @@
   connectedCallback() {
     super.connectedCallback();
     this.setAttribute('role', 'tree');
+    this.focusOutlineManager_ = FocusOutlineManager.forDocument(document);
     this.bookmarksApi_.getFolders().then(folders => {
       this.folders_ = folders;
 
@@ -146,6 +149,14 @@
 
     this.focusBookmark_(bookmarks[0]!.id);
     this.hoverVisible = false;
+
+    // Show the focus state immediately after dropping a bookmark to indicate
+    // where the bookmark was moved to, and remove the state immediately after
+    // the next mouse event.
+    this.focusOutlineManager_.visible = true;
+    document.addEventListener('mousedown', () => {
+      this.focusOutlineManager_.visible = false;
+    }, {once: true});
   }
 
   /** BookmarksDragDelegate */
@@ -275,7 +286,7 @@
     event.preventDefault();
     const eventTarget = event.composedPath()[0] as HTMLElement;
     const bookmarkData = getBookmarkFromElement(eventTarget);
-    if (!bookmarkData || !eventTarget.matches(':focus-visible')) {
+    if (!bookmarkData || !this.focusOutlineManager_.visible) {
       return;
     }
 
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
index 21cae931..a3b7e4c 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
@@ -28,6 +28,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -61,6 +62,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Features.EnableFeatures({ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class ShareSheetCoordinatorTest {
     private static final String MOCK_URL = JUnitTestGURLs.EXAMPLE_URL;
 
diff --git a/chrome/browser/signin/services/OWNERS b/chrome/browser/signin/services/OWNERS
index 1c49383..cad3ddf 100644
--- a/chrome/browser/signin/services/OWNERS
+++ b/chrome/browser/signin/services/OWNERS
@@ -1,2 +1,3 @@
 bsazonov@chromium.org
 aliceywang@chromium.org
+triploblastic@chromium.org
diff --git a/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheUnitTest.java b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheUnitTest.java
index f64eb974..56a6d57 100644
--- a/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheUnitTest.java
+++ b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheUnitTest.java
@@ -15,6 +15,7 @@
 import org.mockito.junit.MockitoRule;
 import org.mockito.quality.Strictness;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.JniMocker;
@@ -31,6 +32,7 @@
  * Unit tests for {@link ProfileDataCache}
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ProfileDataCacheUnitTest {
     private static final long NATIVE_IDENTITY_MANAGER = 10001L;
     private static final String ACCOUNT_EMAIL = "test@gmail.com";
diff --git a/chrome/browser/sync/test/integration/status_change_checker.cc b/chrome/browser/sync/test/integration/status_change_checker.cc
index 3ac2327c..2810f88 100644
--- a/chrome/browser/sync/test/integration/status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/status_change_checker.cc
@@ -36,9 +36,6 @@
 
 }  // namespace
 
-const char switches::kStatusChangeCheckerTimeoutInSeconds[] =
-    "sync-status-change-checker-timeout";
-
 StatusChangeChecker::StatusChangeChecker()
     : timeout_(GetTimeoutFromCommandLineOrDefault()),
       run_loop_(base::RunLoop::Type::kNestableTasksAllowed) {}
diff --git a/chrome/browser/sync/test/integration/status_change_checker.h b/chrome/browser/sync/test/integration/status_change_checker.h
index 55844fd..2e26499 100644
--- a/chrome/browser/sync/test/integration/status_change_checker.h
+++ b/chrome/browser/sync/test/integration/status_change_checker.h
@@ -12,7 +12,8 @@
 
 namespace switches {
 
-extern const char kStatusChangeCheckerTimeoutInSeconds[];
+constexpr inline char kStatusChangeCheckerTimeoutInSeconds[] =
+    "sync-status-change-checker-timeout";
 
 }  // namespace switches
 
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 80e8d02..d88422dab 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -217,10 +217,6 @@
 
 }  // namespace
 
-const char switches::kPasswordFileForTest[] = "password-file-for-test";
-const char switches::kSyncUserForTest[] = "sync-user-for-test";
-const char switches::kSyncPasswordForTest[] = "sync-password-for-test";
-
 SyncTest::FakeInstanceID::FakeInstanceID(const std::string& app_id,
                                          gcm::GCMDriver* gcm_driver)
     : instance_id::InstanceID(app_id, gcm_driver),
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h
index dc15ba50..9512968 100644
--- a/chrome/browser/sync/test/integration/sync_test.h
+++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -79,9 +79,9 @@
 
 namespace switches {
 
-extern const char kPasswordFileForTest[];
-extern const char kSyncUserForTest[];
-extern const char kSyncPasswordForTest[];
+constexpr inline char kPasswordFileForTest[] = "password-file-for-test";
+constexpr inline char kSyncUserForTest[] = "sync-user-for-test";
+constexpr inline char kSyncPasswordForTest[] = "sync-password-for-test";
 
 }  // namespace switches
 
diff --git a/chrome/browser/sync/test/integration/wallet_helper.cc b/chrome/browser/sync/test/integration/wallet_helper.cc
index 49cd18a..19b2916 100644
--- a/chrome/browser/sync/test/integration/wallet_helper.cc
+++ b/chrome/browser/sync/test/integration/wallet_helper.cc
@@ -230,12 +230,6 @@
 
 namespace wallet_helper {
 
-const char kDefaultCardID[] = "wallet card ID";
-const char kDefaultAddressID[] = "wallet address ID";
-const char kDefaultCustomerID[] = "deadbeef";
-const char kDefaultBillingAddressID[] = "billing address entity ID";
-const char kDefaultCreditCardCloudTokenDataID[] = "cloud token data ID";
-
 PersonalDataManager* GetPersonalDataManager(int index) {
   return autofill::PersonalDataManagerFactory::GetForProfile(
       test()->GetProfile(index));
diff --git a/chrome/browser/sync/test/integration/wallet_helper.h b/chrome/browser/sync/test/integration/wallet_helper.h
index 2d16b1b..af55e15a 100644
--- a/chrome/browser/sync/test/integration/wallet_helper.h
+++ b/chrome/browser/sync/test/integration/wallet_helper.h
@@ -35,11 +35,12 @@
 
 namespace wallet_helper {
 
-extern const char kDefaultCardID[];
-extern const char kDefaultAddressID[];
-extern const char kDefaultCustomerID[];
-extern const char kDefaultBillingAddressID[];
-extern const char kDefaultCreditCardCloudTokenDataID[];
+constexpr inline char kDefaultCardID[] = "wallet card ID";
+constexpr inline char kDefaultAddressID[] = "wallet address ID";
+constexpr inline char kDefaultCustomerID[] = "deadbeef";
+constexpr inline char kDefaultBillingAddressID[] = "billing address entity ID";
+constexpr inline char kDefaultCreditCardCloudTokenDataID[] =
+    "cloud token data ID";
 
 // Used to access the personal data manager within a particular sync profile.
 [[nodiscard]] autofill::PersonalDataManager* GetPersonalDataManager(int index);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index d0b3b92..5067f92 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1718,6 +1718,7 @@
       "//chrome/common:version_header",
       "//chrome/common/search:mojo_bindings",
       "//chrome/common/themes:autogenerated_theme_util",
+      "//components/app_constants",
       "//components/enterprise/common:download_item_reroute_info",
       "//components/feedback/proto",
       "//components/keep_alive_registry",
@@ -1971,6 +1972,8 @@
       "app_list/search/files/zero_state_file_provider.h",
       "app_list/search/help_app_provider.cc",
       "app_list/search/help_app_provider.h",
+      "app_list/search/keyboard_shortcut_provider.cc",
+      "app_list/search/keyboard_shortcut_provider.h",
       "app_list/search/mixer.cc",
       "app_list/search/mixer.h",
       "app_list/search/omnibox_answer_result.cc",
@@ -3036,6 +3039,7 @@
       "//chromeos/ui/frame",
       "//chromeos/ui/vector_icons",
       "//chromeos/ui/wm",
+      "//components/app_constants",
       "//components/app_restore",
       "//components/arc",
       "//components/assist_ranker",
@@ -4584,8 +4588,6 @@
       "views/status_bubble_views.h",
       "views/storage/storage_pressure_bubble_view.cc",
       "views/storage/storage_pressure_bubble_view.h",
-      "views/sync/profile_signin_confirmation_dialog_views.cc",
-      "views/sync/profile_signin_confirmation_dialog_views.h",
       "views/tab_contents/chrome_web_contents_view_focus_helper.cc",
       "views/tab_contents/chrome_web_contents_view_focus_helper.h",
       "views/tab_dialogs_views.cc",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index f23c0bc..d107420 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2708,10 +2708,10 @@
         Chrome First Run Experience
       </message>
       <message name="IDS_FRE_TOS" desc="Message explaining that use of Chrome is governed by terms of service.">
-        By using Chrome, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Google Chrome and Chrome OS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>.
+        By using Chrome, you agree to the <ph name="BEGIN_TOS_LINK">&lt;TOS_LINK&gt;</ph>Google Terms of Service<ph name="END_TOS_LINK">&lt;/TOS_LINK&gt;</ph>, and the <ph name="BEGIN_ATOS_LINK">&lt;ATOS_LINK&gt;</ph>Google Chrome and Chrome OS Additional Terms of Service<ph name="END_ATOS_LINK">&lt;/ATOS_LINK&gt;</ph>.
       </message>
       <message name="IDS_FRE_TOS_AND_PRIVACY_CHILD_ACCOUNT" desc="Message explaining that use of Chrome is governed by Chrome's terms of service, and Family Link's privacy notice for children.">
-        By using Chrome, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Google Chrome and Chrome OS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>. The <ph name="BEGIN_LINK3">&lt;LINK3&gt;</ph>Privacy Notice for Google Accounts Managed with Family Link<ph name="END_LINK3">&lt;/LINK3&gt;</ph> also applies.
+        By using Chrome, you agree to the <ph name="BEGIN_TOS_LINK">&lt;TOS_LINK&gt;</ph>Google Terms of Service<ph name="END_TOS_LINK">&lt;/TOS_LINK&gt;</ph>, and the <ph name="BEGIN_ATOS_LINK">&lt;ATOS_LINK&gt;</ph>Google Chrome and Chrome OS Additional Terms of Service<ph name="END_ATOS_LINK">&lt;/ATOS_LINK&gt;</ph>. The <ph name="BEGIN_PRIVACY_LINK">&lt;PRIVACY_LINK&gt;</ph>Privacy Notice for Google Accounts Managed with Family Link<ph name="END_PRIVACY_LINK">&lt;/PRIVACY_LINK&gt;</ph> also applies.
       </message>
       <message name="IDS_LIGHTWEIGHT_FRE_ASSOCIATED_APP_TOS" desc="Message explaining that use of Chrome is governed by Chrome's terms of service.">
         <ph name="APP_NAME">%1$s<ex>Google Maps</ex></ph> will open in Chrome. By continuing, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Google Chrome and Chrome OS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>.
@@ -2739,9 +2739,6 @@
       <message name="IDS_SIGNIN_FRE_FOOTER" desc="The text is displayed in a footer on the very first screen of Chrome. The link ‘Terms of Service’ opens the Google Terms of Service. Preferably, ensure consistency with the “Usage statistics and crash reports” section of the Chrome Privacy Policy (google.com/chrome/privacy). Separate the first and the second part through a line break.">
         By continuing, you agree to the <ph name="BEGIN_TOS_LINK">&lt;TOS_LINK&gt;</ph>Terms of Service<ph name="END_TOS_LINK">&lt;/TOS_LINK&gt;</ph>.\nTo help improve the app, Chrome sends usage and crash data to Google. <ph name="BEGIN_UMA_LINK">&lt;UMA_LINK&gt;</ph>Manage<ph name="END_UMA_LINK">&lt;/UMA_LINK&gt;</ph>
       </message>
-      <message name="IDS_SIGNIN_FRE_FOOTER_SUPERVISED_USER" desc="The text is displayed in a footer on the very first screen of Chrome. The link 'Terms of Service' opens the Google Terms of Service. The link 'Privacy Policy' opens the Google Privacy Policy. Preferably, ensure consistency with the “Usage statistics and crash reports” section of the Chrome Privacy Policy (google.com/chrome/privacy). Separate the first and the second sentence through a line break.">
-        By continuing, you agree to the <ph name="BEGIN_TOS_LINK">&lt;TOS_LINK&gt;</ph>Terms of Service<ph name="END_TOS_LINK">&lt;/TOS_LINK&gt;</ph> and <ph name="BEGIN_PRIVACY_LINK">&lt;PRIVACY_LINK&gt;</ph>Privacy\u00A0Policy<ph name="END_PRIVACY_LINK">&lt;/PRIVACY_LINK&gt;</ph>.\nTo help improve the app, Chrome sends usage and crash data to Google. <ph name="BEGIN_UMA_LINK">&lt;UMA_LINK&gt;</ph>Manage<ph name="END_UMA_LINK">&lt;/UMA_LINK&gt;</ph>
-      </message>
       <message name="IDS_SIGNIN_FRE_FOOTER_TOS" desc="The text is displayed in a footer on the very first screen of Chrome. The link ‘Terms of Service’ opens the Google Terms of Service.">
         By continuing, you agree to the <ph name="BEGIN_TOS_LINK">&lt;TOS_LINK&gt;</ph>Terms of Service<ph name="END_TOS_LINK">&lt;/TOS_LINK&gt;</ph>.
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS.png.sha1
new file mode 100644
index 0000000..1ea7f2f
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS.png.sha1
@@ -0,0 +1 @@
+1bd037570ca734def81579f2dbcc0b4f3862c196
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS_AND_PRIVACY_CHILD_ACCOUNT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS_AND_PRIVACY_CHILD_ACCOUNT.png.sha1
new file mode 100644
index 0000000..95481465
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_FRE_TOS_AND_PRIVACY_CHILD_ACCOUNT.png.sha1
@@ -0,0 +1 @@
+a36228c8421380d655620e6610a173a27fa27385
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_FRE_FOOTER_SUPERVISED_USER.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_FRE_FOOTER_SUPERVISED_USER.png.sha1
deleted file mode 100644
index 63f4454f..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_FRE_FOOTER_SUPERVISED_USER.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-65d59163abbb3534eeaf836d58e214e1ae4d95b5
\ No newline at end of file
diff --git a/chrome/browser/ui/app_list/DEPS b/chrome/browser/ui/app_list/DEPS
index db054910..fac7ee0 100644
--- a/chrome/browser/ui/app_list/DEPS
+++ b/chrome/browser/ui/app_list/DEPS
@@ -2,6 +2,7 @@
   "+ash/app_list/model",
   "+ash/resources",
   "+ash/strings",
+  "+components/app_constants",
   "+components/services/app_service/public",
 ]
 
diff --git a/chrome/browser/ui/app_list/app_context_menu_unittest.cc b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
index d52706b..bee13c901 100644
--- a/chrome/browser/ui/app_list/app_context_menu_unittest.cc
+++ b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
@@ -42,6 +42,7 @@
 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/app_constants/constants.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/services/app_service/public/cpp/app_update.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -306,7 +307,7 @@
     scoped_refptr<extensions::Extension> app = extensions::Extension::Create(
         base::FilePath(), extensions::mojom::ManifestLocation::kInternal, value,
         extensions::Extension::WAS_INSTALLED_BY_DEFAULT,
-        extension_misc::kChromeAppId, &err);
+        app_constants::kChromeAppId, &err);
     EXPECT_EQ(err, "");
     return app;
   }
@@ -319,7 +320,7 @@
 
     controller_ = std::make_unique<FakeAppListControllerDelegate>();
     AppServiceContextMenu menu(menu_delegate(), profile(),
-                               extension_misc::kChromeAppId, controller(),
+                               app_constants::kChromeAppId, controller(),
                                /*add_sort_options=*/false);
     std::unique_ptr<ui::MenuModel> menu_model = GetMenuModel(&menu);
     ASSERT_NE(nullptr, menu_model);
@@ -711,7 +712,7 @@
 
   // Create the context menu.
   AppServiceContextMenu menu(menu_delegate(), profile(),
-                             extension_misc::kLacrosAppId, controller(),
+                             app_constants::kLacrosAppId, controller(),
                              /*add_sort_options=*/false);
   std::unique_ptr<ui::MenuModel> menu_model = GetMenuModel(&menu);
   ASSERT_NE(menu_model, nullptr);
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
index 55cd64f..11b74c58 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -59,6 +59,7 @@
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/app_constants/constants.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/user_names.h"
@@ -472,7 +473,7 @@
 
   // First browser launch time should be recorded.
   const base::Time time_recorded1 =
-      prefs->GetLastLaunchTime(extension_misc::kChromeAppId);
+      prefs->GetLastLaunchTime(app_constants::kChromeAppId);
   EXPECT_NE(base::Time(), time_recorded1);
 
   // Create an incognito browser so that we can close the regular one without
@@ -482,14 +483,14 @@
   EXPECT_EQ(1U, chrome::GetBrowserCount(profile_otr));
   // Creating incognito browser should not update the launch time.
   EXPECT_EQ(time_recorded1,
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+            prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 
   // Close the regular browser.
   CloseBrowserSynchronously(chrome::FindBrowserWithProfile(profile));
   EXPECT_EQ(0U, chrome::GetBrowserCount(profile));
   // Recorded the launch time should not update.
   EXPECT_EQ(time_recorded1,
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+            prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 
   // Launch another regular browser.
   const base::Time time_before_launch = base::Time::Now();
@@ -499,7 +500,7 @@
   EXPECT_EQ(1U, chrome::GetBrowserCount(profile));
 
   const base::Time time_recorded2 =
-      prefs->GetLastLaunchTime(extension_misc::kChromeAppId);
+      prefs->GetLastLaunchTime(app_constants::kChromeAppId);
   EXPECT_LE(time_before_launch, time_recorded2);
   EXPECT_GE(time_after_launch, time_recorded2);
 
@@ -508,7 +509,7 @@
                               /*should_trigger_session_restore=*/true);
   EXPECT_EQ(2U, chrome::GetBrowserCount(profile));
   EXPECT_EQ(time_recorded2,
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+            prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 }
 
 // Browser Test for AppListClient that observes search result changes.
@@ -632,7 +633,7 @@
 IN_PROC_BROWSER_TEST_F(AppListAppLaunchTest,
                        NoDemoModeAppLaunchSourceReported) {
   EXPECT_FALSE(ash::DemoSession::IsDeviceInDemoMode());
-  LaunchChromeAppListItem(extension_misc::kChromeAppId);
+  LaunchChromeAppListItem(app_constants::kChromeAppId);
 
   // Should see 0 apps launched from the Launcher in the histogram when not in
   // Demo mode.
@@ -651,7 +652,7 @@
   // (ChromeAppListItem) is used for all types of apps
   // (ARC, extension, etc), so launching just the browser suffices
   // to test all these cases.
-  LaunchChromeAppListItem(extension_misc::kChromeAppId);
+  LaunchChromeAppListItem(app_constants::kChromeAppId);
 
   // Should see 1 app launched from the Launcher in the histogram.
   histogram_tester_->ExpectUniqueSample(
diff --git a/chrome/browser/ui/app_list/app_list_sort_unittest.cc b/chrome/browser/ui/app_list/app_list_sort_unittest.cc
index a1a97da..b313d544 100644
--- a/chrome/browser/ui/app_list/app_list_sort_unittest.cc
+++ b/chrome/browser/ui/app_list/app_list_sort_unittest.cc
@@ -108,6 +108,52 @@
             std::vector<std::string>({kItemId1, kItemId2, kItemId3}));
 }
 
+TEST_F(TemporaryAppListSortTest, AppInsertionInSortedAppListCaseInsensitive) {
+  RemoveAllExistingItems();
+
+  // Add three apps.
+  const std::string kItemId1 = CreateNextAppId(GenerateId("app_id1"));
+  scoped_refptr<extensions::Extension> app1 =
+      MakeApp("aaa", kItemId1, extensions::Extension::NO_FLAGS);
+  InstallExtension(app1.get());
+
+  const std::string kItemId2 = CreateNextAppId(GenerateId("app_id2"));
+  scoped_refptr<extensions::Extension> app2 =
+      MakeApp("BBB", kItemId2, extensions::Extension::NO_FLAGS);
+  InstallExtension(app2.get());
+
+  const std::string kItemId3 = CreateNextAppId(GenerateId("app_id3"));
+  scoped_refptr<extensions::Extension> app3 =
+      MakeApp("ccc", kItemId3, extensions::Extension::NO_FLAGS);
+  InstallExtension(app3.get());
+
+  // Verify the default status. Note that when the order is kCustom, a new app
+  // should be placed at the front.
+  EXPECT_EQ(ash::AppListSortOrder::kCustom, GetSortOrderFromPrefs());
+  EXPECT_EQ(GetOrderedItemIdsFromModelUpdater(),
+            std::vector<std::string>({kItemId3, kItemId2, kItemId1}));
+
+  // Sort apps with name alphabetical order.
+  GetChromeModelUpdater()->RequestAppListSort(
+      ash::AppListSortOrder::kNameAlphabetical);
+
+  // The app positions stored in the model updater change, where the order of
+  // app names is case insensitive.
+  EXPECT_EQ(GetOrderedItemIdsFromModelUpdater(),
+            std::vector<std::string>({kItemId1, kItemId2, kItemId3}));
+
+  // Install an additional app.
+  const std::string kItemId4 = GenerateId("app_id4");
+  scoped_refptr<extensions::Extension> app4 =
+      MakeApp("abc", kItemId4, extensions::Extension::NO_FLAGS);
+  InstallExtension(app4.get());
+
+  // The app positions stored in the model updater change, where the order of
+  // app names is case insensitive.
+  EXPECT_EQ(GetOrderedItemIdsFromModelUpdater(),
+            std::vector<std::string>({kItemId1, kItemId4, kItemId2, kItemId3}));
+}
+
 // Verifies sorting works as expected when the app list is under temporary sort.
 TEST_F(TemporaryAppListSortTest, SortUponTemporaryOrder) {
   RemoveAllExistingItems();
@@ -857,14 +903,14 @@
   // Sort with the name alphabetical order and commit.
   model_updater->RequestAppListSort(ash::AppListSortOrder::kNameAlphabetical);
   Commit();
-  EXPECT_EQ(std::vector<std::string>({"Folder", "A", "B", "C", "D", "E"}),
+  EXPECT_EQ(std::vector<std::string>({"A", "B", "C", "D", "E", "Folder"}),
             GetOrderedNamesFromSyncableService());
 
   // Sort with the name reverse alphabetical order without committing.
   model_updater->RequestAppListSort(
       ash::AppListSortOrder::kNameReverseAlphabetical);
   EXPECT_EQ(ash::AppListSortOrder::kNameAlphabetical, GetSortOrderFromPrefs());
-  EXPECT_EQ(std::vector<std::string>({"Folder", "A", "B", "C", "D", "E"}),
+  EXPECT_EQ(std::vector<std::string>({"A", "B", "C", "D", "E", "Folder"}),
             GetOrderedNamesFromSyncableService());
 
   // Move `app3` to the folder.
@@ -928,7 +974,7 @@
   // Install an additional app.
   const std::string kItemId4 = GenerateId("app_id4");
   scoped_refptr<extensions::Extension> app4 =
-      MakeApp("D", kItemId4, extensions::Extension::NO_FLAGS);
+      MakeApp("G", kItemId4, extensions::Extension::NO_FLAGS);
   InstallExtension(app4.get());
 
   // Sort with the reverse alphabetical name order and commit.
@@ -936,14 +982,14 @@
   model_updater->RequestAppListSort(
       ash::AppListSortOrder::kNameReverseAlphabetical);
   Commit();
-  EXPECT_EQ(std::vector<std::string>({"Folder", "D", "C", "B", "A"}),
+  EXPECT_EQ(std::vector<std::string>({"G", "Folder", "C", "B", "A"}),
             GetOrderedNamesFromSyncableService());
 
   // Sort with the name alphabetical order without committing.
   model_updater->RequestAppListSort(ash::AppListSortOrder::kNameAlphabetical);
   EXPECT_EQ(ash::AppListSortOrder::kNameReverseAlphabetical,
             GetSortOrderFromPrefs());
-  EXPECT_EQ(std::vector<std::string>({"Folder", "D", "C", "B", "A"}),
+  EXPECT_EQ(std::vector<std::string>({"G", "Folder", "C", "B", "A"}),
             GetOrderedNamesFromSyncableService());
 
   // Move an folder item to root apps grid.
@@ -955,7 +1001,7 @@
   // (2) Sort order pref reverts to custom.
   EXPECT_FALSE(IsUnderTemporarySort());
   EXPECT_EQ(ash::AppListSortOrder::kCustom, GetSortOrderFromPrefs());
-  EXPECT_EQ(std::vector<std::string>({"Folder", "B", "C", "D", "A"}),
+  EXPECT_EQ(std::vector<std::string>({"B", "C", "Folder", "G", "A"}),
             GetOrderedNamesFromSyncableService());
 }
 
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc
index 873c506..10097b4d 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -47,6 +47,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_update.h"
@@ -138,7 +139,7 @@
 }
 
 bool IsUnRemovableDefaultApp(const std::string& id) {
-  return id == extension_misc::kChromeAppId ||
+  return id == app_constants::kChromeAppId ||
          id == extensions::kWebStoreAppId ||
          id == file_manager::kFileManagerAppId;
 }
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc b/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc
index 6175fcc..bbc5733 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc
@@ -35,6 +35,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/app_constants/constants.h"
 #include "components/crx_file/id_util.h"
 #include "components/sync/base/client_tag_hash.h"
 #include "components/sync/model/sync_error_factory.h"
@@ -1535,7 +1536,7 @@
 
   // Chrome is an existing app to transfer attributes to.
   scoped_refptr<extensions::Extension> chrome =
-      MakeApp(kSomeAppName, extension_misc::kChromeAppId,
+      MakeApp(kSomeAppName, app_constants::kChromeAppId,
               extensions::Extension::WAS_INSTALLED_BY_DEFAULT);
   InstallExtension(chrome.get());
 
@@ -1555,9 +1556,9 @@
   ASSERT_TRUE(webstore_sync_item);
 
   const app_list::AppListSyncableService::SyncItem* chrome_sync_item =
-      GetSyncItem(extension_misc::kChromeAppId);
+      GetSyncItem(app_constants::kChromeAppId);
   const ChromeAppListItem* chrome_item =
-      model_updater->FindItem(extension_misc::kChromeAppId);
+      model_updater->FindItem(app_constants::kChromeAppId);
   ASSERT_TRUE(chrome_item);
   ASSERT_TRUE(chrome_sync_item);
 
@@ -1578,7 +1579,7 @@
 
   // Perform attributes transfer to existing Chrome app.
   EXPECT_TRUE(app_list_syncable_service()->TransferItemAttributes(
-      extensions::kWebStoreAppId, extension_misc::kChromeAppId));
+      extensions::kWebStoreAppId, app_constants::kChromeAppId));
   // Perform attributes transfer to the future Youtube app.
   EXPECT_TRUE(app_list_syncable_service()->TransferItemAttributes(
       extensions::kWebStoreAppId, extension_misc::kYoutubeAppId));
@@ -2954,12 +2955,12 @@
   app_list_syncable_service()->SetAppListPreferredOrder(
       ash::AppListSortOrder::kNameReverseAlphabetical);
 
-  // Folders should be in front of apps.
-  EXPECT_EQ(GetOrderedItemIdsFromSyncableService(),
-            std::vector<std::string>({kFolderId2, kFolderId1, kChildItemId2_3,
-                                      kChildItemId2_2, kChildItemId2_1,
-                                      kChildItemId1_2, kChildItemId1_1,
-                                      kItemId2, kItemId1}));
+  // Folders should be sorted alphabetically with apps.
+  EXPECT_EQ(
+      GetOrderedItemIdsFromSyncableService(),
+      std::vector<std::string>(
+          {kChildItemId2_3, kChildItemId2_2, kChildItemId2_1, kFolderId2,
+           kChildItemId1_2, kChildItemId1_1, kFolderId1, kItemId2, kItemId1}));
 }
 
 // Verifies that sorting app items with the alphabetical order should work as
@@ -3261,12 +3262,13 @@
   // Install a new app.
   const std::string kNewAppId = CreateNextAppId(GenerateId("app_id"));
   scoped_refptr<extensions::Extension> app =
-      MakeApp("B", kNewAppId, extensions::Extension::NO_FLAGS);
+      MakeApp("G", kNewAppId, extensions::Extension::NO_FLAGS);
   InstallExtension(app.get());
 
-  // Verify that the app is placed after folders.
+  // Verify that the app is placed alphabetically - note that empty folder name
+  // is treated as "Unnamed".
   EXPECT_EQ(GetOrderedNamesFromSyncableService(),
-            std::vector<std::string>({"Folder1", "Folder2", "", "B"}));
+            std::vector<std::string>({"Folder1", "Folder2", "G", ""}));
 
   // Verify that the entropy is zero.
   EXPECT_TRUE(cc::MathUtil::IsWithinEpsilon(
@@ -3276,18 +3278,18 @@
   // Install the second app.
   const std::string kNewAppId2 = CreateNextAppId(GenerateId("app_id2"));
   scoped_refptr<extensions::Extension> app2 =
-      MakeApp("C", kNewAppId2, extensions::Extension::NO_FLAGS);
+      MakeApp("c", kNewAppId2, extensions::Extension::NO_FLAGS);
   InstallExtension(app2.get());
 
-  // Verify that the app is placed after folders.
+  // Verify that the app is placed alphabetically again.
   EXPECT_EQ(GetOrderedNamesFromSyncableService(),
-            std::vector<std::string>({"Folder1", "Folder2", "", "B", "C"}));
+            std::vector<std::string>({"c", "Folder1", "Folder2", "G", ""}));
 
   // Change folders' names so that folders are out of order.
   ChangeItemName(kFolderItemId1, "Folder2");
   ChangeItemName(kFolderItemId2, "Folder1");
   EXPECT_EQ(GetOrderedNamesFromSyncableService(),
-            std::vector<std::string>({"Folder2", "Folder1", "", "B", "C"}));
+            std::vector<std::string>({"c", "Folder2", "Folder1", "G", ""}));
 
   // There is one folder item out of order so the entropy should be 1/5 = 0.2.
   EXPECT_TRUE(cc::MathUtil::IsWithinEpsilon(
@@ -3297,21 +3299,21 @@
   // Install the third app. Verify the item order after installation.
   const std::string kNewAppId3 = CreateNextAppId(GenerateId("app_id3"));
   scoped_refptr<extensions::Extension> app3 =
-      MakeApp("D", kNewAppId3, extensions::Extension::NO_FLAGS);
+      MakeApp("Fs", kNewAppId3, extensions::Extension::NO_FLAGS);
   InstallExtension(app3.get());
   EXPECT_EQ(
       GetOrderedNamesFromSyncableService(),
-      std::vector<std::string>({"Folder2", "Folder1", "", "B", "C", "D"}));
+      std::vector<std::string>({"c", "Folder2", "Folder1", "Fs", "G", ""}));
 
-  // Install the forth app. Verify that the new item is inserted between a
-  // folder and an app.
+  // Install the forth app. Verify that the new item is inserted in alphabetical
+  // order.
   const std::string kNewAppId4 = CreateNextAppId(GenerateId("app_id4"));
   scoped_refptr<extensions::Extension> app4 =
-      MakeApp("A", kNewAppId4, extensions::Extension::NO_FLAGS);
+      MakeApp("z", kNewAppId4, extensions::Extension::NO_FLAGS);
   InstallExtension(app4.get());
-  EXPECT_EQ(
-      GetOrderedNamesFromSyncableService(),
-      std::vector<std::string>({"Folder2", "Folder1", "", "A", "B", "C", "D"}));
+  EXPECT_EQ(GetOrderedNamesFromSyncableService(),
+            std::vector<std::string>(
+                {"c", "Folder2", "Folder1", "Fs", "G", "", "z"}));
 }
 
 // Verifies that the new app's position maintains the launcher sort order among
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
index aebe31f..6077b8f 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/webui/settings/ash/app_management/app_management_uma.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "components/services/app_service/public/cpp/types_util.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -364,8 +365,8 @@
     BuildExtensionAppShortcutsMenu(menu_model.get());
 
   // Create default items for non-Remote apps.
-  if (app_id() != extension_misc::kChromeAppId &&
-      app_id() != extension_misc::kLacrosAppId &&
+  if (app_id() != app_constants::kChromeAppId &&
+      app_id() != app_constants::kLacrosAppId &&
       app_type_ != apps::AppType::kUnknown &&
       app_type_ != apps::AppType::kRemote) {
     app_list::AppContextMenu::BuildMenu(menu_model.get());
diff --git a/chrome/browser/ui/app_list/reorder/app_list_reorder_core.cc b/chrome/browser/ui/app_list/reorder/app_list_reorder_core.cc
index 40ca3f5..a998f3a5 100644
--- a/chrome/browser/ui/app_list/reorder/app_list_reorder_core.cc
+++ b/chrome/browser/ui/app_list/reorder/app_list_reorder_core.cc
@@ -284,84 +284,58 @@
 }
 
 // Calculate neighbors' locations so that if the new item is inserted between
-// neighbors then `sorted_subsequence` after insertion still keeps `order`. Pass
-// the results through parameters. If the new item should be placed at the end,
-// either `prev` or `next` is empty. Note that `prev` and `next` are calculated
-// based on the local items (i.e. the app list items of the device where a new
-// item is added). Local items are contrast to global items which include all
-// items from all sync devices.
-template <typename T>
-void CalculateNeighbors(
-    ash::AppListSortOrder order,
-    const T& new_item_key_attribute,
-    const std::vector<reorder::SyncItemWrapper<T>>& sorted_subsequence,
-    syncer::StringOrdinal* prev,
-    syncer::StringOrdinal* next) {
+// neighbors then `sorted_subsequence` keeps the order defined by `compare`.
+// Passes the results through parameters. If the new item should be placed at
+// the start or end either `prev` or `next` is empty. Note that `prev` and
+// `next` are calculated based on the local items (i.e. the app list items of
+// the device where a new item is added). Local items are contrast to global
+// items which include all items from all sync devices.
+// `compare` is comparison function object which returns true if the first
+// argument is ordered before) the second.
+template <typename T, class Compare>
+void CalculateNeighbors(const T& item_wrapper,
+                        const std::vector<T>& sorted_subsequence,
+                        Compare compare,
+                        syncer::StringOrdinal* prev,
+                        syncer::StringOrdinal* next) {
   DCHECK(prev && !prev->IsValid());
   DCHECK(next && !next->IsValid());
 
-  // Find the first local item that is not a folder. Recall that
-  // `sorted_subsequence` guarantees:
-  // (1) Folder items are always placed in front of non-folder items.
-  // (2) The items of the same category follow `order`.
   DCHECK(!sorted_subsequence.empty());
-  auto first_non_folder_iter = std::find_if(
-      sorted_subsequence.cbegin(), sorted_subsequence.cend(),
-      [](const reorder::SyncItemWrapper<T>& item) { return !item.is_folder; });
 
-  // Handle the case that all items are folders. Note that the new item is
-  // assumed not to be a folder. TODO(https://crbug.com/1260875): handle the
-  // case that the new item is a folder.
-  if (first_non_folder_iter == sorted_subsequence.cend()) {
-    *prev = sorted_subsequence.back().item_ordinal;
+  // Find the item that should be placed right after the new item when the new
+  // item is added.
+  auto lower_bound =
+      std::lower_bound(sorted_subsequence.cbegin(), sorted_subsequence.cend(),
+                       item_wrapper, compare);
+
+  // Handle the case the `item` should be placed before all other items.
+  if (lower_bound == sorted_subsequence.cbegin()) {
+    *next = lower_bound->item_ordinal;
     return;
   }
 
-  const bool is_increasing = IsIncreasingOrder(order);
-
-  // Find the non-folder item that should be placed right after the new item
-  // when the new item is added.
-  auto lower_bound = std::lower_bound(
-      first_non_folder_iter, sorted_subsequence.cend(), new_item_key_attribute,
-      [&is_increasing](const reorder::SyncItemWrapper<T>& item,
-                       const std::u16string& val) {
-        return is_increasing ? item.key_attribute < val
-                             : item.key_attribute > val;
-      });
-
-  // Handle the case that `item` should be placed in front of all non-folder
-  // items.
-  if (lower_bound == first_non_folder_iter) {
-    *next = first_non_folder_iter->item_ordinal;
-    if (first_non_folder_iter != sorted_subsequence.cbegin()) {
-      // If there are folders, the new item should be placed between the last
-      // folder item and the first non-folder item
-      *prev = std::prev(first_non_folder_iter)->item_ordinal;
-    }
-    return;
-  }
-
-  // Handle the case that `item` should be placed behind all non-folder items.
+  // Handle the case that `item` should be placed after all other items..
   if (lower_bound == sorted_subsequence.cend()) {
     *prev = sorted_subsequence.back().item_ordinal;
     return;
   }
 
-  // The only scenario left is that the new item should be placed between two
-  // non-folder items.
+  // The `item` is placed between two other items.
   *prev = std::prev(lower_bound)->item_ordinal;
   *next = lower_bound->item_ordinal;
 }
 
 // Adjusts `prev` and `prev` in global scope so that the sorting order is kept
 // on all sync devices after placing `new_item` between adjusted neighbors.
-template <typename T>
-void AdjustNeighborsInGlobalScope(
-    ash::AppListSortOrder order,
-    const reorder::SyncItemWrapper<T>& new_item,
-    const std::vector<reorder::SyncItemWrapper<T>>& global_items,
-    syncer::StringOrdinal* prev,
-    syncer::StringOrdinal* next) {
+// `compare` is comparison function object which returns true if the first
+// argument is ordered before) the second.
+template <typename T, class Compare>
+void AdjustNeighborsInGlobalScope(const T& new_item,
+                                  const std::vector<T>& global_items,
+                                  Compare compare,
+                                  syncer::StringOrdinal* prev,
+                                  syncer::StringOrdinal* next) {
   // Before adjustment, `prev` and `next` are the new item's local neighbor
   // positions (see CalculateNeighbors() for more details). Recall that
   // different sync devices may have different sets of apps. This method checks
@@ -370,17 +344,6 @@
   DCHECK(prev);
   DCHECK(next);
 
-  // The left neighbor in the global scope.
-  syncer::StringOrdinal global_prev;
-  if (prev->IsValid())
-    global_prev = *prev;
-
-  // The right neighbor in the global scope.
-  syncer::StringOrdinal global_next;
-  if (next->IsValid())
-    global_next = *next;
-
-  const bool is_increasing = IsIncreasingOrder(order);
   for (const auto& item : global_items) {
     const syncer::StringOrdinal& position = item.item_ordinal;
     if (!position.IsValid())
@@ -388,37 +351,21 @@
 
     // Skip the loop iteration if `position` is not in the range of
     // (global_prev, global_next) because it cannot shrink the range.
-    if ((global_prev.IsValid() && !position.GreaterThan(global_prev)) ||
-        (global_next.IsValid() && !position.LessThan(global_next))) {
+    if ((prev->IsValid() && !position.GreaterThan(*prev)) ||
+        (next->IsValid() && !position.LessThan(*next))) {
       continue;
     }
 
-    // TODO(https://crbug.com/1261673): clean this code block when
-    // `SyncItemWrapper` comparison operators take item type into consideration.
-    const bool is_item_greater =
-        ((item.is_folder == new_item.is_folder &&
-          item.key_attribute > new_item.key_attribute) ||
-         (!item.is_folder && new_item.is_folder));
-    const bool is_equal = (item.is_folder == new_item.is_folder &&
-                           item.key_attribute == new_item.key_attribute);
-
-    if (is_equal || is_increasing == is_item_greater) {
+    if (compare(new_item, item)) {
       // Handle the case that the new item should be placed in front of `item`.
       // Note that if `item` is equal to `new_item`, `item` is always placed
       // after `new_item` to keep the consistency with `CalculateNeighbors()`.
-      global_next = position;
+      *next = position;
     } else {
       // Handle the case that the new item should be placed after `item`.
-      global_prev = position;
+      *prev = position;
     }
   }
-
-  // Store results.
-  if (global_prev.IsValid())
-    *prev = global_prev;
-
-  if (global_next.IsValid())
-    *next = global_next;
 }
 
 syncer::StringOrdinal CalculatePositionBetweenNeighbors(
@@ -444,28 +391,28 @@
   return next.CreateBefore();
 }
 
-// Similar to `CalculateNewItemPosition()` but `order` is either
-// kNameAlphabetical or kNameReverseAlphabetical. Read the comment of
-// `CalculateNewItemPosition()` for parameters' meanings.
-bool CalculatePositionInNameOrder(
+// Implementation for `CalculateNewItemPosition()` parameterized by type used
+// to compare items.
+// `compare` is comparison function object which returns true if the first
+// argument is ordered before) the second.
+template <typename T, class Compare>
+bool CalculatePositionForSyncItemWrapper(
     ash::AppListSortOrder order,
-    const ChromeAppListItem& new_item,
+    const reorder::SyncItemWrapper<T>& item_wrapper,
     const std::vector<const ChromeAppListItem*>& local_items,
     const AppListSyncableService::SyncItemMap* global_items,
+    Compare compare,
     syncer::StringOrdinal* target_position) {
-  DCHECK(order == ash::AppListSortOrder::kNameAlphabetical ||
-         order == ash::AppListSortOrder::kNameReverseAlphabetical);
-
-  std::vector<reorder::SyncItemWrapper<std::u16string>> local_item_wrappers =
-      reorder::GenerateWrappersFromAppListItems<std::u16string>(local_items);
+  std::vector<reorder::SyncItemWrapper<T>> local_item_wrappers =
+      reorder::GenerateWrappersFromAppListItems<T>(local_items);
 
   if (local_item_wrappers.empty()) {
     *target_position = syncer::StringOrdinal::CreateInitialOrdinal();
     return true;
   }
 
-  std::vector<reorder::SyncItemWrapper<std::u16string>> sorted_subsequence;
   float entropy;
+  std::vector<reorder::SyncItemWrapper<T>> sorted_subsequence;
   CalculateEntropyAndGetSortedSubsequence(order, &local_item_wrappers, &entropy,
                                           &sorted_subsequence);
 
@@ -474,19 +421,15 @@
     return false;
   }
 
-  // Use std::u16string for string comparison.
-  std::u16string item_name_utf16 = base::UTF8ToUTF16(new_item.name());
-
   syncer::StringOrdinal prev_neighbor;
   syncer::StringOrdinal next_neighbor;
-  CalculateNeighbors(order, item_name_utf16, sorted_subsequence, &prev_neighbor,
+  CalculateNeighbors(item_wrapper, sorted_subsequence, compare, &prev_neighbor,
                      &next_neighbor);
 
   if (global_items) {
     AdjustNeighborsInGlobalScope(
-        order, reorder::SyncItemWrapper<std::u16string>(new_item),
-        reorder::GenerateWrappersFromSyncItems<std::u16string>(*global_items),
-        &prev_neighbor, &next_neighbor);
+        item_wrapper, reorder::GenerateWrappersFromSyncItems<T>(*global_items),
+        compare, &prev_neighbor, &next_neighbor);
   }
 
   *target_position =
@@ -548,23 +491,31 @@
     const std::vector<const ChromeAppListItem*>& local_items,
     const AppListSyncableService::SyncItemMap* global_items,
     syncer::StringOrdinal* target_position) {
-  // TODO(https://crbug.com/1260875): handle the case that `new_item` is a
-  // folder.
-  DCHECK(!new_item.is_folder());
-
   switch (order) {
     case ash::AppListSortOrder::kCustom:
-      // TODO(crbug.com/1270898): Color sort should handle placing a new item
-      // similar to the way that is done for name sorting.
-    case ash::AppListSortOrder::kColor:
       // Insert `item` at the front when the sort order is kCustom.
       DCHECK(global_items);
       *target_position = CalculateFrontPosition(*global_items);
       return true;
     case ash::AppListSortOrder::kNameAlphabetical:
-    case ash::AppListSortOrder::kNameReverseAlphabetical:
-      return CalculatePositionInNameOrder(order, new_item, local_items,
-                                          global_items, target_position);
+    case ash::AppListSortOrder::kNameReverseAlphabetical: {
+      UErrorCode error = U_ZERO_ERROR;
+      std::unique_ptr<icu::Collator> collator(
+          icu::Collator::createInstance(error));
+      if (U_FAILURE(error))
+        collator.reset();
+      StringWrapperComparator comparator(IsIncreasingOrder(order),
+                                         collator.get());
+      return CalculatePositionForSyncItemWrapper(
+          order, reorder::SyncItemWrapper<std::u16string>(new_item),
+          local_items, global_items, comparator, target_position);
+    }
+    case ash::AppListSortOrder::kColor: {
+      IconColorWrapperComparator comparator;
+      return CalculatePositionForSyncItemWrapper(
+          order, reorder::SyncItemWrapper<ash::IconColor>(new_item),
+          local_items, global_items, comparator, target_position);
+    }
   }
 }
 
diff --git a/chrome/browser/ui/app_list/reorder/app_list_reorder_util.cc b/chrome/browser/ui/app_list/reorder/app_list_reorder_util.cc
index 9825f00..64eabea 100644
--- a/chrome/browser/ui/app_list/reorder/app_list_reorder_util.cc
+++ b/chrome/browser/ui/app_list/reorder/app_list_reorder_util.cc
@@ -117,10 +117,6 @@
 bool StringWrapperComparator::operator()(
     const reorder::SyncItemWrapper<std::u16string>& lhs,
     const reorder::SyncItemWrapper<std::u16string>& rhs) const {
-  // Folders are placed in the front of the app list in app name sort.
-  if (lhs.is_folder != rhs.is_folder)
-    return lhs.is_folder;
-
   // If the collator is not created successfully, compare the string values
   // using operators.
   if (!collator_) {
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
index f76266e..9d62dde2 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
@@ -57,9 +57,10 @@
     SetTitle(text);
     SetAccessibleName(l10n_util::GetStringFUTF16(
         IDS_ASH_ASSISTANT_QUERY_ACCESSIBILITY_ANNOUNCEMENT, text));
-    SetIcon(IconInfo(gfx::CreateVectorIcon(chromeos::kAssistantIcon,
-                                           kSystemIconDimension,
-                                           gfx::kPlaceholderColor)));
+    SetIcon(IconInfo(
+        gfx::CreateVectorIcon(chromeos::kAssistantIcon, kSystemIconDimension,
+                              gfx::kPlaceholderColor),
+        kSystemIconDimension));
 
     set_dismiss_view_on_open(false);
   }
diff --git a/chrome/browser/ui/app_list/search/common/types_util.cc b/chrome/browser/ui/app_list/search/common/types_util.cc
index eabd38d..4077dea 100644
--- a/chrome/browser/ui/app_list/search/common/types_util.cc
+++ b/chrome/browser/ui/app_list/search/common/types_util.cc
@@ -50,6 +50,8 @@
       return "File search";
     case ash::AppListSearchResultType::kDriveSearch:
       return "Drive search";
+    case ash::AppListSearchResultType::kKeyboardShortcut:
+      return "Keyboard shortcut";
   }
   NOTREACHED();
 }
diff --git a/chrome/browser/ui/app_list/search/files/file_result.cc b/chrome/browser/ui/app_list/search/files/file_result.cc
index 45de04c..ebb485b 100644
--- a/chrome/browser/ui/app_list/search/files/file_result.cc
+++ b/chrome/browser/ui/app_list/search/files/file_result.cc
@@ -152,13 +152,16 @@
   } else {
     switch (type) {
       case Type::kFile:
-        SetIcon(IconInfo(ash::GetIconForPath(filepath, dark_background)));
+        SetIcon(IconInfo(ash::GetIconForPath(filepath, dark_background),
+                         kSystemIconDimension));
         break;
       case Type::kDirectory:
-        SetIcon(IconInfo(ash::GetIconFromType("folder", dark_background)));
+        SetIcon(IconInfo(ash::GetIconFromType("folder", dark_background),
+                         kSystemIconDimension));
         break;
       case Type::kSharedDirectory:
-        SetIcon(IconInfo(ash::GetIconFromType("shared", dark_background)));
+        SetIcon(IconInfo(ash::GetIconFromType("shared", dark_background),
+                         kSystemIconDimension));
         break;
     }
   }
diff --git a/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.cc b/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.cc
new file mode 100644
index 0000000..207557f
--- /dev/null
+++ b/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.cc
@@ -0,0 +1,28 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/app_list/search/keyboard_shortcut_provider.h"
+
+#include "ash/public/cpp/app_list/app_list_types.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/search/search_controller.h"
+
+namespace app_list {
+
+KeyboardShortcutProvider::KeyboardShortcutProvider(Profile* profile)
+    : profile_(profile) {
+  DCHECK(profile_);
+}
+
+KeyboardShortcutProvider::~KeyboardShortcutProvider() = default;
+
+void KeyboardShortcutProvider::Start(const std::u16string& query) {
+  // TODO(crbug.com/1290682): Implement.
+}
+
+ash::AppListSearchResultType KeyboardShortcutProvider::ResultType() const {
+  return ash::AppListSearchResultType::kKeyboardShortcut;
+}
+
+}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.h b/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.h
new file mode 100644
index 0000000..110d9f0
--- /dev/null
+++ b/chrome/browser/ui/app_list/search/keyboard_shortcut_provider.h
@@ -0,0 +1,32 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_KEYBOARD_SHORTCUT_PROVIDER_H_
+#define CHROME_BROWSER_UI_APP_LIST_SEARCH_KEYBOARD_SHORTCUT_PROVIDER_H_
+
+#include "chrome/browser/ui/app_list/search/search_provider.h"
+
+class Profile;
+
+namespace app_list {
+
+class KeyboardShortcutProvider : public SearchProvider {
+ public:
+  explicit KeyboardShortcutProvider(Profile* profile);
+  ~KeyboardShortcutProvider() override;
+
+  KeyboardShortcutProvider(const KeyboardShortcutProvider&) = delete;
+  KeyboardShortcutProvider& operator=(const KeyboardShortcutProvider&) = delete;
+
+  // SearchProvider:
+  void Start(const std::u16string& query) override;
+  ash::AppListSearchResultType ResultType() const override;
+
+ private:
+  Profile* const profile_;
+};
+
+}  // namespace app_list
+
+#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_KEYBOARD_SHORTCUT_PROVIDER_H_
diff --git a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
index 80e9ed39..0bce272 100644
--- a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
@@ -265,9 +265,9 @@
   if (!bitmap)
     return;
 
-  IconInfo icon_info(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap));
   DCHECK(IsWeatherResult());
-  icon_info.dimension = GetAnswerCardIconDimension();
+  IconInfo icon_info(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap),
+                     GetAnswerCardIconDimension());
   SetIcon(icon_info);
 }
 
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc
index a0770e6..e4e5c87 100644
--- a/chrome/browser/ui/app_list/search/omnibox_result.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -354,9 +354,8 @@
   if (!bitmap)
     return;
 
-  IconInfo icon_info(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap));
-  icon_info.dimension = GetImageIconDimension();
-  icon_info.shape = IconShape::kRoundedRectangle;
+  IconInfo icon_info(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap),
+                     GetImageIconDimension(), IconShape::kRoundedRectangle);
   SetIcon(icon_info);
 }
 
diff --git a/chrome/browser/ui/app_list/search/ranking/ftrl_ranker.cc b/chrome/browser/ui/app_list/search/ranking/ftrl_ranker.cc
index 566cb1b..a2c1e3e 100644
--- a/chrome/browser/ui/app_list/search/ranking/ftrl_ranker.cc
+++ b/chrome/browser/ui/app_list/search/ranking/ftrl_ranker.cc
@@ -47,6 +47,7 @@
     case ResultType::kOsSettings:
       return Category::kSettings;
     case ResultType::kHelpApp:
+    case ResultType::kKeyboardShortcut:
       return Category::kHelp;
     case ResultType::kPlayStoreReinstallApp:
     case ResultType::kPlayStoreApp:
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc
index 0d2fe17..811fd6e 100644
--- a/chrome/browser/ui/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include "ash/components/arc/arc_util.h"
+#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/app_list/app_list_switches.h"
@@ -25,6 +26,7 @@
 #include "chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h"
 #include "chrome/browser/ui/app_list/search/files/zero_state_file_provider.h"
 #include "chrome/browser/ui/app_list/search/help_app_provider.h"
+#include "chrome/browser/ui/app_list/search/keyboard_shortcut_provider.h"
 #include "chrome/browser/ui/app_list/search/mixer.h"
 #include "chrome/browser/ui/app_list/search/omnibox_provider.h"
 #include "chrome/browser/ui/app_list/search/os_settings_provider.h"
@@ -153,6 +155,13 @@
                             std::make_unique<OsSettingsProvider>(profile));
   }
 
+  if (ash::features::IsProductivityLauncherEnabled()) {
+    size_t shortcut_search_group_id = controller->AddGroup(kGenericMaxResults);
+    controller->AddProvider(
+        shortcut_search_group_id,
+        std::make_unique<KeyboardShortcutProvider>(profile));
+  }
+
   size_t help_app_group_id = controller->AddGroup(kGenericMaxResults);
   controller->AddProvider(help_app_group_id,
                           std::make_unique<HelpAppProvider>(profile));
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc b/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc
index be1a204..897d18d2 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc
@@ -36,6 +36,7 @@
     case ash::AppListSearchResultType::kInternalPrivacyInfo:
     case ash::AppListSearchResultType::kAssistantText:
     case ash::AppListSearchResultType::kHelpApp:
+    case ash::AppListSearchResultType::kKeyboardShortcut:
       // NOTE: We don't rank results of type kAssistantChip, kAssistantText
       // as those results, if present, are shown in a dedicated slot.
       return RankingItemType::kIgnored;
diff --git a/chrome/browser/ui/ash/DEPS b/chrome/browser/ui/ash/DEPS
index 1b9cb2b..aebfea8 100644
--- a/chrome/browser/ui/ash/DEPS
+++ b/chrome/browser/ui/ash/DEPS
@@ -8,6 +8,7 @@
   "+chrome/browser/ui/views",
 
   "+media",
+  "+components/app_constants",
   "+components/desks_storage"
 ]
 
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
index 3f9d202..2515808a 100644
--- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -22,10 +22,10 @@
 #include "chrome/browser/ash/policy/display/display_rotation_default_handler.h"
 #include "chrome/browser/ash/policy/display/display_settings_handler.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/ash/sync/sync_error_notifier_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
 #include "chrome/browser/ui/ash/accessibility/accessibility_controller_client.h"
 #include "chrome/browser/ui/ash/ambient/ambient_client_impl.h"
@@ -378,7 +378,7 @@
         !profile->IsGuestSession()) {
       // Start the error notifier services to show auth/sync notifications.
       ash::SigninErrorNotifierFactory::GetForProfile(profile);
-      SyncErrorNotifierFactory::GetForProfile(profile);
+      ash::SyncErrorNotifierFactory::GetForProfile(profile);
     }
 
     if (ChromeShelfController::instance()) {
diff --git a/chrome/browser/ui/ash/desks_templates/chrome_desks_templates_delegate.cc b/chrome/browser/ui/ash/desks_templates/chrome_desks_templates_delegate.cc
index 3ab7ea3a..4cc237f 100644
--- a/chrome/browser/ui/ash/desks_templates/chrome_desks_templates_delegate.cc
+++ b/chrome/browser/ui/ash/desks_templates/chrome_desks_templates_delegate.cc
@@ -29,6 +29,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/theme_resources.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/app_restore_data.h"
 #include "components/app_restore/full_restore_save_handler.h"
@@ -42,7 +43,6 @@
 #include "components/services/app_service/public/cpp/types_util.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "components/user_manager/user_manager.h"
-#include "extensions/common/constants.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -246,7 +246,7 @@
       apps::AppServiceProxyFactory::GetForProfile(user_profile)
           ->AppRegistryCache();
   const apps::mojom::AppType app_type = app_registry_cache.GetAppType(app_id);
-  if (app_id != extension_misc::kChromeAppId &&
+  if (app_id != app_constants::kChromeAppId &&
       (app_type == apps::mojom::AppType::kChromeApp ||
        app_type == apps::mojom::AppType::kWeb)) {
     // If these values are not present, we will not be able to restore the
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc
index 2e3664f3..549e06c 100644
--- a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc
+++ b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/desk_template_read_handler.h"
 #include "components/app_restore/restore_data.h"
 #include "components/app_restore/window_info.h"
@@ -140,7 +141,7 @@
   const auto& launch_list = restore_data()->app_id_to_launch_list();
   for (const auto& iter : launch_list) {
     const std::string& app_id = iter.first;
-    if (app_id != extension_misc::kChromeAppId)
+    if (app_id != app_constants::kChromeAppId)
       continue;
 
     for (const auto& window_iter : iter.second) {
@@ -199,7 +200,7 @@
       browser->window()->ShowInactive();
     }
   }
-  restore_data()->RemoveApp(extension_misc::kChromeAppId);
+  restore_data()->RemoveApp(app_constants::kChromeAppId);
 }
 
 void DesksTemplatesAppLaunchHandler::MaybeLaunchArcApps() {
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
index 352aa17..8608b4c 100644
--- a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
+++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
@@ -22,10 +22,10 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sync/desk_sync_service_factory.h"
 #include "chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.h"
+#include "components/app_constants/constants.h"
 #include "components/desks_storage/core/desk_sync_service.h"
 #include "components/desks_storage/core/local_desk_data_manager.h"
 #include "components/sync/model/model_type_store.h"
-#include "extensions/common/constants.h"
 
 namespace {
 
@@ -285,7 +285,7 @@
   for (const auto& iter : launch_list) {
     // Since apps aren't guaranteed to have the url field set up correctly, this
     // is necessary to ensure things are not double-counted.
-    if (iter.first != extension_misc::kChromeAppId) {
+    if (iter.first != app_constants::kChromeAppId) {
       ++window_count;
       ++total_count;
       continue;
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
index 5ea6309c..5b87ba49 100644
--- a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
+++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
@@ -55,6 +55,7 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "chromeos/ui/base/window_state_type.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/full_restore_save_handler.h"
 #include "components/app_restore/full_restore_utils.h"
@@ -430,7 +431,7 @@
   EXPECT_EQ(app_id_to_launch_list.size(), 1u);
 
   // Find |browser| window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(browser_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -462,7 +463,7 @@
   EXPECT_EQ(app_id_to_launch_list.size(), 1u);
 
   // Find |browser| window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(incognito_browser_window_id);
   // Created incognito window is NOT in restore list
@@ -512,7 +513,7 @@
   EXPECT_EQ(app_id_to_launch_list.size(), 2u);
 
   // Find |browser| window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(browser_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1016,7 +1017,7 @@
   const auto& app_id_to_launch_list = restore_data->app_id_to_launch_list();
   EXPECT_EQ(app_id_to_launch_list.size(), 1u);
   ASSERT_TRUE(restore_data->HasAppTypeBrowser());
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(pwa_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1067,9 +1068,9 @@
   EXPECT_EQ(app_id_to_launch_list.size(), 1u);
 
   // Test that |pwa_browser|'s restore data is saved under the Chrome browser
-  // app id extension_misc::kChromeAppId, not Youtube app id
+  // app id app_constants::kChromeAppId, not Youtube app id
   // extension_misc::kYoutubeAppId.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(pwa_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1233,7 +1234,7 @@
   EXPECT_EQ(app_id_to_launch_list.size(), 1u);
 
   // Find `browser` window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(browser_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1283,7 +1284,7 @@
   EXPECT_EQ(1u, app_id_to_launch_list.size());
 
   // Find `browser` window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_FALSE(iter == app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(incognito_browser_window_id);
   // Created incognito window is NOT in restore list.
@@ -1498,7 +1499,7 @@
   const auto& app_id_to_launch_list = restore_data->app_id_to_launch_list();
   EXPECT_EQ(1u, app_id_to_launch_list.size());
   ASSERT_TRUE(restore_data->HasAppTypeBrowser());
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(pwa_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1552,9 +1553,9 @@
   EXPECT_EQ(1u, app_id_to_launch_list.size());
 
   // Test that `pwa_browser`'s restore data is saved under the Chrome browser
-  // app id extension_misc::kChromeAppId, not Youtube app id
+  // app id app_constants::kChromeAppId, not Youtube app id
   // extension_misc::kYoutubeAppId.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_TRUE(iter != app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(pwa_window_id);
   ASSERT_TRUE(app_restore_data_iter != iter->second.end());
@@ -1611,7 +1612,7 @@
   EXPECT_EQ(2u, app_id_to_launch_list.size());
 
   // Find `browser` window's app restore data.
-  auto iter = app_id_to_launch_list.find(extension_misc::kChromeAppId);
+  auto iter = app_id_to_launch_list.find(app_constants::kChromeAppId);
   ASSERT_NE(iter, app_id_to_launch_list.end());
   auto app_restore_data_iter = iter->second.find(browser_window_id);
   ASSERT_NE(iter->second.end(), app_restore_data_iter);
@@ -1839,6 +1840,93 @@
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
 }
 
+// Tests that launching the same desk template multiple times creates desks with
+// different/incremented names.
+IN_PROC_BROWSER_TEST_F(DesksTemplatesClientTest,
+                       SystemUILaunchMultipleDeskTemplates) {
+  const base::GUID kDeskUuid = base::GUID::GenerateRandomV4();
+  const std::u16string kDeskName(u"Test Desk Name");
+
+  auto* desks_controller = ash::DesksController::Get();
+
+  ASSERT_EQ(0, desks_controller->GetActiveDeskIndex());
+  desks_controller->desks()[0]->SetName(kDeskName, true);
+
+  // Save a template.
+  ash::ToggleOverview();
+  ash::WaitForOverviewEnterAnimation();
+
+  ClickSaveDeskAsTemplateButton();
+
+  // `ClickSaveDeskAsTemplateButton` will take us to the templates grid. For all
+  // subsuquent runs, we enter the templates grid by click the templates button
+  // on the desks bar.
+  bool first_run = true;
+  auto check_launch_template_desk_name =
+      [kDeskUuid, &first_run](const std::u16string& desk_name) {
+        SCOPED_TRACE(desk_name);
+
+        if (!first_run)
+          ClickExpandedStateTemplatesButton();
+
+        ClickFirstTemplateItem();
+        content::RunAllTasksUntilIdle();
+
+        first_run = false;
+      };
+
+  // Launching a desk from the template creates a desk with the same name as
+  // the template.
+  desks_controller->desks()[0]->SetName(u"Desk", true);
+  check_launch_template_desk_name(kDeskName);
+
+  // Launch more desks from the template and verify that the newly create desks
+  // have unique names.
+  check_launch_template_desk_name(std::u16string(kDeskName).append(u"(1)"));
+  check_launch_template_desk_name(std::u16string(kDeskName).append(u"(2)"));
+
+  // Remove "Test Desk Name (1)", which means the next created desk from
+  // template will have that name. Then it will skip (2) since it already
+  // exists, and create the next desk with (3).
+  RemoveDesk(desks_controller->desks()[2].get());
+  check_launch_template_desk_name(std::u16string(kDeskName).append(u"(1)"));
+  check_launch_template_desk_name(std::u16string(kDeskName).append(u"(3)"));
+
+  // Same as above, but make sure that deleting the desk with the exact template
+  // name still functions the same by only filling in whatever name is
+  // available.
+  RemoveDesk(desks_controller->desks()[1].get());
+  check_launch_template_desk_name(kDeskName);
+  check_launch_template_desk_name(std::u16string(kDeskName).append(u"(4)"));
+}
+
+// Tests that the launch from template histogram is recorded properly.
+IN_PROC_BROWSER_TEST_F(DesksTemplatesClientTest,
+                       SystemUIDeskTemplateLaunchFromTemplateHistogram) {
+  base::HistogramTester histogram_tester;
+
+  // Create a new browser.
+  CreateBrowser({});
+
+  // Save a template.
+  ash::ToggleOverview();
+  ash::WaitForOverviewEnterAnimation();
+  ClickSaveDeskAsTemplateButton();
+
+  const int launches = 5;
+  for (int i = 0; i < launches; i++) {
+    ClickFirstTemplateItem();
+    ClickExpandedStateTemplatesButton();
+  }
+
+  // TODO(crbug.com/1287649) : This histogram is double counted when a template
+  // is launched from the UI.
+  constexpr char kLaunchFromTemplateHistogramName[] =
+      "Ash.DeskTemplate.LaunchFromTemplate";
+  histogram_tester.ExpectTotalCount(kLaunchFromTemplateHistogramName,
+                                    2 * launches);
+}
+
 class DesksTemplatesClientArcTest : public InProcessBrowserTest {
  public:
   DesksTemplatesClientArcTest() {
@@ -1941,10 +2029,6 @@
   arc_helper()->StopInstance();
 }
 
-// TODO(crbug.com/1273532): Port over LaunchMultipleDeskTemplates and
-// DeskTemplateLaunchFromTemplateHistogram to use the native UI to do template
-// operations.
-
 class DesksTemplatesClientMultiProfileTest : public ash::LoginManagerTest {
  public:
   DesksTemplatesClientMultiProfileTest() : ash::LoginManagerTest() {
diff --git a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
index 109fae8..ab3ea79 100644
--- a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
+++ b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -24,20 +24,20 @@
 namespace {
 
 // The total number of Ash accelerators.
-constexpr int kAshAcceleratorsTotalNum = 135;
+constexpr int kAshAcceleratorsTotalNum = 138;
 // The hash of Ash accelerators.
-constexpr char kAshAcceleratorsHash[] = "0b18bee490324b5f9a101e1d7fe97ea7";
+constexpr char kAshAcceleratorsHash[] = "668a69b2f453abb1add5eeac0e62f459";
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // Internal builds add an extra accelerator for the Feedback app.
 // The total number of Chrome accelerators (available on Chrome OS).
-constexpr int kChromeAcceleratorsTotalNum = 99;
+constexpr int kChromeAcceleratorsTotalNum = 100;
 // The hash of Chrome accelerators (available on Chrome OS).
-constexpr char kChromeAcceleratorsHash[] = "52367fa960a90c00613936377d7aa157";
+constexpr char kChromeAcceleratorsHash[] = "a9b5fe991aeb0d64770fdfb03ca47ca9";
 #else
 // The total number of Chrome accelerators (available on Chrome OS).
-constexpr int kChromeAcceleratorsTotalNum = 97;
+constexpr int kChromeAcceleratorsTotalNum = 99;
 // The hash of Chrome accelerators (available on Chrome OS).
-constexpr char kChromeAcceleratorsHash[] = "7ffc641448d3a8bcae2d0ad1ee563b12";
+constexpr char kChromeAcceleratorsHash[] = "2d69b8a26794e689a33cc10cc47035c0";
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
 const char* BooleanToString(bool value) {
diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
index fdf19fc..224a814 100644
--- a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
+++ b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
@@ -16,6 +16,7 @@
 #include "base/task/bind_post_task.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
+#include "base/time/time.h"
 #include "chrome/browser/ash/drive/drive_integration_service.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -26,10 +27,6 @@
 
 namespace {
 
-// Returned by GetScreencastContainerSize(const base::FilePath& relative_path)
-// when the given `relative_path` is an invalid screencast container.
-constexpr int64_t kScreencastSizeUnavailable = -1;
-
 constexpr base::FilePath::CharType kMediaExtension[] =
     FILE_PATH_LITERAL(".webm");
 
@@ -52,31 +49,59 @@
   return drivefs_integration ? drivefs_integration->GetDriveFsHost() : nullptr;
 }
 
-// Return the size in bytes of screencast if `absolute_path` is a valid
-// screencast container, otherwise return kScreencastSizeUnavailable. A valid
-// screencast should have at least 1 media file and 1 metadata file. The
-// 'absolute_path' looks like
-// "/{drivefs mounted point}/root/{folder path in drive}".
-int64_t GetScreencastContainerSize(const base::FilePath& absolute_path) {
+// Returns a valid pending screencast from `container_absolute_path`.  A valid
+// screencast should have 1 media file and 1 metadata file. The
+// `container_absolute_path` is the DriveFS absolute path of `container_dir`,
+// for example: container_absolute_path = "/{drivefs mounted
+// point}/root/{$container_dir}";
+absl::optional<ash::PendingScreencast> GetPendingScreencast(
+    const base::FilePath& container_dir,
+    const base::FilePath& container_absolute_path) {
   DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  if (!base::PathExists(absolute_path))
-    return kScreencastSizeUnavailable;
+  if (!base::PathExists(container_absolute_path))
+    return absl::nullopt;
 
-  int size_of_metadata_files = 0;
-  int size_of_media_files = 0;
-  base::FileEnumerator files(absolute_path, /*recursive=*/false,
+  int64_t total_size_in_bytes = 0;
+  int media_file_count = 0;
+  int metadata_file_count = 0;
+
+  base::Time created_time;
+  std::string media_name;
+
+  base::FileEnumerator files(container_absolute_path, /*recursive=*/false,
                              base::FileEnumerator::FILES);
+
+  // Calculates the size of media file and metadata file, and the created time
+  // of media.
   const std::string metadata_extension = GetMetadataFileExtension();
   for (base::FilePath path = files.Next(); !path.empty(); path = files.Next()) {
-    if (path.MatchesExtension(GetMetadataFileExtension()))
-      size_of_metadata_files += files.GetInfo().GetSize();
-    else if (path.MatchesExtension(kMediaExtension))
-      size_of_media_files += files.GetInfo().GetSize();
+    if (path.MatchesExtension(metadata_extension)) {
+      total_size_in_bytes += files.GetInfo().GetSize();
+      media_file_count++;
+    } else if (path.MatchesExtension(kMediaExtension)) {
+      base::File::Info info;
+      if (!base::GetFileInfo(path, &info))
+        continue;
+      created_time = info.creation_time;
+      total_size_in_bytes += files.GetInfo().GetSize();
+      media_name = path.BaseName().RemoveExtension().value();
+      metadata_file_count++;
+    }
+
+    // Return null if the screencast is not valid.
+    if (media_file_count > 1 || metadata_file_count > 1)
+      return absl::nullopt;
   }
 
-  return size_of_media_files > 0 && size_of_metadata_files > 0
-             ? size_of_media_files + size_of_metadata_files
-             : kScreencastSizeUnavailable;
+  // Return null if the screencast is not valid.
+  if (media_file_count != 1 || metadata_file_count != 1)
+    return absl::nullopt;
+
+  ash::PendingScreencast pending_screencast{container_dir};
+  pending_screencast.created_time = created_time;
+  pending_screencast.name = media_name;
+  pending_screencast.total_size_in_bytes = total_size_in_bytes;
+  return pending_screencast;
 }
 
 // The `pending_webm_or_projector_events` are new pending ".webm" or
@@ -85,16 +110,12 @@
 ash::PendingScreencastSet ProcessAndGenerateNewScreencasts(
     const std::vector<drivefs::mojom::ItemEvent>&
         pending_webm_or_projector_events,
-    drive::DriveIntegrationService* drivefs_integration) {
+    const base::FilePath drivefs_mounted_point) {
   DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  const base::FilePath drivefs_mounted_point =
-      drivefs_integration->GetMountPointPath();
   // The valid screencasts set.
   ash::PendingScreencastSet screencasts;
-  if (!drivefs_integration->IsMounted() ||
-      !base::PathExists(drivefs_mounted_point)) {
+  if (!base::PathExists(drivefs_mounted_point))
     return screencasts;
-  }
 
   // A map of container directory path to pending screencast. Each screencast
   // has a unique container directory path in DriveFS.
@@ -107,11 +128,6 @@
     // looks like "/root/{folder path in drive}".
     const base::FilePath container_dir =
         base::FilePath(pending_event.path).DirName();
-    ash::PendingScreencast screencast;
-    screencast.container_dir = container_dir;
-    // The display name of the a pending screencast is the name of the container
-    // folder name of this screencast.
-    screencast.name = container_dir.BaseName().value();
 
     // During this loop, items of multiple events might be under the same
     // folder.
@@ -133,12 +149,13 @@
     base::FilePath root("/");
     base::FilePath container_absolute_dir(drivefs_mounted_point);
     root.AppendRelativePath(container_dir, &container_absolute_dir);
-    const int64_t total_size_in_bytes =
-        GetScreencastContainerSize(container_absolute_dir);
-    if (total_size_in_bytes != -1) {
-      screencast.total_size_in_bytes = total_size_in_bytes;
-      screencast.bytes_transferred = pending_event.bytes_transferred;
-      container_to_screencasts[container_dir] = screencast;
+
+    auto new_screencast =
+        GetPendingScreencast(container_dir, container_absolute_dir);
+
+    if (new_screencast) {
+      new_screencast->bytes_transferred = pending_event.bytes_transferred;
+      container_to_screencasts[container_dir] = new_screencast.value();
     }
   }
 
@@ -186,6 +203,10 @@
 // download event. Find a way to filter out the upload event.
 void PendingSreencastManager::OnSyncingStatusUpdate(
     const drivefs::mojom::SyncingStatus& status) {
+  drive::DriveIntegrationService* drivefs_integration =
+      GetDriveIntegrationServiceForActiveProfile();
+  if (!drivefs_integration->IsMounted())
+    return;
   std::vector<drivefs::mojom::ItemEvent> pending_webm_or_projector_events;
 
   for (const auto& event : status.item_events) {
@@ -207,7 +228,7 @@
       FROM_HERE,
       base::BindOnce(ProcessAndGenerateNewScreencasts,
                      std::move(pending_webm_or_projector_events),
-                     GetDriveIntegrationServiceForActiveProfile()),
+                     drivefs_integration->GetMountPointPath()),
       base::BindOnce(
           &PendingSreencastManager::OnProcessAndGenerateNewScreencastsFinished,
           weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
index 27e9563..1e0682a 100644
--- a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
+++ b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
@@ -95,22 +95,15 @@
       drivefs::mojom::SyncingStatus& syncing_status) {
     base::ScopedAllowBlockingForTesting allow_blocking;
 
-    drive::DriveIntegrationService* service =
-        drive::DriveIntegrationServiceFactory::FindForProfile(
-            browser()->profile());
-    EXPECT_TRUE(service->IsMounted());
-    EXPECT_TRUE(base::PathExists(service->GetMountPointPath()));
-
-    base::FilePath root("/");
-    base::FilePath path(file_path);
-    base::FilePath folder_path(service->GetMountPointPath());
-    root.AppendRelativePath(path.DirName(), &folder_path);
+    base::FilePath relative_file_path(file_path);
+    base::FilePath folder_path =
+        GetDriveFsAbsolutePath(relative_file_path.DirName().value());
 
     // base::CreateDirectory returns 'true' on successful creation, or if the
     // directory already exists.
     EXPECT_TRUE(base::CreateDirectory(folder_path));
 
-    base::File file(folder_path.Append(path.BaseName()),
+    base::File file(folder_path.Append(relative_file_path.BaseName()),
                     base::File::FLAG_CREATE | base::File::FLAG_WRITE);
     // Create a buffer whose size is `total_bytes`.
     std::string buffer(total_bytes, 'a');
@@ -123,6 +116,29 @@
                          transferred_bytes);
   }
 
+  base::Time GetFileCreatedTime(const std::string& relative_file_path) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    base::File::Info info;
+    return base::GetFileInfo(GetDriveFsAbsolutePath(relative_file_path), &info)
+               ? info.creation_time
+               : base::Time();
+  }
+
+  base::FilePath GetDriveFsAbsolutePath(const std::string& relative_path) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    drive::DriveIntegrationService* service =
+        drive::DriveIntegrationServiceFactory::FindForProfile(
+            browser()->profile());
+    EXPECT_TRUE(service->IsMounted());
+    EXPECT_TRUE(base::PathExists(service->GetMountPointPath()));
+
+    base::FilePath root("/");
+    base::FilePath absolute_path(service->GetMountPointPath());
+    root.AppendRelativePath(base::FilePath(relative_path), &absolute_path);
+    return absolute_path;
+  }
+
   void AddTransferItemEvent(drivefs::mojom::SyncingStatus& syncing_status,
                             const std::string& path,
                             int64_t total_bytes,
@@ -180,6 +196,7 @@
   ash::PendingScreencast ps = *(pending_screencasts.begin());
   EXPECT_EQ(ps.container_dir, base::FilePath(kTestScreencastPath));
   EXPECT_EQ(ps.name, kTestScreencastName);
+  EXPECT_EQ(ps.created_time, GetFileCreatedTime(media_file));
 
   // Tests PendingScreencastChangeCallback won't be invoked if pending
   // screencast status doesn't change.
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc
index dbe0fee1..8103568e 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc
@@ -9,6 +9,8 @@
 #include <utility>
 
 #include "ash/public/cpp/ash_typography.h"
+#include "ash/public/cpp/style/scoped_light_mode_as_default.h"
+#include "ash/style/ash_color_provider.h"
 #include "base/cxx17_backports.h"
 #include "base/i18n/rtl.h"
 #include "base/scoped_observation.h"
@@ -223,14 +225,20 @@
     image->SetImage(*ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
         IDR_SHARESHEET_EMPTY));
     image->SetProperty(views::kMarginsKey, gfx::Insets(0, 0, kSpacing, 0));
+    ScopedLightModeAsDefault scoped_light_mode_as_default;
+    auto* color_provider = AshColorProvider::Get();
     body_view_->AddChildView(CreateShareLabel(
         l10n_util::GetStringUTF16(IDS_SHARESHEET_ZERO_STATE_PRIMARY_LABEL),
         CONTEXT_SHARESHEET_BUBBLE_BODY, kPrimaryTextLineHeight,
-        kPrimaryTextColor, gfx::ALIGN_CENTER));
+        color_provider->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kTextColorPrimary),
+        gfx::ALIGN_CENTER));
     body_view_->AddChildView(CreateShareLabel(
         l10n_util::GetStringUTF16(IDS_SHARESHEET_ZERO_STATE_SECONDARY_LABEL),
         CONTEXT_SHARESHEET_BUBBLE_BODY_SECONDARY, kPrimaryTextLineHeight,
-        kSecondaryTextColor, gfx::ALIGN_CENTER, views::style::STYLE_PRIMARY));
+        color_provider->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kTextColorSecondary),
+        gfx::ALIGN_CENTER, views::style::STYLE_PRIMARY));
   } else {
     if (show_content_previews) {
       header_body_separator_ =
@@ -319,10 +327,13 @@
     expanded_layout->AddPaddingRow(views::GridLayout::kFixedSize,
                                    kExpandViewPaddingTop);
     expanded_layout->StartRow(views::GridLayout::kFixedSize, kColumnSetIdTitle);
+    ScopedLightModeAsDefault scoped_light_mode_as_default;
     expanded_layout->AddView(CreateShareLabel(
         l10n_util::GetStringUTF16(IDS_SHARESHEET_APPS_LIST_LABEL),
         CONTEXT_SHARESHEET_BUBBLE_BODY, kSubtitleTextLineHeight,
-        kPrimaryTextColor, gfx::ALIGN_CENTER));
+        AshColorProvider::Get()->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kTextColorPrimary),
+        gfx::ALIGN_CENTER));
     expanded_layout->AddPaddingRow(views::GridLayout::kFixedSize,
                                    kExpandViewPaddingBottom);
   }
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h b/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
index a9858de..c638fb99 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
@@ -54,12 +54,6 @@
 constexpr int kSubtitleTextLineHeight = 22;
 constexpr int kPrimaryTextLineHeight = 20;
 
-// TODO(crbug.com/1156343) : Go through code and replace all color constants
-// with colors from ColorProvider.
-constexpr SkColor kTitleTextColor = gfx::kGoogleGrey900;
-constexpr SkColor kPrimaryTextColor = gfx::kGoogleGrey700;
-constexpr SkColor kSecondaryTextColor = gfx::kGoogleGrey600;
-
 }  // namespace sharesheet
 }  // namespace ash
 
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
index 821c9a7..83d4cd9 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
@@ -274,17 +274,19 @@
       views::BoxLayout::Orientation::kVertical,
       /* inside_border_insets */ gfx::Insets(),
       /* between_child_spacing */ 0, /* collapse_margins_spacing */ true));
-  text_view_->AddChildView(
-      CreateShareLabel(l10n_util::GetStringUTF16(IDS_SHARESHEET_TITLE_LABEL),
-                       CONTEXT_SHARESHEET_BUBBLE_TITLE, kTitleTextLineHeight,
-                       kTitleTextColor, gfx::ALIGN_LEFT));
+  ScopedLightModeAsDefault scoped_light_mode_as_default;
+  text_view_->AddChildView(CreateShareLabel(
+      l10n_util::GetStringUTF16(IDS_SHARESHEET_TITLE_LABEL),
+      CONTEXT_SHARESHEET_BUBBLE_TITLE, kTitleTextLineHeight,
+      AshColorProvider::Get()->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kTextColorPrimary),
+      gfx::ALIGN_LEFT));
   if (show_content_previews) {
     ShowTextPreview();
     if (has_files) {
       ResolveImages();
     } else {
       DCHECK_GT(image_preview_->GetImageViewCount(), 0);
-      ScopedLightModeAsDefault scoped_light_mode_as_default;
       const auto icon_color = ColorProvider::Get()->GetContentLayerColor(
           ColorProvider::ContentLayerType::kIconColorProminent);
       gfx::ImageSkia file_type_icon = gfx::CreateVectorIcon(
@@ -355,9 +357,12 @@
 
 void SharesheetHeaderView::AddTextLine(const std::u16string& text,
                                        const std::u16string& tooltip_text) {
+  ScopedLightModeAsDefault scoped_light_mode_as_default;
   auto* new_line = text_view_->AddChildView(CreateShareLabel(
       text, CONTEXT_SHARESHEET_BUBBLE_BODY, kPrimaryTextLineHeight,
-      kPrimaryTextColor, gfx::ALIGN_LEFT, views::style::STYLE_PRIMARY));
+      AshColorProvider::Get()->GetContentLayerColor(
+          AshColorProvider::ContentLayerType::kTextColorPrimary),
+      gfx::ALIGN_LEFT, views::style::STYLE_PRIMARY));
   new_line->SetHandlesTooltips(true);
   if (tooltip_text.empty()) {
     return;
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_target_button.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_target_button.cc
index bf2ae3c..b12c4bc5 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_target_button.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_target_button.cc
@@ -110,7 +110,10 @@
 
   auto* label = label_view->AddChildView(std::make_unique<views::Label>(
       display_name, CONTEXT_SHARESHEET_BUBBLE_BODY, STYLE_SHARESHEET));
-  label->SetEnabledColor(kPrimaryTextColor);
+  ScopedLightModeAsDefault scoped_light_mode_as_default;
+  auto secondary_text_color = AshColorProvider::Get()->GetContentLayerColor(
+      AshColorProvider::ContentLayerType::kTextColorSecondary);
+  label->SetEnabledColor(secondary_text_color);
   SetLabelProperties(label);
 
   std::u16string accessible_name = display_name;
@@ -120,7 +123,7 @@
         label_view->AddChildView(std::make_unique<views::Label>(
             secondary_display_name, CONTEXT_SHARESHEET_BUBBLE_BODY_SECONDARY,
             STYLE_SHARESHEET));
-    secondary_label->SetEnabledColor(kSecondaryTextColor);
+    secondary_label->SetEnabledColor(secondary_text_color);
     SetLabelProperties(secondary_label);
     accessible_name =
         base::StrCat({display_name, u" ", secondary_display_name});
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc
index 505f56b..53e0213 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc
@@ -42,13 +42,13 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/app_constants/constants.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/services/app_service/public/cpp/instance.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "extensions/browser/app_window/app_window.h"
-#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display.h"
@@ -351,7 +351,7 @@
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("chrome://blank")));
 
   auto instances = app_service_proxy_->InstanceRegistry().GetInstances(
-      extension_misc::kChromeAppId);
+      app_constants::kChromeAppId);
   EXPECT_EQ(1u, instances.size());
   auto* instance = *instances.begin();
   EXPECT_EQ(instance->Window(), instance->Window()->GetToplevelWindow());
@@ -373,7 +373,7 @@
   // Create a fake Lacros window. The native window owns the widget.
   views::Widget* widget = CreateExoWindow("org.chromium.lacros.12345");
 
-  using extension_misc::kLacrosAppId;
+  using app_constants::kLacrosAppId;
   auto instances =
       app_service_proxy_->InstanceRegistry().GetInstances(kLacrosAppId);
   EXPECT_EQ(1u, instances.size());
@@ -382,7 +382,7 @@
             GetAppInstanceState(kLacrosAppId, (*instances.begin())->Window()));
 
   instances = app_service_proxy_->InstanceRegistry().GetInstances(
-      extension_misc::kLacrosAppId);
+      app_constants::kLacrosAppId);
   EXPECT_EQ(1u, instances.size());
   auto* instance = *instances.begin();
   EXPECT_EQ(instance->Window(), instance->Window()->GetToplevelWindow());
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
index 38c6ccc4..22167a2 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
@@ -46,12 +46,12 @@
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "chromeos/ui/base/window_properties.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/exo/shell_surface_base.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/services/app_service/public/cpp/instance.h"
 #include "components/services/app_service/public/mojom/types.mojom-shared.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
-#include "extensions/common/constants.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
@@ -272,7 +272,7 @@
 
   if (app_service_instance_helper_->IsOpenedInBrowser(GetAppId(shelf_id.app_id),
                                                       window) ||
-      shelf_id.app_id == extension_misc::kChromeAppId) {
+      shelf_id.app_id == app_constants::kChromeAppId) {
     app_service_instance_helper_->OnWindowVisibilityChanged(shelf_id, window,
                                                             visible);
     return;
@@ -286,7 +286,7 @@
                                             shelf_id.launch_id, state);
 
   // Only register the visible non-browser |window| for the active user.
-  if (!visible || shelf_id.app_id == extension_misc::kChromeAppId ||
+  if (!visible || shelf_id.app_id == app_constants::kChromeAppId ||
       !proxy_->InstanceRegistry().Exists(window)) {
     return;
   }
@@ -333,7 +333,7 @@
   if (!app_id.empty() &&
       !app_service_instance_helper_->IsOpenedInBrowser(GetAppId(app_id),
                                                        window) &&
-      app_id != extension_misc::kChromeAppId) {
+      app_id != app_constants::kChromeAppId) {
     // Delete the instance from InstanceRegistry.
     app_service_instance_helper_->OnInstances(GetAppId(app_id), window,
                                               std::string(),
@@ -423,7 +423,7 @@
     // Apps opened in browser are managed by browser, so skip them.
     if (app_service_instance_helper_->IsOpenedInBrowser(
             GetAppId(shelf_id.app_id), window) ||
-        shelf_id.app_id == extension_misc::kChromeAppId) {
+        shelf_id.app_id == app_constants::kChromeAppId) {
       return;
     }
     window_list_.push_back(window);
@@ -541,7 +541,7 @@
 
   if (app_service_instance_helper_->IsOpenedInBrowser(GetAppId(shelf_id.app_id),
                                                       window) ||
-      shelf_id.app_id == extension_misc::kChromeAppId) {
+      shelf_id.app_id == app_constants::kChromeAppId) {
     app_service_instance_helper_->SetWindowActivated(shelf_id, window, active);
     return;
   }
@@ -685,7 +685,7 @@
 ash::ShelfID AppServiceAppWindowShelfController::GetShelfId(
     aura::Window* window) const {
   if (crosapi::browser_util::IsLacrosWindow(window))
-    return ash::ShelfID(extension_misc::kLacrosAppId);
+    return ash::ShelfID(app_constants::kLacrosAppId);
 
   std::string shelf_app_id;
   if (borealis::BorealisWindowManager::IsBorealisWindow(window)) {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc
index a299455..2178d87 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.cc
@@ -24,11 +24,11 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/web_applications/web_app_id.h"
+#include "components/app_constants/constants.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/services/app_service/public/cpp/instance_update.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "content/public/browser/web_contents.h"
-#include "extensions/common/constants.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/wm/core/window_util.h"
 #include "ui/wm/public/activation_client.h"
@@ -156,7 +156,7 @@
 }
 
 void AppServiceInstanceRegistryHelper::OnBrowserRemoved() {
-  auto instances = GetInstances(extension_misc::kChromeAppId);
+  auto instances = GetInstances(app_constants::kChromeAppId);
   for (const auto* instance : instances) {
     if (!chrome::FindBrowserWithWindow(instance->Window())) {
       // The tabs in the browser should be closed, and tab windows have been
@@ -166,7 +166,7 @@
 
       // The browser is removed if the window can't be found, so update the
       // Chrome window instance as destroyed.
-      OnInstances(extension_misc::kChromeAppId, instance->Window(),
+      OnInstances(app_constants::kChromeAppId, instance->Window(),
                   std::string(), apps::InstanceState::kDestroyed);
     }
   }
@@ -231,7 +231,7 @@
   } else if (static_cast<ash::AppType>(window->GetProperty(
                  aura::client::kAppType)) == ash::AppType::BROWSER) {
     // For a normal browser window, set the app id as the browser app id.
-    app_id = extension_misc::kChromeAppId;
+    app_id = app_constants::kChromeAppId;
   }
   OnWindowVisibilityChanged(ash::ShelfID(app_id), window, window->IsVisible());
   auto* client = wm::GetActivationClient(window->GetRootWindow());
@@ -245,7 +245,7 @@
     const ash::ShelfID& shelf_id,
     aura::Window* window,
     bool visible) {
-  if (shelf_id.app_id != extension_misc::kChromeAppId) {
+  if (shelf_id.app_id != app_constants::kChromeAppId) {
     // For Web apps opened in an app window, we need to find the top level
     // window to compare with the parameter |window|, because we save the tab
     // window in AppService InstanceRegistry for Web apps, and we should set the
@@ -273,7 +273,7 @@
   }
 
   apps::InstanceState state = CalculateVisibilityState(window, visible);
-  OnInstances(extension_misc::kChromeAppId, window, std::string(), state);
+  OnInstances(app_constants::kChromeAppId, window, std::string(), state);
 
   if (!base::Contains(browser_window_to_tab_windows_, window))
     return;
@@ -293,7 +293,7 @@
     const ash::ShelfID& shelf_id,
     aura::Window* window,
     bool active) {
-  if (shelf_id.app_id != extension_misc::kChromeAppId) {
+  if (shelf_id.app_id != app_constants::kChromeAppId) {
     // For Web apps opened in an app window, we need to find the top level
     // window to compare with |window|, because we save the tab
     // window in AppService InstanceRegistry for Web apps, and we should set the
@@ -319,7 +319,7 @@
   }
 
   apps::InstanceState state = CalculateActivatedState(window, active);
-  OnInstances(extension_misc::kChromeAppId, window, std::string(), state);
+  OnInstances(app_constants::kChromeAppId, window, std::string(), state);
 
   if (!base::Contains(browser_window_to_tab_windows_, window))
     return;
@@ -471,7 +471,7 @@
   std::string app_id = shelf_controller_helper_->GetAppID(contents);
   if (!app_id.empty())
     return app_id;
-  return extension_misc::kChromeAppId;
+  return app_constants::kChromeAppId;
 }
 
 aura::Window* AppServiceInstanceRegistryHelper::GetWindow(
@@ -510,7 +510,7 @@
 
 void AppServiceInstanceRegistryHelper::AddTabWindow(const std::string& app_id,
                                                     aura::Window* window) {
-  if (app_id == extension_misc::kChromeAppId)
+  if (app_id == app_constants::kChromeAppId)
     return;
 
   aura::Window* top_level_window = window->GetToplevelWindow();
@@ -521,7 +521,7 @@
 void AppServiceInstanceRegistryHelper::RemoveTabWindow(
     const std::string& app_id,
     aura::Window* window) {
-  if (app_id == extension_misc::kChromeAppId)
+  if (app_id == app_constants::kChromeAppId)
     return;
 
   auto it = tab_window_to_browser_window_.find(window);
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
index 852b36a..61b94bf 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
@@ -41,6 +41,7 @@
 #include "chrome/browser/ui/views/crostini/crostini_app_restart_dialog.h"
 #include "chrome/browser/ui/webui/settings/ash/app_management/app_management_uma.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "content/public/browser/context_menu_params.h"
 #include "extensions/browser/extension_prefs.h"
 #include "ui/display/scoped_display_for_new_windows.h"
@@ -316,8 +317,8 @@
   size_t shortcut_index = menu_items->items.size();
   for (size_t i = index; i < menu_items->items.size(); i++) {
     // For Chrome browser, add the close item before the app info item.
-    if ((item().id.app_id == extension_misc::kChromeAppId ||
-         item().id.app_id == extension_misc::kLacrosAppId) &&
+    if ((item().id.app_id == app_constants::kChromeAppId ||
+         item().id.app_id == app_constants::kLacrosAppId) &&
         menu_items->items[i]->command_id == ash::SHOW_APP_INFO) {
       BuildChromeAppMenu(menu_model.get());
     }
diff --git a/chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.cc b/chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.cc
index 38aac45..7f7125a 100644
--- a/chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.cc
+++ b/chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/ui/ash/shelf/shelf_context_menu.h"
 #include "chrome/browser/ui/ash/shelf/shelf_controller_helper.h"
 #include "chromeos/ui/wm/desks/desks_helper.h"
-#include "extensions/common/constants.h"
+#include "components/app_constants/constants.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/wm/core/window_util.h"
 
@@ -188,7 +188,7 @@
   // Otherwise, fallthrough to minimize or activate or advance.
   // TODO(sammiequon): This feature should only be for lacros browser and not
   // lacros PWAs. Revisit when there is a way to differentiate the two.
-  if (app_id() == extension_misc::kLacrosAppId &&
+  if (app_id() == app_constants::kLacrosAppId &&
       ShouldLaunchNewLacrosWindow(*event, filtered_windows)) {
     crosapi::BrowserManager::Get()->NewWindow(
         /*incognito=*/false, /*should_trigger_session_restore=*/true);
diff --git a/chrome/browser/ui/ash/shelf/browser_app_shelf_controller.cc b/chrome/browser/ui/ash/shelf/browser_app_shelf_controller.cc
index 7d0c875e..bdfd519 100644
--- a/chrome/browser/ui/ash/shelf/browser_app_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/browser_app_shelf_controller.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_item_factory.h"
 #include "chrome/browser/ui/ash/shelf/shelf_controller_helper.h"
 #include "chrome/browser/ui/ash/shelf/shelf_spinner_controller.h"
-#include "extensions/common/constants.h"
+#include "components/app_constants/constants.h"
 #include "ui/aura/window.h"
 
 namespace {
@@ -127,7 +127,7 @@
   if (!BrowserAppShelfControllerShouldHandleApp(app_id, profile_)) {
     return;
   }
-  bool running = (app_id == extension_misc::kLacrosAppId)
+  bool running = (app_id == app_constants::kLacrosAppId)
                      ? browser_app_instance_registry_.IsLacrosBrowserRunning()
                      : browser_app_instance_registry_.IsAppRunning(app_id);
   UpdateShelfItemStatus(item,
@@ -190,8 +190,8 @@
             return instance.window == window;
           });
   const char* browser_app_id = crosapi::browser_util::IsLacrosWindow(window)
-                                   ? extension_misc::kLacrosAppId
-                                   : extension_misc::kChromeAppId;
+                                   ? app_constants::kLacrosAppId
+                                   : app_constants::kChromeAppId;
   // App ID of the window is set to the app ID of the active tab. If the active
   // tab has no app, app ID of the window is set to the browser's ID.
   // Shelf ID of the window is set to the app's item on the shelf, if the item
diff --git a/chrome/browser/ui/ash/shelf/browser_app_shelf_controller_browsertest.cc b/chrome/browser/ui/ash/shelf/browser_app_shelf_controller_browsertest.cc
index 5867c73..863c6e00 100644
--- a/chrome/browser/ui/ash/shelf/browser_app_shelf_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/browser_app_shelf_controller_browsertest.cc
@@ -37,15 +37,15 @@
 #include "chrome/test/base/chromeos/ash_browser_test_starter.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
+#include "components/app_constants/constants.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/mojom/types.mojom-shared.h"
 #include "content/public/test/browser_test.h"
-#include "extensions/common/constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/events/base_event_utils.h"
 
-using ::extension_misc::kChromeAppId;
-using ::extension_misc::kLacrosAppId;
+using ::app_constants::kChromeAppId;
+using ::app_constants::kLacrosAppId;
 using ::testing::AnyOf;
 using ::testing::Eq;
 
diff --git a/chrome/browser/ui/ash/shelf/browser_app_shelf_item_controller.cc b/chrome/browser/ui/ash/shelf/browser_app_shelf_item_controller.cc
index 89e4074..a269810 100644
--- a/chrome/browser/ui/ash/shelf/browser_app_shelf_item_controller.cc
+++ b/chrome/browser/ui/ash/shelf/browser_app_shelf_item_controller.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
 #include "chrome/browser/ui/ash/shelf/shelf_context_menu.h"
 #include "chrome/common/chrome_features.h"
+#include "components/app_constants/constants.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "extensions/common/constants.h"
@@ -87,7 +88,7 @@
   for (const auto& pair : GetMatchingInstances(filter_predicate)) {
     int command_id = pair.first;
     base::UnguessableToken id = pair.second;
-    if (shelf_id().app_id == extension_misc::kLacrosAppId) {
+    if (shelf_id().app_id == app_constants::kLacrosAppId) {
       const apps::BrowserWindowInstance* instance =
           registry_.GetBrowserWindowInstanceById(id);
       DCHECK(instance);
@@ -130,7 +131,7 @@
 
 void BrowserAppShelfItemController::OnBrowserWindowAdded(
     const apps::BrowserWindowInstance& instance) {
-  if (!(shelf_id().app_id == extension_misc::kLacrosAppId &&
+  if (!(shelf_id().app_id == app_constants::kLacrosAppId &&
         crosapi::browser_util::IsLacrosWindow(instance.window))) {
     // Only handle Lacros browser windows.
     return;
@@ -147,7 +148,7 @@
 
 void BrowserAppShelfItemController::OnBrowserWindowRemoved(
     const apps::BrowserWindowInstance& instance) {
-  if (!(shelf_id().app_id == extension_misc::kLacrosAppId &&
+  if (!(shelf_id().app_id == app_constants::kLacrosAppId &&
         crosapi::browser_util::IsLacrosWindow(instance.window))) {
     // Only handle Lacros browser windows.
     return;
@@ -189,7 +190,7 @@
   for (const auto& pair : command_to_instance_map_) {
     base::UnguessableToken id = pair.second;
     aura::Window* window = nullptr;
-    if (shelf_id().app_id == extension_misc::kLacrosAppId) {
+    if (shelf_id().app_id == app_constants::kLacrosAppId) {
       const apps::BrowserWindowInstance* instance =
           registry_.GetBrowserWindowInstanceById(id);
       DCHECK(instance);
diff --git a/chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.cc b/chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.cc
index 39af5f8e..739edc3 100644
--- a/chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.cc
+++ b/chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.cc
@@ -31,6 +31,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
+#include "components/app_constants/constants.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/url_constants.h"
 #include "extensions/browser/extension_prefs.h"
@@ -79,7 +80,7 @@
 
 BrowserShortcutShelfItemController::BrowserShortcutShelfItemController(
     ash::ShelfModel* shelf_model)
-    : ash::ShelfItemDelegate(ash::ShelfID(extension_misc::kChromeAppId)),
+    : ash::ShelfItemDelegate(ash::ShelfID(app_constants::kChromeAppId)),
       shelf_model_(shelf_model) {
   BrowserList::AddObserver(this);
 }
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
index 02746de9..652b306 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
@@ -92,6 +92,7 @@
 #include "chrome/grit/theme_resources.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/favicon/content/content_favicon_driver.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "components/strings/grit/components_strings.h"
@@ -110,7 +111,7 @@
 #include "ui/display/types/display_constants.h"
 #include "ui/resources/grit/ui_resources.h"
 
-using extension_misc::kChromeAppId;
+using app_constants::kChromeAppId;
 using extension_misc::kGmailAppId;
 
 namespace {
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
index d331cc3..c846cf3 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
@@ -102,6 +102,7 @@
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/app_constants/constants.h"
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
@@ -860,7 +861,7 @@
   EXPECT_TRUE(app_window->IsActive());
   EXPECT_FALSE(browser2->window()->IsActive());
 
-  SelectItem(ash::ShelfID(extension_misc::kChromeAppId));
+  SelectItem(ash::ShelfID(app_constants::kChromeAppId));
 
   EXPECT_FALSE(app_window->IsActive());
   EXPECT_TRUE(browser2->window()->IsActive());
@@ -2139,7 +2140,7 @@
       controller_->GetBrowserShortcutShelfItemControllerForTesting();
   ASSERT_TRUE(item_controller);
   const ash::ShelfID browser_id = item_controller->shelf_id();
-  EXPECT_EQ(extension_misc::kChromeAppId, browser_id.app_id);
+  EXPECT_EQ(app_constants::kChromeAppId, browser_id.app_id);
 
   extensions::ExtensionPrefs* prefs =
       extensions::ExtensionPrefs::Get(profile());
@@ -2150,7 +2151,7 @@
   EXPECT_FALSE(controller_->IsOpen(browser_id));
   // No launch time recorded for Chrome yet.
   EXPECT_EQ(base::Time(),
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+            prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 
   // Activate. This creates new browser
   base::Time time_before_launch = base::Time::Now();
@@ -2162,7 +2163,7 @@
   EXPECT_TRUE(controller_->IsOpen(browser_id));
   // Valid launch time should be recorded for Chrome.
   const base::Time time_launch =
-      prefs->GetLastLaunchTime(extension_misc::kChromeAppId);
+      prefs->GetLastLaunchTime(app_constants::kChromeAppId);
   EXPECT_LE(time_before_launch, time_launch);
   EXPECT_GE(time_after_launch, time_launch);
 
@@ -2179,8 +2180,7 @@
   EXPECT_TRUE(controller_->IsOpen(browser_id));
   EXPECT_FALSE(browser->window()->IsMinimized());
   // Re-activation should not upate the recorded launch time.
-  EXPECT_GE(time_launch,
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+  EXPECT_GE(time_launch, prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 }
 
 // Check that browser launch time is recorded when the browser is started
@@ -2192,14 +2192,14 @@
 
   EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
   EXPECT_EQ(base::Time(),
-            prefs->GetLastLaunchTime(extension_misc::kChromeAppId));
+            prefs->GetLastLaunchTime(app_constants::kChromeAppId));
 
   base::Time time_before_launch = base::Time::Now();
   // Load about:blank in a new window.
   CreateBrowser(profile());
   base::Time time_after_launch = base::Time::Now();
   const base::Time time_launch =
-      prefs->GetLastLaunchTime(extension_misc::kChromeAppId);
+      prefs->GetLastLaunchTime(app_constants::kChromeAppId);
   EXPECT_LE(time_before_launch, time_launch);
   EXPECT_GE(time_after_launch, time_launch);
 }
@@ -2737,7 +2737,7 @@
 // Chrome's ShelfModel should have the browser item and delegate.
 IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, ShelfModelInitialization) {
   EXPECT_EQ(1, shelf_model()->item_count());
-  EXPECT_EQ(extension_misc::kChromeAppId, shelf_model()->items()[0].id.app_id);
+  EXPECT_EQ(app_constants::kChromeAppId, shelf_model()->items()[0].id.app_id);
   EXPECT_TRUE(
       shelf_model()->GetShelfItemDelegate(shelf_model()->items()[0].id));
 }
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
index 678d5d4..8649063 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
@@ -117,6 +117,7 @@
 #include "chromeos/dbus/concierge/concierge_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/prefs/pref_notifier_impl.h"
@@ -459,7 +460,7 @@
     std::string error;
     extension_chrome_ = Extension::Create(
         base::FilePath(), ManifestLocation::kUnpacked, manifest,
-        Extension::NO_FLAGS, extension_misc::kChromeAppId, &error);
+        Extension::NO_FLAGS, app_constants::kChromeAppId, &error);
     extension1_ = Extension::Create(
         base::FilePath(), ManifestLocation::kUnpacked, manifest,
         Extension::NO_FLAGS, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", &error);
@@ -533,7 +534,7 @@
 
     // Set an empty pinned pref to begin with.
     syncer::SyncChangeList sync_list;
-    InsertAddPinChange(&sync_list, 0, extension_misc::kChromeAppId);
+    InsertAddPinChange(&sync_list, 0, app_constants::kChromeAppId);
     SendPinChanges(sync_list, true);
     EXPECT_EQ("Chrome", GetPinnedAppStatus());
 
@@ -557,13 +558,13 @@
     InsertAddPinChange(user_a, 3, extension_platform_app_->id());
     InsertAddPinChange(user_a, 4, web_app::kGoogleDocsAppId);
     InsertAddPinChange(user_a, 5, extension5_->id());
-    InsertAddPinChange(user_a, 6, extension_misc::kChromeAppId);
+    InsertAddPinChange(user_a, 6, app_constants::kChromeAppId);
 
     // Set user b preferences.
     InsertAddPinChange(user_b, 0, extension6_->id());
     InsertAddPinChange(user_b, 1, extension7_->id());
     InsertAddPinChange(user_b, 2, extension8_->id());
-    InsertAddPinChange(user_b, 3, extension_misc::kChromeAppId);
+    InsertAddPinChange(user_b, 3, app_constants::kChromeAppId);
   }
 
   void TearDown() override {
@@ -789,7 +790,7 @@
   // Set the index at which the chrome icon should be.
   void SetShelfChromeIconIndex(int index) {
     DCHECK(
-        app_list_syncable_service_->GetPinPosition(extension_misc::kChromeAppId)
+        app_list_syncable_service_->GetPinPosition(app_constants::kChromeAppId)
             .IsValid());
     syncer::StringOrdinal chrome_position;
     chrome_position = index == 0 ? GeneratePinPosition(0).CreateBefore()
@@ -800,11 +801,11 @@
     sync_pb::EntitySpecifics specifics;
     sync_pb::AppListSpecifics* app_list_specifics =
         specifics.mutable_app_list();
-    app_list_specifics->set_item_id(extension_misc::kChromeAppId);
+    app_list_specifics->set_item_id(app_constants::kChromeAppId);
     app_list_specifics->set_item_type(sync_pb::AppListSpecifics::TYPE_APP);
     app_list_specifics->set_item_pin_ordinal(chrome_position.ToInternalValue());
     syncer::SyncData sync_data = syncer::SyncData::CreateLocalData(
-        extension_misc::kChromeAppId, "Test", specifics);
+        app_constants::kChromeAppId, "Test", specifics);
     sync_list.push_back(syncer::SyncChange(
         FROM_HERE, syncer::SyncChange::ACTION_UPDATE, sync_data));
     app_list_syncable_service_->ProcessSyncChanges(FROM_HERE, sync_list);
@@ -1790,7 +1791,7 @@
   // extension 1, 3 are pinned by user
   syncer::SyncChangeList sync_list;
   InsertAddPinChange(&sync_list, 0, extension1_->id());
-  InsertAddPinChange(&sync_list, 1, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list, 1, app_constants::kChromeAppId);
   InsertAddPinChange(&sync_list, 2, web_app::kGmailAppId);
   SendPinChanges(sync_list, true);
 
@@ -1909,7 +1910,7 @@
 
   syncer::SyncChangeList sync_list;
   InsertAddPinChange(&sync_list, 0, extension1_->id());
-  InsertAddPinChange(&sync_list, 1, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list, 1, app_constants::kChromeAppId);
   InsertAddPinChange(&sync_list, 2, extension2_->id());
   InsertAddPinChange(&sync_list, 3, web_app::kGmailAppId);
   SendPinChanges(sync_list, true);
@@ -1963,14 +1964,14 @@
   InsertAddPinChange(&sync_list1, 0, web_app::kGmailAppId);
   InsertAddPinChange(&sync_list1, 1, extension1_->id());
   InsertAddPinChange(&sync_list1, 2, extension2_->id());
-  InsertAddPinChange(&sync_list1, 3, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list1, 3, app_constants::kChromeAppId);
   SendPinChanges(sync_list1, true);
   EXPECT_EQ("Gmail, App1, App2, Chrome", GetPinnedAppStatus());
 
   syncer::SyncChangeList sync_list2;
   InsertAddPinChange(&sync_list2, 0, extension2_->id());
   InsertAddPinChange(&sync_list2, 1, web_app::kGmailAppId);
-  InsertAddPinChange(&sync_list2, 2, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list2, 2, app_constants::kChromeAppId);
   InsertAddPinChange(&sync_list2, 3, extension1_->id());
   SendPinChanges(sync_list2, true);
   EXPECT_EQ("App2, Gmail, Chrome, App1", GetPinnedAppStatus());
@@ -3086,15 +3087,15 @@
   std::unique_ptr<Browser> profile2_browser =
       CreateBrowserAndTabWithProfile(profile2, kWebAppName, kWebAppUrl);
 
-  EXPECT_EQ(std::vector<std::string>(
-                {extension_misc::kChromeAppId, installed_app_id}),
-            GetAppsShownInShelf());
+  EXPECT_EQ(
+      std::vector<std::string>({app_constants::kChromeAppId, installed_app_id}),
+      GetAppsShownInShelf());
 
   // Switch to the secondary user, and verify the app only installed in the
   // primary profile is removed from the model.
   SwitchActiveUser(account_id2);
 
-  EXPECT_EQ(std::vector<std::string>({extension_misc::kChromeAppId}),
+  EXPECT_EQ(std::vector<std::string>({app_constants::kChromeAppId}),
             GetAppsShownInShelf());
 
   chrome::CloseTab(profile2_browser.get());
@@ -3339,7 +3340,7 @@
   InitShelfController();
 
   syncer::SyncChangeList sync_list;
-  InsertAddPinChange(&sync_list, 10, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list, 10, app_constants::kChromeAppId);
   SendPinChanges(sync_list, true);
 
   std::vector<std::string> expected_pinned_apps;
@@ -3448,7 +3449,7 @@
   // Check that the browser list is empty at this time.
   ash::ShelfItem item_browser;
   item_browser.type = ash::TYPE_BROWSER_SHORTCUT;
-  item_browser.id = ash::ShelfID(extension_misc::kChromeAppId);
+  item_browser.id = ash::ShelfID(app_constants::kChromeAppId);
   CheckAppMenu(shelf_controller_.get(), item_browser, 0, nullptr);
 
   // Now make the created browser() visible by showing its browser window.
@@ -3485,7 +3486,7 @@
 
   ash::ShelfItem item_browser;
   item_browser.type = ash::TYPE_BROWSER_SHORTCUT;
-  item_browser.id = ash::ShelfID(extension_misc::kChromeAppId);
+  item_browser.id = ash::ShelfID(app_constants::kChromeAppId);
 
   // Check that the menu is empty.
   chrome::NewTab(browser());
@@ -3546,7 +3547,7 @@
   // Check the menu content.
   ash::ShelfItem item_browser;
   item_browser.type = ash::TYPE_BROWSER_SHORTCUT;
-  item_browser.id = ash::ShelfID(extension_misc::kChromeAppId);
+  item_browser.id = ash::ShelfID(app_constants::kChromeAppId);
 
   ash::ShelfItem item_gmail;
   item_gmail.type = ash::TYPE_PINNED_APP;
@@ -3603,7 +3604,7 @@
   // Check the menu content.
   ash::ShelfItem item_browser;
   item_browser.type = ash::TYPE_BROWSER_SHORTCUT;
-  item_browser.id = ash::ShelfID(extension_misc::kChromeAppId);
+  item_browser.id = ash::ShelfID(app_constants::kChromeAppId);
 
   ash::ShelfItem item_gmail;
   item_gmail.type = ash::TYPE_PINNED_APP;
@@ -4687,7 +4688,7 @@
   AddWebApp(web_app::kGmailAppId);
 
   syncer::SyncChangeList sync_list;
-  InsertAddPinChange(&sync_list, 0, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list, 0, app_constants::kChromeAppId);
   InsertAddPinChange(&sync_list, 1, extension1_->id());
   InsertAddPinChange(&sync_list, 1, extension2_->id());
   InsertAddPinChange(&sync_list, 1, web_app::kGmailAppId);
@@ -4696,7 +4697,7 @@
   EXPECT_EQ("Chrome, App1, App2, Gmail", GetPinnedAppStatus());
 
   const syncer::StringOrdinal position_chrome =
-      app_list_syncable_service_->GetPinPosition(extension_misc::kChromeAppId);
+      app_list_syncable_service_->GetPinPosition(app_constants::kChromeAppId);
   const syncer::StringOrdinal position_1 =
       app_list_syncable_service_->GetPinPosition(extension1_->id());
   const syncer::StringOrdinal position_2 =
@@ -4715,8 +4716,8 @@
 
   // Expect sync positions for only Chrome is updated and its resolution is
   // after all duplicated ordinals.
-  EXPECT_TRUE(position_3.LessThan(app_list_syncable_service_->GetPinPosition(
-      extension_misc::kChromeAppId)));
+  EXPECT_TRUE(position_3.LessThan(
+      app_list_syncable_service_->GetPinPosition(app_constants::kChromeAppId)));
   EXPECT_TRUE(position_1.Equals(
       app_list_syncable_service_->GetPinPosition(extension1_->id())));
   EXPECT_TRUE(position_1.Equals(
@@ -4736,7 +4737,7 @@
   extension_service_->AddExtension(extension2_.get());
 
   syncer::SyncChangeList sync_list;
-  InsertAddPinChange(&sync_list, 0, extension_misc::kChromeAppId);
+  InsertAddPinChange(&sync_list, 0, app_constants::kChromeAppId);
   InsertAddPinChange(&sync_list, 1, extension1_->id());
   InsertAddPinChange(&sync_list, 1, extension2_->id());
   SendPinChanges(sync_list, true);
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
index 72105c7..40775df 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
@@ -40,6 +40,7 @@
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
+#include "components/app_constants/constants.h"
 #include "components/crx_file/id_util.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
@@ -287,7 +288,7 @@
   for (const auto& sync_peer : syncable_service->sync_items()) {
     if (!sync_peer.second->item_pin_ordinal.IsValid())
       continue;
-    if (exclude_chrome && sync_peer.first == extension_misc::kChromeAppId)
+    if (exclude_chrome && sync_peer.first == app_constants::kChromeAppId)
       continue;
     if (!position.IsValid() ||
         sync_peer.second->item_pin_ordinal.LessThan(position)) {
@@ -335,7 +336,7 @@
     const std::vector<std::string>& app_ids) {
   // Chrome must be pinned at this point.
   const syncer::StringOrdinal chrome_position =
-      syncable_service->GetPinPosition(extension_misc::kChromeAppId);
+      syncable_service->GetPinPosition(app_constants::kChromeAppId);
   DCHECK(chrome_position.IsValid());
 
   // New pins are inserted after this position.
@@ -409,11 +410,11 @@
   if (crosapi::browser_util::IsLacrosEnabled() &&
       ash::ProfileHelper::IsPrimaryProfile(profile_)) {
     syncer::StringOrdinal lacros_position =
-        syncable_service->GetPinPosition(extension_misc::kLacrosAppId);
+        syncable_service->GetPinPosition(app_constants::kLacrosAppId);
     if (!lacros_position.IsValid()) {
       // If Lacros isn't already pinned, add it to the right of the Chrome icon.
       InsertPinsAfterChromeAndBeforeFirstPinnedApp(
-          syncable_service, {extension_misc::kLacrosAppId});
+          syncable_service, {app_constants::kLacrosAppId});
     }
   }
 
@@ -564,10 +565,10 @@
 void ChromeShelfPrefs::EnsureChromePinned(
     app_list::AppListSyncableService* syncable_service) {
   syncer::StringOrdinal chrome_position =
-      syncable_service->GetPinPosition(extension_misc::kChromeAppId);
+      syncable_service->GetPinPosition(app_constants::kChromeAppId);
   if (!chrome_position.IsValid()) {
     chrome_position = CreateFirstPinPosition(syncable_service);
-    syncable_service->SetPinPosition(extension_misc::kChromeAppId,
+    syncable_service->SetPinPosition(app_constants::kChromeAppId,
                                      chrome_position);
   }
 }
@@ -624,7 +625,7 @@
 
 bool ChromeShelfPrefs::IsSyncItemValid(const std::string& id,
                                        ShelfControllerHelper* helper) {
-  return id == extension_misc::kChromeAppId ||
+  return id == app_constants::kChromeAppId ||
          helper->IsValidIDForCurrentUser(id);
 }
 
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs_unittest.cc
index a4d2668..edfebf6 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs_unittest.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/app_list/app_list_syncable_service.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
+#include "components/app_constants/constants.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/sync/model/string_ordinal.h"
@@ -158,7 +159,7 @@
   shelf_prefs_->EnsureChromePinned(&syncable_service_);
 
   // Check that chrome now has a valid ordinal.
-  EXPECT_TRUE(syncable_service_.item_map_[extension_misc::kChromeAppId]
+  EXPECT_TRUE(syncable_service_.item_map_[app_constants::kChromeAppId]
                   ->item_pin_ordinal.IsValid());
 }
 
@@ -166,15 +167,15 @@
   // Set up the initial ordinals.
   syncer::StringOrdinal initial_ordinal =
       syncer::StringOrdinal::CreateInitialOrdinal();
-  syncable_service_.item_map_[extension_misc::kChromeAppId] =
-      MakeSyncItem(extension_misc::kChromeAppId, initial_ordinal);
+  syncable_service_.item_map_[app_constants::kChromeAppId] =
+      MakeSyncItem(app_constants::kChromeAppId, initial_ordinal);
 
   shelf_prefs_->EnsureChromePinned(&syncable_service_);
 
   // Check that the chrome ordinal did not change.
-  ASSERT_TRUE(syncable_service_.item_map_[extension_misc::kChromeAppId]
+  ASSERT_TRUE(syncable_service_.item_map_[app_constants::kChromeAppId]
                   ->item_pin_ordinal.IsValid());
-  auto& pin_ordinal = syncable_service_.item_map_[extension_misc::kChromeAppId]
+  auto& pin_ordinal = syncable_service_.item_map_[app_constants::kChromeAppId]
                           ->item_pin_ordinal;
   EXPECT_TRUE(pin_ordinal.Equals(initial_ordinal));
 }
@@ -183,7 +184,7 @@
   shelf_prefs_->EnsureChromePinned(&syncable_service_);
   shelf_prefs_->AddDefaultApps(&pref_service_, &syncable_service_);
 
-  ASSERT_TRUE(syncable_service_.item_map_[extension_misc::kChromeAppId]
+  ASSERT_TRUE(syncable_service_.item_map_[app_constants::kChromeAppId]
                   ->item_pin_ordinal.IsValid());
 
   // Check that a pin was added for the gmail app.
@@ -203,7 +204,7 @@
 
   // Pinned apps should have the chrome app as the first item.
   ASSERT_GE(pinned_apps_strs.size(), 1u);
-  EXPECT_EQ(pinned_apps_strs[0], extension_misc::kChromeAppId);
+  EXPECT_EQ(pinned_apps_strs[0], app_constants::kChromeAppId);
 
   // Pinned apps should have the gmail app.
   EXPECT_TRUE(base::Contains(pinned_apps_strs, extension_misc::kGmailAppId));
diff --git a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc
index 3b6905b..3d59a213 100644
--- a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc
@@ -22,6 +22,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "content/public/browser/context_menu_params.h"
 #include "extensions/browser/extension_prefs.h"
 #include "ui/base/models/image_model.h"
@@ -81,7 +82,7 @@
                            IDS_SHELF_CONTEXT_MENU_CLOSE);
     }
   }
-  if (app_id != extension_misc::kChromeAppId) {
+  if (app_id != app_constants::kChromeAppId) {
     AddContextMenuOption(menu_model.get(), ash::UNINSTALL,
                          IDS_APP_LIST_EXTENSIONS_UNINSTALL);
   }
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
index 659a611..f48375a 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -16,6 +16,7 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/accessibility/accessibility_state_utils.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/ui/autofill/autofill_popup_view.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
@@ -23,6 +24,7 @@
 #include "components/autofill/core/browser/ui/popup_item_ids.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/feature_engagement/public/tracker.h"
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/native_web_keyboard_event.h"
@@ -340,6 +342,14 @@
                                           /*has_suggestions=*/false);
   mf_controller->Hide();
 #endif
+
+  if (web_contents_ &&
+      suggestion.frontend_id == POPUP_ITEM_ID_VIRTUAL_CREDIT_CARD_ENTRY) {
+    feature_engagement::TrackerFactory::GetForBrowserContext(
+        web_contents_->GetBrowserContext())
+        ->NotifyEvent("autofill_virtual_card_suggestion_accepted");
+  }
+
   delegate_->DidAcceptSuggestion(suggestion.value, suggestion.frontend_id,
                                  suggestion.backend_id, index);
 }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 42e0befa..2db8dde0 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1772,11 +1772,11 @@
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace) {
   BackgroundContents* background_contents = CreateBackgroundContents(
       source_site_instance, opener, opener_url, is_new_browsing_instance,
-      frame_name, target_url, partition_id, session_storage_namespace);
+      frame_name, target_url, partition_config, session_storage_namespace);
   if (background_contents) {
     return background_contents->web_contents();
   }
@@ -2999,7 +2999,7 @@
     bool is_new_browsing_instance,
     const std::string& frame_name,
     const GURL& target_url,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace) {
   BackgroundContentsService* service =
       BackgroundContentsServiceFactory::GetForProfile(profile_);
@@ -3025,7 +3025,7 @@
   if (allow_js_access) {
     return service->CreateBackgroundContents(
         source_site_instance, opener, is_new_browsing_instance, frame_name,
-        extension->id(), partition_id, session_storage_namespace);
+        extension->id(), partition_config, session_storage_namespace);
   }
 
   // If script access is not allowed, create the the background contents in a
@@ -3035,7 +3035,7 @@
   BackgroundContents* contents = service->CreateBackgroundContents(
       content::SiteInstance::Create(source_site_instance->GetBrowserContext()),
       nullptr, is_new_browsing_instance, frame_name, extension->id(),
-      partition_id, session_storage_namespace);
+      partition_config, session_storage_namespace);
 
   // When a separate process is used, the original renderer cannot access the
   // new window later, thus we need to navigate the window now.
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index ef25db3d..ee70ee4 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -813,7 +813,7 @@
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace) override;
   void WebContentsCreated(content::WebContents* source_contents,
                           int opener_render_process_id,
@@ -1094,7 +1094,7 @@
       bool is_new_browsing_instance,
       const std::string& frame_name,
       const GURL& target_url,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace);
 
   // Data members /////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index 8f2f2dc5..26a040d 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -7,6 +7,7 @@
 #include "ui/base/interaction/element_identifier.h"
 
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kAppMenuButtonElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kAutofillCreditCardSuggestionEntryElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kAvatarButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kInstallPwaElementId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index 4fd702d..38beadd 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -16,6 +16,7 @@
 
 // These should gradually replace values in view_ids.h.
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kAppMenuButtonElementId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kAutofillCreditCardSuggestionEntryElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kAvatarButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kInstallPwaElementId);
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
index 70e8edb4..992d9ec 100644
--- a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
+++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
@@ -15,9 +15,6 @@
 #include "components/history/core/browser/history_service.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/buildflags/buildflags.h"
-#include "ui/color/color_id.h"
-#include "ui/color/color_provider.h"
-#include "ui/gfx/color_utils.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/common/extensions/extension_constants.h"
@@ -47,14 +44,6 @@
 
 namespace ui {
 
-SkColor GetSigninConfirmationPromptBarColor(
-    const ui::ColorProvider* color_provider,
-    SkAlpha alpha) {
-  static const SkColor kBackgroundColor =
-      color_provider->GetColor(ui::kColorDialogBackground);
-  return color_utils::BlendTowardMaxContrast(kBackgroundColor, alpha);
-}
-
 bool HasBeenShutdown(Profile* profile) {
   bool has_been_shutdown = !profile->IsNewProfile();
   if (has_been_shutdown)
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper.h b/chrome/browser/ui/sync/profile_signin_confirmation_helper.h
index 2d0e8ea5..d3139177 100644
--- a/chrome/browser/ui/sync/profile_signin_confirmation_helper.h
+++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper.h
@@ -6,18 +6,11 @@
 #define CHROME_BROWSER_UI_SYNC_PROFILE_SIGNIN_CONFIRMATION_HELPER_H_
 
 #include "base/callback.h"
-#include "third_party/skia/include/core/SkColor.h"
 
 class Profile;
 
 namespace ui {
 
-class ColorProvider;
-
-// Create slightly different colors for the dialog prompt bar.
-SkColor GetSigninConfirmationPromptBarColor(const ColorProvider* color_provider,
-                                            SkAlpha alpha);
-
 // Determines whether the browser has ever been shutdown since the
 // profile was created.
 // Exposed for testing.
diff --git a/chrome/browser/ui/tab_dialogs.h b/chrome/browser/ui/tab_dialogs.h
index b79e1bfd..af9d1a7 100644
--- a/chrome/browser/ui/tab_dialogs.h
+++ b/chrome/browser/ui/tab_dialogs.h
@@ -5,9 +5,6 @@
 #ifndef CHROME_BROWSER_UI_TAB_DIALOGS_H_
 #define CHROME_BROWSER_UI_TAB_DIALOGS_H_
 
-#include <memory>
-#include <string>
-
 #include "base/callback_forward.h"
 #include "base/supports_user_data.h"
 #include "ui/gfx/native_widget_types.h"
@@ -50,13 +47,6 @@
       content::RenderWidgetHost* render_widget_host) = 0;
   virtual bool IsShowingHungRendererDialog() = 0;
 
-  // Shows a dialog asking the user to confirm linking to a managed account.
-  virtual void ShowProfileSigninConfirmation(
-      Browser* browser,
-      const std::string& username,
-      bool prompt_for_new_profile,
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) = 0;
-
   // Shows or hides the ManagePasswords bubble.
   // Pass true for |user_action| if this is a user initiated action.
   virtual void ShowManagePasswordsBubble(bool user_action) = 0;
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index bb94ae9..f1d7e3f1 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -123,10 +123,6 @@
 const base::Feature kScrollableTabStripButtons{
     "ScrollableTabStripButtons", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Updated managed profile sign-in popup. https://crbug.com/1141224
-const base::Feature kSyncConfirmationUpdatedText{
-    "SyncConfirmationUpdatedText", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Automatically create groups for users based on domain.
 // https://crbug.com/1128703
 const base::Feature kTabGroupsAutoCreate{"TabGroupsAutoCreate",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index c4d1cc7..0ae25f2 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -76,8 +76,6 @@
 extern const base::Feature kSideSearchStatePerTab;
 #endif  // BUILDFLAG(ENABLE_SIDE_SEARCH)
 
-extern const base::Feature kSyncConfirmationUpdatedText;
-
 extern const base::Feature kTabGroupsAutoCreate;
 
 extern const base::Feature kTabGroupsNewBadgePromo;
diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc
index 21eccd4..fc617ce1 100644
--- a/chrome/browser/ui/views/accelerator_table.cc
+++ b/chrome/browser/ui/views/accelerator_table.cc
@@ -146,6 +146,8 @@
     {ui::VKEY_BROWSER_REFRESH, ui::EF_NONE, IDC_RELOAD},
     {ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN, IDC_RELOAD_BYPASSING_CACHE},
     {ui::VKEY_BROWSER_REFRESH, ui::EF_SHIFT_DOWN, IDC_RELOAD_BYPASSING_CACHE},
+    {ui::VKEY_CLOSE, ui::EF_NONE, IDC_CLOSE_TAB},
+    {ui::VKEY_NEW, ui::EF_NONE, IDC_NEW_TAB},
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/views/apps/DEPS b/chrome/browser/ui/views/apps/DEPS
index 3657eb1..ce2b415 100644
--- a/chrome/browser/ui/views/apps/DEPS
+++ b/chrome/browser/ui/views/apps/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
- "+extensions/components/native_app_window"
+  "+extensions/components/native_app_window",
+  "+components/app_constants",
 ]
 
 specific_include_rules = {
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
index 6c82a7f..7c04b50 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
@@ -28,10 +28,10 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_switches.h"
+#include "components/app_constants/constants.h"
 #include "components/constrained_window/constrained_window_views.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_registry.h"
-#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
@@ -143,7 +143,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // When Google Play Store is enabled and the Settings app is available, show
   // the "Manage supported links" link for Chrome.
-  if (app->id() == extension_misc::kChromeAppId &&
+  if (app->id() == app_constants::kChromeAppId &&
       arc::IsArcPlayStoreEnabledForProfile(profile)) {
     const ArcAppListPrefs* arc_app_list_prefs = ArcAppListPrefs::Get(profile);
     if (arc_app_list_prefs &&
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
index e8f1ae5..9fea0571 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
@@ -19,9 +19,9 @@
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/app_constants/constants.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
-#include "extensions/common/constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/views/controls/link.h"
 #include "ui/views/test/scoped_views_test_helper.h"
@@ -116,7 +116,7 @@
 #endif
     extension_ = extension_environment_.MakePackagedApp(kTestExtensionId, true);
     chrome_app_ = extension_environment_.MakePackagedApp(
-        extension_misc::kChromeAppId, true);
+        app_constants::kChromeAppId, true);
   }
 
   void TearDown() override {
@@ -317,7 +317,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 TEST_F(AppInfoDialogViewsTest, ArcAppInfoLinks) {
-  ShowAppInfo(extension_misc::kChromeAppId);
+  ShowAppInfo(app_constants::kChromeAppId);
   EXPECT_FALSE(widget_->IsClosed());
   // App Info should not have ARC App info links section because ARC Settings
   // app is not available yet.
@@ -331,7 +331,7 @@
   arc::mojom::AppHost* app_host = arc_prefs;
   app_host->OnAppListRefreshed(GetArcSettingsAppInfo());
   EXPECT_TRUE(arc_prefs->IsRegistered(arc::kSettingsAppId));
-  ShowAppInfo(extension_misc::kChromeAppId);
+  ShowAppInfo(app_constants::kChromeAppId);
   EXPECT_FALSE(widget_->IsClosed());
   EXPECT_TRUE(dialog_->arc_app_info_links_for_test());
 
@@ -341,12 +341,11 @@
       std::make_unique<TestingProfile>();
   extension_environment_.CreateExtensionServiceForProfile(other_profile.get());
   scoped_refptr<const extensions::Extension> other_app =
-      extension_environment_.MakePackagedApp(extension_misc::kChromeAppId,
-                                             true);
+      extension_environment_.MakePackagedApp(app_constants::kChromeAppId, true);
   extensions::ExtensionSystem::Get(other_profile.get())
       ->extension_service()
       ->AddExtension(other_app.get());
-  ShowAppInfoForProfile(extension_misc::kChromeAppId, other_profile.get());
+  ShowAppInfoForProfile(app_constants::kChromeAppId, other_profile.get());
   EXPECT_FALSE(widget_->IsClosed());
   // The ARC App info links are not available if ARC is not allowed for
   // secondary profile.
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
index 1a8dc62..71bd575 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
@@ -11,10 +11,10 @@
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/management_policy.h"
 #include "extensions/browser/uninstall_reason.h"
-#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
@@ -137,7 +137,7 @@
   return false;
 #else
   // Extensions and the Chrome component app can't have shortcuts.
-  return app->id() != extension_misc::kChromeAppId && !app->is_extension();
+  return app->id() != app_constants::kChromeAppId && !app->is_extension();
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
@@ -162,7 +162,7 @@
 bool AppInfoFooterPanel::CanSetPinnedToShelf(Profile* profile,
                                              const extensions::Extension* app) {
   // The Chrome app can't be unpinned, and extensions can't be pinned.
-  return app->id() != extension_misc::kChromeAppId && !app->is_extension() &&
+  return app->id() != app_constants::kChromeAppId && !app->is_extension() &&
          (GetPinnableForAppID(app->id(), profile) ==
           AppListControllerDelegate::PIN_EDITABLE);
 }
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
index 319e8f24..405e9af 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
@@ -16,10 +16,10 @@
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/app_constants/constants.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/path_util.h"
-#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_handlers/shared_module_info.h"
@@ -256,7 +256,7 @@
   // V2 apps and extensions don't have a launch type, and neither does the
   // Chrome app.
   return !app_->is_platform_app() && !app_->is_extension() &&
-         app_->id() != extension_misc::kChromeAppId;
+         app_->id() != app_constants::kChromeAppId;
 }
 
 void AppInfoSummaryPanel::ShowAppHomePage() {
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc b/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc
index 0c80dda..c231522 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_base_view.cc
@@ -14,14 +14,15 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/platform_util.h"
+#include "chrome/browser/themes/theme_service.h"
 #include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/views/autofill/autofill_popup_view_utils.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/contents_web_view.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/strings/grit/components_strings.h"
+#include "content/public/browser/web_contents.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/platform/ax_platform_node.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -36,6 +37,7 @@
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/layout/fill_layout.h"
+#include "ui/views/widget/widget.h"
 
 #if DCHECK_IS_ON()
 #include "base/containers/fixed_flat_set.h"
@@ -44,6 +46,51 @@
 
 namespace autofill {
 
+// The widget that the AutofillPopupBaseView will be attached to.
+class AutofillPopupBaseView::Widget : public views::Widget {
+ public:
+  explicit Widget(AutofillPopupBaseView* autofill_popup_base_view)
+      : autofill_popup_base_view_(autofill_popup_base_view) {
+    views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
+    params.delegate = autofill_popup_base_view_;
+    params.parent = autofill_popup_base_view_->GetParentNativeView();
+    // Ensure the bubble border is not painted on an opaque background.
+    params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
+    params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
+    Init(std::move(params));
+    AddObserver(autofill_popup_base_view_);
+
+    // No animation for popup appearance (too distracting).
+    SetVisibilityAnimationTransition(views::Widget::ANIMATE_HIDE);
+  }
+
+  ~Widget() override = default;
+
+  // views::Widget:
+  const ui::ThemeProvider* GetThemeProvider() const override {
+    if (!autofill_popup_base_view_ || !autofill_popup_base_view_->browser())
+      return nullptr;
+
+    return &ThemeService::GetThemeProviderForProfile(
+        autofill_popup_base_view_->browser()->profile());
+  }
+
+  views::Widget* GetPrimaryWindowWidget() override {
+    if (!autofill_popup_base_view_ || !autofill_popup_base_view_->browser())
+      return nullptr;
+
+    BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(
+        autofill_popup_base_view_->browser());
+    if (!browser_view)
+      return nullptr;
+
+    return browser_view->GetWidget()->GetPrimaryWindowWidget();
+  }
+
+ private:
+  const raw_ptr<AutofillPopupBaseView> autofill_popup_base_view_;
+};
+
 int AutofillPopupBaseView::GetCornerRadius() {
   return ChromeLayoutProvider::Get()->GetCornerRadiusMetric(
       views::Emphasis::kMedium);
@@ -80,7 +127,11 @@
 AutofillPopupBaseView::AutofillPopupBaseView(
     base::WeakPtr<AutofillPopupViewDelegate> delegate,
     views::Widget* parent_widget)
-    : delegate_(delegate), parent_widget_(parent_widget) {}
+    : delegate_(delegate), parent_widget_(parent_widget) {
+  // GetWebContents() may return nullptr in some tests.
+  if (GetWebContents())
+    browser_ = chrome::FindBrowserWithWebContents(GetWebContents());
+}
 
 AutofillPopupBaseView::~AutofillPopupBaseView() {
   if (delegate_) {
@@ -101,22 +152,9 @@
     if (parent_widget_)
       parent_widget_->AddObserver(this);
 
-    // The widget is destroyed by the corresponding NativeWidget, so we use
-    // a weak pointer to hold the reference and don't have to worry about
-    // deletion.
-    views::Widget* widget = new views::Widget;
-    views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
-    params.delegate = this;
-    params.parent = parent_widget_ ? parent_widget_->GetNativeView()
-                                   : delegate_->container_view();
-    // Ensure the bubble border is not painted on an opaque background.
-    params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
-    params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
-    widget->Init(std::move(params));
-    widget->AddObserver(this);
-
-    // No animation for popup appearance (too distracting).
-    widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_HIDE);
+    // The widget is destroyed by the corresponding NativeWidget, so we don't
+    // have to worry about deletion.
+    new AutofillPopupBaseView::Widget(this);
 
     show_time_ = base::Time::Now();
   }
@@ -252,7 +290,7 @@
 }
 
 gfx::Rect AutofillPopupBaseView::GetContentAreaBounds() const {
-  content::WebContents* web_contents = delegate_->GetWebContents();
+  content::WebContents* web_contents = GetWebContents();
   if (web_contents)
     return web_contents->GetContainerBounds();
 
@@ -325,9 +363,8 @@
   // Linux, use the screen bounds.
   const gfx::Rect top_window_bounds = GetTopWindowBounds();
   const gfx::Rect& max_bounds_for_popup =
-      PopupMayExceedContentAreaBounds(delegate_->GetWebContents())
-          ? top_window_bounds
-          : content_area_bounds;
+      PopupMayExceedContentAreaBounds(GetWebContents()) ? top_window_bounds
+                                                        : content_area_bounds;
 
   gfx::Rect element_bounds = gfx::ToEnclosingRect(delegate_->element_bounds());
 
@@ -407,6 +444,18 @@
   // timing of that deletion is tricky.
 }
 
+content::WebContents* AutofillPopupBaseView::GetWebContents() const {
+  if (!delegate_)
+    return nullptr;
+
+  return delegate_->GetWebContents();
+}
+
+gfx::NativeView AutofillPopupBaseView::GetParentNativeView() const {
+  return parent_widget_ ? parent_widget_->GetNativeView()
+                        : delegate_->container_view();
+}
+
 gfx::NativeView AutofillPopupBaseView::container_view() {
   return delegate_->container_view();
 }
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_base_view.h b/chrome/browser/ui/views/autofill/autofill_popup_base_view.h
index a29a15fa..e916983 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_base_view.h
+++ b/chrome/browser/ui/views/autofill/autofill_popup_base_view.h
@@ -12,6 +12,8 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/autofill/autofill_popup_view_delegate.h"
+#include "chrome/browser/ui/browser.h"
+#include "content/public/browser/web_contents.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/focus/widget_focus_manager.h"
 #include "ui/views/widget/widget.h"
@@ -66,6 +68,8 @@
     return base::Time::Now() - show_time_;
   }
 
+  Browser* browser() { return browser_; }
+
  protected:
   AutofillPopupBaseView(base::WeakPtr<AutofillPopupViewDelegate> delegate,
                         views::Widget* parent_widget);
@@ -107,6 +111,8 @@
  private:
   friend class AutofillPopupBaseViewTest;
 
+  class Widget;
+
   // views::Views implementation.
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
 
@@ -125,6 +131,12 @@
   // eventually hide this view in the process.
   void HideController(PopupHidingReason reason);
 
+  // Return the web contents related to this.
+  content::WebContents* GetWebContents() const;
+
+  // The native view that |this|'s related widget should sit in.
+  gfx::NativeView GetParentNativeView() const;
+
   // Must return the container view for this popup.
   gfx::NativeView container_view();
 
@@ -137,6 +149,9 @@
   // The time when the popup was shown.
   base::Time show_time_;
 
+  // The browser this popup is shown in.
+  raw_ptr<Browser> browser_;
+
   // Ensures that the menu start event is not fired redundantly.
   bool is_ax_menu_start_event_fired_ = false;
 };
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc b/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
index 0bcd9254..79ae852 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
@@ -104,7 +104,6 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-// Regression test for crbug.com/391316
 IN_PROC_BROWSER_TEST_F(AutofillPopupBaseViewTest, CorrectBoundsTest) {
   gfx::RectF bounds(100, 150, 5, 5);
   EXPECT_CALL(mock_delegate_, element_bounds())
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
index 8ff81c5..30f6ebe 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -20,10 +20,14 @@
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/ui/autofill/autofill_popup_controller.h"
 #include "chrome/browser/ui/autofill/autofill_popup_controller_utils.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/user_education/feature_promo_controller.h"
 #include "chrome/browser/ui/views/autofill/autofill_popup_view_utils.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
 #include "chrome/browser/ui/views/chrome_typography_provider.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
@@ -31,6 +35,7 @@
 #include "components/autofill/core/browser/ui/popup_types.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/feature_engagement/public/feature_constants.h"
 #include "components/omnibox/browser/vector_icons.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
@@ -1280,7 +1285,6 @@
 }  // namespace
 
 /************** AutofillPopupRowView **************/
-
 void AutofillPopupRowView::SetSelected(bool selected) {
   if (selected == selected_)
     return;
@@ -1292,6 +1296,24 @@
   OnPropertyChanged(&selected_, views::kPropertyEffectsNone);
 }
 
+void AutofillPopupRowView::MaybeShowIphPromo() {
+  std::string feature_name = popup_view()
+                                 ->controller()
+                                 ->GetSuggestionAt(GetLineNumber())
+                                 .feature_for_iph;
+  if (feature_name.empty())
+    return;
+
+  if (feature_name == "IPH_AutofillVirtualCardSuggestion") {
+    SetProperty(views::kElementIdentifierKey,
+                kAutofillCreditCardSuggestionEntryElementId);
+    Browser* browser = popup_view()->browser();
+    DCHECK(browser);
+    browser->window()->MaybeShowFeaturePromo(
+        feature_engagement::kIPHAutofillVirtualCardSuggestionFeature);
+  }
+}
+
 void AutofillPopupRowView::OnThemeChanged() {
   views::View::OnThemeChanged();
   RefreshStyle();
@@ -1415,6 +1437,15 @@
       AutofillPopupBaseView::GetViewAccessibility().GetUniqueId());
 }
 
+void AutofillPopupViewNativeViews::OnWidgetVisibilityChanged(
+    views::Widget* widget,
+    bool visible) {
+  if (visible) {
+    for (auto* row_view : rows_)
+      row_view->MaybeShowIphPromo();
+  }
+}
+
 void AutofillPopupViewNativeViews::CreateChildViews() {
   RemoveAllChildViews();
   rows_.clear();
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
index 7c0c56d..2b95e50 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
@@ -39,6 +39,12 @@
   ~AutofillPopupRowView() override = default;
   void SetSelected(bool selected);
 
+  // Show the in-product-help promo anchored to this bubble if applicable. The
+  // in-product-help promo is a bubble anchored to this item to show educational
+  // messages. The promo bubble should only be shown once in one session and has
+  // a limit for how many times it can be shown at most in a period of time.
+  void MaybeShowIphPromo();
+
   // views::View:
   bool HandleAccessibleAction(const ui::AXActionData& action_data) override;
   void OnThemeChanged() override;
@@ -102,6 +108,7 @@
   // TODO(crbug.com/831603): Remove these overrides and the corresponding
   // methods in AutofillPopupBaseView.
   void OnMouseMoved(const ui::MouseEvent& event) override {}
+  void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
 
   base::WeakPtr<AutofillPopupController> controller() { return controller_; }
 
diff --git a/chrome/browser/ui/views/chrome_constrained_window_views_client.cc b/chrome/browser/ui/views/chrome_constrained_window_views_client.cc
index 5bb2b171..4ad0d74 100644
--- a/chrome/browser/ui/views/chrome_constrained_window_views_client.cc
+++ b/chrome/browser/ui/views/chrome_constrained_window_views_client.cc
@@ -46,5 +46,5 @@
 
 std::unique_ptr<constrained_window::ConstrainedWindowViewsClient>
 CreateChromeConstrainedWindowViewsClient() {
-  return base::WrapUnique(new ChromeConstrainedWindowViewsClient);
+  return std::make_unique<ChromeConstrainedWindowViewsClient>();
 }
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index 8ae74ecf..e86e3d9 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
+#include "chrome/browser/headless/headless_mode_util.h"
 #include "chrome/browser/themes/custom_theme_supplier.h"
 #include "chrome/browser/themes/theme_service.h"
 #include "chrome/browser/themes/theme_service_factory.h"
@@ -92,6 +93,7 @@
   views::Widget::InitParams params = native_browser_frame_->GetWidgetParams();
   params.name = "BrowserFrame";
   params.delegate = browser_view_;
+  params.headless_mode = headless::IsChromeNativeHeadless();
 
   if (native_browser_frame_->ShouldRestorePreviousBrowserWidgetState()) {
     Browser* browser = browser_view_->browser();
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
index b18e9ad..71e96b5 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
@@ -214,8 +214,14 @@
 // fullscreen.
 // This test does not make sense for the webUI tabstrip, since the frame is not
 // painted in that case.
+// Disable for lacros due to flakiness. crbug.com/1292412
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#define MAYBE_NonImmersiveFullscreen DISABLED_NonImmersiveFullscreen
+#else
+#define MAYBE_NonImmersiveFullscreen NonImmersiveFullscreen
+#endif
 IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewChromeOSTestNoWebUiTabStrip,
-                       NonImmersiveFullscreen) {
+                       MAYBE_NonImmersiveFullscreen) {
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
   content::WebContents* web_contents = browser_view->GetActiveWebContents();
   BrowserNonClientFrameViewChromeOS* frame_view =
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
index 2c560d3..ed23267c 100644
--- a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
+++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
@@ -81,7 +81,7 @@
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace) override {
     // The HaTS Next WebDialog runs with a non-primary OTR profile. This profile
     // cannot open new browser windows, so they are instead opened in the
diff --git a/chrome/browser/ui/views/media_router/web_contents_display_observer_view.cc b/chrome/browser/ui/views/media_router/web_contents_display_observer_view.cc
index 80d33b23..2061c2e 100644
--- a/chrome/browser/ui/views/media_router/web_contents_display_observer_view.cc
+++ b/chrome/browser/ui/views/media_router/web_contents_display_observer_view.cc
@@ -65,7 +65,7 @@
   }
 }
 
-void WebContentsDisplayObserverView::OnWidgetClosing(views::Widget* widget) {
+void WebContentsDisplayObserverView::OnWidgetDestroying(views::Widget* widget) {
   if (widget_)
     widget_->RemoveObserver(this);
   widget_ = nullptr;
diff --git a/chrome/browser/ui/views/media_router/web_contents_display_observer_view.h b/chrome/browser/ui/views/media_router/web_contents_display_observer_view.h
index dc2adbec..fc7d408 100644
--- a/chrome/browser/ui/views/media_router/web_contents_display_observer_view.h
+++ b/chrome/browser/ui/views/media_router/web_contents_display_observer_view.h
@@ -29,7 +29,7 @@
   void OnBrowserSetLastActive(Browser* browser) override;
 
   // views::WidgetObserver overrides:
-  void OnWidgetClosing(views::Widget* widget) override;
+  void OnWidgetDestroying(views::Widget* widget) override;
   void OnWidgetBoundsChanged(views::Widget* widget,
                              const gfx::Rect& new_bounds) override;
 
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
index 540ec7c..311376c 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -47,8 +47,6 @@
       views::LayoutProvider::Get()->GetSnappedDialogWidth(kDialogWidth);
   web_view->SetPreferredSize({width, kDialogHeight});
 
-  // TODO(crbug.com/1286276): Provide dialog type to WebUI so it can present
-  // the correct content.
   PrivacySandboxDialogUI* web_ui = web_view->GetWebContents()
                                        ->GetWebUI()
                                        ->GetController()
@@ -57,7 +55,9 @@
   DCHECK(web_ui);
   // Unretained is fine because this outlives the inner web UI.
   web_ui->Initialize(
-      base::BindOnce(&PrivacySandboxDialogView::Close, base::Unretained(this)));
+      browser->profile(),
+      base::BindOnce(&PrivacySandboxDialogView::Close, base::Unretained(this)),
+      dialog_type);
 
   SetButtons(ui::DIALOG_BUTTON_NONE);
   SetModalType(ui::MODAL_TYPE_WINDOW);
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
index 35e7ac9..bbfc263d 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -281,16 +281,6 @@
       content::RenderWidgetHost* render_widget_host) override {}
   bool IsShowingHungRendererDialog() override { return false; }
 
-  void ShowProfileSigninConfirmation(
-      Browser* browser,
-      const std::string& username,
-      bool prompt_for_new_profile,
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate)
-      override {
-    delegate->OnContinueSignin();
-    run_loop_->Quit();
-  }
-
   void ShowManagePasswordsBubble(bool user_action) override {}
   void HideManagePasswordsBubble() override {}
 
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
deleted file mode 100644
index 2bed309..0000000
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/bind.h"
-#include "base/feature_list.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/browser/ui/browser_navigator.h"
-#include "chrome/browser/ui/browser_navigator_params.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/views/chrome_layout_provider.h"
-#include "chrome/browser/ui/views/chrome_typography.h"
-#include "chrome/browser/ui/views/profiles/profile_menu_view.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/constrained_window/constrained_window_views.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/vector_icons/vector_icons.h"
-#include "content/public/browser/web_contents.h"
-#include "google_apis/gaia/gaia_auth_util.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/base/window_open_disposition.h"
-#include "ui/gfx/color_palette.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/gfx/range/range.h"
-#include "ui/views/background.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/button/md_text_button.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/styled_label.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/box_layout_view.h"
-#include "ui/views/layout/layout_provider.h"
-#include "ui/views/view_class_properties.h"
-#include "ui/views/views_delegate.h"
-#include "ui/views/widget/widget.h"
-
-constexpr int kBusinessIconSize = 20;
-constexpr int kPreferredWidth = 440;
-
-ProfileSigninConfirmationDialogViews::ProfileSigninConfirmationDialogViews(
-    Browser* browser,
-    const std::string& username,
-    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
-    bool prompt_for_new_profile)
-    : browser_(browser),
-      username_(username),
-      delegate_(std::move(delegate)),
-      prompt_for_new_profile_(prompt_for_new_profile),
-      use_work_profile_wording_(base::FeatureList::IsEnabled(
-          features::kSyncConfirmationUpdatedText)) {
-  using Delegate = ui::ProfileSigninConfirmationDelegate;
-  using DelegateNotifyFn = void (Delegate::*)();
-  auto notify_delegate = [](ProfileSigninConfirmationDialogViews* dialog,
-                            DelegateNotifyFn fn) {
-    if (dialog->delegate_) {
-      (dialog->delegate_.get()->*fn)();
-      dialog->delegate_.reset();
-    }
-  };
-
-  auto builder =
-      views::Builder<ProfileSigninConfirmationDialogViews>(this)
-          .SetButtonLabel(
-              ui::DIALOG_BUTTON_CANCEL,
-              l10n_util::GetStringUTF16(IDS_ENTERPRISE_SIGNIN_CANCEL))
-          .SetModalType(ui::MODAL_TYPE_WINDOW)
-          .SetAcceptCallback(base::BindOnce(
-              notify_delegate, base::Unretained(this),
-              prompt_for_new_profile_ ? &Delegate::OnSigninWithNewProfile
-                                      : &Delegate::OnContinueSignin))
-          .SetCancelCallback(base::BindOnce(notify_delegate,
-                                            base::Unretained(this),
-                                            &Delegate::OnCancelSignin));
-
-  if (use_work_profile_wording_) {
-    builder
-        .SetTitle(IDS_ENTERPRISE_SIGNIN_WORK_PROFILE_TITLE)
-        // Create business icon.
-        .SetIcon(gfx::CreateVectorIcon(
-            gfx::IconDescription(vector_icons::kBusinessIcon, kBusinessIconSize,
-                                 gfx::kChromeIconGrey)))
-        .SetShowIcon(true)
-        .SetDefaultButton(ui::DIALOG_BUTTON_OK)
-        .SetButtonLabel(ui::DIALOG_BUTTON_OK,
-                        l10n_util::GetStringUTF16(
-                            prompt_for_new_profile_
-                                ? IDS_ENTERPRISE_SIGNIN_CREATE_NEW_WORK_PROFILE
-                                : IDS_ENTERPRISE_SIGNIN_CONTINUE));
-  } else {
-    builder.SetShowCloseButton(false)
-        .SetTitle(IDS_ENTERPRISE_SIGNIN_TITLE)
-        .SetDefaultButton(ui::DIALOG_BUTTON_NONE)
-        .SetButtonLabel(ui::DIALOG_BUTTON_OK,
-                        l10n_util::GetStringUTF16(
-                            prompt_for_new_profile_
-                                ? IDS_ENTERPRISE_SIGNIN_CREATE_NEW_PROFILE
-                                : IDS_ENTERPRISE_SIGNIN_CONTINUE));
-    if (prompt_for_new_profile) {
-      builder.SetExtraView(views::Builder<views::MdTextButton>()
-                               .SetCallback(base::BindRepeating(
-                                   &ProfileSigninConfirmationDialogViews::
-                                       ContinueSigninButtonPressed,
-                                   base::Unretained(this)))
-                               .SetText(l10n_util::GetStringUTF16(
-                                   IDS_ENTERPRISE_SIGNIN_CONTINUE)));
-    }
-  }
-
-  std::move(builder).BuildChildren();
-
-  chrome::RecordDialogCreation(
-      chrome::DialogIdentifier::PROFILE_SIGNIN_CONFIRMATION);
-}
-
-ProfileSigninConfirmationDialogViews::~ProfileSigninConfirmationDialogViews() {}
-
-// static
-void ProfileSigninConfirmationDialogViews::Show(
-    Browser* browser,
-    const std::string& username,
-    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
-    bool prompt_for_new_profile) {
-  auto dialog = std::make_unique<ProfileSigninConfirmationDialogViews>(
-      browser, username, std::move(delegate), prompt_for_new_profile);
-  constrained_window::CreateBrowserModalDialogViews(
-      dialog.release(), browser->window()->GetNativeWindow())
-      ->Show();
-}
-
-void ProfileSigninConfirmationDialogViews::ViewHierarchyChanged(
-    const views::ViewHierarchyChangedDetails& details) {
-  views::DialogDelegateView::ViewHierarchyChanged(details);
-  if (!details.is_add || details.child != this)
-    return;
-
-  if (use_work_profile_wording_)
-    BuildWorkProfileView();
-  else
-    BuildDefaultView();
-}
-
-void ProfileSigninConfirmationDialogViews::BuildDefaultView() {
-  DCHECK(!use_work_profile_wording_);
-
-  size_t offset;
-  std::vector<size_t> offsets;
-  const std::u16string domain =
-      base::ASCIIToUTF16(gaia::ExtractDomainName(username_));
-  const std::u16string username = base::ASCIIToUTF16(username_);
-  const std::u16string prompt_text =
-      l10n_util::GetStringFUTF16(IDS_ENTERPRISE_SIGNIN_ALERT, domain, &offset);
-  views::StyledLabel::RangeStyleInfo bold_style;
-  bold_style.text_style = STYLE_EMPHASIZED;
-  const std::u16string learn_more_text =
-      l10n_util::GetStringUTF16(IDS_LEARN_MORE);
-  const std::u16string signin_explanation_text = l10n_util::GetStringFUTF16(
-      prompt_for_new_profile_
-          ? IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITH_PROFILE_CREATION
-          : IDS_ENTERPRISE_SIGNIN_EXPLANATION_WITHOUT_PROFILE_CREATION,
-      username, learn_more_text, &offsets);
-  const SkColor kPromptBarBackgroundColor =
-      ui::GetSigninConfirmationPromptBarColor(GetColorProvider(), 0x0A);
-  const gfx::Insets content_insets =
-      views::LayoutProvider::Get()->GetDialogInsetsForContentType(
-          views::DialogContentType::kControl, views::DialogContentType::kText);
-
-  views::Builder<ProfileSigninConfirmationDialogViews>(this)
-      .SetBorder(views::CreateEmptyBorder(content_insets.top(), 0,
-                                          content_insets.bottom(), 0))
-      // Layout the components.
-      .SetLayoutManager(std::make_unique<views::BoxLayout>(
-          views::BoxLayout::Orientation::kVertical, gfx::Insets(),
-          content_insets.top()))
-      .AddChildren(
-          views::Builder<views::BoxLayoutView>()
-              .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
-              .SetBetweenChildSpacing(
-                  ChromeLayoutProvider::Get()->GetDistanceMetric(
-                      views::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING))
-              .SetBorder(views::CreateEmptyBorder(
-                  ChromeLayoutProvider::Get()->GetInsetsMetric(
-                      views::INSETS_DIALOG_SUBSECTION)))
-              .SetBackground(
-                  views::CreateSolidBackground(kPromptBarBackgroundColor))
-              .AddChildren(
-                  views::Builder<views::ImageView>().SetImage(
-                      gfx::CreateVectorIcon(gfx::IconDescription(
-                          vector_icons::kBusinessIcon, kBusinessIconSize,
-                          gfx::kChromeIconGrey))),
-                  views::Builder<views::StyledLabel>()
-                      .SetDisplayedOnBackgroundColor(kPromptBarBackgroundColor)
-                      .SetText(prompt_text)
-                      .AddStyleRange(gfx::Range(offset, offset + domain.size()),
-                                     bold_style)),
-          views::Builder<views::StyledLabel>()
-              .SetText(signin_explanation_text)
-              .AddStyleRange(
-                  gfx::Range(offsets[1], offsets[1] + learn_more_text.size()),
-                  views::StyledLabel::RangeStyleInfo::CreateForLink(
-                      base::BindRepeating(
-                          &ProfileSigninConfirmationDialogViews::
-                              LearnMoreClicked,
-                          base::Unretained(this))))
-              .SizeToFit(kPreferredWidth)
-              .SetProperty(views::kMarginsKey,
-                           gfx::Insets(0, content_insets.left(), 0,
-                                       content_insets.right())))
-      .BuildChildren();
-}
-
-void ProfileSigninConfirmationDialogViews::BuildWorkProfileView() {
-  DCHECK(use_work_profile_wording_);
-
-  // Define the explanation label text.
-  size_t learn_more_offset;
-  const std::u16string learn_more_text =
-      l10n_util::GetStringUTF16(IDS_LEARN_MORE);
-  const std::u16string signin_explanation_text =
-      l10n_util::GetStringFUTF16(IDS_ENTERPRISE_SIGNIN_WORK_PROFILE_EXPLANATION,
-                                 learn_more_text, &learn_more_offset);
-  const gfx::Insets content_insets =
-      views::LayoutProvider::Get()->GetDialogInsetsForContentType(
-          views::DialogContentType::kControl, views::DialogContentType::kText);
-  const gfx::Insets control_insets =
-      gfx::Insets(0, content_insets.left(), 0, content_insets.right());
-
-  views::Builder<ProfileSigninConfirmationDialogViews>(this)
-      // The prompt bar needs to go to the edge of the dialog, so remove
-      // horizontal insets.
-      .SetBorder(views::CreateEmptyBorder(content_insets.top(), 0,
-                                          content_insets.bottom(), 0))
-      .SetLayoutManager(std::make_unique<views::BoxLayout>(
-          views::BoxLayout::Orientation::kVertical,
-          gfx::Insets(content_insets.top(), 0, 0, 0), 10))
-      .AddChildren(
-          // Create the explanation label first row.
-          views::Builder<views::Label>()
-              .SetText(l10n_util::GetStringUTF16(
-                  IDS_ENTERPRISE_SIGNIN_WORK_PROFILE_CREATION))
-              .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
-              .SetMultiLine(true)
-              .SizeToFit(kPreferredWidth)
-              .SetProperty(views::kMarginsKey, control_insets),
-          views::Builder<views::Label>()
-              .SetText(l10n_util::GetStringUTF16(
-                  IDS_ENTERPRISE_SIGNIN_WORK_PROFILE_ISOLATION_NOTICE))
-              .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
-              .SetProperty(views::kMarginsKey, control_insets),
-          // Create the explanation label.
-          views::Builder<views::StyledLabel>()
-              .SetText(signin_explanation_text)
-              .AddStyleRange(
-                  gfx::Range(learn_more_offset,
-                             learn_more_offset + learn_more_text.size()),
-                  views::StyledLabel::RangeStyleInfo::CreateForLink(
-                      base::BindRepeating(
-                          &ProfileSigninConfirmationDialogViews::
-                              LearnMoreClicked,
-                          base::Unretained(this))))
-              .SizeToFit(kPreferredWidth)
-              .SetProperty(views::kMarginsKey, control_insets))
-      .BuildChildren();
-}
-
-void ProfileSigninConfirmationDialogViews::ContinueSigninButtonPressed() {
-  DCHECK(prompt_for_new_profile_);
-  if (delegate_) {
-    delegate_->OnContinueSignin();
-    delegate_ = nullptr;
-  }
-  GetWidget()->Close();
-}
-
-void ProfileSigninConfirmationDialogViews::LearnMoreClicked(
-    const ui::Event& event) {
-  NavigateParams params(
-      browser_, GURL("https://support.google.com/chromebook/answer/1331549"),
-      ui::PAGE_TRANSITION_LINK);
-  params.disposition = ui::DispositionFromEventFlags(
-      event.flags(), WindowOpenDisposition::NEW_POPUP);
-  params.window_action = NavigateParams::SHOW_WINDOW;
-  Navigate(&params);
-}
-
-BEGIN_METADATA(ProfileSigninConfirmationDialogViews, views::DialogDelegateView)
-END_METADATA
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h
deleted file mode 100644
index 5951e216..0000000
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_SYNC_PROFILE_SIGNIN_CONFIRMATION_DIALOG_VIEWS_H_
-#define CHROME_BROWSER_UI_VIEWS_SYNC_PROFILE_SIGNIN_CONFIRMATION_DIALOG_VIEWS_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
-#include "ui/base/metadata/metadata_header_macros.h"
-#include "ui/views/metadata/view_factory.h"
-#include "ui/views/window/dialog_delegate.h"
-
-class Browser;
-
-// A tab-modal dialog to allow a user signing in with a managed account
-// to create a new Chrome profile.
-class ProfileSigninConfirmationDialogViews : public views::DialogDelegateView {
- public:
-  METADATA_HEADER(ProfileSigninConfirmationDialogViews);
-
-  // Create and show the dialog, which owns itself.
-  static void Show(
-      Browser* browser,
-      const std::string& username,
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
-      bool prompt_for_new_profile);
-
-  ProfileSigninConfirmationDialogViews(
-      Browser* browser,
-      const std::string& username,
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
-      bool prompt_for_new_profile);
-  ProfileSigninConfirmationDialogViews(
-      const ProfileSigninConfirmationDialogViews&) = delete;
-  ProfileSigninConfirmationDialogViews& operator=(
-      const ProfileSigninConfirmationDialogViews&) = delete;
-  ~ProfileSigninConfirmationDialogViews() override;
-
- private:
-  // views::DialogDelegateView:
-  void ViewHierarchyChanged(
-      const views::ViewHierarchyChangedDetails& details) override;
-
-  void ContinueSigninButtonPressed();
-
-  // Called when the "learn more" link is clicked.
-  void LearnMoreClicked(const ui::Event& event);
-
-  // Builds the default view for the dialog.
-  void BuildDefaultView();
-
-  // Build the view with the "work profile" wording enabled by
-  // |features::SyncConfirmationUpdatedText|.
-  void BuildWorkProfileView();
-
-  // Weak ptr to parent view.
-  const raw_ptr<Browser> browser_;
-
-  // The GAIA username being signed in.
-  std::string username_;
-
-  // Dialog button handler.
-  std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate_;
-
-  // Whether the user should be prompted to create a new profile.
-  const bool prompt_for_new_profile_;
-
-  const bool use_work_profile_wording_;
-};
-
-BEGIN_VIEW_BUILDER(,
-                   ProfileSigninConfirmationDialogViews,
-                   views::DialogDelegateView)
-END_VIEW_BUILDER
-
-DEFINE_VIEW_BUILDER(, ProfileSigninConfirmationDialogViews)
-
-#endif  // CHROME_BROWSER_UI_VIEWS_SYNC_PROFILE_SIGNIN_CONFIRMATION_DIALOG_VIEWS_H_
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc
deleted file mode 100644
index 03fbe3b..0000000
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
-
-#include "base/command_line.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
-#include "chrome/browser/ui/tab_dialogs.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/test/test_browser_dialog.h"
-#include "chrome/browser/ui/ui_features.h"
-#include "components/bookmarks/browser/bookmark_model.h"
-#include "content/public/test/browser_test.h"
-
-namespace {
-
-// Test delegate passed to the confirmation dialog to receive (and currently
-// ignore) the result from the dialog.
-class TestSigninDialogDelegate : public ui::ProfileSigninConfirmationDelegate {
- public:
-  TestSigninDialogDelegate() {}
-
-  TestSigninDialogDelegate(const TestSigninDialogDelegate&) = delete;
-  TestSigninDialogDelegate& operator=(const TestSigninDialogDelegate&) = delete;
-
-  void OnCancelSignin() override {}
-  void OnContinueSignin() override {}
-  void OnSigninWithNewProfile() override {}
-};
-
-}  // namespace
-
-class ProfileSigninConfirmationDialogTest : public DialogBrowserTest {
- public:
-  ProfileSigninConfirmationDialogTest() {}
-
-  ProfileSigninConfirmationDialogTest(
-      const ProfileSigninConfirmationDialogTest&) = delete;
-  ProfileSigninConfirmationDialogTest& operator=(
-      const ProfileSigninConfirmationDialogTest&) = delete;
-
-  void ShowUi(const std::string& name) override {
-    content::WebContents* web_contents =
-        browser()->tab_strip_model()->GetActiveWebContents();
-    TabDialogs::FromWebContents(web_contents)
-        ->ShowProfileSigninConfirmation(
-            browser(), "username@example.com",
-            /*prompt_for_new_profile=*/true,
-            std::make_unique<TestSigninDialogDelegate>());
-  }
-};
-
-class WorkProfileSigninConfirmationDialogTest
-    : public ProfileSigninConfirmationDialogTest {
- public:
-  WorkProfileSigninConfirmationDialogTest() {
-    features_.InitAndEnableFeature(features::kSyncConfirmationUpdatedText);
-  }
-
- private:
-  base::test::ScopedFeatureList features_;
-};
-
-// Test that calls ShowUi("default").
-IN_PROC_BROWSER_TEST_F(ProfileSigninConfirmationDialogTest, InvokeUi_default) {
-  ShowAndVerifyUi();
-}
-
-IN_PROC_BROWSER_TEST_F(WorkProfileSigninConfirmationDialogTest,
-                       InvokeUi_default) {
-  ShowAndVerifyUi();
-}
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc
deleted file mode 100644
index 95f605a6..0000000
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/raw_ptr.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
-#include "chrome/test/views/chrome_views_test_base.h"
-#include "ui/views/controls/button/label_button.h"
-#include "ui/views/test/widget_test.h"
-
-namespace {
-
-class TestDelegate : public ui::ProfileSigninConfirmationDelegate {
- public:
-  TestDelegate(int* cancels, int* continues, int* signins)
-      : cancels_(cancels), continues_(continues), signins_(signins) {}
-  ~TestDelegate() override = default;
-
-  void OnCancelSignin() override { (*cancels_)++; }
-  void OnContinueSignin() override { (*continues_)++; }
-  void OnSigninWithNewProfile() override { (*signins_)++; }
-
-  raw_ptr<int> cancels_;
-  raw_ptr<int> continues_;
-  raw_ptr<int> signins_;
-};
-
-}  // namespace
-
-class ProfileSigninConfirmationDialogTest : public ChromeViewsTestBase {
- public:
-  void BuildDialog(
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate,
-      bool prompt_for_new_profile = true) {
-    auto dialog = std::make_unique<ProfileSigninConfirmationDialogViews>(
-        nullptr, "foo@bar.com", std::move(delegate), prompt_for_new_profile);
-    weak_dialog_ = dialog.get();
-
-    widget_ = views::DialogDelegate::CreateDialogWidget(dialog.release(),
-                                                        GetContext(), nullptr);
-    widget_->Show();
-  }
-
-  void PressButton(views::Button* button) {
-    views::test::WidgetDestroyedWaiter destroy_waiter(widget_);
-    // Synthesize both press & release - different platforms have different
-    // notions about whether buttons activate on press or on release.
-    button->OnKeyPressed(
-        ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, ui::EF_NONE));
-    button->OnKeyReleased(
-        ui::KeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_SPACE, ui::EF_NONE));
-    destroy_waiter.Wait();
-  }
-
-  raw_ptr<ProfileSigninConfirmationDialogViews> weak_dialog_ = nullptr;
-  raw_ptr<views::Widget> widget_ = nullptr;
-  base::test::ScopedFeatureList features_;
-};
-
-// Regression test for https://crbug.com/1054866
-TEST_F(ProfileSigninConfirmationDialogTest, CloseButtonOnlyCallsDelegateOnce) {
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  // Press the "continue signin" button.
-  views::Button* button =
-      static_cast<views::Button*>(weak_dialog_->GetExtraView());
-  PressButton(button);
-
-  // The delegate should *not* have gotten a call back to OnCancelSignin. If the
-  // fix for https://crbug.com/1054866 regresses, either it will, or we'll have
-  // crashed above.
-  EXPECT_EQ(cancels, 0);
-  EXPECT_EQ(continues, 1);
-  EXPECT_EQ(signins, 0);
-}
-
-// Regression test for https://crbug.com/1091232
-TEST_F(ProfileSigninConfirmationDialogTest, CancelButtonOnlyCallsDelegateOnce) {
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  // Press the "Cancel" button.
-  views::Button* button = weak_dialog_->GetCancelButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 1);
-  EXPECT_EQ(continues, 0);
-  EXPECT_EQ(signins, 0);
-}
-
-// Regression test for https://crbug.com/1091232
-TEST_F(ProfileSigninConfirmationDialogTest,
-       NewProfileButtonOnlyCallsDelegateOnce) {
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  // Press the "Signin with new profile" button.
-  views::Button* button = weak_dialog_->GetOkButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 0);
-  EXPECT_EQ(continues, 0);
-  EXPECT_EQ(signins, 1);
-}
-
-// Regression test for https://crbug.com/1091232
-TEST_F(ProfileSigninConfirmationDialogTest,
-       CancelButtonOnlyCallsDelegateOnceProfileVersion) {
-  features_.InitAndEnableFeature(features::kSyncConfirmationUpdatedText);
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  // Press the "Cancel" button.
-  views::Button* button = weak_dialog_->GetCancelButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 1);
-  EXPECT_EQ(continues, 0);
-  EXPECT_EQ(signins, 0);
-}
-
-TEST_F(ProfileSigninConfirmationDialogTest,
-       NewProfileButtonOnlyCallsDelegateOnceWorkProfileVersion) {
-  features_.InitAndEnableFeature(features::kSyncConfirmationUpdatedText);
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  // Press the "Signin with new profile" button.
-  views::Button* button = weak_dialog_->GetOkButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 0);
-  EXPECT_EQ(continues, 0);
-  EXPECT_EQ(signins, 1);
-}
-
-TEST_F(ProfileSigninConfirmationDialogTest,
-       OKButtonContinuesForFreshWorkProfileVersion) {
-  features_.InitAndEnableFeature(features::kSyncConfirmationUpdatedText);
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate), /*prompt_for_new_profile=*/false);
-  widget_->Show();
-
-  // Press the "Signin with new profile" button.
-  views::Button* button = weak_dialog_->GetOkButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 0);
-  EXPECT_EQ(continues, 1);
-  EXPECT_EQ(signins, 0);
-}
-
-TEST_F(ProfileSigninConfirmationDialogTest, NoExtraViewWorkProfileVersion) {
-  features_.InitAndEnableFeature(features::kSyncConfirmationUpdatedText);
-  int cancels = 0;
-  int continues = 0;
-  int signins = 0;
-  auto delegate =
-      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
-  BuildDialog(std::move(delegate));
-  widget_->Show();
-
-  EXPECT_EQ(nullptr, weak_dialog_->GetExtraView());
-
-  // Press the "Cancel" button.
-  views::Button* button = weak_dialog_->GetCancelButton();
-  PressButton(button);
-
-  EXPECT_EQ(cancels, 1);
-  EXPECT_EQ(continues, 0);
-  EXPECT_EQ(signins, 0);
-}
diff --git a/chrome/browser/ui/views/tab_dialogs_views.cc b/chrome/browser/ui/views/tab_dialogs_views.cc
index c34a5a05..aa24057 100644
--- a/chrome/browser/ui/views/tab_dialogs_views.cc
+++ b/chrome/browser/ui/views/tab_dialogs_views.cc
@@ -7,18 +7,12 @@
 #include <memory>
 #include <utility>
 
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/views/collected_cookies_views.h"
 #include "chrome/browser/ui/views/hung_renderer_view.h"
 #include "chrome/browser/ui/views/passwords/password_bubble_view_base.h"
 #include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
 #include "content/public/browser/web_contents.h"
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
-#endif
-
 // static
 void TabDialogs::CreateForWebContents(content::WebContents* contents) {
   DCHECK(contents);
@@ -59,19 +53,6 @@
   return HungRendererDialogView::IsShowingForWebContents(web_contents_);
 }
 
-void TabDialogsViews::ShowProfileSigninConfirmation(
-    Browser* browser,
-    const std::string& username,
-    bool prompt_for_new_profile,
-    std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) {
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-  ProfileSigninConfirmationDialogViews::Show(
-      browser, username, std::move(delegate), prompt_for_new_profile);
-#else
-  NOTREACHED();
-#endif
-}
-
 void TabDialogsViews::ShowManagePasswordsBubble(bool user_action) {
   if (PasswordBubbleViewBase::manage_password_bubble()) {
     // The bubble is currently shown for some other tab. We should close it now
diff --git a/chrome/browser/ui/views/tab_dialogs_views.h b/chrome/browser/ui/views/tab_dialogs_views.h
index 467a3d00..f4f310f 100644
--- a/chrome/browser/ui/views/tab_dialogs_views.h
+++ b/chrome/browser/ui/views/tab_dialogs_views.h
@@ -27,11 +27,6 @@
   void HideHungRendererDialog(
       content::RenderWidgetHost* render_widget_host) override;
   bool IsShowingHungRendererDialog() override;
-  void ShowProfileSigninConfirmation(
-      Browser* browser,
-      const std::string& username,
-      bool prompt_for_new_profile,
-      std::unique_ptr<ui::ProfileSigninConfirmationDelegate> delegate) override;
   void ShowManagePasswordsBubble(bool user_action) override;
   void HideManagePasswordsBubble() override;
 
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index 8d5b5c3..2937cef 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -17,6 +17,7 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/feature_engagement/public/feature_constants.h"
+#include "components/strings/grit/components_strings.h"
 #include "ui/base/interaction/interaction_sequence.h"
 #include "ui/views/interaction/element_tracker_views.h"
 
@@ -52,6 +53,16 @@
           feature_engagement::kIPHDesktopPwaInstallFeature))
     return;
 
+  // kIPHAutofillVirtualCardSuggestionFeature:
+  registry.RegisterFeature(std::move(
+      FeaturePromoSpecification::CreateForToastPromo(
+          feature_engagement::kIPHAutofillVirtualCardSuggestionFeature,
+          kAutofillCreditCardSuggestionEntryElementId,
+          IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL,
+          IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL,
+          FeaturePromoSpecification::AcceleratorInfo())
+          .SetBubbleArrow(HelpBubbleArrow::kLeftCenter)));
+
   // kIPHDesktopPwaInstallFeature:
   registry.RegisterFeature(FeaturePromoSpecification::CreateForLegacyPromo(
       &feature_engagement::kIPHDesktopPwaInstallFeature, kInstallPwaElementId,
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
index bb1f165..c913b09 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -366,17 +366,9 @@
   helper_.CheckAppInListWindowed("SiteA");
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown \
-  DISABLED_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown
-#else
-#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown \
-  WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown) {
+    WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_NavSiteA_InstIconNotShown_LaunchIconShown) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -723,17 +715,9 @@
   helper_.CheckLaunchIconShown();
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone \
-  DISABLED_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone
-#else
-#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone \
-  WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone) {
+    WebAppIntegration_InstPlcyWinNoShctSiteA_InListWinSiteA_LaunchFromListSiteA_WindowCreated_Standalone) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -846,17 +830,9 @@
   helper_.CheckAppNotInList("SiteA");
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
-  DISABLED_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
-#else
-#define MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
-  WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
+    WebAppIntegration_InstPlcyTabNoShctSiteA_InListTabbedSiteA_InstCrtShctWindowedSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1104,10 +1080,17 @@
   helper_.CheckAppInListWindowed("SiteA");
 }
 
-// TODO(crbug.com/1279704): Test is consistently failing on Mac and Win7.
+// TODO(crbug.com/1279704): Test is consistently failing on Win7.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
+  DISABLED_WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
+#else
+#define MAYBE_WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA \
+  WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    DISABLED_WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
+    MAYBE_WebAppIntegration_InstPlcyTabShctSiteA_InListTabbedSiteA_InstOmniboxSiteA_InListWinSiteA_WindowCreated_UninstallPlcySiteA_InListWinSiteA) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1177,17 +1160,9 @@
   helper_.CheckLaunchIconNotShown();
 }
 
-// TODO(crbug.com/1286616): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown \
-  DISABLED_WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown
-#else
-#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown \
-  WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown) {
+    WebAppIntegration_InstCrtShctWindowedSiteC_InListWinSiteC_NavSiteC_InstIconNotShown_LaunchIconShown) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1248,17 +1223,9 @@
   helper_.CheckLaunchIconShown();
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated \
-  DISABLED_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated
-#else
-#define MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated \
-  WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated) {
+    WebAppIntegration_InstPlcyWinNoShctSiteC_InListWinSiteC_LaunchFromListSiteC_WindowCreated) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1340,17 +1307,9 @@
   helper_.CheckWindowDisplayMinimal();
 }
 
-// TODO(crbug.com/1286616): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown \
-  DISABLED_WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown
-#else
-#define MAYBE_WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown \
-  WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown) {
+    WebAppIntegration_InstOmniboxSiteB_NavSiteB_LaunchIconShown) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1359,17 +1318,9 @@
   helper_.CheckLaunchIconShown();
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal \
-  DISABLED_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal
-#else
-#define MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal \
-  WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal) {
+    WebAppIntegration_InstOmniboxSiteB_LaunchFromListSiteB_Minimal) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1422,17 +1373,9 @@
   helper_.CheckWindowDisplayMinimal();
 }
 
-// TODO(crbug.com/1286616): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown \
-  DISABLED_WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown
-#else
-#define MAYBE_WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown \
-  WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown) {
+    WebAppIntegration_InstMenuOptionSiteB_NavSiteB_LaunchIconShown) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1594,17 +1537,9 @@
   helper_.CheckInstallIconNotShown();
 }
 
-// TODO(crbug.com/1279704): Flaky on macOS.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
-  DISABLED_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
-#else
-#define MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
-  WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
-#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    MAYBE_WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) {
+    WebAppIntegration_InstCrtShctWindowedSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1693,9 +1628,17 @@
   helper_.CheckWindowCreated();
 }
 
+// TODO(crbug.com/1281083): Flaky on Win7.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal \
+  DISABLED_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal
+#else
+#define MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal \
+  WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
-    DISABLED_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal) {
+    MAYBE_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_ClosePWA_MnfstUpdateDsplMinimalSiteA_LaunchFromIconSiteA_Minimal) {
   // Test contents are generated by script. Please do not modify!
   // See `chrome/test/webapps/README.md` for more info.
   // Sheriffs: Disabling this test is supported.
@@ -1722,7 +1665,14 @@
   helper_.CheckWindowDisplayStandalone();
 }
 
-// TODO(crbug.com/1279704): Test is consistently failing on Mac and Win7.
+// TODO(crbug.com/1279704): Test is consistently failing Win7.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
+  DISABLED_WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
+#else
+#define MAYBE_WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated \
+  WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated
+#endif
 IN_PROC_BROWSER_TEST_F(
     WebAppIntegrationBrowserTest,
     DISABLED_WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabNoShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
index 9d590b8..1cd2b41a 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
@@ -14,17 +14,20 @@
 // Manual tests:
 
 IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux,
-                       CheckAppShortcutExists) {
+                       CheckPlatformShortcutAndIcon) {
+  helper_.CheckPlatformShortcutNotExists("SiteA");
+  helper_.CheckPlatformShortcutNotExists("SiteB");
   helper_.InstallCreateShortcutWindowed("SiteA");
-  helper_.CheckAppShortcutExists("SiteA");
+  helper_.CheckPlatformShortcutAndIcon("SiteA");
+  helper_.CheckPlatformShortcutNotExists("SiteB");
 }
 
 IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux,
                        CheckPolicyAppUninstallWorks) {
   helper_.InstallPolicyAppWindowedShortcut("SiteA");
-  helper_.CheckAppShortcutExists("SiteA");
+  helper_.CheckPlatformShortcutAndIcon("SiteA");
   helper_.UninstallPolicyApp("SiteA");
-  helper_.CheckAppShortcutNotExists("SiteA");
+  helper_.CheckPlatformShortcutNotExists("SiteA");
 }
 
 // Generated tests:
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 36978a1..dcc95e33 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
@@ -95,8 +95,10 @@
 #endif
 
 #if BUILDFLAG(IS_MAC)
+#include <ImageIO/ImageIO.h>
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
 #include "chrome/browser/web_applications/app_shim_registry_mac.h"
+#include "skia/ext/skia_utils_mac.h"
 #endif
 
 #if BUILDFLAG(IS_WIN)
@@ -142,6 +144,22 @@
                                          {"SiteAFoo", "site_a/foo"},
                                          {"SiteABar", "site_a/bar"}};
 
+const base::flat_map<std::string, std::string> g_site_mode_to_app_name = {
+    {"SiteA", "Site A"},
+    {"SiteB", "Site B"},
+    {"SiteC", "Site C"},
+    {"SiteAFoo", "Site A Foo"},
+    {"SiteABar", "Site A Bar"}};
+
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+const base::flat_map<std::string, SkColor> g_app_name_icon_color = {
+    {"Site A", SkColorSetARGB(0xFF, 0x00, 0x00, 0x00)},
+    {"Site B", SkColorSetARGB(0xFF, 0x00, 0x00, 0x00)},
+    {"Site C", SkColorSetARGB(0x00, 0x00, 0x00, 0x00)},
+    {"Site A Foo", SkColorSetARGB(0xFF, 0x00, 0x00, 0x00)},
+    {"Site A Bar", SkColorSetARGB(0xFF, 0x00, 0x00, 0x00)}};
+#endif
+
 #if !BUILDFLAG(IS_CHROMEOS)
 class TestAppLauncherHandler : public AppLauncherHandler {
  public:
@@ -201,11 +219,11 @@
   return shortcut_profile;
 }
 
-bool IsShortcutFoundForProfile(Profile* profile,
-                               const std::string& name,
-                               base::FilePath shortcut_dir) {
+SkColor IsShortcutAndIconFoundForProfile(Profile* profile,
+                                         const std::string& name,
+                                         base::FilePath shortcut_dir,
+                                         SkColor expected_icon_pixel_color) {
   std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
-
   base::FileEnumerator enumerator(shortcut_dir, false,
                                   base::FileEnumerator::FILES);
   while (!enumerator.Next().empty()) {
@@ -213,8 +231,10 @@
     if (re2::RE2::FullMatch(converter.to_bytes(shortcut_filename),
                             name + "(.*).lnk")) {
       base::FilePath shortcut_path = shortcut_dir.Append(shortcut_filename);
-      if (GetShortcutProfile(shortcut_path) == profile->GetBaseName())
-        return true;
+      if (GetShortcutProfile(shortcut_path) == profile->GetBaseName()) {
+        SkColor icon_pixel_color = GetIconTopLeftColor(shortcut_path);
+        return (icon_pixel_color == expected_icon_pixel_color);
+      }
     }
   }
   return false;
@@ -1016,7 +1036,7 @@
   AfterStateCheckAction();
 }
 
-void WebAppIntegrationTestDriver::CheckAppShortcutExists(
+void WebAppIntegrationTestDriver::CheckPlatformShortcutAndIcon(
     const std::string& site_mode) {
   BeforeStateCheckAction();
   absl::optional<AppState> app_state = GetAppBySiteMode(
@@ -1026,8 +1046,12 @@
   AfterStateCheckAction();
 }
 
-void WebAppIntegrationTestDriver::CheckAppShortcutNotExists(
+void WebAppIntegrationTestDriver::CheckPlatformShortcutNotExists(
     const std::string& site_mode) {
+  // This is to handle if the check happens at the very beginning of the test,
+  // when no web app is installed (or any other action has happened yet).
+  if (!before_state_change_action_state_ && !after_state_change_action_state_)
+    return;
   BeforeStateCheckAction();
   absl::optional<AppState> app_state = GetAppBySiteMode(
       after_state_change_action_state_.get(), profile(), site_mode);
@@ -1035,10 +1059,17 @@
     app_state = GetAppBySiteMode(before_state_change_action_state_.get(),
                                  profile(), site_mode);
   }
-  ASSERT_TRUE(app_state)
-      << "App has to be installed now or before last state change action";
-
-  EXPECT_FALSE(IsShortcutCreated(profile(), app_state->name, app_state->id));
+  std::string app_name;
+  AppId app_id;
+  // If app_state is still nullptr, the site_mode is manually mapped to get an
+  // app_name and app_id remains empty.
+  if (!app_state) {
+    app_name = g_site_mode_to_app_name.find(site_mode)->second;
+  } else {
+    app_name = app_state->name;
+    app_id = app_state->id;
+  }
+  EXPECT_FALSE(IsShortcutAndIconCreated(profile(), app_name, app_id));
   AfterStateCheckAction();
 }
 
@@ -1377,8 +1408,8 @@
                    registrar.GetAppEffectiveDisplayMode(app_id),
                    registrar.GetAppUserDisplayMode(app_id),
                    registrar.IsLocallyInstalled(app_id),
-                   IsShortcutCreated(profile, registrar.GetAppShortName(app_id),
-                                     app_id)));
+                   IsShortcutAndIconCreated(
+                       profile, registrar.GetAppShortName(app_id), app_id)));
     }
     profile_state_map.emplace(
         profile, ProfileState(std::move(browser_state), std::move(app_state)));
@@ -1558,38 +1589,53 @@
   return LaunchWebAppBrowserAndWait(profile(), app_state->id);
 }
 
-bool WebAppIntegrationTestDriver::IsShortcutCreated(Profile* profile,
-                                                    const std::string& name,
-                                                    const AppId& id) {
+bool WebAppIntegrationTestDriver::IsShortcutAndIconCreated(
+    Profile* profile,
+    const std::string& name,
+    const AppId& id) {
   base::ScopedAllowBlockingForTesting allow_blocking;
-  bool shortcut_exists = false;
+  bool shortcut_correct = false;
 
 #if BUILDFLAG(IS_WIN)
-  shortcut_exists =
-      (IsShortcutFoundForProfile(profile, name,
-                                 shortcut_override_->desktop.GetPath()) &&
-       IsShortcutFoundForProfile(
-           profile, name, shortcut_override_->application_menu.GetPath()));
+  shortcut_correct =
+      (IsShortcutAndIconFoundForProfile(
+           profile, name, shortcut_override_->desktop.GetPath(),
+           g_app_name_icon_color.find(name)->second) &&
+       IsShortcutAndIconFoundForProfile(
+           profile, name, shortcut_override_->application_menu.GetPath(),
+           g_app_name_icon_color.find(name)->second));
 #elif BUILDFLAG(IS_MAC)
   std::string shortcut_filename = name + ".app";
   base::FilePath app_shortcut_path =
       shortcut_override_->chrome_apps_folder.GetPath().Append(
           shortcut_filename);
   AppShimRegistry* registry = AppShimRegistry::Get();
+  bool is_app_profile_found = false;
+  // Exits early if the app id is empty because the verification won't work.
+  // TODO(crbug.com/1289865): Figure a way to find the profile that has the app
+  //                          installed without using app ID.
+  if (id.empty())
+    return false;
   std::set<base::FilePath> app_installed_profiles =
       registry->GetInstalledProfilesForApp(id);
-  shortcut_exists = (base::PathExists(app_shortcut_path) &&
-                     app_installed_profiles.find(profile->GetPath()) !=
-                         app_installed_profiles.end());
+  is_app_profile_found = (app_installed_profiles.find(profile->GetPath()) !=
+                          app_installed_profiles.end());
+  bool shortcut_exists =
+      (base::PathExists(app_shortcut_path) && is_app_profile_found);
+  if (shortcut_exists) {
+    SkColor icon_pixel_color = GetIconTopLeftColor(app_shortcut_path);
+    shortcut_correct =
+        (icon_pixel_color == g_app_name_icon_color.find(name)->second);
+  }
 #elif BUILDFLAG(IS_LINUX)
   std::string shortcut_filename =
       "chrome-" + id + "-" + profile->GetBaseName().value() + ".desktop";
   base::FilePath desktop_shortcut_path =
       shortcut_override_->desktop.GetPath().Append(shortcut_filename);
-  shortcut_exists = base::PathExists(desktop_shortcut_path);
+  shortcut_correct = base::PathExists(desktop_shortcut_path);
 #endif
 
-  return shortcut_exists;
+  return shortcut_correct;
 }
 
 Browser* WebAppIntegrationTestDriver::browser() {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
index 9f1a2d3..08cb556 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -180,8 +180,6 @@
   void CheckAppInListTabbed(const std::string& site_mode);
   void CheckAppNavigationIsStartUrl();
   void CheckAppNotInList(const std::string& site_mode);
-  void CheckAppShortcutExists(const std::string& site_mode);
-  void CheckAppShortcutNotExists(const std::string& site_mode);
   void CheckAppWindowMode(const std::string& site_mode,
                           apps::mojom::WindowMode window_mode);
   void CheckInstallable();
@@ -191,6 +189,8 @@
   void CheckLaunchIconNotShown();
   void CheckTabCreated();
   void CheckCustomToolbar();
+  void CheckPlatformShortcutAndIcon(const std::string& site_mode);
+  void CheckPlatformShortcutNotExists(const std::string& site_mode);
   void CheckUserDisplayModeInternal(DisplayMode display_mode);
   void CheckWindowClosed();
   void CheckWindowCreated();
@@ -246,9 +246,9 @@
   Browser* GetAppBrowserForSite(const std::string& site_mode,
                                 bool launch_if_not_open = true);
 
-  bool IsShortcutCreated(Profile* profile,
-                         const std::string& name,
-                         const AppId& id);
+  bool IsShortcutAndIconCreated(Profile* profile,
+                                const std::string& name,
+                                const AppId& id);
 
   Browser* browser();
   const net::EmbeddedTestServer* embedded_test_server();
diff --git a/chrome/browser/ui/webui/DEPS b/chrome/browser/ui/webui/DEPS
index 62fff47..fa8286d 100644
--- a/chrome/browser/ui/webui/DEPS
+++ b/chrome/browser/ui/webui/DEPS
@@ -2,6 +2,7 @@
   "+ash/components/account_manager",
   "+ash/components/audio",
   "+ash/webui/os_feedback_ui",
+  "+components/app_constants",
   "+components/browser_ui/share/android",
   "+components/services/app_service/public",
   "+device/bluetooth",
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
index d182349..4152781 100644
--- a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
+++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/app_constants/constants.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/intent_constants.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
@@ -49,8 +50,8 @@
 };
 
 const char* kAppIdsWithHiddenPinToShelf[] = {
-    extension_misc::kChromeAppId,
-    extension_misc::kLacrosAppId,
+    app_constants::kChromeAppId,
+    app_constants::kLacrosAppId,
 };
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc b/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
index 425869ec9..305bdb1 100644
--- a/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
+++ b/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
@@ -205,6 +205,7 @@
 // This list was derived from chrome://about. :)
 static constexpr const char* const kChromeUrls[] = {
     "chrome://accessibility",
+    "chrome://attribution-internals",
     "chrome://autofill-internals",
     "chrome://blob-internals",
     "chrome://bookmarks",
@@ -212,7 +213,6 @@
     "chrome://components",
     "chrome://connection-help",
     "chrome://connection-monitoring-detected",
-    "chrome://conversion-internals",
     "chrome://crashes",
     "chrome://credits",
     "chrome://device-log",
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
index fcf3ce9..de3b403f 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -159,6 +159,7 @@
                           IDR_CROSTINI_INSTALLER_TYPES_MOJO_LITE_JS);
   source->AddResourcePath("images/linux_illustration.png",
                           IDR_LINUX_ILLUSTRATION);
+  source->AddResourcePath("images/crostini_icon.svg", IDR_CROSTINI_ICON);
   source->SetDefaultResource(IDR_CROSTINI_INSTALLER_INDEX_HTML);
 
   content::WebUIDataSource::Add(profile, source);
diff --git a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
index 4b08109..f2d8713 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -111,6 +111,7 @@
                           IDR_CROSTINI_UPGRADER_BROWSER_PROXY_JS);
   source->AddResourcePath("crostini_upgrader.mojom-lite.js",
                           IDR_CROSTINI_UPGRADER_MOJO_LITE_JS);
+  source->AddResourcePath("images/crostini_icon.svg", IDR_CROSTINI_ICON);
   source->SetDefaultResource(IDR_CROSTINI_UPGRADER_INDEX_HTML);
   content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
 }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
index e9e4c5b0..62238f1e 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc
@@ -48,9 +48,8 @@
 
 // Test that display removal does not trigger CHECK in
 // WindowTreeHostManager::GetPrimaryDisplayId().
-// TODO(crbug.com/1183020): Align with RWHI::GetVisualProperties and re-enable.
 IN_PROC_BROWSER_TEST_F(OobeDisplayChooserTest,
-                       DISABLED_RemovingPrimaryDisplaySanityCheck) {
+                       RemovingPrimaryDisplaySanityCheck) {
   display::ManagedDisplayInfo info1(1, "x-1", false);
   info1.SetBounds(gfx::Rect(0, 0, 1280, 800));
   display::ManagedDisplayInfo info2(2, "x-2", false);
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index 397171e..95e2c91 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -137,7 +137,7 @@
                             bool report_users,
                             bool report_crash_info,
                             bool report_app_info_and_activity)
-      : policy::DeviceStatusCollector(local_state, nullptr),
+      : policy::DeviceStatusCollector(local_state, nullptr, nullptr),
         report_activity_times_(report_activity_times),
         report_nics_(report_nics),
         report_hardware_data_(report_hardware_data),
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index f2e1c98d..b5b9155 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -564,7 +564,7 @@
   EXPECT_EQ(1u, call_count);
   EXPECT_TRUE(is_done);
   ASSERT_TRUE(printers.get());
-  EXPECT_TRUE(printers->Equals(original_printers.get()))
+  EXPECT_EQ(*printers, *original_printers)
       << *printers << ", expected: " << *original_printers;
 }
 
@@ -680,7 +680,7 @@
 
   EXPECT_EQ(1u, call_count);
   ASSERT_TRUE(capability.get());
-  EXPECT_TRUE(capability->Equals(original_capability.get()))
+  EXPECT_EQ(*capability, *original_capability)
       << *capability << ", expected: " << *original_capability;
 }
 
@@ -1011,7 +1011,7 @@
 
   EXPECT_EQ(1u, call_count);
   ASSERT_TRUE(printer_info.get());
-  EXPECT_TRUE(printer_info->Equals(original_printer_info.get()))
+  EXPECT_EQ(*printer_info, *original_printer_info)
       << *printer_info << ", expected: " << *original_printer_info;
 }
 
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
index 0755ea3..a568780 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h"
 
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h"
 #include "chrome/browser/ui/webui/webui_util.h"
@@ -29,7 +30,17 @@
 
 PrivacySandboxDialogUI::~PrivacySandboxDialogUI() = default;
 
-void PrivacySandboxDialogUI::Initialize(base::OnceClosure close_callback) {
+void PrivacySandboxDialogUI::Initialize(
+    Profile* profile,
+    base::OnceClosure close_callback,
+    PrivacySandboxService::DialogType dialog_type) {
+  std::unique_ptr<base::DictionaryValue> update =
+      std::make_unique<base::DictionaryValue>();
+  update->SetBoolean(
+      "isConsent", dialog_type == PrivacySandboxService::DialogType::kConsent);
+  content::WebUIDataSource::Update(
+      profile, chrome::kChromeUIPrivacySandboxDialogHost, std::move(update));
+
   auto handler =
       std::make_unique<PrivacySandboxDialogHandler>(std::move(close_callback));
   web_ui()->AddMessageHandler(std::move(handler));
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h
index d3c3874..e2408e84 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h
@@ -5,16 +5,20 @@
 #ifndef CHROME_BROWSER_UI_WEBUI_PRIVACY_SANDBOX_PRIVACY_SANDBOX_DIALOG_UI_H_
 #define CHROME_BROWSER_UI_WEBUI_PRIVACY_SANDBOX_PRIVACY_SANDBOX_DIALOG_UI_H_
 
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "content/public/browser/web_ui_controller.h"
 
+class Profile;
+
 // WebUI which is shown to the user as part of the PrivacySandboxDialog.
 class PrivacySandboxDialogUI : public content::WebUIController {
  public:
   explicit PrivacySandboxDialogUI(content::WebUI* web_ui);
   ~PrivacySandboxDialogUI() override;
 
-  // content::WebUIController
-  void Initialize(base::OnceClosure close_callback);
+  void Initialize(Profile* profile,
+                  base::OnceClosure close_callback,
+                  PrivacySandboxService::DialogType dialog_type);
 
  private:
   WEB_UI_CONTROLLER_TYPE_DECL();
diff --git a/chrome/browser/ui/webui/settings/chromeos/languages_section.cc b/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
index 2531eec3..bf10945f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
@@ -455,9 +455,12 @@
   html_source->AddBoolean("onDeviceGrammarCheckEnabled",
                           base::FeatureList::IsEnabled(
                               ::chromeos::features::kOnDeviceGrammarCheck));
-  html_source->AddBoolean("languagePacksHandwritingEnabled",
-                          base::FeatureList::IsEnabled(
-                              ::chromeos::features::kLanguagePacksHandwriting));
+  html_source->AddBoolean(
+      "languagePacksHandwritingEnabled",
+      base::FeatureList::IsEnabled(
+          ::chromeos::features::kHandwritingLegacyRecognition) ||
+          base::FeatureList::IsEnabled(
+              ::chromeos::features::kHandwritingLegacyRecognitionAllLang));
 }
 
 void LanguagesSection::AddHandlers(content::WebUI* web_ui) {
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index 912affa..3123658 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -636,6 +636,7 @@
   deps = [
     ":web_applications",
     ":web_applications_test_support",
+    "adjustments:adjustments_browser_tests",
     "//base",
     "//build:branding_buildflags",
     "//build:chromeos_buildflags",
diff --git a/chrome/browser/web_applications/adjustments/BUILD.gn b/chrome/browser/web_applications/adjustments/BUILD.gn
new file mode 100644
index 0000000..2458c3c
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/BUILD.gn
@@ -0,0 +1,42 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//chrome/common/features.gni")
+
+source_set("adjustments") {
+  sources = [
+    "link_capturing_pref_migration.cc",
+    "link_capturing_pref_migration.h",
+    "web_app_adjustments.cc",
+    "web_app_adjustments.h",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome/browser/profiles:profile",
+    "//chrome/browser/ui",
+    "//chrome/browser/web_applications",
+    "//chrome/common",
+    "//components/keyed_service/content",
+    "//components/services/app_service/public/cpp:app_update",
+    "//components/services/app_service/public/cpp:types",
+  ]
+}
+
+source_set("adjustments_browser_tests") {
+  testonly = true
+
+  sources = []
+  if (is_chromeos_ash) {
+    sources += [ "link_capturing_pref_migration_browsertest.cc" ]
+  }
+
+  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
+
+  deps = [
+    "//chrome/browser/web_applications",
+    "//chrome/browser/web_applications:web_applications_test_support_minimal",
+    "//chrome/test:test_support",
+  ]
+}
diff --git a/chrome/browser/web_applications/adjustments/link_capturing_pref_migration.cc b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration.cc
new file mode 100644
index 0000000..cf2168d
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration.cc
@@ -0,0 +1,63 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h"
+
+#include "base/task/post_task.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "components/services/app_service/public/cpp/types_util.h"
+
+namespace web_app {
+
+LinkCapturingPrefMigration::LinkCapturingPrefMigration(Profile& profile)
+    : profile_(profile) {
+  scoped_observation_.Observe(
+      &apps::AppServiceProxyFactory::GetForProfile(&profile_)
+           ->AppRegistryCache());
+}
+
+LinkCapturingPrefMigration::~LinkCapturingPrefMigration() = default;
+
+void LinkCapturingPrefMigration::OnAppUpdate(const apps::AppUpdate& update) {
+  if (update.AppType() != apps::mojom::AppType::kWeb)
+    return;
+
+  if (apps_util::IsInstalled(update.PriorReadiness()))
+    return;
+
+  if (!apps_util::IsInstalled(update.Readiness()))
+    return;
+
+  // The DLC API was never used by system web apps.
+  const WebAppProvider* provider = WebAppProvider::GetForWebApps(&profile_);
+  if (!provider)
+    return;
+
+  const WebApp* web_app = provider->registrar().GetAppById(update.AppId());
+  if (!web_app)
+    return;
+
+  switch (web_app->capture_links()) {
+    case blink::mojom::CaptureLinks::kUndefined:
+    case blink::mojom::CaptureLinks::kNone:
+      return;
+
+    case blink::mojom::CaptureLinks::kNewClient:
+    case blink::mojom::CaptureLinks::kExistingClientNavigate:
+      apps::AppServiceProxyFactory::GetForProfile(&profile_)
+          ->SetSupportedLinksPreference(update.AppId());
+      break;
+  }
+}
+
+void LinkCapturingPrefMigration::OnAppRegistryCacheWillBeDestroyed(
+    apps::AppRegistryCache* cache) {
+  scoped_observation_.Reset();
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/app_service/link_capturing_migration_manager.h b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h
similarity index 66%
rename from chrome/browser/web_applications/app_service/link_capturing_migration_manager.h
rename to chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h
index 59b5b306..c5c91df 100644
--- a/chrome/browser/web_applications/app_service/link_capturing_migration_manager.h
+++ b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_WEB_APPLICATIONS_APP_SERVICE_LINK_CAPTURING_MIGRATION_MANAGER_H_
-#define CHROME_BROWSER_WEB_APPLICATIONS_APP_SERVICE_LINK_CAPTURING_MIGRATION_MANAGER_H_
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_LINK_CAPTURING_PREF_MIGRATION_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_LINK_CAPTURING_PREF_MIGRATION_H_
 
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
@@ -21,10 +21,10 @@
 // These web apps are exempt from the user preference opt in model we have now
 // as they would have been installed prior to the opt in model coming into
 // effect.
-class LinkCapturingMigrationManager : public apps::AppRegistryCache::Observer {
+class LinkCapturingPrefMigration : public apps::AppRegistryCache::Observer {
  public:
-  explicit LinkCapturingMigrationManager(Profile& profile);
-  ~LinkCapturingMigrationManager() override;
+  explicit LinkCapturingPrefMigration(Profile& profile);
+  ~LinkCapturingPrefMigration() override;
 
   // apps::AppRegistryCache::Observer:
   void OnAppUpdate(const apps::AppUpdate& update) override;
@@ -32,17 +32,15 @@
       apps::AppRegistryCache* cache) override;
 
  private:
-  void ObserveAppRegistryCache();
-
   Profile& profile_;
 
   base::ScopedObservation<apps::AppRegistryCache,
                           apps::AppRegistryCache::Observer>
       scoped_observation_{this};
 
-  base::WeakPtrFactory<LinkCapturingMigrationManager> weak_factory_{this};
+  base::WeakPtrFactory<LinkCapturingPrefMigration> weak_factory_{this};
 };
 
 }  // namespace web_app
 
-#endif  // CHROME_BROWSER_WEB_APPLICATIONS_APP_SERVICE_LINK_CAPTURING_MIGRATION_MANAGER_H_
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_LINK_CAPTURING_PREF_MIGRATION_H_
diff --git a/chrome/browser/web_applications/app_service/link_capturing_migration_manager_browsertest.cc b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration_browsertest.cc
similarity index 86%
rename from chrome/browser/web_applications/app_service/link_capturing_migration_manager_browsertest.cc
rename to chrome/browser/web_applications/adjustments/link_capturing_pref_migration_browsertest.cc
index 5240d4a..78154c23 100644
--- a/chrome/browser/web_applications/app_service/link_capturing_migration_manager_browsertest.cc
+++ b/chrome/browser/web_applications/adjustments/link_capturing_pref_migration_browsertest.cc
@@ -15,10 +15,10 @@
 
 namespace web_app {
 
-class LinkCapturingMigrationManagerBrowserTest : public InProcessBrowserTest {
+class LinkCapturingPrefMigrationBrowserTest : public InProcessBrowserTest {
  public:
-  LinkCapturingMigrationManagerBrowserTest() = default;
-  ~LinkCapturingMigrationManagerBrowserTest() override = default;
+  LinkCapturingPrefMigrationBrowserTest() = default;
+  ~LinkCapturingPrefMigrationBrowserTest() override = default;
 
   // InProcessBrowserTest:
   void SetUpOnMainThread() override {
@@ -31,7 +31,7 @@
   OsIntegrationManager::ScopedSuppressForTesting os_hooks_supress_;
 };
 
-IN_PROC_BROWSER_TEST_F(LinkCapturingMigrationManagerBrowserTest,
+IN_PROC_BROWSER_TEST_F(LinkCapturingPrefMigrationBrowserTest,
                        MigrateCaptureLinks) {
   Profile* profile = browser()->profile();
   auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile);
diff --git a/chrome/browser/web_applications/adjustments/web_app_adjustments.cc b/chrome/browser/web_applications/adjustments/web_app_adjustments.cc
new file mode 100644
index 0000000..aeea093b
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/web_app_adjustments.cc
@@ -0,0 +1,70 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/adjustments/web_app_adjustments.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_provider_factory.h"
+#include "chrome/browser/web_applications/web_app_utils.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace web_app {
+
+// --------------------------------
+// WebAppAdjustments implementation
+// --------------------------------
+
+WebAppAdjustments::WebAppAdjustments(Profile* profile) {
+#if BUILDFLAG(IS_CHROMEOS)
+  link_capturing_pref_migration_ =
+      std::make_unique<web_app::LinkCapturingPrefMigration>(*profile);
+#endif  // BUILDFLAG(IS_CHROMEOS)
+}
+
+WebAppAdjustments::~WebAppAdjustments() = default;
+
+// ---------------------------------------
+// WebAppAdjustmentsFactory implementation
+// ---------------------------------------
+
+// static
+WebAppAdjustmentsFactory* WebAppAdjustmentsFactory::GetInstance() {
+  static base::NoDestructor<WebAppAdjustmentsFactory> instance;
+  return instance.get();
+}
+
+WebAppAdjustmentsFactory::WebAppAdjustmentsFactory()
+    : BrowserContextKeyedServiceFactory(
+          "WebAppAdjustments",
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(WebAppProviderFactory::GetInstance());
+  DependsOn(apps::AppServiceProxyFactory::GetInstance());
+}
+
+WebAppAdjustmentsFactory::~WebAppAdjustmentsFactory() = default;
+
+KeyedService* WebAppAdjustmentsFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+  return new WebAppAdjustments(profile);
+}
+
+bool WebAppAdjustmentsFactory::ServiceIsCreatedWithBrowserContext() const {
+  return true;
+}
+
+content::BrowserContext* WebAppAdjustmentsFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+  return GetBrowserContextForWebApps(context) &&
+                 apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(
+                     profile)
+             ? context
+             : nullptr;
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/adjustments/web_app_adjustments.h b/chrome/browser/web_applications/adjustments/web_app_adjustments.h
new file mode 100644
index 0000000..491e393
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/web_app_adjustments.h
@@ -0,0 +1,53 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_WEB_APP_ADJUSTMENTS_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_WEB_APP_ADJUSTMENTS_H_
+
+#include <memory>
+
+#include "chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace content {
+class BrowserContext;
+}
+
+class Profile;
+
+namespace web_app {
+
+// A container class for temporary migrations, fix ups and clean ups dealing
+// historical code that's left its mark on the user's database/prefs.
+// Everything in here should have a removal date.
+class WebAppAdjustments : public KeyedService {
+ public:
+  explicit WebAppAdjustments(Profile* profile);
+  ~WebAppAdjustments() override;
+
+ private:
+  // TODO(crbug.com/1262906): This was added in M97, remove in M107.
+  std::unique_ptr<LinkCapturingPrefMigration> link_capturing_pref_migration_;
+};
+
+class WebAppAdjustmentsFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  WebAppAdjustmentsFactory();
+  ~WebAppAdjustmentsFactory() override;
+
+  static WebAppAdjustmentsFactory* GetInstance();
+
+ private:
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+  bool ServiceIsCreatedWithBrowserContext() const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_WEB_APP_ADJUSTMENTS_H_
diff --git a/chrome/browser/web_applications/app_service/BUILD.gn b/chrome/browser/web_applications/app_service/BUILD.gn
index c508993..c2e4141 100644
--- a/chrome/browser/web_applications/app_service/BUILD.gn
+++ b/chrome/browser/web_applications/app_service/BUILD.gn
@@ -6,8 +6,6 @@
 
 source_set("app_service") {
   sources = [
-    "link_capturing_migration_manager.cc",
-    "link_capturing_migration_manager.h",
     "web_app_publisher_helper.cc",
     "web_app_publisher_helper.h",
   ]
diff --git a/chrome/browser/web_applications/app_service/link_capturing_migration_manager.cc b/chrome/browser/web_applications/app_service/link_capturing_migration_manager.cc
deleted file mode 100644
index e01d50a..0000000
--- a/chrome/browser/web_applications/app_service/link_capturing_migration_manager.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/web_applications/app_service/link_capturing_migration_manager.h"
-
-#include "base/task/post_task.h"
-#include "chrome/browser/apps/app_service/app_service_proxy.h"
-#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/web_applications/web_app.h"
-#include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/browser/web_applications/web_app_registrar.h"
-#include "components/services/app_service/public/cpp/types_util.h"
-
-namespace web_app {
-
-LinkCapturingMigrationManager::LinkCapturingMigrationManager(Profile& profile)
-    : profile_(profile) {
-  // Defer this to be an async operation as we are constructed during
-  // AppServiceProxy's construction and thus cannot read the AppServiceProxy out
-  // of AppServiceProxyFactory yet.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&LinkCapturingMigrationManager::ObserveAppRegistryCache,
-                     weak_factory_.GetWeakPtr()));
-}
-
-LinkCapturingMigrationManager::~LinkCapturingMigrationManager() = default;
-
-void LinkCapturingMigrationManager::OnAppUpdate(const apps::AppUpdate& update) {
-  if (update.AppType() != apps::mojom::AppType::kWeb)
-    return;
-
-  if (apps_util::IsInstalled(update.PriorReadiness()))
-    return;
-
-  if (!apps_util::IsInstalled(update.Readiness()))
-    return;
-
-  // The DLC API was never used by system web apps.
-  const WebAppProvider* provider = WebAppProvider::GetForWebApps(&profile_);
-  if (!provider)
-    return;
-
-  const WebApp* web_app = provider->registrar().GetAppById(update.AppId());
-  if (!web_app)
-    return;
-
-  switch (web_app->capture_links()) {
-    case blink::mojom::CaptureLinks::kUndefined:
-    case blink::mojom::CaptureLinks::kNone:
-      return;
-
-    case blink::mojom::CaptureLinks::kNewClient:
-    case blink::mojom::CaptureLinks::kExistingClientNavigate:
-      apps::AppServiceProxyFactory::GetInstance()
-          ->GetForProfile(&profile_)
-          ->SetSupportedLinksPreference(update.AppId());
-      break;
-  }
-}
-
-void LinkCapturingMigrationManager::OnAppRegistryCacheWillBeDestroyed(
-    apps::AppRegistryCache* cache) {
-  scoped_observation_.Reset();
-}
-
-void LinkCapturingMigrationManager::ObserveAppRegistryCache() {
-  scoped_observation_.Observe(&apps::AppServiceProxyFactory::GetInstance()
-                                   ->GetForProfile(&profile_)
-                                   ->AppRegistryCache());
-}
-
-}  // namespace web_app
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index 342d2e8..a84fccf8 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/ui/web_applications/web_app_dialog_manager.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_manager.h"
 #include "chrome/browser/ui/web_applications/web_app_ui_manager_impl.h"
-#include "chrome/browser/web_applications/app_service/link_capturing_migration_manager.h"
 #include "chrome/browser/web_applications/policy/web_app_policy_manager.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
@@ -1415,9 +1414,6 @@
   if (observe_media_requests) {
     media_dispatcher_.Observe(MediaCaptureDevicesDispatcher::GetInstance());
   }
-
-  link_capturing_migration_manager_ =
-      std::make_unique<LinkCapturingMigrationManager>(*profile());
 #endif
 }
 
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
index bfd9de2..56f69c7 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -57,7 +57,6 @@
 class WebAppProvider;
 class WebAppRegistrar;
 class WebAppLaunchManager;
-class LinkCapturingMigrationManager;
 
 struct ShortcutIdTypeMarker {};
 
@@ -397,9 +396,6 @@
   std::map<std::string, WebAppShortcutsMenuItemInfo> shortcut_id_map_;
   ShortcutId::Generator shortcut_id_generator_;
 
-  std::unique_ptr<web_app::LinkCapturingMigrationManager>
-      link_capturing_migration_manager_;
-
   base::WeakPtrFactory<WebAppPublisherHelper> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/web_applications/external_install_options.cc b/chrome/browser/web_applications/external_install_options.cc
index 2f0ceb5..453fc3a 100644
--- a/chrome/browser/web_applications/external_install_options.cc
+++ b/chrome/browser/web_applications/external_install_options.cc
@@ -58,6 +58,7 @@
         options.only_if_previously_preinstalled,
         options.user_type_allowlist,
         options.gate_on_feature,
+        options.gate_on_feature_or_installed,
 #if BUILDFLAG(IS_CHROMEOS_ASH)
         options.disable_if_arc_supported,
         options.disable_if_tablet_form_factor,
@@ -125,6 +126,8 @@
   root.SetKey("force_reinstall_for_milestone",
               ConvertOptional(force_reinstall_for_milestone));
   root.SetKey("gate_on_feature", ConvertOptional(gate_on_feature));
+  root.SetKey("gate_on_feature_or_installed",
+              ConvertOptional(gate_on_feature_or_installed));
   root.SetBoolKey("install_placeholder", install_placeholder);
   root.SetIntKey("install_source", static_cast<int>(install_source));
   root.SetBoolKey("is_disabled", is_disabled);
diff --git a/chrome/browser/web_applications/external_install_options.h b/chrome/browser/web_applications/external_install_options.h
index 94d0b11..0578dbc2 100644
--- a/chrome/browser/web_applications/external_install_options.h
+++ b/chrome/browser/web_applications/external_install_options.h
@@ -106,11 +106,18 @@
   // See apps::DetermineUserType() for relevant string constants.
   std::vector<std::string> user_type_allowlist;
 
-  // Which feature flag should be enabled to install this app. See
-  // chrome/browser/web_applications/preinstalled_app_install_features.h
+  // Which feature flag should be enabled to install this app. If the feature
+  // is disabled, existing external installs will be removed.
+  // See chrome/browser/web_applications/preinstalled_app_install_features.h
   // for available features to gate on.
   absl::optional<std::string> gate_on_feature;
 
+  // Which feature flag should be enabled to install this app. If the feature is
+  // disabled, existing external installs will not be removed.
+  // See chrome/browser/web_applications/preinstalled_app_install_features.h
+  // for available features to gate on.
+  absl::optional<std::string> gate_on_feature_or_installed;
+
   // Whether this should not be installed for devices that support ARC.
   bool disable_if_arc_supported = false;
 
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.cc b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
index 3091b8c..a8c1cc7 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
@@ -187,6 +187,21 @@
            " disabled because feature is disabled: " + *options.gate_on_feature;
   }
 
+  // Remove if gated on a disabled feature, and the app hasn't been preinstalled
+  // before.
+  if (options.gate_on_feature_or_installed &&
+      !IsPreinstalledAppInstallFeatureEnabled(
+          *options.gate_on_feature_or_installed, *profile)) {
+    absl::optional<AppId> app_id =
+        ExternallyInstalledWebAppPrefs(profile->GetPrefs())
+            .LookupAppId(options.install_url);
+    if (!app_id.has_value()) {
+      return options.install_url.spec() + " disabled because the feature " +
+             *options.gate_on_feature_or_installed +
+             " is disabled and the app is not already installed";
+    }
+  }
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Remove if ARC is supported and app should be disabled.
   if (options.disable_if_arc_supported && arc::IsArcAvailable()) {
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
index e54afef..6a0f220 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/web_applications/preinstalled_web_app_manager.h"
 
+#include "base/auto_reset.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
@@ -597,6 +598,78 @@
   EXPECT_FALSE(registrar().IsInstalled(app_id));
 }
 
+const char kFeatureNameOrInstalledConfig[] = R"({
+  "app_url": "$1",
+  "launch_container": "window",
+  "user_type": ["unmanaged"],
+  "feature_name_or_installed": "test_feature"
+})";
+
+// When the "feature_name_or_installed" feature is enabled, the app should be
+// installed.
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppManagerBrowserTest,
+                       GateOnFeatureNameOrInstalled_InstallWhenEnabled) {
+  PreinstalledWebAppManager::BypassOfflineManifestRequirementForTesting();
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  base::AutoReset<bool> enable_feature =
+      SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting();
+
+  std::string app_config = base::ReplaceStringPlaceholders(
+      kFeatureNameOrInstalledConfig, {GetAppUrl().spec()}, nullptr);
+
+  EXPECT_EQ(SyncPreinstalledAppConfig(GetAppUrl(), app_config),
+            InstallResultCode::kSuccessNewInstall);
+
+  AppId app_id = GenerateAppId(/*manifest_id=*/absl::nullopt, GetAppUrl());
+  EXPECT_TRUE(registrar().IsInstalled(app_id));
+}
+
+// When the "feature_name_or_installed" feature is disabled, the app should not
+// be installed.
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppManagerBrowserTest,
+                       GateOnFeatureNameOrInstalled_IgnoreWhenDisabled) {
+  PreinstalledWebAppManager::BypassOfflineManifestRequirementForTesting();
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  std::string app_config = base::ReplaceStringPlaceholders(
+      kFeatureNameOrInstalledConfig, {GetAppUrl().spec()}, nullptr);
+
+  EXPECT_EQ(SyncPreinstalledAppConfig(GetAppUrl(), app_config), absl::nullopt);
+
+  AppId app_id = GenerateAppId(/*manifest_id=*/absl::nullopt, GetAppUrl());
+  EXPECT_FALSE(registrar().IsInstalled(app_id));
+}
+
+// When the "feature_name_or_installed" feature is disabled, any existing
+// preinstalled app should not be uninstalled.
+IN_PROC_BROWSER_TEST_F(
+    PreinstalledWebAppManagerBrowserTest,
+    GateOnFeatureNameOrInstalled_DoNotUninstallWhenDisabled) {
+  PreinstalledWebAppManager::BypassOfflineManifestRequirementForTesting();
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  std::string app_config = base::ReplaceStringPlaceholders(
+      kFeatureNameOrInstalledConfig, {GetAppUrl().spec()}, nullptr);
+  AppId app_id = GenerateAppId(/*manifest_id=*/absl::nullopt, GetAppUrl());
+
+  {
+    base::AutoReset<bool> enable_feature =
+        SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting();
+    EXPECT_EQ(SyncPreinstalledAppConfig(GetAppUrl(), app_config),
+              InstallResultCode::kSuccessNewInstall);
+
+    EXPECT_TRUE(registrar().IsInstalled(app_id));
+  }
+
+  {
+    EXPECT_EQ(SyncPreinstalledAppConfig(GetAppUrl(), app_config),
+              InstallResultCode::kSuccessAlreadyInstalled);
+
+    EXPECT_TRUE(registrar().IsInstalled(app_id));
+  }
+}
+
 // The offline manifest JSON config functionality is only available on Chrome
 // OS.
 #if BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/web_applications/preinstalled_web_app_utils.cc b/chrome/browser/web_applications/preinstalled_web_app_utils.cc
index 921499a..bd2c597 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_utils.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_utils.cc
@@ -64,6 +64,14 @@
 //  - if the feature is not enabled, the app will be removed.
 constexpr char kFeatureName[] = "feature_name";
 
+// kFeatureNameOrInstalled is an optional string parameter specifying a feature
+// associated with this app. The feature must be present in
+// |kPreinstalledAppInstallFeatures| to be applicable.
+//
+// When specified, the app will only be installed when the feature is enabled.
+// If the feature is disabled, existing installations will not be removed.
+constexpr char kFeatureNameOrInstalled[] = "feature_name_or_installed";
+
 // kDisableIfArcSupported is an optional bool which specifies whether to skip
 // install of the app if the device supports Arc (Chrome OS only).
 // Defaults to false.
@@ -215,6 +223,12 @@
   if (feature_name)
     options.gate_on_feature = *feature_name;
 
+  // feature_name_or_installed
+  const std::string* feature_name_or_installed =
+      app_config.FindStringKey(kFeatureNameOrInstalled);
+  if (feature_name_or_installed)
+    options.gate_on_feature_or_installed = *feature_name_or_installed;
+
   // app_url
   value = app_config.FindKeyOfType(kAppUrl, base::Value::Type::STRING);
   if (!value) {
diff --git a/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc b/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc
index ee512c4..b5b359d 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc
@@ -557,4 +557,35 @@
       touchscreen_set->disable_if_touchscreen_with_stylus_not_supported);
 }
 
+TEST_F(PreinstalledWebAppUtilsTest, GateOnFeatureNameOrInstalled) {
+  absl::optional<ExternalInstallOptions> feature_name_set = ParseConfig(R"(
+        {
+          "app_url": "https://www.test.org",
+          "launch_container": "window",
+          "feature_name_or_installed": "foobar",
+          "user_type": ["test"]
+        }
+    )");
+  EXPECT_EQ("foobar", feature_name_set->gate_on_feature_or_installed);
+
+  absl::optional<ExternalInstallOptions> no_feature_name = ParseConfig(R"(
+        {
+          "app_url": "https://www.test.org",
+          "launch_container": "window",
+          "user_type": ["test"]
+        }
+    )");
+  EXPECT_FALSE(no_feature_name->gate_on_feature_or_installed.has_value());
+
+  absl::optional<ExternalInstallOptions> non_string_feature = ParseConfig(R"(
+        {
+          "app_url": "https://www.test.org",
+          "launch_container": "window",
+          "feature_name_or_installed": true,
+          "user_type": ["test"]
+        }
+    )");
+  EXPECT_FALSE(non_string_feature->gate_on_feature_or_installed.has_value());
+}
+
 }  // namespace web_app
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 2e558dda6..6a66c30 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1643630095-a2ac72ad04f7fa531f1a8ed60b1ceef9d4ad47a8.profdata
+chrome-linux-main-1643695137-98824cd4cf8f60c8ace8d6d3c6d426f315f257b8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 4e62cd29..3f8c0f866 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1643630095-51871895d6a00dff376e22c7d09ffd31199f23b0.profdata
+chrome-mac-arm-main-1643673573-018e20a1c459dbe11f008d1e6dfd4c47979b25ce.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index bc1568ff..21f0fb73 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1643630095-d2885bd95ad430b4cf81d0a8b0f12b6a19eb8bd3.profdata
+chrome-mac-main-1643695137-4c5a4af9dd4ed5eea1dbf8aeda947e5dcd718418.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 3cf36086..313cbd7 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1643641180-4086e6b7885a88fd39693b2b46cee816e8c7bcda.profdata
+chrome-win32-main-1643684315-57a6abbf7f637f3e24a1d93c8ac9b055f5fddf55.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6f50c5a..b0645bd 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1643641180-cf3a3d4b5f885385d0d83bdd073a439c4289f587.profdata
+chrome-win64-main-1643673573-797abcb8f40a3f7dbcdb09a92cdd6c497b3f4904.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 8a2dc50..8dcaf4d 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -330,15 +330,6 @@
 const base::Feature kDesktopPWAsWebBundles{"DesktopPWAsWebBundles",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Tries disabling the HTTP disk cache.
-const base::Feature kDisableHttpDiskCache{"DisableHttpDiskCache",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
-
-// The size of the memory cache when the HTTP disk cache is disabled. 0 uses the
-// default size.
-const base::FeatureParam<int> kDisableHttpDiskCacheMemoryCacheSizeParam{
-    &kDisableHttpDiskCache, "MemoryCacheSize", 0};
-
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 // Serves web app settings at chrome://app-settings/<app-id>.
 const base::Feature kDesktopPWAsWebAppSettingsPage{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index ae340a3..949b9145 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -224,11 +224,6 @@
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsWebBundles;
 
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kDisableHttpDiskCache;
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::FeatureParam<int> kDisableHttpDiskCacheMemoryCacheSizeParam;
-
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsWebAppSettingsPage;
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index fdec51d..24be121e 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2142,6 +2142,11 @@
 // String that lists supported HTTP authentication schemes.
 const char kAuthSchemes[] = "auth.schemes";
 
+// List of origin schemes that allow the supported HTTP authentication schemes
+// from "auth.schemes".
+const char kAllHttpAuthSchemesAllowedForOrigins[] =
+    "auth.http_auth_allowed_for_origins";
+
 // Boolean that specifies whether to disable CNAME lookups when generating
 // Kerberos SPN.
 const char kDisableAuthNegotiateCnameLookup[] =
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index acceb9d2..8384bd4a 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -820,6 +820,7 @@
 extern const char kTotalMemoryLimitMb[];
 
 extern const char kAuthSchemes[];
+extern const char kAllHttpAuthSchemesAllowedForOrigins[];
 extern const char kDisableAuthNegotiateCnameLookup[];
 extern const char kEnableAuthNegotiatePort[];
 extern const char kAuthServerAllowlist[];
diff --git a/chrome/installer/mac/signing/parts.py b/chrome/installer/mac/signing/parts.py
index c19c026..cc8dd04 100644
--- a/chrome/installer/mac/signing/parts.py
+++ b/chrome/installer/mac/signing/parts.py
@@ -117,13 +117,15 @@
                 verify_options=verify_options),
     }
 
-    dylibs = (
+    dylibs = [
         'libEGL.dylib',
         'libGLESv2.dylib',
         'libswiftshader_libEGL.dylib',
         'libswiftshader_libGLESv2.dylib',
         'libvk_swiftshader.dylib',
-    )
+    ]
+    if config.is_chrome_branded():
+        dylibs.append('liboptimization_guide_internal.dylib')
     for library in dylibs:
         library_basename = os.path.basename(library)
         parts[library_basename] = CodeSignedProduct(
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index dcc8eda..65d2748 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1990,7 +1990,6 @@
       "../browser/ui/search_engines/search_engine_tab_helper_browsertest.cc",
       "../browser/ui/startup/startup_browser_creator_browsertest.cc",
       "../browser/ui/sync/one_click_signin_links_delegate_impl_browsertest.cc",
-      "../browser/ui/sync/profile_signin_confirmation_helper_browsertest.cc",
       "../browser/ui/tab_modal_confirm_dialog_browsertest.cc",
       "../browser/ui/tab_modal_confirm_dialog_browsertest.h",
       "../browser/ui/tab_ui_helper_browsertest.cc",
@@ -3040,7 +3039,6 @@
         "../browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl_browsertest.cc",
         "../browser/ui/views/session_crashed_bubble_view_browsertest.cc",
         "../browser/ui/views/status_bubble_views_browsertest.cc",
-        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc",
         "../browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc",
         "../browser/ui/views/tabs/tab_group_editor_bubble_view_browsertest.cc",
         "../browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc",
@@ -3599,7 +3597,6 @@
         "../browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc",
         "../browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc",
         "../browser/ui/window_sizer/window_sizer_chromeos_uitest.cc",
-        "../browser/web_applications/app_service/link_capturing_migration_manager_browsertest.cc",
         "../browser/web_applications/app_service/web_apps_browsertest.cc",
         "../browser/web_applications/app_service/web_apps_chromeos_browsertest.cc",
         "../browser/webshare/chromeos/sharesheet_client_browsertest.cc",
@@ -3688,7 +3685,6 @@
 
         # chromeos does not use the profile chooser view
         "../browser/ui/views/profiles/profile_menu_view_browsertest.cc",
-        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc",
         "../browser/ui/webui/profile_helper_browsertest.cc",
 
         # chromeos does not support machine level user cloud policies
@@ -5074,7 +5070,6 @@
       "../browser/ui/hats/trust_safety_sentiment_service_factory_unittest.cc",
       "../browser/ui/hats/trust_safety_sentiment_service_unittest.cc",
       "../browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc",
-      "../browser/ui/sync/profile_signin_confirmation_helper_unittest.cc",
       "../browser/ui/sync/sync_promo_ui_unittest.cc",
       "../browser/ui/toolbar/app_menu_icon_controller_unittest.cc",
       "../browser/ui/views/file_system_access/file_system_access_ui_helpers_unittest.cc",
@@ -6613,7 +6608,6 @@
       "../browser/sharesheet/share_action/share_action_unittest.cc",
       "../browser/speech/tts_chromeos_unittest.cc",
       "../browser/speech/tts_controller_delegate_impl_unittest.cc",
-      "../browser/sync/sync_error_notifier_ash_unittest.cc",
       "../browser/ui/app_list/app_context_menu_unittest.cc",
       "../browser/ui/app_list/app_list_sort_unittest.cc",
       "../browser/ui/app_list/app_list_syncable_service_unittest.cc",
@@ -7696,6 +7690,7 @@
       "//chrome:unit_tests_pak",
       "//chrome/browser/ui/tabs:tab_enums",
       "//chrome/browser/ui/views",
+      "//components/app_constants",
       "//components/constrained_window",
       "//components/global_media_controls",
       "//components/media_message_center",
@@ -7844,7 +7839,6 @@
     if (!is_chromeos_ash) {
       sources += [
         "../browser/ui/views/sync/one_click_signin_dialog_view_unittest.cc",
-        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc",
       ]
     }
     if (!is_chromeos) {
@@ -9918,18 +9912,14 @@
 
 # This target is for Lacros version skew testing.
 if (is_chromeos_ash) {
-  cipd_package_definition_by_file("gen_linux_ash_chromium_cipd_yaml") {
+  copy("test_ash_chrome_cipd_yaml") {
     testonly = true
-    buildtype = "dev"
-    arch = "64bit"
-    files_file = "//chrome/tools/build/chromeos/FILES.cfg"
-    package = "chromium/testing/linux-ash-chromium/x86_64/ash.zip"
-    description = "Prebuilt test binary."
-    install_mode = "copy"
     deps = [
       ":test_ash_chrome",
       "//chrome",
     ]
+    sources = [ "//infra/archive_config/test-ash-chrome.yaml" ]
+    outputs = [ "$root_out_dir/test_ash_chrome.yaml" ]
   }
 }
 
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.cc b/chrome/test/chromedriver/chrome/stub_web_view.cc
index aeea963..b6f9ff2d 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.cc
+++ b/chrome/test/chromedriver/chrome/stub_web_view.cc
@@ -227,7 +227,7 @@
 }
 
 Status StubWebView::SetFileInputFiles(const std::string& frame,
-                                      const base::DictionaryValue& element,
+                                      const base::Value& element,
                                       const std::vector<base::FilePath>& files,
                                       const bool append) {
   return Status(kOk);
@@ -282,7 +282,7 @@
 void StubWebView::SetFrame(const std::string& new_frame_id) {}
 
 Status StubWebView::GetNodeIdByElement(const std::string& frame,
-                                       const base::DictionaryValue& element,
+                                       const base::Value& element,
                                        int* node_id) {
   return Status(kOk);
 }
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.h b/chrome/test/chromedriver/chrome/stub_web_view.h
index 50da512..2ad6c01 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.h
+++ b/chrome/test/chromedriver/chrome/stub_web_view.h
@@ -111,7 +111,7 @@
   Status PrintToPDF(const base::DictionaryValue& params,
                     std::string* pdf) override;
   Status SetFileInputFiles(const std::string& frame,
-                           const base::DictionaryValue& element,
+                           const base::Value& element,
                            const std::vector<base::FilePath>& files,
                            const bool append) override;
   Status TakeHeapSnapshot(std::unique_ptr<base::Value>* snapshot) override;
@@ -132,7 +132,7 @@
   std::unique_ptr<base::Value> GetCastIssueMessage() override;
   void SetFrame(const std::string& new_frame_id) override;
   Status GetNodeIdByElement(const std::string& frame,
-                            const base::DictionaryValue& element,
+                            const base::Value& element,
                             int* node_id) override;
 
  private:
diff --git a/chrome/test/chromedriver/chrome/web_view.h b/chrome/test/chromedriver/chrome/web_view.h
index 52da35d..b7e75183 100644
--- a/chrome/test/chromedriver/chrome/web_view.h
+++ b/chrome/test/chromedriver/chrome/web_view.h
@@ -239,7 +239,7 @@
   // Set files in a file input element.
   // |element| is the WebElement JSON Object of the input element.
   virtual Status SetFileInputFiles(const std::string& frame,
-                                   const base::DictionaryValue& element,
+                                   const base::Value& element,
                                    const std::vector<base::FilePath>& files,
                                    const bool append) = 0;
 
@@ -280,7 +280,7 @@
   virtual void SetFrame(const std::string& new_frame_id) = 0;
 
   virtual Status GetNodeIdByElement(const std::string& frame,
-                                    const base::DictionaryValue& element,
+                                    const base::Value& element,
                                     int* node_id) = 0;
 };
 
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc
index 2957b090..352342c 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -983,14 +983,16 @@
 }
 
 Status WebViewImpl::GetNodeIdByElement(const std::string& frame,
-                                       const base::DictionaryValue& element,
+                                       const base::Value& element,
                                        int* node_id) {
+  if (!element.is_dict())
+    return Status(kUnknownError, "'element' is not a dictionary");
   int context_id;
   Status status = GetContextIdForFrame(this, frame, &context_id);
   if (status.IsError())
     return status;
   base::ListValue args;
-  args.Append(element.CreateDeepCopy());
+  args.Append(element.Clone());
   bool found_node;
   status = internal::GetNodeIdFromFunction(
       client_.get(), context_id, "function(element) { return element; }", args,
@@ -1003,9 +1005,11 @@
 }
 
 Status WebViewImpl::SetFileInputFiles(const std::string& frame,
-                                      const base::DictionaryValue& element,
+                                      const base::Value& element,
                                       const std::vector<base::FilePath>& files,
                                       const bool append) {
+  if (!element.is_dict())
+    return Status(kUnknownError, "'element' is not a dictionary");
   WebViewImpl* target = GetTargetForFrame(this, frame);
   if (target != nullptr && target != this) {
     if (target->IsDetached())
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.h b/chrome/test/chromedriver/chrome/web_view_impl.h
index 35e4b4b..880e9ccc 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.h
+++ b/chrome/test/chromedriver/chrome/web_view_impl.h
@@ -159,7 +159,7 @@
   Status PrintToPDF(const base::DictionaryValue& params,
                     std::string* pdf) override;
   Status SetFileInputFiles(const std::string& frame,
-                           const base::DictionaryValue& element,
+                           const base::Value& element,
                            const std::vector<base::FilePath>& files,
                            const bool append) override;
   Status TakeHeapSnapshot(std::unique_ptr<base::Value>* snapshot) override;
@@ -174,7 +174,7 @@
                                  int xoffset,
                                  int yoffset) override;
   Status GetNodeIdByElement(const std::string& frame,
-                            const base::DictionaryValue& element,
+                            const base::Value& element,
                             int* node_id) override;
 
   bool IsNonBlocking() const override;
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc
index f9305c1..cd814cb6 100644
--- a/chrome/test/chromedriver/element_commands.cc
+++ b/chrome/test/chromedriver/element_commands.cc
@@ -612,8 +612,8 @@
       return Status(kInvalidArgument,
                     "the element can not hold multiple files");
 
-    std::unique_ptr<base::DictionaryValue> element(CreateElement(element_id));
-    return web_view->SetFileInputFiles(session->GetCurrentFrameId(), *element,
+    base::Value element = CreateElement(element_id);
+    return web_view->SetFileInputFiles(session->GetCurrentFrameId(), element,
                                        paths, multiple);
   } else if (session->w3c_compliant && is_input && is_nontypeable) {
     // Special handling for non-typeable inputs is only included in W3C Spec
diff --git a/chrome/test/chromedriver/element_util.cc b/chrome/test/chromedriver/element_util.cc
index 0857449..0340968e 100644
--- a/chrome/test/chromedriver/element_util.cc
+++ b/chrome/test/chromedriver/element_util.cc
@@ -334,21 +334,18 @@
   return Status(kOk);
 }
 
-std::unique_ptr<base::DictionaryValue> CreateElementCommon(
-    const std::string& key,
-    const std::string& value) {
-  std::unique_ptr<base::DictionaryValue> element(new base::DictionaryValue());
-  element->SetString(key, value);
+base::Value CreateElementCommon(const std::string& key,
+                                const std::string& value) {
+  base::Value element(base::Value::Type::DICTIONARY);
+  element.SetStringPath(key, value);
   return element;
 }
 
-std::unique_ptr<base::DictionaryValue> CreateElement(
-    const std::string& element_id) {
+base::Value CreateElement(const std::string& element_id) {
   return CreateElementCommon(GetElementKey(), element_id);
 }
 
-std::unique_ptr<base::DictionaryValue> CreateShadowRoot(
-    const std::string& shadow_root_id) {
+base::Value CreateShadowRoot(const std::string& shadow_root_id) {
   return CreateElementCommon(kShadowRootKey, shadow_root_id);
 }
 
@@ -515,8 +512,8 @@
   status = GetActiveElement(session, web_view, &result);
   if (status.IsError())
     return status;
-  std::unique_ptr<base::Value> element_dict(CreateElement(element_id));
-  *is_focused = *result == *element_dict;
+  base::Value element_dict = CreateElement(element_id);
+  *is_focused = *result == element_dict;
   return Status(kOk);
 }
 
@@ -995,8 +992,8 @@
     return status;
 
   int node_id;
-  std::unique_ptr<base::DictionaryValue> element(CreateElement(element_id));
-  status = web_view->GetNodeIdByElement(session->GetCurrentFrameId(), *element,
+  base::Value element(CreateElement(element_id));
+  status = web_view->GetNodeIdByElement(session->GetCurrentFrameId(), element,
                                         &node_id);
 
   if (status.IsError())
diff --git a/chrome/test/chromedriver/element_util.h b/chrome/test/chromedriver/element_util.h
index 3d7a2b4..ff46ec4c1 100644
--- a/chrome/test/chromedriver/element_util.h
+++ b/chrome/test/chromedriver/element_util.h
@@ -8,21 +8,16 @@
 #include <memory>
 #include <string>
 
+#include "base/values.h"
 #include "chrome/test/chromedriver/basic_types.h"
 
-namespace base {
-class DictionaryValue;
-class Value;
-}
-
 struct Session;
 class Status;
 class WebView;
 
 std::string GetElementKey();
 
-std::unique_ptr<base::DictionaryValue> CreateElement(
-    const std::string& element_id);
+base::Value CreateElement(const std::string& element_id);
 
 std::unique_ptr<base::DictionaryValue> CreateValueFrom(const WebPoint& point);
 
diff --git a/chrome/test/data/client_hints/accept_ch.html.mock-http-headers b/chrome/test/data/client_hints/accept_ch.html.mock-http-headers
index be71519..ad1ac6d1 100644
--- a/chrome/test/data/client_hints/accept_ch.html.mock-http-headers
+++ b/chrome/test/data/client_hints/accept_ch.html.mock-http-headers
@@ -1,2 +1,2 @@
 HTTP/1.1 200 OK
-Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list
+Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64
diff --git a/chrome/test/data/client_hints/accept_ch_img_localhost.html.mock-http-headers b/chrome/test/data/client_hints/accept_ch_img_localhost.html.mock-http-headers
index be71519..ad1ac6d1 100644
--- a/chrome/test/data/client_hints/accept_ch_img_localhost.html.mock-http-headers
+++ b/chrome/test/data/client_hints/accept_ch_img_localhost.html.mock-http-headers
@@ -1,2 +1,2 @@
 HTTP/1.1 200 OK
-Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list
+Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch.html b/chrome/test/data/client_hints/http_equiv_accept_ch.html
index 2ef6a6a5..cc74cfc 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch.html
@@ -1,5 +1,5 @@
 <html>
-<meta http-equiv="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list">
+<meta http-equiv="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <head></head>
 Empty file which uses link-rel to disable favicon fetches. The corresponding
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_bar.html b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_bar.html
index d962720..de4d8e5a 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_bar.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_bar.html
@@ -1,5 +1,5 @@
 <html>
-<meta http-equiv="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/)">
+<meta http-equiv="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/),sec-ch-ua-wow64=(https://bar.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_foo.html b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_foo.html
index 92b57fc2..35f17b0b 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_foo.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_foo.html
@@ -1,5 +1,5 @@
 <html>
-<meta http-equiv="Accept-CH" content="dpr=(https://foo.com/),sec-ch-dpr=(https://foo.com/),device-memory=(https://foo.com/),sec-ch-device-memory=(https://foo.com/),viewport-width=(https://foo.com/),sec-ch-viewport-width=(https://foo.com/),rtt=(https://foo.com/),downlink=(https://foo.com/),ect=(https://foo.com/),sec-ch-ua-arch=(https://foo.com/),sec-ch-ua-platform-version=(https://foo.com/),sec-ch-ua-model=(https://foo.com/),sec-ch-ua-full-version=(https://foo.com/),sec-ch-prefers-color-scheme=(https://foo.com/),sec-ch-ua-bitness=(https://foo.com/),sec-ch-viewport-height=(https://foo.com/),sec-ch-ua-full-version-list=(https://foo.com/)">
+<meta http-equiv="Accept-CH" content="dpr=(https://foo.com/),sec-ch-dpr=(https://foo.com/),device-memory=(https://foo.com/),sec-ch-device-memory=(https://foo.com/),viewport-width=(https://foo.com/),sec-ch-viewport-width=(https://foo.com/),rtt=(https://foo.com/),downlink=(https://foo.com/),ect=(https://foo.com/),sec-ch-ua-arch=(https://foo.com/),sec-ch-ua-platform-version=(https://foo.com/),sec-ch-ua-model=(https://foo.com/),sec-ch-ua-full-version=(https://foo.com/),sec-ch-prefers-color-scheme=(https://foo.com/),sec-ch-ua-bitness=(https://foo.com/),sec-ch-viewport-height=(https://foo.com/),sec-ch-ua-full-version-list=(https://foo.com/),sec-ch-ua-wow64=(https://foo.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html
index d962720..de4d8e5a 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html
@@ -1,5 +1,5 @@
 <html>
-<meta http-equiv="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/)">
+<meta http-equiv="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/),sec-ch-ua-wow64=(https://bar.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html.mock-http-headers b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html.mock-http-headers
index 7a251e4..bf7cf79 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html.mock-http-headers
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_delegation_merge.html.mock-http-headers
@@ -1,3 +1,3 @@
 HTTP/1.1 200 OK
-Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list
-Permissions-Policy: ch-dpr=(*),ch-device-memory=(self "https://foo.com/"),ch-viewport-width=(*),ch-rtt=(self "https://foo.com/"),ch-downlink=(*),ch-ect=(self "https://foo.com/"),ch-ua-arch=(*),ch-ua-platform-version=(self "https://foo.com/"),ch-ua-model=(*),ch-ua-full-version=(self "https://foo.com/"),ch-prefers-color-scheme=(*),ch-ua-bitness=(self "https://foo.com/"),ch-viewport-height=(*),ch-ua-full-version-list=(self "https://foo.com/")
+Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64
+Permissions-Policy: ch-dpr=(*),ch-device-memory=(self "https://foo.com/"),ch-viewport-width=(*),ch-rtt=(self "https://foo.com/"),ch-downlink=(*),ch-ect=(self "https://foo.com/"),ch-ua-arch=(*),ch-ua-platform-version=(self "https://foo.com/"),ch-ua-model=(*),ch-ua-full-version=(self "https://foo.com/"),ch-prefers-color-scheme=(*),ch-ua-bitness=(self "https://foo.com/"),ch-viewport-height=(*),ch-ua-full-version-list=(self "https://foo.com/"),ch-ua-wow64=(*)
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_img_localhost.html b/chrome/test/data/client_hints/http_equiv_accept_ch_img_localhost.html
index f5d6f39..8c5fe13 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_img_localhost.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_img_localhost.html
@@ -1,5 +1,5 @@
 <html>
-<meta http-equiv="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list">
+<meta http-equiv="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <head></head>
 Empty file which uses link-rel to disable favicon fetches. The corresponding
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_injection.html b/chrome/test/data/client_hints/http_equiv_accept_ch_injection.html
index 223ff69..5b815df 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_injection.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_injection.html
@@ -7,7 +7,7 @@
     <script type="text/javascript">
         document.getElementsByTagName('meta')[0].setAttribute("content", "dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect");
         document.head.outerHTML += '<meta http-equiv="Accept-CH" content="sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model">';
-        document.head.innerHTML += '<meta http-equiv="Accept-CH" content="sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list">';
+        document.head.innerHTML += '<meta http-equiv="Accept-CH" content="sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list,sec-ch-ua-wow64">';
         document.write('<meta http-equiv="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-prefers-color-scheme,sec-ch-viewport-height">');
         document.body.innerHTML += '<img src="non-existing-image.jpg"></img>';
     </script>
diff --git a/chrome/test/data/client_hints/http_equiv_accept_ch_merge.html b/chrome/test/data/client_hints/http_equiv_accept_ch_merge.html
index 4009910..6c57584e 100644
--- a/chrome/test/data/client_hints/http_equiv_accept_ch_merge.html
+++ b/chrome/test/data/client_hints/http_equiv_accept_ch_merge.html
@@ -2,7 +2,7 @@
 <!-- This is split in two since data from header may round trip quickly
   enough from browser to be used, so this makes sure we actually merge -->
 <meta http-equiv="Accept-CH" content="sec-ch-ua-arch,sec-ch-ua-platform">
-<meta http-equiv="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list">
+<meta http-equiv="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <!-- A subresource! -->
 <img src="non-existing-image.jpg"></img>
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch.html b/chrome/test/data/client_hints/meta_name_accept_ch.html
index f17e494..0b42188 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch.html
@@ -1,5 +1,5 @@
 <html>
-<meta name="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list">
+<meta name="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <head></head>
 Empty file which uses link-rel to disable favicon fetches. The corresponding
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_bar.html b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_bar.html
index 9886b9c0..86a37e5f 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_bar.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_bar.html
@@ -1,5 +1,5 @@
 <html>
-<meta name="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/)">
+<meta name="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/),sec-ch-ua-wow64=(https://bar.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_foo.html b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_foo.html
index dc5ef5d..f824351 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_foo.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_foo.html
@@ -1,5 +1,5 @@
 <html>
-<meta name="Accept-CH" content="dpr=(https://foo.com/),sec-ch-dpr=(https://foo.com/),device-memory=(https://foo.com/),sec-ch-device-memory=(https://foo.com/),viewport-width=(https://foo.com/),sec-ch-viewport-width=(https://foo.com/),rtt=(https://foo.com/),downlink=(https://foo.com/),ect=(https://foo.com/),sec-ch-ua-arch=(https://foo.com/),sec-ch-ua-platform-version=(https://foo.com/),sec-ch-ua-model=(https://foo.com/),sec-ch-ua-full-version=(https://foo.com/),sec-ch-prefers-color-scheme=(https://foo.com/),sec-ch-ua-bitness=(https://foo.com/),sec-ch-viewport-height=(https://foo.com/),sec-ch-ua-full-version-list=(https://foo.com/)">
+<meta name="Accept-CH" content="dpr=(https://foo.com/),sec-ch-dpr=(https://foo.com/),device-memory=(https://foo.com/),sec-ch-device-memory=(https://foo.com/),viewport-width=(https://foo.com/),sec-ch-viewport-width=(https://foo.com/),rtt=(https://foo.com/),downlink=(https://foo.com/),ect=(https://foo.com/),sec-ch-ua-arch=(https://foo.com/),sec-ch-ua-platform-version=(https://foo.com/),sec-ch-ua-model=(https://foo.com/),sec-ch-ua-full-version=(https://foo.com/),sec-ch-prefers-color-scheme=(https://foo.com/),sec-ch-ua-bitness=(https://foo.com/),sec-ch-viewport-height=(https://foo.com/),sec-ch-ua-full-version-list=(https://foo.com/),sec-ch-ua-wow64=(https://foo.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html
index 9886b9c0..86a37e5f 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html
@@ -1,5 +1,5 @@
 <html>
-<meta name="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/)">
+<meta name="Accept-CH" content="dpr=(https://bar.com/),sec-ch-dpr=(https://bar.com/),device-memory=(https://bar.com/),sec-ch-device-memory=(https://bar.com/),viewport-width=(https://bar.com/),sec-ch-viewport-width=(https://bar.com/),rtt=(https://bar.com/),downlink=(https://bar.com/),ect=(https://bar.com/),sec-ch-ua-arch=(https://bar.com/),sec-ch-ua-platform-version=(https://bar.com/),sec-ch-ua-model=(https://bar.com/),sec-ch-ua-full-version=(https://bar.com/),sec-ch-prefers-color-scheme=(https://bar.com/),sec-ch-ua-bitness=(https://bar.com/),sec-ch-viewport-height=(https://bar.com/),sec-ch-ua-full-version-list=(https://bar.com/),sec-ch-ua-wow64=(https://bar.com/)">
 <link rel="icon" href="data:;base64,=">
 <body>
     <img src="test_img.jpg"></img>
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html.mock-http-headers b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html.mock-http-headers
index 7a251e4..bf7cf79 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html.mock-http-headers
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_delegation_merge.html.mock-http-headers
@@ -1,3 +1,3 @@
 HTTP/1.1 200 OK
-Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list
-Permissions-Policy: ch-dpr=(*),ch-device-memory=(self "https://foo.com/"),ch-viewport-width=(*),ch-rtt=(self "https://foo.com/"),ch-downlink=(*),ch-ect=(self "https://foo.com/"),ch-ua-arch=(*),ch-ua-platform-version=(self "https://foo.com/"),ch-ua-model=(*),ch-ua-full-version=(self "https://foo.com/"),ch-prefers-color-scheme=(*),ch-ua-bitness=(self "https://foo.com/"),ch-viewport-height=(*),ch-ua-full-version-list=(self "https://foo.com/")
+Accept-CH: dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64
+Permissions-Policy: ch-dpr=(*),ch-device-memory=(self "https://foo.com/"),ch-viewport-width=(*),ch-rtt=(self "https://foo.com/"),ch-downlink=(*),ch-ect=(self "https://foo.com/"),ch-ua-arch=(*),ch-ua-platform-version=(self "https://foo.com/"),ch-ua-model=(*),ch-ua-full-version=(self "https://foo.com/"),ch-prefers-color-scheme=(*),ch-ua-bitness=(self "https://foo.com/"),ch-viewport-height=(*),ch-ua-full-version-list=(self "https://foo.com/"),ch-ua-wow64=(*)
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_img_localhost.html b/chrome/test/data/client_hints/meta_name_accept_ch_img_localhost.html
index 47dbd4a..1e3b0c7c 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_img_localhost.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_img_localhost.html
@@ -1,5 +1,5 @@
 <html>
-<meta name="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list">
+<meta name="Accept-CH" content="dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect,sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <head></head>
 Empty file which uses link-rel to disable favicon fetches. The corresponding
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_injection.html b/chrome/test/data/client_hints/meta_name_accept_ch_injection.html
index e8192861..a868da96 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_injection.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_injection.html
@@ -7,7 +7,7 @@
     <script type="text/javascript">
         document.getElementsByTagName('meta')[0].setAttribute("content", "dpr,sec-ch-dpr,device-memory,sec-ch-device-memory,viewport-width,sec-ch-viewport-width,rtt,downlink,ect");
         document.head.outerHTML += '<meta name="Accept-CH" content="sec-ch-ua-arch,sec-ch-ua-platform,sec-ch-ua-model">';
-        document.head.innerHTML += '<meta name="Accept-CH" content="sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list">';
+        document.head.innerHTML += '<meta name="Accept-CH" content="sec-ch-ua-full-version,sec-ch-ua-bitness,sec-ch-ua-full-version-list,sec-ch-ua-wow64">';
         document.write('<meta name="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-prefers-color-scheme,sec-ch-viewport-height">');
         document.body.innerHTML += '<img src="non-existing-image.jpg"></img>';
     </script>
diff --git a/chrome/test/data/client_hints/meta_name_accept_ch_merge.html b/chrome/test/data/client_hints/meta_name_accept_ch_merge.html
index b298da9..b0ebc3cb 100644
--- a/chrome/test/data/client_hints/meta_name_accept_ch_merge.html
+++ b/chrome/test/data/client_hints/meta_name_accept_ch_merge.html
@@ -2,7 +2,7 @@
 <!-- This is split in two since data from header may round trip quickly
   enough from browser to be used, so this makes sure we actually merge -->
 <meta name="Accept-CH" content="sec-ch-ua-arch,sec-ch-ua-platform">
-<meta name="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list">
+<meta name="Accept-CH" content="sec-ch-ua-platform-version,sec-ch-ua-model,sec-ch-ua-full-version,sec-ch-prefers-color-scheme,sec-ch-ua-bitness,sec-ch-viewport-height,sec-ch-ua-full-version-list,sec-ch-ua-wow64">
 <link rel="icon" href="data:;base64,=">
 <!-- A subresource! -->
 <img src="non-existing-image.jpg"></img>
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 73ad7378..f9b26f9 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -2730,6 +2730,37 @@
       }
     ]
   },
+  "AllHttpAuthSchemesAllowedForOrigins": {
+    "os": [
+      "win",
+      "linux",
+      "mac",
+      "chromeos_ash",
+      "chromeos_lacros",
+      "android"
+    ],
+    "policy_pref_mapping_tests": [
+      {
+        "note": "Default value (no policies set)",
+        "policies": {},
+        "prefs": {
+          "auth.http_auth_allowed_for_origins": {
+            "location": "local_state",
+            "default_value": []
+          }
+        }
+      },
+      {
+        "policies": {"AllHttpAuthSchemesAllowedForOrigins": ["*.example.com", "google.com"]},
+        "prefs": {
+          "auth.http_auth_allowed_for_origins": {
+            "location": "local_state",
+            "value": ["*.example.com", "google.com"]
+          }
+        }
+      }
+    ]
+  },
   "DisableAuthNegotiateCnameLookup": {
     "os": [
       "win",
diff --git a/chrome/test/data/webui/chromeos/ash_common/keyboard_diagram_test.js b/chrome/test/data/webui/chromeos/ash_common/keyboard_diagram_test.js
index d453b56..4fc4685 100644
--- a/chrome/test/data/webui/chromeos/ash_common/keyboard_diagram_test.js
+++ b/chrome/test/data/webui/chromeos/ash_common/keyboard_diagram_test.js
@@ -3,7 +3,8 @@
 // found in the LICENSE file.
 
 import {MechanicalLayout, PhysicalLayout, TopRowKey} from 'chrome://resources/ash/common/keyboard_diagram.js';
-import {assertEquals, assertNotEquals, assertTrue} from '../../chai_assert.js';
+import {KeyboardKeyState} from 'chrome://resources/ash/common/keyboard_key.js';
+import {assertEquals, assertNotEquals, assertThrows, assertTrue} from '../../chai_assert.js';
 import {flushTasks, waitAfterNextRender} from '../../test_util.js';
 
 export function keyboardDiagramTestSuite() {
@@ -145,4 +146,71 @@
     assertEquals('keyboard:back', keyElements[1].icon);
     assertEquals('delete', keyElements[6].mainGlyph);
   });
+
+  test('setKeyState', async () => {
+    const backspaceKey = diagramElement.root.getElementById('backspaceKey');
+    assertEquals(KeyboardKeyState.kNotPressed, backspaceKey.state);
+    diagramElement.setKeyState(
+        14 /* KEY_BACKSPACE */, KeyboardKeyState.kPressed);
+    assertEquals(KeyboardKeyState.kPressed, backspaceKey.state);
+  });
+
+  test('setKeyState_twoPartEnter', async () => {
+    diagramElement.mechanicalLayout = MechanicalLayout.kIso;
+    await flushTasks();
+
+    const enterKey = diagramElement.root.getElementById('enterKey');
+    const enterKeyLowerPart =
+        diagramElement.root.getElementById('enterKeyLowerPart');
+    assertEquals(KeyboardKeyState.kNotPressed, enterKey.state);
+    assertEquals(KeyboardKeyState.kNotPressed, enterKeyLowerPart.state);
+    diagramElement.setKeyState(28 /* KEY_ENTER */, KeyboardKeyState.kPressed);
+    assertEquals(KeyboardKeyState.kPressed, enterKey.state);
+    assertEquals(KeyboardKeyState.kPressed, enterKeyLowerPart.state);
+  });
+
+  test('setTopRowKeyState', async () => {
+    const topRowContainer = diagramElement.$.topRow;
+    const testKeySet = [
+      TopRowKey.kBack,
+      TopRowKey.kRefresh,
+      TopRowKey.kNone,
+      TopRowKey.kNone,
+      TopRowKey.kScreenMirror,
+      TopRowKey.kDelete,
+    ];
+
+    diagramElement.topRowKeys = testKeySet;
+    await flushTasks();
+
+    diagramElement.setTopRowKeyState(
+        /* topRowPosition= */ 0, KeyboardKeyState.kPressed);
+    const keyElements = topRowContainer.getElementsByTagName('keyboard-key');
+    assertEquals(KeyboardKeyState.kPressed, keyElements[1].state);
+  });
+
+  test('setTopRowKeyState_invalidPosition', async () => {
+    const topRowContainer = diagramElement.$.topRow;
+    const testKeySet = [
+      TopRowKey.kBack,
+      TopRowKey.kRefresh,
+      TopRowKey.kNone,
+      TopRowKey.kNone,
+      TopRowKey.kScreenMirror,
+      TopRowKey.kDelete,
+    ];
+
+    diagramElement.topRowKeys = testKeySet;
+    await flushTasks();
+
+    assertThrows(
+        () => diagramElement.setTopRowKeyState(
+            /* topRowPosition= */ -1, KeyboardKeyState.kPressed),
+        RangeError);
+    assertThrows(
+        () => diagramElement.setTopRowKeyState(
+            /* topRowPosition= */ testKeySet.length + 1,
+            KeyboardKeyState.kPressed),
+        RangeError);
+  });
 }
diff --git a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_test.js b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_test.js
index 72b259b7..7cfd1fa 100644
--- a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_test.js
+++ b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_extension_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import {EmojiPicker} from 'chrome://emoji-picker/emoji_picker.js';
+import {EmojiPickerApiProxyImpl} from 'chrome://emoji-picker/emoji_picker_api_proxy.js';
 import {EMOJI_BUTTON_CLICK, V2_CONTENT_LOADED} from 'chrome://emoji-picker/events.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -123,7 +124,7 @@
       });
 
   test(
-      'click at an emoticon button should trigger the clicking event with ' +
+      'clicking at an emoticon button should trigger the clicking event with ' +
           'correct emoticon string and name.',
       async () => {
         const firstEmoticonButton = await waitForCondition(
@@ -135,7 +136,7 @@
         const buttonClickPromise = new Promise(
             (resolve) =>
                 emojiPicker.addEventListener(EMOJI_BUTTON_CLICK, (event) => {
-                  assertEquals(expectedEmoticonString, event.detail.emoji);
+                  assertEquals(expectedEmoticonString, event.detail.text);
                   assertEquals(expectedEmoticonName, event.detail.name);
                   resolve();
                 }));
@@ -145,4 +146,75 @@
             buttonClickPromise, 1000,
             'Failed to receive emoticon button click event');
       });
+
+  test('there should be no recently used emoticon group when empty.', () => {
+    assert(!findInEmojiPicker('[data-group=emoticon-history] emoticon-group'));
+  });
+
+  test(
+      'history tab button must be disabled when the emoticon history is empty.',
+      () => {
+        const emoticonCategoryButton = findInEmojiPicker(
+            'emoji-search', 'emoji-category-button:last-of-type',
+            'cr-icon-button');
+        emoticonCategoryButton.click();
+        flush();
+        const emoticonHistoryTab = findInEmojiPicker(
+            '.pagination [data-group=history]', 'cr-icon-button');
+        assertTrue(emoticonHistoryTab.disabled);
+      });
+
+  test(
+      'clicking at recently used emoticon buttons should trigger emoticon ' +
+          'insertion.',
+      async () => {
+        EmojiPickerApiProxyImpl.getInstance().isIncognitoTextField = () =>
+            new Promise((resolve) => resolve({incognito: false}));
+
+        const emoticonButton = findInEmojiPicker('emoticon-group', 'button');
+        emoticonButton.click();
+
+        const recentEmoticonGroup = await waitForCondition(
+            () => findInEmojiPicker(
+                '[data-group=emoticon-history] emoticon-group'));
+
+        const recentlyUsedEmoticonButton =
+            deepQuerySelector(recentEmoticonGroup, ['.emoticon-button']);
+        const buttonClickPromise = new Promise(
+            (resolve) =>
+                emojiPicker.addEventListener(EMOJI_BUTTON_CLICK, (event) => {
+                  assertEquals(
+                      emoticonButton.innerHTML.trim(), event.detail.text);
+                  assertEquals(
+                      emoticonButton.getAttribute('emoticon-name'),
+                      event.detail.name);
+                  resolve();
+                }));
+
+        recentlyUsedEmoticonButton.click();
+        await waitWithTimeout(
+            buttonClickPromise, 1000,
+            'Clicking at recently used emoticon buttons does not trigger ' +
+                'emoticon insertion.');
+      });
+
+  test(
+      'recently used emoticon group should contain the correct emoticon ' +
+          'after it is clicked.',
+      async () => {
+        EmojiPickerApiProxyImpl.getInstance().isIncognitoTextField = () =>
+            new Promise((resolve) => resolve({incognito: false}));
+
+        const emoticonButton = findInEmojiPicker('emoticon-group', 'button');
+        emoticonButton.click();
+
+        const recentEmoticonGroup = await waitForCondition(
+            () => findInEmojiPicker(
+                '[data-group=emoticon-history] emoticon-group'));
+        assert(recentEmoticonGroup);
+
+        const recentlyUsedEmoticons =
+            recentEmoticonGroup.shadowRoot.querySelectorAll('.emoticon-button');
+        assertEquals(1, recentlyUsedEmoticons.length);
+      });
 });
\ No newline at end of file
diff --git a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_store_test.js b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_store_test.js
index 625b4276..12926730 100644
--- a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_store_test.js
+++ b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_store_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {RecentEmojiStore} from 'chrome://emoji-picker/store.js';
+import {RecentlyUsedStore} from 'chrome://emoji-picker/store.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 
 import {assertDeepEquals} from '../../chai_assert.js';
@@ -17,7 +17,7 @@
 
   setup(() => {
     window.localStorage.clear();
-    store = new RecentEmojiStore();
+    store = new RecentlyUsedStore('emoji-recently-used');
   });
 
   test('store should be initially empty', () => {
@@ -25,29 +25,29 @@
   });
 
   test('store data should be persisted', () => {
-    store.bumpEmoji(TEST_EMOJI.grin.string);
+    store.bumpItem(TEST_EMOJI.grin.string);
 
-    const newStore = new RecentEmojiStore();
+    const newStore = new RecentlyUsedStore('emoji-recently-used');
     assertDeepEquals(store.data, newStore.data);
   });
 
   test('one emoji in recently used', () => {
-    store.bumpEmoji(TEST_EMOJI.grin.string);
+    store.bumpItem(TEST_EMOJI.grin.string);
     assertDeepEquals([TEST_EMOJI.grin.string], store.data);
 
-    store.bumpEmoji(TEST_EMOJI.grin.string);
+    store.bumpItem(TEST_EMOJI.grin.string);
     assertDeepEquals(
         [TEST_EMOJI.grin.string], store.data,
         'clicking an existing emoji should not duplicate it');
   });
 
   test('two emoji in recently used', () => {
-    store.bumpEmoji(TEST_EMOJI.grin.string);
-    store.bumpEmoji(TEST_EMOJI.waving.string);
+    store.bumpItem(TEST_EMOJI.grin.string);
+    store.bumpItem(TEST_EMOJI.waving.string);
     assertDeepEquals(
         [TEST_EMOJI.waving.string, TEST_EMOJI.grin.string], store.data);
 
-    store.bumpEmoji(TEST_EMOJI.grin.string);
+    store.bumpItem(TEST_EMOJI.grin.string);
     assertDeepEquals(
         [TEST_EMOJI.grin.string, TEST_EMOJI.waving.string], store.data,
         'clicking an existing emoji should move it to the front');
diff --git a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
index 222ce0e9..c6918dd 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
@@ -34,6 +34,7 @@
     "google_photos_albums_element_test.ts",
     "google_photos_collection_element_test.ts",
     "google_photos_photos_by_album_id_element_test.ts",
+    "google_photos_photos_element_test.ts",
     "local_images_element_test.ts",
     "personalization_app_component_test.ts",
     "personalization_app_controller_test.ts",
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
index 6926d71..b40e9ef 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'chrome://personalization/trusted/ambient/toggle_row.js';
-
 import {AmbientSubpage} from 'chrome://personalization/trusted/ambient/ambient_subpage_element.js';
 import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
 
@@ -34,5 +32,9 @@
         toggleRow!.shadowRoot!.querySelector('cr-toggle') as CrToggleElement;
     assertTrue(!!toggleButton);
     assertFalse(toggleButton!.checked);
+
+    const topicSource =
+        ambientSubpageElement.shadowRoot!.querySelector('topic-source-list');
+    assertTrue(!!topicSource);
   });
 }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/google_photos_collection_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/google_photos_collection_element_test.ts
index fcec21f..2f37616 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/google_photos_collection_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/google_photos_collection_element_test.ts
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {GooglePhotosAlbum} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js';
 import {GooglePhotosCollection} from 'chrome://personalization/trusted/wallpaper/google_photos_collection_element.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {baseSetup, initElement, teardownElement} from './personalization_app_test_utils.js';
 import {TestPersonalizationStore} from './test_personalization_store.js';
+import {TestWallpaperProvider} from './test_wallpaper_interface_provider.js';
 
 export function GooglePhotosCollectionTest() {
   let googlePhotosCollectionElement: GooglePhotosCollection|null;
-
   let personalizationStore: TestPersonalizationStore;
+  let wallpaperProvider: TestWallpaperProvider;
 
   /**
    * Returns the match for |selector| in |googlePhotosCollectionElement|'s
@@ -37,6 +38,8 @@
 
     const mocks = baseSetup();
     personalizationStore = mocks.personalizationStore;
+    personalizationStore.setReducersEnabled(true);
+    wallpaperProvider = mocks.wallpaperProvider;
   });
 
   teardown(async () => {
@@ -46,11 +49,13 @@
 
   test('displays only photos content', async () => {
     // Tabs and albums content are not displayed if albums are absent.
-    personalizationStore.data.wallpaper.googlePhotos.albums = null;
-    personalizationStore.data.wallpaper.googlePhotos.photos =
-        Array.from({length: 1});
-    personalizationStore.data.wallpaper.loading.googlePhotos.albums = false;
-    personalizationStore.data.wallpaper.loading.googlePhotos.photos = false;
+    wallpaperProvider.setGooglePhotosAlbums(undefined);
+    wallpaperProvider.setGooglePhotosCount(1);
+    wallpaperProvider.setGooglePhotosPhotos([{
+      id: '9bd1d7a3-f995-4445-be47-53c5b58ce1cb',
+      date: {data: []},
+      url: {url: 'foo.com'}
+    }]);
 
     googlePhotosCollectionElement =
         initElement(GooglePhotosCollection, {hidden: false});
@@ -76,12 +81,19 @@
 
   test('displays tabs and content for photos and albums', async () => {
     // Tabs and albums content are only displayed if albums are present.
-    personalizationStore.data.wallpaper.googlePhotos.albums =
-        Array.from({length: 1});
-    personalizationStore.data.wallpaper.googlePhotos.photos =
-        Array.from({length: 1});
-    personalizationStore.data.wallpaper.loading.googlePhotos.albums = false;
-    personalizationStore.data.wallpaper.loading.googlePhotos.photos = false;
+    const albums: GooglePhotosAlbum[] = [{
+      id: '9bd1d7a3-f995-4445-be47-53c5b58ce1cb',
+      title: 'Album 0',
+      photoCount: 1,
+      preview: {url: 'foo.com'}
+    }];
+    wallpaperProvider.setGooglePhotosAlbums(albums);
+    wallpaperProvider.setGooglePhotosCount(1);
+    wallpaperProvider.setGooglePhotosPhotos([{
+      id: '9bd1d7a3-f995-4445-be47-53c5b58ce1cb',
+      date: {data: []},
+      url: {url: 'foo.com'}
+    }]);
 
     googlePhotosCollectionElement =
         initElement(GooglePhotosCollection, {hidden: false});
@@ -142,7 +154,7 @@
     // * photos by album id content to be visible.
     // * albums content to be hidden.
     // * photos content to be hidden.
-    googlePhotosCollectionElement.setAttribute('album-id', '1');
+    googlePhotosCollectionElement.setAttribute('album-id', albums[0]!.id);
     await waitAfterNextRender(googlePhotosCollectionElement);
     assertEquals(window.getComputedStyle(tabStrip).display, 'none');
     assertFalse(photosByAlbumIdContent.hidden);
@@ -178,10 +190,9 @@
   });
 
   test('displays zero state when there is no content', async () => {
-    personalizationStore.data.wallpaper.googlePhotos.albums = [];
-    personalizationStore.data.wallpaper.googlePhotos.photos = [];
-    personalizationStore.data.wallpaper.loading.googlePhotos.albums = false;
-    personalizationStore.data.wallpaper.loading.googlePhotos.photos = false;
+    wallpaperProvider.setGooglePhotosAlbums([]);
+    wallpaperProvider.setGooglePhotosCount(0);
+    wallpaperProvider.setGooglePhotosPhotos([]);
 
     googlePhotosCollectionElement =
         initElement(GooglePhotosCollection, {hidden: false});
diff --git a/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts
new file mode 100644
index 0000000..592be4fa
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts
@@ -0,0 +1,92 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {GooglePhotosPhoto} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js';
+import {GooglePhotosPhotos} from 'chrome://personalization/trusted/wallpaper/google_photos_photos_element.js';
+import {initializeGooglePhotosData} from 'chrome://personalization/trusted/wallpaper/wallpaper_controller.js';
+import {WallpaperGridItem} from 'chrome://personalization/trusted/wallpaper/wallpaper_grid_item_element.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
+
+import {baseSetup, initElement, teardownElement} from './personalization_app_test_utils.js';
+import {TestPersonalizationStore} from './test_personalization_store.js';
+import {TestWallpaperProvider} from './test_wallpaper_interface_provider.js';
+
+export function GooglePhotosPhotosTest() {
+  let googlePhotosPhotosElement: GooglePhotosPhotos|null;
+  let personalizationStore: TestPersonalizationStore;
+  let wallpaperProvider: TestWallpaperProvider;
+
+  /**
+   * Returns all matches for |selector| in |googlePhotosPhotosElement|'s shadow
+   * DOM.
+   */
+  function querySelectorAll(selector: string): Element[]|null {
+    const matches =
+        googlePhotosPhotosElement!.shadowRoot!.querySelectorAll(selector);
+    return matches ? [...matches] : null;
+  }
+
+  setup(() => {
+    loadTimeData.overrideValues({'isGooglePhotosIntegrationEnabled': true});
+
+    const mocks = baseSetup();
+    personalizationStore = mocks.personalizationStore;
+    personalizationStore.setReducersEnabled(true);
+    wallpaperProvider = mocks.wallpaperProvider;
+  });
+
+  teardown(async () => {
+    await teardownElement(googlePhotosPhotosElement);
+    googlePhotosPhotosElement = null;
+  });
+
+  test('displays photos', async () => {
+    const photos: GooglePhotosPhoto[] = [
+      {
+        id: '9bd1d7a3-f995-4445-be47-53c5b58ce1cb',
+        date: {data: []},
+        url: {url: 'foo.com'}
+      },
+      {
+        id: '0ec40478-9712-42e1-b5bf-3e75870ca042',
+        date: {data: []},
+        url: {url: 'bar.com'}
+      },
+      {
+        id: '0a268a37-877a-4936-81d4-38cc84b0f596',
+        date: {data: []},
+        url: {url: 'baz.com'}
+      }
+    ];
+
+    // Set values returned by |wallpaperProvider|.
+    wallpaperProvider.setGooglePhotosPhotos(photos);
+    wallpaperProvider.setGooglePhotosCount(photos.length);
+
+    // Initialize |googlePhotosPhotosElement|.
+    googlePhotosPhotosElement =
+        initElement(GooglePhotosPhotos, {hidden: false});
+    await waitAfterNextRender(googlePhotosPhotosElement);
+
+    // The |personalizationStore| should be empty, so no photos should be
+    // rendered initially.
+    const photoSelector = 'wallpaper-grid-item:not([hidden]).photo';
+    assertEquals(querySelectorAll(photoSelector)!.length, 0);
+
+    // Initialize Google Photos data in the |personalizationStore|.
+    await initializeGooglePhotosData(wallpaperProvider, personalizationStore);
+    await waitAfterNextRender(googlePhotosPhotosElement);
+
+    // Verify that the expected |photos| are rendered.
+    const photoEls = querySelectorAll(photoSelector) as WallpaperGridItem[];
+    assertEquals(photoEls.length, photos.length);
+    photoEls.forEach((albumEl, i) => {
+      assertEquals(albumEl.imageSrc, photos[i]!.url.url);
+      assertEquals(albumEl.primaryText, undefined);
+      assertEquals(albumEl.secondaryText, undefined);
+    });
+  });
+}
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_test.ts
index e3db157..92f1331 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_test.ts
@@ -10,6 +10,7 @@
 import {GooglePhotosAlbumsTest} from './google_photos_albums_element_test.js';
 import {GooglePhotosCollectionTest} from './google_photos_collection_element_test.js';
 import {GooglePhotosPhotosByAlbumIdTest} from './google_photos_photos_by_album_id_element_test.js';
+import {GooglePhotosPhotosTest} from './google_photos_photos_element_test.js';
 import {LocalImagesTest} from './local_images_element_test.js';
 import {PersonalizationBreadcrumbTest} from './personalization_breadcrumb_element_test.js';
 import {PersonalizationMainTest} from './personalization_main_element_test.js';
@@ -36,6 +37,7 @@
   GooglePhotosAlbumsTest,
   GooglePhotosCollectionTest,
   GooglePhotosPhotosByAlbumIdTest,
+  GooglePhotosPhotosTest,
   LocalImagesTest,
   PersonalizationBreadcrumbTest,
   PersonalizationMainTest,
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
index 84d92f474..4297c7b 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CurrentWallpaper, FetchGooglePhotosAlbumsResponse, FetchGooglePhotosPhotosResponse, GooglePhotosAlbum, OnlineImageType, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperObserverInterface, WallpaperObserverRemote, WallpaperProviderInterface, WallpaperType} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js';
+import {CurrentWallpaper, FetchGooglePhotosAlbumsResponse, FetchGooglePhotosPhotosResponse, GooglePhotosAlbum, GooglePhotosPhoto, OnlineImageType, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperObserverInterface, WallpaperObserverRemote, WallpaperProviderInterface, WallpaperType} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
 import {assertTrue} from 'chrome://webui-test/chai_assert.js';
@@ -96,6 +96,7 @@
   private images_: WallpaperImage[]|null;
   private googlePhotosAlbums_: GooglePhotosAlbum[]|undefined = [];
   private googlePhotosCount_: number = 0;
+  private googlePhotosPhotos_: GooglePhotosPhoto[]|undefined = [];
   localImages: FilePath[]|null;
   localImageData: Record<string, string>;
   currentWallpaper: CurrentWallpaper;
@@ -155,10 +156,10 @@
   fetchGooglePhotosPhotos() {
     this.methodCalled('fetchGooglePhotosPhotos');
     const response = new FetchGooglePhotosPhotosResponse();
-    // TODO(b/216528919): Wire up with mojo API.
     response.photos =
-        loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ? [] :
-                                                                      undefined;
+        loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ?
+        this.googlePhotosPhotos_ :
+        undefined;
     response.resumeToken = undefined;
     return Promise.resolve({response});
   }
@@ -239,6 +240,10 @@
     this.googlePhotosCount_ = googlePhotosCount;
   }
 
+  setGooglePhotosPhotos(googlePhotosPhotos: GooglePhotosPhoto[]|undefined) {
+    this.googlePhotosPhotos_ = googlePhotosPhotos;
+  }
+
   setImages(images: WallpaperImage[]) {
     this.images_ = images;
   }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
index 2250647..fe1f24d 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
@@ -4,6 +4,7 @@
 
 import {kMaximumGooglePhotosPreviews, kMaximumLocalImagePreviews} from 'chrome://personalization/common/constants.js';
 import {IFrameApi} from 'chrome://personalization/trusted/iframe_api.js';
+import {GooglePhotosPhoto} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js';
 import {emptyState} from 'chrome://personalization/trusted/personalization_state.js';
 import {WallpaperCollections} from 'chrome://personalization/trusted/wallpaper/wallpaper_collections_element.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
@@ -87,7 +88,7 @@
 
     personalizationStore.data.wallpaper.googlePhotos.photos =
         Array.from({length: kMaximumGooglePhotosPreviews + 1})
-            .map((_, i) => `foo://${i}`);
+            .map((_, i) => ({url: {url: `foo://${i}`}}));
     personalizationStore.data.wallpaper.loading.googlePhotos.photos = false;
     personalizationStore.notifyObservers();
 
@@ -103,8 +104,9 @@
 
     assertWindowObjectsEqual(iframe!.contentWindow, target);
     assertDeepEquals(
-        personalizationStore.data.wallpaper.googlePhotos.photos.slice(
-            0, kMaximumGooglePhotosPreviews),
+        personalizationStore.data.wallpaper.googlePhotos.photos
+            .slice(0, kMaximumGooglePhotosPreviews)
+            .map((googlePhoto: GooglePhotosPhoto) => googlePhoto.url),
         data);
   });
 
diff --git a/chrome/test/data/webui/read_later/side_panel/bookmarks_list_interactive_ui_test.ts b/chrome/test/data/webui/read_later/side_panel/bookmarks_list_interactive_ui_test.ts
index cc241516..aa1d8b58 100644
--- a/chrome/test/data/webui/read_later/side_panel/bookmarks_list_interactive_ui_test.ts
+++ b/chrome/test/data/webui/read_later/side_panel/bookmarks_list_interactive_ui_test.ts
@@ -8,8 +8,9 @@
 import {BookmarkFolderElement} from 'chrome://read-later.top-chrome/side_panel/bookmark_folder.js';
 import {BookmarksApiProxyImpl} from 'chrome://read-later.top-chrome/side_panel/bookmarks_api_proxy.js';
 import {BookmarksListElement} from 'chrome://read-later.top-chrome/side_panel/bookmarks_list.js';
-import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
-import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
+import {down, keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {TestBookmarksApiProxy} from './test_bookmarks_api_proxy.js';
@@ -121,11 +122,21 @@
   test('CutsCopyPastesBookmark', async () => {
     const folderElement = getFolderElements(bookmarksList)[0]!;
     const bookmarkElement = getBookmarkElements(folderElement)[0]!;
+
+    // Hide focus states and focus.
+    FocusOutlineManager.forDocument(document).visible = false;
     bookmarkElement.focus();
     assertEquals(bookmarkElement, folderElement.shadowRoot!.activeElement);
 
+    // When focus is hidden, keyboard shortcuts should not be allowed.
+    keyDownOn(bookmarkElement, 0, ['ctrl'], 'x');
+    assertEquals(0, bookmarksApi.getCallCount('cutBookmark'));
+
+    // Show focus states, which should allow keyboard shortcuts.
+    FocusOutlineManager.forDocument(document).visible = true;
     keyDownOn(bookmarkElement, 0, ['ctrl'], 'x');
     const cutId = await bookmarksApi.whenCalled('cutBookmark');
+    assertEquals(1, bookmarksApi.getCallCount('cutBookmark'));
     assertEquals('3', cutId);
 
     keyDownOn(bookmarkElement, 0, ['ctrl'], 'c');
@@ -138,4 +149,20 @@
     assertEquals('0', pastedId);
     assertEquals('3', pastedDestinationId);
   });
+
+  test('ShowsFocusStateOnDrop', () => {
+    const focusOutlineManager = FocusOutlineManager.forDocument(document);
+
+    // Mousedown to hide focus state initially.
+    down(bookmarksList, {x: 0, y: 0});
+    assertFalse(focusOutlineManager.visible);
+
+    // Perform a drop and assert that focus state is visible.
+    bookmarksList.onFinishDrop([folders[0]!.children![0]!]);
+    assertTrue(focusOutlineManager.visible);
+
+    // Make sure on the next mouse event, the focus state gets rehidden.
+    down(bookmarksList, {x: 0, y: 0});
+    assertFalse(focusOutlineManager.visible);
+  });
 });
\ No newline at end of file
diff --git a/chrome/updater/mac/setup/.install.sh b/chrome/updater/mac/setup/.install.sh
index c821f3b1..56794ad7 100755
--- a/chrome/updater/mac/setup/.install.sh
+++ b/chrome/updater/mac/setup/.install.sh
@@ -8,5 +8,7 @@
 PRODUCT_NAME=
 readonly PRODUCT_NAME
 
+env
+
 "${UNPACK_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}" \
-    ${SERVER_ARGS}
+    ${SERVER_ARGS} ${KS_kServerActionArguments}
diff --git a/chrome/updater/mac/signing/pipeline.py b/chrome/updater/mac/signing/pipeline.py
index 1b2b3cb..25b82fd 100644
--- a/chrome/updater/mac/signing/pipeline.py
+++ b/chrome/updater/mac/signing/pipeline.py
@@ -80,7 +80,7 @@
         '--copy',
         '{}:/'.format(app_path),
         '--copy',
-        '{}/chrome/updater/.install:/'.format(paths.input),
+        '{}/chrome/updater/.install:/.keystone_install'.format(paths.input),
     ]
     commands.run_command(pkg_dmg)
     return dmg_path
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc
index cec8c6f..b3961d0 100644
--- a/chrome/updater/test/integration_tests_win.cc
+++ b/chrome/updater/test/integration_tests_win.cc
@@ -4,6 +4,8 @@
 
 #include <wrl/client.h>
 
+#include <regstr.h>
+
 #include <iostream>
 #include <memory>
 #include <string>
@@ -226,6 +228,16 @@
                                &uninstall_cmd_line_string));
       EXPECT_TRUE(base::CommandLine::FromString(uninstall_cmd_line_string)
                       .HasSwitch(kUninstallIfUnusedSwitch));
+
+      if (scope == UpdaterScope::kUser) {
+        std::wstring run_updater_wake_command;
+        EXPECT_EQ(ERROR_SUCCESS,
+                  base::win::RegKey(root, REGSTR_PATH_RUN, KEY_READ)
+                      .ReadValue(GetTaskNamePrefix(scope).c_str(),
+                                 &run_updater_wake_command));
+        EXPECT_TRUE(base::CommandLine::FromString(run_updater_wake_command)
+                        .HasSwitch(kWakeSwitch));
+      }
     } else {
       for (const wchar_t* key :
            {kRegKeyCompanyCloudManagement, kRegKeyCompanyEnrollment,
@@ -234,6 +246,11 @@
       }
 
       EXPECT_FALSE(RegKeyExists(root, UPDATER_KEY));
+
+      if (scope == UpdaterScope::kUser) {
+        EXPECT_FALSE(base::win::RegKey(root, REGSTR_PATH_RUN, KEY_READ)
+                         .HasValue(GetTaskNamePrefix(scope).c_str()));
+      }
     }
   }
 
diff --git a/chrome/updater/win/setup/setup.cc b/chrome/updater/win/setup/setup.cc
index 35fa1ec..0b115df 100644
--- a/chrome/updater/win/setup/setup.cc
+++ b/chrome/updater/win/setup/setup.cc
@@ -192,6 +192,12 @@
   run_updater_wake_command.AppendSwitch(kEnableLoggingSwitch);
   run_updater_wake_command.AppendSwitchASCII(kLoggingModuleSwitch,
                                              kLoggingModuleSwitchValue);
+
+  if (scope == UpdaterScope::kUser) {
+    RegisterUserRunAtStartup(GetTaskNamePrefix(scope), run_updater_wake_command,
+                             install_list.get());
+  }
+
   if (!install_list->Do() ||
       !RegisterWakeTask(run_updater_wake_command, scope)) {
     LOG(ERROR) << "Install failed, rolling back...";
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc
index a409606..08466dd 100644
--- a/chrome/updater/win/setup/setup_util.cc
+++ b/chrome/updater/win/setup/setup_util.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/updater/win/setup/setup_util.h"
 
+#include <regstr.h>
 #include <shlobj.h>
 #include <windows.h>
 
@@ -24,6 +25,7 @@
 #include "base/win/win_util.h"
 #include "build/branding_buildflags.h"
 #include "chrome/installer/util/install_service_work_item.h"
+#include "chrome/installer/util/install_util.h"
 #include "chrome/installer/util/work_item_list.h"
 #include "chrome/updater/app/server/win/updater_idl.h"
 #include "chrome/updater/app/server/win/updater_internal_idl.h"
@@ -340,4 +342,22 @@
   return result;
 }
 
+void RegisterUserRunAtStartup(const std::wstring& run_value_name,
+                              const base::CommandLine& command,
+                              WorkItemList* list) {
+  DCHECK(list);
+  VLOG(1) << __func__;
+
+  list->AddSetRegValueWorkItem(HKEY_CURRENT_USER, REGSTR_PATH_RUN, 0,
+                               run_value_name, command.GetCommandLineString(),
+                               true);
+}
+
+bool UnregisterUserRunAtStartup(const std::wstring& run_value_name) {
+  VLOG(1) << __func__;
+
+  return InstallUtil::DeleteRegistryValue(HKEY_CURRENT_USER, REGSTR_PATH_RUN, 0,
+                                          run_value_name);
+}
+
 }  // namespace updater
diff --git a/chrome/updater/win/setup/setup_util.h b/chrome/updater/win/setup/setup_util.h
index 65e7ffed..ea1cb6e 100644
--- a/chrome/updater/win/setup/setup_util.h
+++ b/chrome/updater/win/setup/setup_util.h
@@ -90,6 +90,16 @@
 // updater to run, and are filtered out from the return value of this function.
 std::vector<base::FilePath> ParseFilesFromDeps(const base::FilePath& deps);
 
+// Adds a worklist item to set a value in the Run key in the user registry under
+// the value `run_value_name` to start the specified `command`.
+void RegisterUserRunAtStartup(const std::wstring& run_value_name,
+                              const base::CommandLine& command,
+                              WorkItemList* list);
+
+// Deletes the value in the Run key in the user registry under the value
+// `run_value_name`.
+bool UnregisterUserRunAtStartup(const std::wstring& run_value_name);
+
 }  // namespace updater
 
 #endif  // CHROME_UPDATER_WIN_SETUP_SETUP_UTIL_H_
diff --git a/chrome/updater/win/setup/uninstall.cc b/chrome/updater/win/setup/uninstall.cc
index b8e4899a3..f1e6c3fe 100644
--- a/chrome/updater/win/setup/uninstall.cc
+++ b/chrome/updater/win/setup/uninstall.cc
@@ -168,6 +168,9 @@
     DeleteComService(uninstall_all);
   DeleteComServer(scope, key, uninstall_all);
 
+  if (scope == UpdaterScope::kUser)
+    UnregisterUserRunAtStartup(GetTaskNamePrefix(scope));
+
   DeleteGoogleUpdateEntries(scope, key);
 
   return RunUninstallScript(scope, uninstall_all);
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc
index a993a775..751eb9f69 100644
--- a/chromecast/browser/cast_browser_main_parts.cc
+++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -56,7 +56,6 @@
 #include "chromecast/browser/service_manager_context.h"
 #include "chromecast/chromecast_buildflags.h"
 #include "chromecast/common/mojom/constants.mojom.h"
-#include "chromecast/common/mojom/identification_settings.mojom.h"
 #include "chromecast/external_mojo/broker_service/broker_service.h"
 #include "chromecast/external_mojo/external_service_support/external_connector.h"
 #include "chromecast/external_mojo/external_service_support/external_service.h"
@@ -711,9 +710,6 @@
       cast_browser_process_->browser_context(), window_manager_.get());
   browser_service_->AddInterface<::chromecast::mojom::CastWebService>(
       web_service_.get());
-  browser_service_
-      ->AddInterface<::chromecast::mojom::BrowserIdentificationSettingsManager>(
-          web_service_.get());
   connector()->RegisterService(::chromecast::mojom::kCastBrowserServiceName,
                                browser_service_.get());
 
diff --git a/chromecast/browser/cast_web_contents_browsertest.cc b/chromecast/browser/cast_web_contents_browsertest.cc
index d2770c8..73f04b68 100644
--- a/chromecast/browser/cast_web_contents_browsertest.cc
+++ b/chromecast/browser/cast_web_contents_browsertest.cc
@@ -112,12 +112,8 @@
 
   MOCK_METHOD1(PageStateChanged, void(PageState page_state));
   MOCK_METHOD2(PageStopped, void(PageState page_state, int error_code));
-  MOCK_METHOD3(RenderFrameCreated,
-               void(int render_process_id,
-                    int render_frame_id,
-                    mojo::PendingAssociatedRemote<
-                        chromecast::mojom::IdentificationSettingsManager>
-                        settings_manager));
+  MOCK_METHOD2(RenderFrameCreated,
+               void(int render_process_id, int render_frame_id));
   MOCK_METHOD0(ResourceLoadFailed, void());
   MOCK_METHOD1(UpdateTitle, void(const std::string& title));
 };
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc
index d9a7e59..e0934ba5 100644
--- a/chromecast/browser/cast_web_contents_impl.cc
+++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -23,7 +23,6 @@
 #include "chromecast/browser/cast_session_id_map.h"
 #include "chromecast/browser/devtools/remote_debugging_server.h"
 #include "chromecast/common/mojom/activity_url_filter.mojom.h"
-#include "chromecast/common/mojom/identification_settings.mojom.h"
 #include "chromecast/common/mojom/queryable_data_store.mojom.h"
 #include "chromecast/common/queryable_data.h"
 #include "chromecast/net/connectivity_checker.h"
@@ -510,28 +509,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(frame_host);
 
-  auto* process = frame_host->GetProcess();
-  const int render_process_id = process->GetID();
-  const int render_frame_id = frame_host->GetRoutingID();
-
-  // Allow observers to use remote interfaces which are hosted by the new
-  // RenderFrame. Since the observer is potentially in a different process,
-  // we have to proxy requests through the browser. The easiest way to do this
-  // is to bind local mojo::Remote<> as the "implementation" for a
-  // mojo::ReceiverSet<> in this process.
-  identification_settings_proxies[frame_host] =
-      std::make_unique<IdentificationSettingsProxy>();
-  auto* proxy = identification_settings_proxies[frame_host].get();
-  frame_host->GetRemoteAssociatedInterfaces()->GetInterface(&(proxy->remote));
-  for (auto& observer : observers_) {
-    mojo::PendingAssociatedRemote<mojom::IdentificationSettingsManager>
-        settings_manager;
-    proxy->receivers.Add(proxy->remote.get(),
-                         settings_manager.InitWithNewEndpointAndPassReceiver());
-    observer->RenderFrameCreated(render_process_id, render_frame_id,
-                                 std::move(settings_manager));
-  }
-
   // TODO(b/187758538): Merge the two ConfigureFeatures() calls.
   mojo::Remote<chromecast::shell::mojom::FeatureManager> feature_manager_remote;
   frame_host->GetRemoteInterfaces()->GetInterface(
@@ -587,11 +564,6 @@
   }
 }
 
-void CastWebContentsImpl::RenderFrameDeleted(
-    content::RenderFrameHost* frame_host) {
-  identification_settings_proxies.erase(frame_host);
-}
-
 std::vector<chromecast::shell::mojom::FeaturePtr>
 CastWebContentsImpl::GetRendererFeatures() {
   std::vector<chromecast::shell::mojom::FeaturePtr> features;
@@ -843,11 +815,6 @@
   DCHECK_EQ(PageState::ERROR, page_state_);
 }
 
-CastWebContentsImpl::IdentificationSettingsProxy::
-    IdentificationSettingsProxy() = default;
-CastWebContentsImpl::IdentificationSettingsProxy::
-    ~IdentificationSettingsProxy() = default;
-
 void CastWebContentsImpl::OnPageLoading() {
   closing_ = false;
   stopped_ = false;
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h
index 8d3dcd94..b48d5358 100644
--- a/chromecast/browser/cast_web_contents_impl.h
+++ b/chromecast/browser/cast_web_contents_impl.h
@@ -115,7 +115,6 @@
 
   // content::WebContentsObserver implementation:
   void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
-  void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
   void PrimaryMainFrameRenderProcessGone(
       base::TerminationStatus status) override;
   void DidStartNavigation(
@@ -151,15 +150,6 @@
       content::WebContentsObserver::MediaStoppedReason reason) override;
 
  private:
-  // Proxy allowing a client to communicate with IdentificationSettingsManager
-  // in a RenderFrame.
-  struct IdentificationSettingsProxy {
-    IdentificationSettingsProxy();
-    ~IdentificationSettingsProxy();
-    mojo::AssociatedRemote<mojom::IdentificationSettingsManager> remote;
-    mojo::AssociatedReceiverSet<mojom::IdentificationSettingsManager> receivers;
-  };
-
   // Constructor used to create inner CastWebContents. This allows inner
   // contents to share the same URL rewrite rules as the root.
   CastWebContentsImpl(content::WebContents* web_contents,
@@ -215,10 +205,6 @@
   on_load_script_injector::OnLoadScriptInjectorHost<uint64_t> script_injector_;
   mojo::Remote<mojom::ApiBindings> api_bindings_;
 
-  base::flat_map<content::RenderFrameHost*,
-                 std::unique_ptr<IdentificationSettingsProxy>>
-      identification_settings_proxies;
-
   // If |ConnectToBindingsService| is invoked, |bindings_received_| is set
   // false. Following |LoadUrl| will be stored in |pending_load_url_|, and
   // will be invoked once bindings are received.
diff --git a/chromecast/browser/cast_web_contents_observer.h b/chromecast/browser/cast_web_contents_observer.h
index ae3e740..9a5dde0 100644
--- a/chromecast/browser/cast_web_contents_observer.h
+++ b/chromecast/browser/cast_web_contents_observer.h
@@ -9,7 +9,6 @@
 
 #include "chromecast/browser/mojom/cast_web_contents.mojom.h"
 #include "chromecast/browser/web_types.h"
-#include "chromecast/common/mojom/identification_settings.mojom.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -53,11 +52,8 @@
 
   // A new RenderFrame was created for the WebContents. |settings_manager| is
   // provided by the frame.
-  void RenderFrameCreated(int render_process_id,
-                          int render_frame_id,
-                          mojo::PendingAssociatedRemote<
-                              chromecast::mojom::IdentificationSettingsManager>
-                              settings_manager) override {}
+  void RenderFrameCreated(int render_process_id, int render_frame_id) override {
+  }
 
   // A navigation has finished in the WebContents' main frame.
   void MainFrameFinishedNavigation() override {}
diff --git a/chromecast/browser/cast_web_service.cc b/chromecast/browser/cast_web_service.cc
index 67a76b9..766f218 100644
--- a/chromecast/browser/cast_web_service.cc
+++ b/chromecast/browser/cast_web_service.cc
@@ -180,73 +180,4 @@
                 });
 }
 
-void CastWebService::CreateSessionWithSubstitutions(
-    const std::string& session_id,
-    std::vector<mojom::SubstitutableParameterPtr> params) {
-  DCHECK(settings_managers_.find(session_id) == settings_managers_.end());
-  auto settings_manager_it = settings_managers_.insert_or_assign(
-      session_id, base::MakeRefCounted<IdentificationSettingsManager>());
-  settings_manager_it.first->second->SetSubstitutableParameters(
-      std::move(params));
-  LOG(INFO) << "Added session: " << session_id;
-}
-
-void CastWebService::SetClientAuthForSession(
-    const std::string& session_id,
-    mojo::PendingRemote<mojom::ClientAuthDelegate> client_auth_delegate) {
-  GetSessionManager(session_id)->SetClientAuth(std::move(client_auth_delegate));
-}
-
-void CastWebService::UpdateAppSettingsForSession(
-    const std::string& session_id,
-    mojom::AppSettingsPtr app_settings) {
-  GetSessionManager(session_id)->UpdateAppSettings(std::move(app_settings));
-}
-
-void CastWebService::UpdateDeviceSettingsForSession(
-    const std::string& session_id,
-    mojom::DeviceSettingsPtr device_settings) {
-  GetSessionManager(session_id)
-      ->UpdateDeviceSettings(std::move(device_settings));
-}
-
-void CastWebService::UpdateSubstitutableParamValuesForSession(
-    const std::string& session_id,
-    std::vector<mojom::IndexValuePairPtr> updated_values) {
-  GetSessionManager(session_id)
-      ->UpdateSubstitutableParamValues(std::move(updated_values));
-}
-
-void CastWebService::UpdateBackgroundModeForSession(
-    const std::string& session_id,
-    bool background_mode) {
-  GetSessionManager(session_id)->UpdateBackgroundMode(background_mode);
-}
-
-void CastWebService::OnSessionDestroyed(const std::string& session_id) {
-  size_t num_erased = settings_managers_.erase(session_id);
-  if (num_erased == 0U) {
-    LOG(INFO) << "Successfully erased session: " << session_id;
-    return;
-  }
-  LOG(ERROR) << "Failed to erase session: " << session_id;
-}
-
-scoped_refptr<CastURLLoaderThrottle::Delegate>
-CastWebService::GetURLLoaderThrottleDelegateForSession(
-    const std::string& session_id) {
-  auto delegate_it = settings_managers_.find(session_id);
-  if (delegate_it == settings_managers_.end()) {
-    return nullptr;
-  }
-  return delegate_it->second;
-}
-
-IdentificationSettingsManager* CastWebService::GetSessionManager(
-    const std::string& session_id) {
-  auto it = settings_managers_.find(session_id);
-  CHECK(it != settings_managers_.end());
-  return it->second.get();
-}
-
 }  // namespace chromecast
diff --git a/chromecast/browser/cast_web_service.h b/chromecast/browser/cast_web_service.h
index 1a8775f..7debc22 100644
--- a/chromecast/browser/cast_web_service.h
+++ b/chromecast/browser/cast_web_service.h
@@ -18,8 +18,6 @@
 #include "chromecast/browser/cast_web_view.h"
 #include "chromecast/browser/cast_web_view_factory.h"
 #include "chromecast/browser/mojom/cast_web_service.mojom.h"
-#include "chromecast/common/identification_settings_manager.h"
-#include "chromecast/common/mojom/identification_settings.mojom.h"
 #include "chromecast/external_mojo/external_service_support/reconnecting_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "url/origin.h"
@@ -43,8 +41,7 @@
 // they go out of scope, allowing us to keep the pages alive for extra time if
 // needed. CastWebService allows us to synchronously destroy all pages when the
 // system is shutting down, preventing use of freed browser resources.
-class CastWebService : public mojom::CastWebService,
-                       public mojom::BrowserIdentificationSettingsManager {
+class CastWebService : public mojom::CastWebService {
  public:
   CastWebService(content::BrowserContext* browser_context,
                  CastWindowManager* window_manager);
@@ -84,28 +81,6 @@
   void FlushDomLocalStorage() override;
   void ClearLocalStorage(ClearLocalStorageCallback callback) override;
 
-  // mojom::BrowserIdentificationSettingsManager implementation:
-  void CreateSessionWithSubstitutions(
-      const std::string& session_id,
-      std::vector<mojom::SubstitutableParameterPtr> params) override;
-  void SetClientAuthForSession(const std::string& session_id,
-                               mojo::PendingRemote<mojom::ClientAuthDelegate>
-                                   client_auth_delegate) override;
-  void UpdateAppSettingsForSession(const std::string& session_id,
-                                   mojom::AppSettingsPtr app_settings) override;
-  void UpdateDeviceSettingsForSession(
-      const std::string& session_id,
-      mojom::DeviceSettingsPtr device_settings) override;
-  void UpdateSubstitutableParamValuesForSession(
-      const std::string& session_id,
-      std::vector<mojom::IndexValuePairPtr> updated_values) override;
-  void UpdateBackgroundModeForSession(const std::string& session_id,
-                                      bool background_mode) override;
-  void OnSessionDestroyed(const std::string& session_id) override;
-
-  scoped_refptr<CastURLLoaderThrottle::Delegate>
-  GetURLLoaderThrottleDelegateForSession(const std::string& session_id);
-
   // Immediately deletes all owned CastWebViews. This should happen before
   // CastWebService is deleted, to prevent UAF of shared browser objects.
   void DeleteOwnedWebViews();
@@ -114,9 +89,6 @@
   void OwnerDestroyed(CastWebView* web_view);
   void DeleteWebView(CastWebView* web_view);
 
-  IdentificationSettingsManager* GetSessionManager(
-      const std::string& session_id);
-
   content::BrowserContext* const browser_context_;
   // This is used on Aura platforms.
   CastWindowManager* const window_manager_;
@@ -145,10 +117,6 @@
   const std::unique_ptr<LRURendererCache> overlay_renderer_cache_;
   bool immediately_delete_webviews_ = false;
 
-  base::flat_map<std::string /* session_id */,
-                 scoped_refptr<IdentificationSettingsManager>>
-      settings_managers_;
-
   std::vector<std::string> cast_webui_hosts_;
 
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
diff --git a/chromecast/browser/mojom/cast_web_contents.mojom b/chromecast/browser/mojom/cast_web_contents.mojom
index b3e2eda..ebf5dd1 100644
--- a/chromecast/browser/mojom/cast_web_contents.mojom
+++ b/chromecast/browser/mojom/cast_web_contents.mojom
@@ -5,7 +5,6 @@
 module chromecast.mojom;
 
 import "chromecast/bindings/public/mojom/api_bindings.mojom";
-import "chromecast/common/mojom/identification_settings.mojom";
 import "chromecast/mojo/mojom/remote_interfaces.mojom";
 import "components/url_rewrite/mojom/url_request_rewrite.mojom";
 import "mojo/public/mojom/base/values.mojom";
@@ -44,9 +43,7 @@
   // provided by the frame.
   RenderFrameCreated(
       int32 render_process_id,
-      int32 render_frame_id,
-      pending_associated_remote<chromecast.mojom.IdentificationSettingsManager>
-          settings_manager);
+      int32 render_frame_id);
 
   // A navigation has finished in the WebContents' main frame.
   MainFrameFinishedNavigation();
diff --git a/chromecast/browser/mojom/cast_web_service.mojom b/chromecast/browser/mojom/cast_web_service.mojom
index e13df9a..2018cb0 100644
--- a/chromecast/browser/mojom/cast_web_service.mojom
+++ b/chromecast/browser/mojom/cast_web_service.mojom
@@ -7,7 +7,6 @@
 import "chromecast/browser/webui/mojom/webui.mojom";
 import "chromecast/browser/mojom/cast_content_window.mojom";
 import "chromecast/browser/mojom/cast_web_contents.mojom";
-import "chromecast/common/mojom/identification_settings.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "url/mojom/url.mojom";
 
diff --git a/chromecast/cast_core/runtime/browser/runtime_application_base.cc b/chromecast/cast_core/runtime/browser/runtime_application_base.cc
index 35977688..7cd0419 100644
--- a/chromecast/cast_core/runtime/browser/runtime_application_base.cc
+++ b/chromecast/cast_core/runtime/browser/runtime_application_base.cc
@@ -241,10 +241,6 @@
     GetCastWebContents()->ClosePage();
   }
 
-  if (web_service_) {
-    web_service_->OnSessionDestroyed(cast_session_id());
-  }
-
   grpc_server_->Stop();
   grpc_server_.reset();
   LOG(INFO) << "Application is stopped: " << *this;
diff --git a/chromecast/common/BUILD.gn b/chromecast/common/BUILD.gn
index 8ba7a3b..7e31143 100644
--- a/chromecast/common/BUILD.gn
+++ b/chromecast/common/BUILD.gn
@@ -82,11 +82,7 @@
   sources = [
     "cast_content_client.cc",
     "cast_content_client.h",
-    "cast_url_loader_throttle.cc",
-    "cast_url_loader_throttle.h",
     "global_descriptors.h",
-    "identification_settings_manager.cc",
-    "identification_settings_manager.h",
     "user_agent.cc",
     "user_agent.h",
   ]
@@ -98,15 +94,11 @@
     "//chromecast/base",
     "//chromecast/base:cast_version",
     "//chromecast/common/media",
-    "//chromecast/common/mojom",
     "//components/cast/common:constants",
     "//components/cdm/common:common",
     "//components/version_info",
     "//content/public/common",
     "//media:media_buildflags",
-    "//mojo/public/cpp/bindings",
-    "//net",
-    "//services/network/public/cpp:cpp",
     "//third_party/widevine/cdm:buildflags",
     "//ui/base",
     "//url:url",
diff --git a/chromecast/common/cast_url_loader_throttle.cc b/chromecast/common/cast_url_loader_throttle.cc
deleted file mode 100644
index cd567b3..0000000
--- a/chromecast/common/cast_url_loader_throttle.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chromecast/common/cast_url_loader_throttle.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/check.h"
-#include "base/notreached.h"
-#include "net/base/net_errors.h"
-#include "services/network/public/cpp/resource_request.h"
-
-namespace chromecast {
-
-CastURLLoaderThrottle::CastURLLoaderThrottle(scoped_refptr<Delegate> delegate,
-                                             const std::string& session_id)
-    : settings_delegate_(std::move(delegate)),
-      session_id_(session_id),
-      weak_factory_(this) {
-  weak_this_ = weak_factory_.GetWeakPtr();
-}
-
-CastURLLoaderThrottle::~CastURLLoaderThrottle() = default;
-
-void CastURLLoaderThrottle::DetachFromCurrentSequence() {}
-
-void CastURLLoaderThrottle::WillStartRequest(
-    network::ResourceRequest* request,
-    bool* defer) {
-  // Although unlikely, but there might be some weird edge case where `delegate`
-  // passed in the constructor is nullptr.
-  if (!settings_delegate_) {
-    return;
-  }
-  int error = settings_delegate_->WillStartResourceRequest(
-      request, session_id_,
-      base::BindOnce(&CastURLLoaderThrottle::ResumeRequest, weak_this_));
-  if (error == net::ERR_IO_PENDING) {
-    deferred_ = true;
-    *defer = true;
-  }
-}
-
-bool CastURLLoaderThrottle::makes_unsafe_redirect() {
-  // Yes, this makes cross-scheme redirects.
-  return true;
-}
-
-void CastURLLoaderThrottle::ResumeRequest(
-    int error,
-    net::HttpRequestHeaders headers,
-    net::HttpRequestHeaders cors_exempt_headers) {
-  DCHECK(deferred_);
-  if (error != net::OK) {
-    NOTREACHED() << "Trying to resume a request with unexpected error: "
-                 << error;
-    return;
-  }
-  deferred_ = false;
-  delegate_->UpdateDeferredRequestHeaders(headers, cors_exempt_headers);
-  delegate_->Resume();
-}
-
-}  // namespace chromecast
diff --git a/chromecast/common/identification_settings_manager.h b/chromecast/common/identification_settings_manager.h
deleted file mode 100644
index 2695bb05..0000000
--- a/chromecast/common/identification_settings_manager.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROMECAST_COMMON_IDENTIFICATION_SETTINGS_MANAGER_H_
-#define CHROMECAST_COMMON_IDENTIFICATION_SETTINGS_MANAGER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/containers/flat_map.h"
-#include "base/synchronization/lock.h"
-#include "base/time/clock.h"
-#include "base/time/time.h"
-#include "chromecast/common/cast_url_loader_throttle.h"
-#include "chromecast/common/mojom/identification_settings.mojom.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "net/http/http_request_headers.h"
-#include "url/gurl.h"
-
-namespace chromecast {
-
-// Receives messages from the browser process and stores identification settings
-// to feed into URLLoaderThrottles for throttling url requests in the browser or
-// renderers. When constructed in a renderer, this class could be deleted on a
-// different thread from the main thread.
-class IdentificationSettingsManager
-    : public mojom::IdentificationSettingsManager,
-      public CastURLLoaderThrottle::Delegate {
- public:
-  using RequestCompletionCallback = base::OnceCallback<
-      void(int, net::HttpRequestHeaders, net::HttpRequestHeaders)>;
-  using DoneSigningCallback = base::OnceCallback<void()>;
-  using EnsureCertsCallback = base::OnceCallback<void()>;
-
-  IdentificationSettingsManager();
-  IdentificationSettingsManager(const IdentificationSettingsManager&) = delete;
-  IdentificationSettingsManager& operator=(
-      const IdentificationSettingsManager&) = delete;
-
-  // CastURLLoaderThrottle::Delegate implementation:
-  // |callback| will only be run if net::IO_PENDING is returned.
-  int WillStartResourceRequest(network::ResourceRequest* request,
-                               const std::string& /* session_id */,
-                               RequestCompletionCallback callback) override;
-
-  // chromecast::mojom::IdentificationSettingsManager implementation:
-  void SetSubstitutableParameters(
-      std::vector<mojom::SubstitutableParameterPtr> params) override;
-  void SetClientAuth(mojo::PendingRemote<mojom::ClientAuthDelegate>
-                         client_auth_delegate) override;
-  void UpdateAppSettings(mojom::AppSettingsPtr app_settings) override;
-  void UpdateDeviceSettings(mojom::DeviceSettingsPtr device_settings) override;
-  void UpdateSubstitutableParamValues(
-      std::vector<mojom::IndexValuePairPtr> updated_values) override;
-  void UpdateBackgroundMode(bool background_mode) override;
-
- protected:
-  ~IdentificationSettingsManager() override;
-
- private:
-  struct RequestInfo;
-
-  struct SubstitutableParameter {
-    SubstitutableParameter();
-    ~SubstitutableParameter();
-
-    // Explicitly allows copy and move.
-    SubstitutableParameter(const SubstitutableParameter& other);
-    SubstitutableParameter& operator=(const SubstitutableParameter& other) =
-        default;
-    SubstitutableParameter(SubstitutableParameter&& other) noexcept;
-    SubstitutableParameter& operator=(SubstitutableParameter&& other) noexcept =
-        default;
-
-    uint32_t index;
-    std::string name;
-    std::string replacement_token;
-    std::string suppression_token;
-    bool is_signature = false;
-    bool suppress_header = false;
-    bool need_query = false;
-    std::string value;
-  };
-
-  SubstitutableParameter ConvertSubstitutableParameterFromMojom(
-      mojom::SubstitutableParameterPtr mojo_param);
-
-  void MoveCorsExemptHeaders(net::HttpRequestHeaders* headers,
-                             net::HttpRequestHeaders* cors_exempt_headers);
-  void HandlePendingRequests();
-  GURL FindReplacementURL(const GURL& gurl) const;
-
-  bool IsAllowed(const GURL& gurl);
-  bool IsAppAllowedForDeviceIdentification() const;
-  int ApplyBackgroundQueryParamIfNeeded(const GURL& orig_url,
-                                        GURL& new_url) const;
-  int ApplyDeviceIdentificationSettings(const GURL& orig_url,
-                                        GURL& new_url,
-                                        net::HttpRequestHeaders* headers);
-  int ApplyHeaderChanges(const std::vector<SubstitutableParameter>& params,
-                         net::HttpRequestHeaders* headers);
-  int ApplyURLReplacementSettings(const GURL& request_url,
-                                  const GURL& replacement_url,
-                                  GURL& new_url) const;
-  int EnsureSignature();
-  int CreateSignatureAsync();
-  void SignatureComplete(
-      DoneSigningCallback done_signing,
-      std::vector<chromecast::mojom::IndexValuePairPtr> signature_headers,
-      base::Time next_refresh_time);
-  void InitCerts(
-      std::vector<chromecast::mojom::IndexValuePairPtr> cert_headers);
-
-  // The following methods must only be accessed while holding exclusive
-  // ownership of |lock_| for thread-safe access. Asserted at compile time via
-  // EXCLUSIVE_LOCKS_REQUIRED and run-time via base::Lock::AssertAcquired.
-  int EnsureCerts() EXCLUSIVE_LOCKS_REQUIRED(lock_);
-
-  void ReplaceURL(const GURL& source,
-                  const GURL& replacement,
-                  GURL& new_url) const;
-
-  bool NeedParameter(const SubstitutableParameter& param, uint32_t index) const;
-  bool NeedsSignature(
-      const std::vector<SubstitutableParameter>& parameters) const;
-  void AnalyzeAndReplaceQueryString(
-      const GURL& orig_url,
-      GURL& new_url,
-      std::vector<SubstitutableParameter>* params);
-  void AddHttpHeaders(const std::vector<SubstitutableParameter>& parameters,
-                      net::HttpRequestHeaders* headers) const;
-
-  // A list of parameters used to replace some patterns in the template strings
-  // i.e. JWT template. It is also used to fill in http headers.
-  std::vector<SubstitutableParameter> substitutable_params_;
-
-  // A set of headers which rarely change.
-  base::flat_map<std::string /* header_name */, std::string /* header_value */>
-      static_headers_;
-
-  // Whether the app is in background mode.
-  bool background_mode_ = false;
-
-  // Whether the app is allowed for device identification.
-  bool is_allowed_for_device_identification_ = false;
-
-  // Bit representation of allowed headers.
-  int allowed_headers_ = 0;
-
-  // Host names used to match against http requests. The identification settings
-  // are only applied if one of the host names matches the host name of the
-  // request.
-  std::vector<std::string> full_host_names_;
-  std::vector<std::string> wildcard_host_names_;
-
-  // Replacement map from canonical URL strings to GURLs.
-  base::flat_map<std::string, GURL> replacements_;
-
-  // Whether a request to generate certificates is sent.
-  bool create_cert_in_progress_ GUARDED_BY(lock_) = false;
-
-  // Whether a signature creation request is sent.
-  bool create_signature_in_progress_ GUARDED_BY(lock_) = false;
-
-  // Whether certificates have been initialized.
-  bool cert_initialized_ GUARDED_BY(lock_) = false;
-
-  // When the next time the signature needs to be refreshed.
-  base::Time next_refresh_time_ GUARDED_BY(lock_);
-
-  base::Clock* const clock_ GUARDED_BY(lock_);
-
-  // TODO(b/159910473): Remove the lock if possible.
-  mutable base::Lock lock_;
-
-  mojo::Remote<mojom::ClientAuthDelegate> client_auth_delegate_;
-  std::vector<std::unique_ptr<RequestInfo>> pending_requests_;
-};
-
-}  // namespace chromecast
-
-#endif  // CHROMECAST_COMMON_IDENTIFICATION_SETTINGS_MANAGER_H_
diff --git a/chromecast/common/mojom/BUILD.gn b/chromecast/common/mojom/BUILD.gn
index 255fae0..a6ce042 100644
--- a/chromecast/common/mojom/BUILD.gn
+++ b/chromecast/common/mojom/BUILD.gn
@@ -17,7 +17,6 @@
     "feature_manager.mojom",
     "feature_update.mojom",
     "gesture.mojom",
-    "identification_settings.mojom",
     "js_channel.mojom",
     "media_caps.mojom",
     "memory_pressure.mojom",
diff --git a/chromecast/common/mojom/identification_settings.mojom b/chromecast/common/mojom/identification_settings.mojom
deleted file mode 100644
index a210bd1c..0000000
--- a/chromecast/common/mojom/identification_settings.mojom
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module chromecast.mojom;
-
-import "mojo/public/mojom/base/time.mojom";
-import "url/mojom/url.mojom";
-
-// Parameter used to change/set headers for HTTP requests.
-// Only |value| can be updated once SetSubstitutableParameters is called.
-struct SubstitutableParameter {
-  // HTTP header name.
-  // If a non-empty |replacement_token| or non-empty |suppression_token| are
-  // present in the query string, |name| is ignored. Otherwise, an HTTP
-  // header with |name| and associated |value| will be added to the request if
-  // not already present.
-  string name;
-
-  // All instances of a non-empty |replacement_token| present in the URL's
-  // query string will be replaced with |value|.
-  string? replacement_token;
-
-  // If non-empty and |suppression_token| is present in the URL's query,
-  // all instances will be removed from the query string.
-  // If |replacement_token| and |suppression_token| are both set,
-  // |replacement_token| will take precedence.
-  string? suppression_token;
-
-  // If |is_signature| is true, |value| will be asynchronously populated via
-  // `ClientAuthDelegate`
-  bool is_signature;
-
-  // Value of the header.
-  string value;
-};
-
-// Pair of (index, value) used to update values of SubstitutableParameter.
-// It's used for updating |value| of SubstitutableParameter (no other
-// fields can be updated). The update is necessary since the list of
-// SubstitutableParameter needs to be present in the renderer before the
-// very first network request but some of the values are dynamically
-// generated at runtime.
-// |index| must be smaller than the size of the array sent in
-// SetSubstitutableParameters.
-struct IndexValuePair {
-  // Index of the struct to be updated in the array sent in
-  // SetSubstitutableParameters.
-  uint32 index;
-
-  // New value of SubstitutableParameter.
-  string value;
-};
-
-// Controls when substitutable parameters should be applied to a request.
-// These settings are per-app, and each frame only has one associated app.
-struct AppSettings {
-  // Bitmask of substituable parameters that should be used for this app.
-  // Each position is an index into the list of substitutable params set for
-  // the frame.
-  int32 allowed_headers;
-
-  // Whether the app is allowed to use auth headers.
-  bool allowed_for_device_identification;
-
-  // Full host names used to match allowed hosts.
-  // Allowed hosts are a set of hosts which the app can access.
-  // If the hostname of the URL in the URL request has a matching hostname,
-  // the corresponding parameters specified in |allowed_headers| will be
-  // applied to the URL request.
-  array<string> full_host_names;
-
-  // Wildcard host names are host name suffixes. If the hostname of the URL
-  // in the URL request has a matching suffix, the corresponding parameters
-  // specified in |allowed_headers| will be applied to the URL request.
-  // Example: ".example.com" (the leading '.' is necessary).
-  array<string> wildcard_host_names;
-};
-
-// Settings specific to a device.
-struct DeviceSettings {
-  // A map of header names and values that will be added to all requests
-  // in this frame if not already present. Note that the added headers will
-  // be CORS exempt.
-  map<string, string> static_headers;
-
-  // Map of URLs that will be rewritten. The key is generated by clearing
-  // the reference and the query string. If the resulting URL matches a key
-  // in this map, the query parameters of the replacement URL will be appended
-  // to the query parameters from the original URL.
-  // Note: URL comparison is cast-insensitive here.
-  map<url.mojom.Url, url.mojom.Url> url_replacements;
-};
-
-// Delegate that is registered through IdentificationSettingsManager to sync
-// signatures and certs from the browser process to renderers in callbacks.
-// This interface is necessary since browser manages all the certificates.
-// Async operation is needed since certs and signatures are generated upon
-// request and are not populated along with other substitutable params.
-interface ClientAuthDelegate {
-  // Ensures the certs are created in the browser and synced to the renderer.
-  EnsureCerts() => (array<IndexValuePair> cert_headers);
-
-  // Ensures the signature is generated in the browser and synced to the
-  // renderer.
-  EnsureSignature() => (array<IndexValuePair> signature_headers,
-                        mojo_base.mojom.Time next_refresh_time);
-};
-
-// This per-frame interface lives in the renderer and allows the browser to
-// set parameters that will be used to modify URL requests.
-interface IdentificationSettingsManager {
-  // Sets the list of possible substitutable parameters. This may only be
-  // called once; once called, the list of parameters is fixed. Values
-  // associated with each substitutable parameter can later be updated with
-  // a call to `UpdateSubstitutableParamValues`.
-  // Note: This moethod needs to be called before the first network request
-  // is made from a render frame, so it should be called on an associated
-  // mojo endpoint when the render frame is created.
-  SetSubstitutableParameters(array<SubstitutableParameter> params);
-
-  // Sets the ClientAuthDelegate.
-  SetClientAuth(pending_remote<ClientAuthDelegate> client_auth_delegate);
-
-  // Updates app specific settings.
-  UpdateAppSettings(AppSettings app_settings);
-
-  // Updates device specific settings.
-  UpdateDeviceSettings(DeviceSettings device_settings);
-
-  // Updates user tokens.
-  UpdateSubstitutableParamValues(array<IndexValuePair> updated_values);
-
-  // Updates the app's background mode.
-  UpdateBackgroundMode(bool background_mode);
-};
-
-// Singular browser interface for modifying URL requests that originate in the
-// browser process.
-interface BrowserIdentificationSettingsManager {
-  // Creates a session and sets the list of possible substitutable parameters.
-  // This may only be called once per session; once called, the list of
-  // parameters is fixed. Values associated with each substitutable parameter
-  // can later be updated with a call to `UpdateSubstitutableParamValues`.
-  // Note: This moethod needs to be called before any navigation request is
-  // made from a session.
-  CreateSessionWithSubstitutions(string session_id,
-                                 array<SubstitutableParameter> params);
-
-  // Sets the ClientAuthDelegate.
-  SetClientAuthForSession(
-      string session_id,
-      pending_remote<ClientAuthDelegate> client_auth_delegate);
-
-  // Updates app specific settings.
-  UpdateAppSettingsForSession(string session_id, AppSettings app_settings);
-
-  // Updates device specific settings.
-  UpdateDeviceSettingsForSession(string session_id,
-                                 DeviceSettings device_settings);
-
-  // Updates user tokens.
-  UpdateSubstitutableParamValuesForSession(
-      string session_id, array<IndexValuePair> updated_values);
-
-  // Updates the app's background mode.
-  UpdateBackgroundModeForSession(string session_id, bool background_mode);
-
-  // This must be called when the session has ended. This deletes the associated
-  // URL throttle for the session.
-  OnSessionDestroyed(string session_id);
-};
diff --git a/chromecast/renderer/BUILD.gn b/chromecast/renderer/BUILD.gn
index 35d2edd6..7d54f58c 100644
--- a/chromecast/renderer/BUILD.gn
+++ b/chromecast/renderer/BUILD.gn
@@ -59,9 +59,6 @@
     "feature_manager.h",
     "feature_manager_on_associated_interface.cc",
     "feature_manager_on_associated_interface.h",
-    "identification_settings_manager_renderer.cc",
-    "identification_settings_manager_renderer.h",
-    "identification_settings_manager_store.h",
     "js_channel_bindings.cc",
     "js_channel_bindings.h",
     "native_bindings_helper.cc",
diff --git a/chromecast/renderer/identification_settings_manager_renderer.cc b/chromecast/renderer/identification_settings_manager_renderer.cc
deleted file mode 100644
index 2cecf6c..0000000
--- a/chromecast/renderer/identification_settings_manager_renderer.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chromecast/renderer/identification_settings_manager_renderer.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/check.h"
-#include "content/public/renderer/render_frame.h"
-#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
-
-namespace chromecast {
-
-IdentificationSettingsManagerRenderer::IdentificationSettingsManagerRenderer(
-    content::RenderFrame* render_frame,
-    base::OnceCallback<void()> on_removed_callback)
-    : content::RenderFrameObserver(render_frame),
-      on_removed_callback_(std::move(on_removed_callback)) {
-  // base::Unretained is safe here since |this| won't get more binding requests
-  // after |render_frame| is gone.
-  render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
-      base::BindRepeating(&IdentificationSettingsManagerRenderer::
-                              OnIdentificationSettingsManagerAssociatedRequest,
-                          base::Unretained(this)));
-}
-
-IdentificationSettingsManagerRenderer::
-    ~IdentificationSettingsManagerRenderer() {
-  if (on_removed_callback_) {
-    std::move(on_removed_callback_).Run();
-  }
-}
-
-void IdentificationSettingsManagerRenderer::OnDestruct() {
-  DCHECK(on_removed_callback_);
-  std::move(on_removed_callback_).Run();
-}
-
-void IdentificationSettingsManagerRenderer::
-    OnIdentificationSettingsManagerAssociatedRequest(
-        mojo::PendingAssociatedReceiver<mojom::IdentificationSettingsManager>
-            receiver) {
-  associated_receiver_.Bind(std::move(receiver));
-}
-
-}  // namespace chromecast
diff --git a/chromecast/renderer/identification_settings_manager_renderer.h b/chromecast/renderer/identification_settings_manager_renderer.h
deleted file mode 100644
index 292f9e7..0000000
--- a/chromecast/renderer/identification_settings_manager_renderer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_RENDERER_H_
-#define CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_RENDERER_H_
-
-#include "base/callback_forward.h"
-#include "chromecast/common/identification_settings_manager.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "mojo/public/cpp/bindings/associated_receiver.h"
-#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
-
-namespace chromecast {
-
-// Receives messages from the browser process and stores identification settings
-// to feed into URLLoaderThrottles for throttling url requests in renderers.
-// Note: this class could be deleted on a different thread from the main thread.
-class IdentificationSettingsManagerRenderer
-    : public content::RenderFrameObserver,
-      public IdentificationSettingsManager {
- public:
-  IdentificationSettingsManagerRenderer(
-      content::RenderFrame* render_frame,
-      base::OnceCallback<void()> on_removed_callback);
-  IdentificationSettingsManagerRenderer(
-      const IdentificationSettingsManagerRenderer&) = delete;
-  IdentificationSettingsManagerRenderer& operator=(
-      const IdentificationSettingsManagerRenderer&) = delete;
-
- protected:
-  ~IdentificationSettingsManagerRenderer() override;
-
- private:
-  // content::RenderFrameObserver implementation:
-  void OnDestruct() override;
-
-  void OnIdentificationSettingsManagerAssociatedRequest(
-      mojo::PendingAssociatedReceiver<mojom::IdentificationSettingsManager>
-          receiver);
-
-  base::OnceCallback<void()> on_removed_callback_;
-  mojo::AssociatedReceiver<mojom::IdentificationSettingsManager>
-      associated_receiver_{this};
-};
-
-}  // namespace chromecast
-
-#endif  // CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_RENDERER_H_
diff --git a/chromecast/renderer/identification_settings_manager_store.h b/chromecast/renderer/identification_settings_manager_store.h
deleted file mode 100644
index b9923bc..0000000
--- a/chromecast/renderer/identification_settings_manager_store.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_STORE_H_
-#define CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_STORE_H_
-
-#include "base/memory/scoped_refptr.h"
-
-namespace chromecast {
-
-class IdentificationSettingsManager;
-
-namespace shell {
-
-class IdentificationSettingsManagerStore {
- public:
-  virtual ~IdentificationSettingsManagerStore() = default;
-
-  virtual scoped_refptr<IdentificationSettingsManager>
-  GetSettingsManagerFromRenderFrameID(int render_frame_id) = 0;
-};
-
-}  // namespace shell
-}  // namespace chromecast
-
-#endif  // CHROMECAST_RENDERER_IDENTIFICATION_SETTINGS_MANAGER_STORE_H_
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 57dc060..9d3dba6 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2611,6 +2611,9 @@
       <message name="IDS_FIRMWARE_UPDATE_BUTTON_TEXT" desc="Label for button to start the firmware update.">
         Update
       </message>
+      <message name="IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL" desc="A11y Label for button to start the firmware update.">
+        Update <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
+      </message>
       <message name="IDS_FIRMWARE_UPDATING_TEXT" desc="Label for showing that a device is being updated.">
         Updating <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
       </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL.png.sha1
new file mode 100644
index 0000000..46eb4ad
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL.png.sha1
@@ -0,0 +1 @@
+e4083f8d878bc06965a7aee8b14b5297c9079b4e
\ No newline at end of file
diff --git a/chromeos/dbus/hps/hps_dbus_client.h b/chromeos/dbus/hps/hps_dbus_client.h
index fff207d..0c897512 100644
--- a/chromeos/dbus/hps/hps_dbus_client.h
+++ b/chromeos/dbus/hps/hps_dbus_client.h
@@ -21,6 +21,9 @@
 // D-Bus client for ambient presence sensing. Communicates with the Chrome OS
 // presence daemon to allow for features that depend on user presence.
 //
+// Use of this API is restricted by policy. Consult
+// go/cros-pdd#bookmark=id.7emuxnhxv638 and Chrome OS Privacy before using.
+//
 // TODO(crbug/1241706): clarify naming.
 class COMPONENT_EXPORT(HPS) HpsDBusClient {
  public:
diff --git a/chromeos/dbus/patchpanel/BUILD.gn b/chromeos/dbus/patchpanel/BUILD.gn
new file mode 100644
index 0000000..9acffd0
--- /dev/null
+++ b/chromeos/dbus/patchpanel/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/protobuf/proto_library.gni")
+
+assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos")
+
+component("patchpanel") {
+  defines = [ "IS_PATCHPANEL_IMPL" ]
+
+  deps = [
+    ":patchpanel_proto",
+    "//base",
+    "//chromeos/dbus:common",
+    "//dbus",
+  ]
+
+  sources = [
+    "fake_patchpanel_client.cc",
+    "fake_patchpanel_client.h",
+    "patchpanel_client.cc",
+    "patchpanel_client.h",
+  ]
+}
+
+proto_library("patchpanel_proto") {
+  sources = [
+    "//third_party/cros_system_api/dbus/patchpanel/patchpanel_service.proto",
+  ]
+
+  proto_out_dir = "chromeos/dbus/patchpanel"
+}
diff --git a/chromeos/dbus/patchpanel/fake_patchpanel_client.cc b/chromeos/dbus/patchpanel/fake_patchpanel_client.cc
new file mode 100644
index 0000000..814af8b
--- /dev/null
+++ b/chromeos/dbus/patchpanel/fake_patchpanel_client.cc
@@ -0,0 +1,38 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/dbus/patchpanel/fake_patchpanel_client.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/check_op.h"
+#include "base/threading/thread_task_runner_handle.h"
+
+namespace chromeos {
+
+namespace {
+
+FakePatchPanelClient* g_instance = nullptr;
+
+}  // namespace
+
+// static
+FakePatchPanelClient* FakePatchPanelClient::Get() {
+  return g_instance;
+}
+
+FakePatchPanelClient::FakePatchPanelClient() {
+  DCHECK(!g_instance);
+  g_instance = this;
+}
+
+FakePatchPanelClient::~FakePatchPanelClient() {
+  DCHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
+
+void FakePatchPanelClient::GetDevices(GetDevicesCallback callback) {}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/patchpanel/fake_patchpanel_client.h b/chromeos/dbus/patchpanel/fake_patchpanel_client.h
new file mode 100644
index 0000000..0fa3df7
--- /dev/null
+++ b/chromeos/dbus/patchpanel/fake_patchpanel_client.h
@@ -0,0 +1,37 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_DBUS_PATCHPANEL_FAKE_PATCHPANEL_CLIENT_H_
+#define CHROMEOS_DBUS_PATCHPANEL_FAKE_PATCHPANEL_CLIENT_H_
+
+#include "chromeos/dbus/patchpanel/patchpanel_client.h"
+
+namespace chromeos {
+
+// FakePatchPanelClient is a stub implementation of PatchPanelClient used for
+// testing.
+class COMPONENT_EXPORT(PATCHPANEL) FakePatchPanelClient
+    : public PatchPanelClient {
+ public:
+  // Returns the fake global instance if initialized. May return null.
+  static FakePatchPanelClient* Get();
+
+  FakePatchPanelClient(const FakePatchPanelClient&) = delete;
+  FakePatchPanelClient& operator=(const FakePatchPanelClient&) = delete;
+
+  // PatchPanelClient:
+  void GetDevices(GetDevicesCallback callback) override;
+
+ protected:
+  friend class PatchPanelClient;
+
+  FakePatchPanelClient();
+  ~FakePatchPanelClient() override;
+
+  void Init(dbus::Bus* bus) override {}
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_PATCHPANEL_FAKE_PATCHPANEL_CLIENT_H_
diff --git a/chromeos/dbus/patchpanel/patchpanel_client.cc b/chromeos/dbus/patchpanel/patchpanel_client.cc
new file mode 100644
index 0000000..95cf557
--- /dev/null
+++ b/chromeos/dbus/patchpanel/patchpanel_client.cc
@@ -0,0 +1,113 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+#include "chromeos/dbus/patchpanel/patchpanel_client.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "base/strings/strcat.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chromeos/dbus/patchpanel/fake_patchpanel_client.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_proxy.h"
+#include "third_party/cros_system_api/dbus/patchpanel/dbus-constants.h"
+
+namespace chromeos {
+namespace {
+
+PatchPanelClient* g_instance = nullptr;
+
+// "Real" implementation of PatchPanelClient talking to the PatchPanel daemon
+// on the Chrome OS side.
+class PatchPanelClientImpl : public PatchPanelClient {
+ public:
+  PatchPanelClientImpl() = default;
+  PatchPanelClientImpl(const PatchPanelClientImpl&) = delete;
+  PatchPanelClientImpl& operator=(const PatchPanelClientImpl&) = delete;
+  ~PatchPanelClientImpl() override = default;
+
+  // PatchPanelClient overrides:
+  void GetDevices(GetDevicesCallback callback) override {
+    dbus::MethodCall method_call(patchpanel::kPatchPanelInterface,
+                                 patchpanel::kGetDevicesMethod);
+    dbus::MessageWriter writer(&method_call);
+
+    patchpanel::GetDevicesRequest request;
+    if (!writer.AppendProtoAsArrayOfBytes(request)) {
+      LOG(ERROR) << "Failed to encode GetDevicesRequest proto";
+      return;
+    }
+
+    patchpanel_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&PatchPanelClientImpl::HandleGetDevicesResponse,
+                       weak_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
+  void Init(dbus::Bus* bus) override {
+    patchpanel_proxy_ = bus->GetObjectProxy(
+        patchpanel::kPatchPanelServiceName,
+        dbus::ObjectPath(patchpanel::kPatchPanelServicePath));
+  }
+
+ private:
+  void HandleGetDevicesResponse(GetDevicesCallback callback,
+                                dbus::Response* dbus_response) {
+    patchpanel::GetDevicesResponse response;
+    dbus::MessageReader reader(dbus_response);
+    if (!reader.PopArrayOfBytesAsProto(&response)) {
+      LOG(ERROR) << "Failed to parse GetDevices response proto";
+      std::move(callback).Run({});
+      return;
+    }
+    std::move(callback).Run(std::vector<patchpanel::NetworkDevice>(
+        std::make_move_iterator(response.devices().begin()),
+        std::make_move_iterator(response.devices().end())));
+  }
+
+  // D-Bus proxy for the PatchPanel daemon, not owned.
+  dbus::ObjectProxy* patchpanel_proxy_ = nullptr;
+
+  base::WeakPtrFactory<PatchPanelClientImpl> weak_factory_{this};
+};
+
+}  // namespace
+
+PatchPanelClient::PatchPanelClient() {
+  CHECK(!g_instance);
+  g_instance = this;
+}
+
+PatchPanelClient::~PatchPanelClient() {
+  CHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
+
+// static
+void PatchPanelClient::Initialize(dbus::Bus* bus) {
+  CHECK(bus);
+  (new PatchPanelClientImpl())->Init(bus);
+}
+
+// static
+void PatchPanelClient::InitializeFake() {
+  new FakePatchPanelClient();
+}
+
+// static
+void PatchPanelClient::Shutdown() {
+  CHECK(g_instance);
+  delete g_instance;
+}
+
+// static
+PatchPanelClient* PatchPanelClient::Get() {
+  return g_instance;
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/patchpanel/patchpanel_client.h b/chromeos/dbus/patchpanel/patchpanel_client.h
new file mode 100644
index 0000000..d3347d1e
--- /dev/null
+++ b/chromeos/dbus/patchpanel/patchpanel_client.h
@@ -0,0 +1,51 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_DBUS_PATCHPANEL_PATCHPANEL_CLIENT_H_
+#define CHROMEOS_DBUS_PATCHPANEL_PATCHPANEL_CLIENT_H_
+
+#include "base/callback.h"
+#include "base/component_export.h"
+#include "chromeos/dbus/dbus_client.h"
+#include "chromeos/dbus/patchpanel/patchpanel_service.pb.h"
+#include "dbus/object_proxy.h"
+
+namespace chromeos {
+
+// Simple wrapper around patchpanel DBus API. The method names and protobuf
+// schema used by patchpanel DBus API are defined in
+// third_party/cros_system_api/dbus/patchpanel.
+class COMPONENT_EXPORT(PATCHPANEL) PatchPanelClient : public DBusClient {
+ public:
+  using GetDevicesCallback = base::OnceCallback<void(
+      const std::vector<patchpanel::NetworkDevice>& devices)>;
+
+  // Creates and initializes the global instance. |bus| must not be null.
+  static void Initialize(dbus::Bus* bus);
+
+  // Creates the global instance with a fake implementation.
+  static void InitializeFake();
+
+  // Destroys the global instance which must have been initialized first.
+  static void Shutdown();
+
+  // Returns the global instance if initialized. May return null.
+  static PatchPanelClient* Get();
+
+  PatchPanelClient(const PatchPanelClient&) = delete;
+  PatchPanelClient& operator=(const PatchPanelClient&) = delete;
+
+  // Obtains a list of virtual network interfaces configured and managed by
+  // patchpanel.
+  virtual void GetDevices(GetDevicesCallback callback) = 0;
+
+ protected:
+  // Initialize/Shutdown should be used instead.
+  PatchPanelClient();
+  ~PatchPanelClient() override;
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_PATCHPANEL_PATCHPANEL_CLIENT_H_
diff --git a/chromeos/network/auto_connect_handler.cc b/chromeos/network/auto_connect_handler.cc
index 515db14..b1ef7ae 100644
--- a/chromeos/network/auto_connect_handler.cc
+++ b/chromeos/network/auto_connect_handler.cc
@@ -491,19 +491,19 @@
     const std::string& network_type) {
   NET_LOG(EVENT) << "Disable auto-connect forced by policy: "
                  << NetworkPathId(service_path);
-  base::DictionaryValue properties;
+  base::Value properties(base::Value::Type::DICTIONARY);
 
-  std::string autoconenct_path;
+  std::string autoconnect_path;
   if (network_type == ::onc::network_config::kWiFi) {
-    autoconenct_path = base::StrCat(
+    autoconnect_path = base::StrCat(
         {::onc::network_config::kWiFi, ".", ::onc::wifi::kAutoConnect});
   } else if (network_type == ::onc::network_config::kCellular) {
-    autoconenct_path = base::StrCat(
+    autoconnect_path = base::StrCat(
         {::onc::network_config::kCellular, ".", ::onc::cellular::kAutoConnect});
   } else {
     NOTREACHED();
   }
-  properties.SetBoolPath(autoconenct_path, false);
+  properties.SetBoolPath(autoconnect_path, false);
   managed_configuration_handler_->SetProperties(
       service_path, properties, base::DoNothing(),
       base::BindOnce(&SetPropertiesErrorCallback));
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc
index b41386c..b431cb6 100644
--- a/chromeos/network/auto_connect_handler_unittest.cc
+++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -262,9 +262,7 @@
     return client_cert;
   }
 
-  void SetupPolicy(const std::string& network_configs_json,
-                   const base::DictionaryValue& global_config,
-                   bool user_policy) {
+  void SetupUserPolicy(const std::string& network_configs_json) {
     base::Value network_configs(base::Value::Type::LIST);
     if (!network_configs_json.empty()) {
       base::JSONReader::ValueWithError parsed_json =
@@ -274,16 +272,26 @@
       ASSERT_TRUE(parsed_json.value->is_list());
       network_configs = std::move(*parsed_json.value);
     }
+    managed_config_handler_->SetPolicy(
+        ::onc::ONC_SOURCE_USER_POLICY, helper_.UserHash(), network_configs,
+        /*global_config=*/base::Value(base::Value::Type::DICTIONARY));
+    task_environment_.RunUntilIdle();
+  }
 
-    if (user_policy) {
-      managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_USER_POLICY,
-                                         helper_.UserHash(), network_configs,
-                                         global_config);
-    } else {
-      managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY,
-                                         std::string(),  // no username hash
-                                         network_configs, global_config);
+  void SetupDevicePolicy(const std::string& network_configs_json,
+                         const base::Value& global_config) {
+    base::Value network_configs(base::Value::Type::LIST);
+    if (!network_configs_json.empty()) {
+      base::JSONReader::ValueWithError parsed_json =
+          base::JSONReader::ReadAndReturnValueWithError(
+              network_configs_json, base::JSON_ALLOW_TRAILING_COMMAS);
+      ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
+      ASSERT_TRUE(parsed_json.value->is_list());
+      network_configs = std::move(*parsed_json.value);
     }
+    managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY,
+                                       std::string(),  // no username hash
+                                       network_configs, global_config);
     task_environment_.RunUntilIdle();
   }
 
@@ -438,15 +446,13 @@
 
   // Applying the policy which restricts autoconnect should disconnect from the
   // shared, unmanaged network.
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
       base::Value(true));
 
-  SetupPolicy(std::string(),            // no network configs
-              base::DictionaryValue(),  // no global config
-              true);                    // load as user policy
-  SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+  SetupUserPolicy(/*network_configs_json=*/std::string());
+  SetupDevicePolicy(kPolicy, global_config);
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
@@ -469,15 +475,13 @@
   ASSERT_FALSE(wifi1_service_path.empty());
   helper().manager_test()->SetBestServiceToConnect(wifi0_service_path);
 
-  SetupPolicy(std::string(),            // no device policy
-              base::DictionaryValue(),  // no global config
-              false);                   // load as device policy
+  SetupDevicePolicy(
+      /*network_configs_json=*/std::string(),
+      /*global_config=*/base::Value(base::Value::Type::DICTIONARY));
   EXPECT_EQ(0, test_observer_->num_auto_connect_events());
 
   LoginToRegularUser();
-  SetupPolicy(kPolicyCertPattern,
-              base::DictionaryValue(),  // no global config
-              true);                    // load as user policy
+  SetupUserPolicy(kPolicyCertPattern);
   StartNetworkCertLoader();
   EXPECT_EQ(1, test_observer_->num_auto_connect_events());
   EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN |
@@ -517,14 +521,12 @@
   ASSERT_FALSE(wifi1_service_path.empty());
   helper().manager_test()->SetBestServiceToConnect(wifi0_service_path);
 
-  SetupPolicy(std::string(),            // no device policy
-              base::DictionaryValue(),  // no global config
-              false);                   // load as device policy
+  SetupDevicePolicy(
+      /*network_configs_json=*/std::string(),
+      /*global_config=*/base::Value(base::Value::Type::DICTIONARY));
   LoginToRegularUser();
   StartNetworkCertLoader();
-  SetupPolicy(kPolicy,
-              base::DictionaryValue(),  // no global config
-              true);                    // load as user policy
+  SetupUserPolicy(kPolicy);
 
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
@@ -560,7 +562,7 @@
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
       base::Value(true));
@@ -569,13 +571,13 @@
   // shared, unmanaged network.
   // Because no best service is set, the fake implementation of
   // ConnectToBestServices will be a no-op.
-  SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+  SetupDevicePolicy(kPolicy, global_config);
 
   // Should not trigger any change until user policy is loaded
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
-  SetupPolicy(std::string(), base::DictionaryValue(), true);
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_EQ(0, test_observer_->num_auto_connect_events());
@@ -599,7 +601,8 @@
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
   // Apply device policy which should trigger ConnectToBestServices.
-  SetupPolicy(kPolicy, base::DictionaryValue(), /*user_policy=*/false);
+  SetupDevicePolicy(
+      kPolicy, /*global_config=*/base::Value(base::Value::Type::DICTIONARY));
 
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path));
@@ -615,7 +618,8 @@
       ConfigureService(kConfigWifi1ManagedSharedConnectable);
   ASSERT_FALSE(wifi1_service_path.empty());
   // Device policy has already been applied.
-  SetupPolicy(std::string(), base::DictionaryValue(), /*user_policy=*/false);
+  SetupDevicePolicy(std::string(), /*global_config=*/base::Value(
+                        base::Value::Type::DICTIONARY));
 
   // When shill's ConnectToBestServices is called, wifi1 should be come online.
   helper().manager_test()->SetBestServiceToConnect(wifi1_service_path);
@@ -628,7 +632,7 @@
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
   // Applying user policy should trigger connection to "best" service.
-  SetupPolicy(kPolicy, base::DictionaryValue(), /*user_policy=*/true);
+  SetupUserPolicy(kPolicy);
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path));
   EXPECT_EQ(1, test_observer_->num_auto_connect_events());
@@ -643,7 +647,8 @@
       ConfigureService(kConfigWifi1ManagedSharedConnectable);
   ASSERT_FALSE(wifi1_service_path.empty());
   // Device policy has already been applied.
-  SetupPolicy(std::string(), base::DictionaryValue(), /*user_policy=*/false);
+  SetupDevicePolicy(std::string(), /*global_config=*/base::Value(
+                        base::Value::Type::DICTIONARY));
   StartNetworkCertLoader();
   LoginToRegularUser();
   // When shill's ConnectToBestServices is called, wifi1 should be come online.
@@ -657,7 +662,7 @@
   helper().device_test()->SetDeviceProperty(
       kWifiDevicePath, shill::kScanningProperty, base::Value(true),
       /*notify_changed=*/true);
-  SetupPolicy(kPolicy, base::DictionaryValue(), /*user_policy=*/true);
+  SetupUserPolicy(kPolicy);
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
@@ -682,7 +687,8 @@
       ConfigureService(kConfigWifi1ManagedSharedConnectable);
   ASSERT_FALSE(wifi1_service_path.empty());
   // Device policy has already been applied.
-  SetupPolicy(std::string(), base::DictionaryValue(), /*user_policy=*/false);
+  SetupDevicePolicy(std::string(), /*global_config=*/base::Value(
+                        base::Value::Type::DICTIONARY));
   StartNetworkCertLoader();
   LoginToRegularUser();
   // When shill's ConnectToBestServices is called, wifi1 should be come online.
@@ -697,7 +703,7 @@
   helper().device_test()->SetDeviceProperty(
       kWifiDevicePath, shill::kScanningProperty, base::Value(true),
       /*notify_changed=*/true);
-  SetupPolicy(kPolicyHiddenSsid, base::DictionaryValue(), /*user_policy=*/true);
+  SetupUserPolicy(kPolicyHiddenSsid);
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
@@ -736,7 +742,8 @@
       ConfigureService(kConfigWifi2ManagedSharedConnectable);
   ASSERT_FALSE(wifi2_service_path.empty());
   // Device policy has already been applied.
-  SetupPolicy(std::string(), base::DictionaryValue(), /*user_policy=*/false);
+  SetupDevicePolicy(std::string(), /*global_config=*/base::Value(
+                        base::Value::Type::DICTIONARY));
   StartNetworkCertLoader();
   LoginToRegularUser();
   // When shill's ConnectToBestServices is called, wifi1 should be come online.
@@ -751,7 +758,7 @@
   helper().device_test()->SetDeviceProperty(
       kWifiDevicePath, shill::kScanningProperty, base::Value(true),
       /*notify_changed=*/true);
-  SetupPolicy(kPolicyHiddenSsid, base::DictionaryValue(), /*user_policy=*/true);
+  SetupUserPolicy(kPolicyHiddenSsid);
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
@@ -769,10 +776,7 @@
   // While scanning, apply another policy that changes the set of hidden SSIDs
   // again. This will not trigger another re-scan because AutoConnectHandler
   // limits to once re-scan.
-  LOG(ERROR) << "Applying new policy!";
-  SetupPolicy(kPolicyTwoHiddenSsids, base::DictionaryValue(),
-              /*user_policy=*/true);
-  LOG(ERROR) << "Done applying!";
+  SetupUserPolicy(kPolicyTwoHiddenSsids);
 
   // Now finish the scan by waiting for the delay configured in
   // FakeShillManagerClient.
@@ -801,7 +805,7 @@
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnect,
       base::Value(true));
@@ -810,13 +814,13 @@
   // shared, unmanaged network.
   // Because no best service is set, the fake implementation of
   // ConnectToBestServices will be a no-op.
-  SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+  SetupDevicePolicy(kPolicy, global_config);
 
   // Should not trigger any change until user policy is loaded
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
-  SetupPolicy(std::string(), base::DictionaryValue(), true);
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_EQ(0, test_observer_->num_auto_connect_events());
@@ -841,17 +845,14 @@
 
   // Applying an empty device policy will not trigger anything yet, until also
   // the user policy is applied.
-  SetupPolicy(std::string(),            // no network configs
-              base::DictionaryValue(),  // no global config
-              false);                   // load as device policy
+  SetupDevicePolicy(std::string(), /*global_config=*/base::Value(
+                        base::Value::Type::DICTIONARY));
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
 
   // Applying also an empty user policy should trigger connecting to the 'best'
   // network.
-  SetupPolicy(std::string(),            // no network configs
-              base::DictionaryValue(),  // no global config
-              true);                    // load as user policy
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path));
   EXPECT_EQ(1, test_observer_->num_auto_connect_events());
@@ -872,9 +873,9 @@
   // policy is loaded.
   LoginToRegularUser();
   StartNetworkCertLoader();
-  SetupPolicy(std::string(),            // no network configs
-              base::DictionaryValue(),  // no global config
-              false);                   // load as device policy
+  SetupDevicePolicy(
+      std::string(),
+      /*global_config=*/base::Value(base::Value::Type::DICTIONARY));
 
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
@@ -885,9 +886,7 @@
 
   // Applying the user policy after login would usually trigger connecting to
   // the 'best' network. But the manual connect prevents this.
-  SetupPolicy(std::string(),            // no network configs
-              base::DictionaryValue(),  // no global config
-              true);                    // load as user policy
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_EQ(0, test_observer_->num_auto_connect_events());
@@ -926,12 +925,11 @@
   // Apply 'AllowOnlyPolicyNetworksToAutoconnect' policy as a device
   // policy and provide a network configuration for cellular2 to make it
   // managed.
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
       base::Value(true));
-  SetupPolicy(kCellularPolicy, global_config,
-              false /* load as device policy */);
+  SetupDevicePolicy(kCellularPolicy, global_config);
   // cellular1 and cellular3's service state should be set to idle and
   // autoconnect property should be set false.
   EXPECT_EQ(shill::kStateIdle, GetServiceState(cellular1_service_path));
@@ -974,12 +972,11 @@
 
   // Apply 'AllowOnlyPolicyCellularNetworks' policy as a device policy and
   // provide a network configuration for cellular2 to make it managed.
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyCellularNetworks,
       base::Value(true));
-  SetupPolicy(kCellularPolicy, global_config,
-              false /* load as device policy */);
+  SetupDevicePolicy(kCellularPolicy, global_config);
 
   // Cellular1's service configuration should be not removed because it's a
   // pSIM network. Cellular3's service configuration should be removed because
@@ -1010,18 +1007,17 @@
   // since we wait for both device & user policy before possibly disconnecting.
   base::Value::ListStorage blocked;
   blocked.push_back(base::Value("7769666930"));  // hex(wifi0) = 7769666930
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(::onc::global_network_config::kBlockedHexSSIDs,
                        base::Value(blocked));
-  SetupPolicy(std::string(), global_config, false /* load as device policy */);
+  SetupDevicePolicy(std::string(), global_config);
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path));
 
   // Apply an empty user policy (no allow list for wifi0). Connection to wifi0
   // should be disconnected due to being blocked.
-  SetupPolicy(std::string(), base::DictionaryValue(),
-              true /* load as user policy */);
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_FALSE(helper().profile_test()->HasService(wifi0_service_path));
@@ -1045,11 +1041,11 @@
 
   // Apply 'AllowOnlyPolicyWiFiToConnectIfAvailable' policy as a device
   // policy and provide a network configuration for wifi1 to make it managed.
-  base::DictionaryValue global_config;
+  base::Value global_config(base::Value::Type::DICTIONARY);
   global_config.SetKey(
       ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnectIfAvailable,
       base::Value(true));
-  SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+  SetupDevicePolicy(kPolicy, global_config);
   EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path));
@@ -1057,8 +1053,7 @@
   // Apply an empty user policy (no allow list for wifi0). Connection to wifi0
   // should be disconnected due to being unmanaged and managed network wifi1
   // being available. wifi0 configuration should not be removed.
-  SetupPolicy(std::string(), base::DictionaryValue(),
-              true /* load as user policy */);
+  SetupUserPolicy(/*network_configs_json=*/std::string());
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path));
   EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path));
   EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path));
diff --git a/chromeos/network/client_cert_resolver.cc b/chromeos/network/client_cert_resolver.cc
index e54872d..72373a9 100644
--- a/chromeos/network/client_cert_resolver.cc
+++ b/chromeos/network/client_cert_resolver.cc
@@ -529,7 +529,7 @@
 bool ClientCertResolver::ResolveClientCertificateSync(
     const client_cert::ConfigType client_cert_type,
     const client_cert::ClientCertConfig& client_cert_config,
-    base::DictionaryValue* shill_properties) {
+    base::Value* shill_properties) {
   if (!ShouldResolveCert(client_cert_config))
     return false;
 
@@ -811,7 +811,7 @@
     NET_LOG(EVENT) << "Configuring certificate for network: "
                    << GetNetworkIdWithGuid(network_state);
 
-    base::DictionaryValue shill_properties;
+    base::Value shill_properties{base::Value::Type::DICTIONARY};
     if (match.matching_cert.has_value()) {
       const MatchingCert& matching_cert = match.matching_cert.value();
       client_cert::SetShillProperties(
diff --git a/chromeos/network/client_cert_resolver.h b/chromeos/network/client_cert_resolver.h
index a7508a2a..61d7840 100644
--- a/chromeos/network/client_cert_resolver.h
+++ b/chromeos/network/client_cert_resolver.h
@@ -90,7 +90,7 @@
   static bool ResolveClientCertificateSync(
       const client_cert::ConfigType client_cert_type,
       const client_cert::ClientCertConfig& client_cert_config,
-      base::DictionaryValue* shill_properties);
+      base::Value* shill_properties);
 
   // Allows overwriting the function which gets the client certificate
   // provisioning profile id of a certificate. This is necessary for unit tests,
diff --git a/chromeos/network/client_cert_resolver_unittest.cc b/chromeos/network/client_cert_resolver_unittest.cc
index 5443d18..652e007 100644
--- a/chromeos/network/client_cert_resolver_unittest.cc
+++ b/chromeos/network/client_cert_resolver_unittest.cc
@@ -341,12 +341,9 @@
             test_onc_pattern, base::JSON_ALLOW_TRAILING_COMMAS);
     ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
 
-    base::DictionaryValue* onc_pattern_dict;
-    parsed_json.value->GetAsDictionary(&onc_pattern_dict);
-
     client_cert_config->onc_source = onc_source;
     client_cert_config->client_cert_type = ::onc::client_cert::kPattern;
-    client_cert_config->pattern.ReadFromONCDictionary(*onc_pattern_dict);
+    client_cert_config->pattern.ReadFromONCDictionary(*(parsed_json.value));
   }
 
   // Sets up a policy with a certificate pattern that matches any client cert
@@ -389,7 +386,7 @@
         onc_source == ::onc::ONC_SOURCE_USER_POLICY ? kUserHash : "";
     managed_config_handler_->SetPolicy(
         onc_source, user_hash, *parsed_json.value,
-        base::DictionaryValue() /* no global network config */);
+        /*global_network_config=*/base::Value(base::Value::Type::DICTIONARY));
   }
 
   void SetWifiState(const std::string& state) {
@@ -727,7 +724,7 @@
   SetupCertificateConfigMatchingIssuerCN(::onc::ONC_SOURCE_USER_POLICY,
                                          &client_cert_config);
 
-  base::DictionaryValue shill_properties;
+  base::Value shill_properties(base::Value::Type::DICTIONARY);
   ClientCertResolver::ResolveClientCertificateSync(
       client_cert::CONFIG_TYPE_EAP, client_cert_config, &shill_properties);
   std::string pkcs11_id =
@@ -766,7 +763,7 @@
   SetupCertificateConfigMatchingIssuerCN(::onc::ONC_SOURCE_DEVICE_POLICY,
                                          &client_cert_config);
 
-  base::DictionaryValue shill_properties;
+  base::Value shill_properties(base::Value::Type::DICTIONARY);
   ClientCertResolver::ResolveClientCertificateSync(
       client_cert::CONFIG_TYPE_EAP, client_cert_config, &shill_properties);
   std::string pkcs11_id =
@@ -807,7 +804,7 @@
   SetupCertificateConfigMatchingIssuerCN(::onc::ONC_SOURCE_DEVICE_POLICY,
                                          &client_cert_config);
 
-  base::DictionaryValue shill_properties;
+  base::Value shill_properties(base::Value::Type::DICTIONARY);
   ClientCertResolver::ResolveClientCertificateSync(
       client_cert::CONFIG_TYPE_EAP, client_cert_config, &shill_properties);
   std::string pkcs11_id =
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index 5a6627d..e3c4b79 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-99-4827.0-1643020945-benchmark-99.0.4844.9-r1.orderfile.xz
+chromeos-chrome-orderfile-field-99-4827.0-1643020945-benchmark-99.0.4844.11-r1.orderfile.xz
diff --git a/chromeos/services/bluetooth_config/device_pairing_handler.cc b/chromeos/services/bluetooth_config/device_pairing_handler.cc
index fce93ec3..f702d00 100644
--- a/chromeos/services/bluetooth_config/device_pairing_handler.cc
+++ b/chromeos/services/bluetooth_config/device_pairing_handler.cc
@@ -218,8 +218,29 @@
     return;
   }
 
-  BLUETOOTH_LOG(ERROR) << "Pairing failed with error code: "
+  device::BluetoothDevice* device = FindDevice(current_pairing_device_id_);
+
+  // In some cases, device->Connect() will return a failure if the pairing
+  // succeeded but the subsequent connection request returns with a failure.
+  // Empirically, it's found that the device actually does connect, and
+  // device->IsConnected() returns true. Handle this case the
+  // same as pairing succeeding. TODO(b/209531279): Remove this when root cause
+  // of issue is fixed.
+  if (device && device->IsConnected()) {
+    BLUETOOTH_LOG(EVENT)
+        << device->GetAddress()
+        << ": Pairing finished with an error code, but device "
+        << "is connected. Handling like pairing succeeded. Error code: "
+        << error_code.value();
+    FinishCurrentPairingRequest(absl::nullopt);
+    NotifyFinished();
+    return;
+  }
+
+  BLUETOOTH_LOG(ERROR) << device->GetAddress()
+                       << ": Pairing failed with error code: "
                        << error_code.value();
+
   using ErrorCode = device::BluetoothDevice::ConnectErrorCode;
   switch (error_code.value()) {
     case ErrorCode::ERROR_AUTH_CANCELED:
diff --git a/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc b/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
index 13bf78a..1aeb2ca 100644
--- a/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
+++ b/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
@@ -229,11 +229,19 @@
   }
 
   void EnterKeys(const std::string device_id, uint32_t num_keys_entered) {
-    device_pairing_handler_->KeysEntered(FindDevice(device_id),
+    device_pairing_handler_->KeysEntered(FindDevice(device_id)->get(),
                                          num_keys_entered);
     base::RunLoop().RunUntilIdle();
   }
 
+  void ChangeDeviceIsConnected(const std::string& device_id,
+                               bool is_connected) {
+    auto it = FindDevice(device_id);
+    EXPECT_TRUE(it != mock_devices_.end());
+
+    ON_CALL(**it, IsConnected()).WillByDefault(testing::Return(is_connected));
+  }
+
   const absl::optional<mojom::PairingResult>& pairing_result() const {
     return pairing_result_;
   }
@@ -256,12 +264,12 @@
     return devices;
   }
 
-  device::BluetoothDevice* FindDevice(const std::string device_id) const {
-    for (auto& device : mock_devices_) {
-      if (device->GetIdentifier() == device_id)
-        return device.get();
-    }
-    return nullptr;
+  std::vector<NiceMockDevice>::iterator FindDevice(
+      const std::string& device_id) {
+    return std::find_if(mock_devices_.begin(), mock_devices_.end(),
+                        [&device_id](const NiceMockDevice& device) {
+                          return device_id == device->GetIdentifier();
+                        });
   }
 
   void OnPairingAttemptFinished() { num_pairing_attempt_finished_calls_++; }
@@ -507,6 +515,40 @@
                                 /*failure_count=*/0);
 }
 
+TEST_F(DevicePairingHandlerImplTest, PairFailsDeviceConnected) {
+  // Simulate case where pairing succeeded but the subsequent connection request
+  // returns with a failure. Empirically, it's found that the device actually
+  // does connect and should be treated as a successful pairing (See
+  // b/209531279).
+  std::string device_id;
+  AddDevice(&device_id, AuthType::kNone);
+
+  CheckPairingHistograms(device::BluetoothTransportType::kClassic,
+                         /*type_count=*/0, /*failure_count=*/0,
+                         /*success_count=*/0);
+  CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
+                                /*failure_count=*/0);
+
+  std::unique_ptr<FakeDevicePairingDelegate> delegate = PairDevice(device_id);
+  EXPECT_TRUE(HasPendingConnectCallback());
+  FastForwardOperation(kTestDuration);
+
+  // Update device to be connected.
+  ChangeDeviceIsConnected(device_id, /*is_connected=*/true);
+
+  // Fail the pairing.
+  InvokePendingConnectCallback(/*success=*/false);
+
+  // The pairing should still return as a success.
+  EXPECT_EQ(pairing_result(), mojom::PairingResult::kSuccess);
+  EXPECT_EQ(num_pairing_attempt_finished_calls(), 1u);
+  CheckPairingHistograms(device::BluetoothTransportType::kClassic,
+                         /*type_count=*/1, /*failure_count=*/0,
+                         /*success_count=*/1);
+  CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
+                                /*failure_count=*/0);
+}
+
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPinCode) {
   std::string device_id;
   AddDevice(&device_id, AuthType::kRequestPinCode);
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 1b3eadb..6175ca5 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -72,10 +72,6 @@
   # crbug.com/1263233
   "security.SharedFilesystemState",
 
-  # https://crbug.com/1267943: Flaky.
-  "ui.DesktopControl",
-  "ui.WindowControl",
-
   # https://crbug.com/1269876: Flaky.
   "arc.TextToSpeech",
 
diff --git a/components/autofill/content/renderer/form_autofill_util_browsertest.cc b/components/autofill/content/renderer/form_autofill_util_browsertest.cc
index 753cda9f..9ec880b3 100644
--- a/components/autofill/content/renderer/form_autofill_util_browsertest.cc
+++ b/components/autofill/content/renderer/form_autofill_util_browsertest.cc
@@ -13,6 +13,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/autofill/content/renderer/test_utils.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/field_data_manager.h"
 #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h"
 #include "components/autofill/core/common/unique_ids.h"
 #include "content/public/renderer/render_frame.h"
@@ -1538,6 +1539,61 @@
   }
 }
 
+// Fills a form, resets the form using <input type=reset>, and fills it again.
+// Tests that the form is actually filled on the second fill
+// (crbug.com/1291619).
+TEST_F(FormAutofillUtilsTest, FillAndResetAndFillAgainForm) {
+  LoadHTML(R"(
+    <body>
+      <form id="f">
+        <input id="f0">
+        <select id="f1">
+          <option value="Bar">Bar</option>
+          <option value="Foo">Foo</option>
+          <option value="Zoo">Zoo</option>
+        </select>
+        <input id="reset" type="reset">
+      </form>
+    </body>
+  )");
+  WebDocument doc = GetMainFrame()->GetDocument();
+  auto field_manager = base::MakeRefCounted<FieldDataManager>();
+
+  FormData form;
+  ExtractFormData(GetFormElementById(doc, "f"), *field_manager, &form);
+  ASSERT_EQ(form.fields.size(), 2u);
+  form.fields[0].value = u"Foo";
+  form.fields[1].value = u"Foo";
+  form.fields[0].is_autofilled = true;
+  form.fields[1].is_autofilled = true;
+
+  // First fill of the form.
+  FillOrPreviewForm(form, GetFormControlElementById(doc, "f0"),
+                    mojom::RendererFormDataAction::kFill);
+  // Autofilling f0 leaves f0.UserHasEditedTheField() == false.
+  // TODO(crbug.com/1291619): Is this desired?
+  EXPECT_TRUE(GetFormControlElementById(doc, "f1").UserHasEditedTheField());
+  EXPECT_EQ(GetFormControlElementById(doc, "f0").Value().Ascii(), "Foo");
+  EXPECT_EQ(GetFormControlElementById(doc, "f1").Value().Ascii(), "Foo");
+
+  // Click reset button.
+  GetFormControlElementById(doc, "reset").SimulateClick();
+  content::RunAllTasksUntilIdle();
+  EXPECT_FALSE(GetFormControlElementById(doc, "f0").UserHasEditedTheField());
+  EXPECT_FALSE(GetFormControlElementById(doc, "f1").UserHasEditedTheField());
+  EXPECT_EQ(GetFormControlElementById(doc, "f0").Value().Ascii(), "");
+  EXPECT_EQ(GetFormControlElementById(doc, "f1").Value().Ascii(), "Bar");
+
+  // Fill form again.
+  FillOrPreviewForm(form, GetFormControlElementById(doc, "f0"),
+                    mojom::RendererFormDataAction::kFill);
+  // Autofilling f0 leaves f0.UserHasEditedTheField() == false.
+  // TODO(crbug.com/1291619): Is this desired?
+  EXPECT_TRUE(GetFormControlElementById(doc, "f1").UserHasEditedTheField());
+  EXPECT_EQ(GetFormControlElementById(doc, "f0").Value().Ascii(), "Foo");
+  EXPECT_EQ(GetFormControlElementById(doc, "f1").Value().Ascii(), "Foo");
+}
+
 }  // namespace
 }  // namespace form_util
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc
index 8ae1fddc..60af874 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -246,14 +246,12 @@
 
   if (virtual_card_option) {
 #if BUILDFLAG(IS_ANDROID)
-    // Set the IPH feature in order to show the IPH bubble when the virtual
-    // card is presented in the keyboard accessory.
-    suggestion.feature_for_iph =
-        feature_engagement::kIPHKeyboardAccessoryPaymentVirtualCardFeature.name;
     suggestion.custom_icon_url = credit_card.card_art_url();
 #endif  // BUILDFLAG(IS_ANDROID)
 
     suggestion.frontend_id = POPUP_ITEM_ID_VIRTUAL_CREDIT_CARD_ENTRY;
+    suggestion.feature_for_iph =
+        feature_engagement::kIPHAutofillVirtualCardSuggestionFeature.name;
 
     gfx::Image* image = personal_data_->GetCreditCardArtImageForUrl(
         card_art_url_for_virtual_card_option);
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 279ca08..1405675 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -836,7 +836,7 @@
   // Local card migration will not be offered. We check to see if it is valid to
   // offer upload save or local card save, which will happen below if we do not
   // early return false in this if-statement.
-  if (!ShouldOfferUploadCardOrLocalCardSave(&imported_credit_card,
+  if (!ShouldOfferUploadCardOrLocalCardSave(imported_credit_card.get(),
                                             is_credit_card_upstream_enabled)) {
     return false;
   }
@@ -1073,7 +1073,7 @@
 }
 
 bool FormDataImporter::ShouldOfferUploadCardOrLocalCardSave(
-    std::unique_ptr<CreditCard>* imported_credit_card,
+    const CreditCard* imported_credit_card,
     bool is_credit_card_upload_enabled) {
   // If we have an invalid card in the form, a duplicate field type, or we have
   // entered a virtual card, |imported_credit_card| will be set
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index 6656a08..a5eae552 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -203,15 +203,16 @@
   // will be empty if no UPI ID was found.
   absl::optional<std::string> ImportUpiId(const FormStructure& form);
 
-  // |imported_credit_card| is the card from a form if it is valid (and it might
-  // be set to a copy of a LOCAL_CARD or SERVER_CARD we have saved if we were
-  // able to find a matching copy). |is_credit_card_upstream_enabled| denotes
-  // whether the user has credit card upload enabled. This function is used to
-  // prevent offering upload card save or local card save in situations where it
-  // would be invalid to offer them. For example, we should not offer to upload
-  // card if it is already a server card.
+  // |imported_credit_card| stores a pointer to the card imported from the form.
+  // If no valid card was imported, it is set to nullptr. It might be set to a
+  // copy of a LOCAL_CARD or SERVER_CARD we have already saved if we were able
+  // to find a matching copy. |is_credit_card_upstream_enabled| denotes whether
+  // the user has credit card upload enabled. This function is used to prevent
+  // offering upload card save or local card save in situations where it would
+  // be invalid to offer them. For example, we should not offer to upload card
+  // if it is already a server card.
   bool ShouldOfferUploadCardOrLocalCardSave(
-      std::unique_ptr<CreditCard>* imported_credit_card,
+      const CreditCard* imported_credit_card,
       bool is_credit_card_upload_enabled);
 
   // Whether a dynamic change form is imported.
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index e36d41b..06c4436 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -73,9 +73,11 @@
 using UkmCardUploadDecisionType = ukm::builders::Autofill_CardUploadDecision;
 using UkmDeveloperEngagementType = ukm::builders::Autofill_DeveloperEngagement;
 
+#if !BUILDFLAG(IS_IOS)
 // time_t representation of 9th Sep, 2001 01:46:40 GMT
-const base::Time kArbitraryTime = base::Time::FromTimeT(1000000000);
-const base::Time kMuchLaterTime = base::Time::FromTimeT(1234567890);
+constexpr base::Time kArbitraryTime = base::Time::FromTimeT(1000000000);
+constexpr base::Time kMuchLaterTime = base::Time::FromTimeT(1234567890);
+#endif
 
 // Used to configure form for |CreateTestCreditCardFormData|.
 struct CreditCardFormOptions {
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index 21368c5..8e9424b1 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -111,6 +111,13 @@
 const base::Feature kAutofillEnableVirtualCard{
     "AutofillEnableVirtualCard", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// When enabled, in the payments settings page on desktop, virtual card
+// enrollment management will be provided so that the user can enroll/unenroll a
+// card in virtual card.
+const base::Feature kAutofillEnableVirtualCardManagementInDesktopSettingsPage{
+    "AutofillEnableVirtualCardManagementInDesktopSettingsPage",
+    base::FEATURE_ENABLED_BY_DEFAULT};
+
 // When enabled, virtual card retrieval will pass an optional
 // authentication based on risk level.
 const base::Feature kAutofillEnableVirtualCardsRiskBasedAuthentication{
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index 1cbdaa5..23acdac 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -30,6 +30,8 @@
 extern const base::Feature kAutofillEnableToolbarStatusChip;
 extern const base::Feature kAutofillEnableUpdateVirtualCardEnrollment;
 extern const base::Feature kAutofillEnableVirtualCard;
+extern const base::Feature
+    kAutofillEnableVirtualCardManagementInDesktopSettingsPage;
 extern const base::Feature kAutofillEnableVirtualCardsRiskBasedAuthentication;
 extern const base::Feature kAutofillFillMerchantPromoCodeFields;
 extern const base::Feature kAutofillFixOfferInIncognito;
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 287baa3..27d2ae9 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -550,6 +550,11 @@
       Copied
     </message>
   </if>
+
+    <message name="IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL" desc="Text shown in the IPH bubble for the virtual card option in the suggestion dropdown bubble.">
+      Use your virtual card for added security
+    </message>
+
   <message name="IDS_AUTOFILL_CARD_UNMASK_AUTHENTICATION_SELECTION_DIALOG_ISSUER_CONFIRMATION_TEXT" desc="The issuer confirmation text shown in the Autofill card unmask authentication selection dialog on Desktop. This is the header text of the dialog, and it is the text stating that the issuer wants additional authentication. This dialog lets the user choose the method of authentication when unmasking a server card, including a virtual card.">
       Your bank wants to confirm it's you.
   </message>
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL.png.sha1
new file mode 100644
index 0000000..0c6d2a8dd
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL.png.sha1
@@ -0,0 +1 @@
+c268ae70d46009771482cb9fe595fd5b0e187706
\ No newline at end of file
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn
index 458e347b..c9c7d5a 100644
--- a/components/browser_sync/BUILD.gn
+++ b/components/browser_sync/BUILD.gn
@@ -10,7 +10,6 @@
     "active_devices_provider_impl.cc",
     "active_devices_provider_impl.h",
     "browser_sync_client.h",
-    "browser_sync_switches.cc",
     "browser_sync_switches.h",
     "signin_confirmation_helper.cc",
     "signin_confirmation_helper.h",
diff --git a/components/browser_sync/browser_sync_switches.cc b/components/browser_sync/browser_sync_switches.cc
deleted file mode 100644
index 638189d..0000000
--- a/components/browser_sync/browser_sync_switches.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/browser_sync/browser_sync_switches.h"
-
-#include "build/build_config.h"
-
-namespace switches {
-
-// Enabled the local sync backend implemented by the LoopbackServer.
-const char kEnableLocalSyncBackend[] = "enable-local-sync-backend";
-
-// Specifies the local sync backend directory. The name is chosen to mimic
-// user-data-dir etc. This flag only matters if the enable-local-sync-backend
-// flag is present.
-const char kLocalSyncBackendDir[] = "local-sync-backend-dir";
-
-#if BUILDFLAG(IS_ANDROID)
-const base::Feature kSyncUseSessionsUnregisterDelay{
-    "SyncUseSessionsUnregisterDelay", base::FEATURE_DISABLED_BY_DEFAULT};
-#endif  // BUILDFLAG(IS_ANDROID)
-
-// Enables providing the list of FCM registration tokens in the commit request.
-const base::Feature kSyncUseFCMRegistrationTokensList{
-    "SyncUseFCMRegistrationTokensList", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Max size of FCM registration tokens list. If the number of active devices
-// having FCM registration tokens is higher, then the resulting list will be
-// empty meaning unknown FCM registration tokens.
-const base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize{
-    &kSyncUseFCMRegistrationTokensList, "SyncFCMRegistrationTokensListMaxSize",
-    5};
-
-// Enables filtering out inactive devices which haven't sent DeviceInfo update
-// recently (depending on the device's pulse_interval and an additional margin).
-const base::Feature kSyncFilterOutInactiveDevicesForSingleClient{
-    "SyncFilterOutInactiveDevicesForSingleClient",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-// An additional threshold to consider devices as active. It extends device's
-// pulse interval to mitigate possible latency after DeviceInfo commit.
-const base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin{
-    &kSyncFilterOutInactiveDevicesForSingleClient, "SyncActiveDeviceMargin",
-    base::Minutes(30)};
-
-}  // namespace switches
diff --git a/components/browser_sync/browser_sync_switches.h b/components/browser_sync/browser_sync_switches.h
index 7c33aea6..8ea9c96 100644
--- a/components/browser_sync/browser_sync_switches.h
+++ b/components/browser_sync/browser_sync_switches.h
@@ -11,18 +11,40 @@
 
 namespace switches {
 
-extern const char kEnableLocalSyncBackend[];
-extern const char kLocalSyncBackendDir[];
+// Enabled the local sync backend implemented by the LoopbackServer.
+constexpr inline char kEnableLocalSyncBackend[] = "enable-local-sync-backend";
+
+// Specifies the local sync backend directory. The name is chosen to mimic
+// user-data-dir etc. This flag only matters if the enable-local-sync-backend
+// flag is present.
+constexpr inline char kLocalSyncBackendDir[] = "local-sync-backend-dir";
 
 #if BUILDFLAG(IS_ANDROID)
-extern const base::Feature kSyncUseSessionsUnregisterDelay;
-#endif
+constexpr inline base::Feature kSyncUseSessionsUnregisterDelay{
+    "SyncUseSessionsUnregisterDelay", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // BUILDFLAG(IS_ANDROID)
 
 // Sync invalidation switches.
-extern const base::Feature kSyncUseFCMRegistrationTokensList;
-extern const base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize;
-extern const base::Feature kSyncFilterOutInactiveDevicesForSingleClient;
-extern const base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin;
+//
+// Enables providing the list of FCM registration tokens in the commit request.
+constexpr inline base::Feature kSyncUseFCMRegistrationTokensList{
+    "SyncUseFCMRegistrationTokensList", base::FEATURE_ENABLED_BY_DEFAULT};
+// Max size of FCM registration tokens list. If the number of active devices
+// having FCM registration tokens is higher, then the resulting list will be
+// empty meaning unknown FCM registration tokens.
+constexpr inline base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize{
+    &kSyncUseFCMRegistrationTokensList, "SyncFCMRegistrationTokensListMaxSize",
+    5};
+// Enables filtering out inactive devices which haven't sent DeviceInfo update
+// recently (depending on the device's pulse_interval and an additional margin).
+constexpr inline base::Feature kSyncFilterOutInactiveDevicesForSingleClient{
+    "SyncFilterOutInactiveDevicesForSingleClient",
+    base::FEATURE_ENABLED_BY_DEFAULT};
+// An additional threshold to consider devices as active. It extends device's
+// pulse interval to mitigate possible latency after DeviceInfo commit.
+constexpr inline base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin{
+    &kSyncFilterOutInactiveDevicesForSingleClient, "SyncActiveDeviceMargin",
+    base::Minutes(30)};
 
 }  // namespace switches
 
diff --git a/components/certificate_transparency/certificate_transparency_config.proto b/components/certificate_transparency/certificate_transparency_config.proto
index e2f2db2..ac7906b 100644
--- a/components/certificate_transparency/certificate_transparency_config.proto
+++ b/components/certificate_transparency/certificate_transparency_config.proto
@@ -16,4 +16,7 @@
   bool disable_ct_enforcement = 1;
   // Logs Chrome should recognize.
   CTLogList log_list = 2;
-}
\ No newline at end of file
+  // A list of the leaf hashes for the most popular SCTs encountered in Chrome
+  // recently. Sorted lexicographically.
+  repeated bytes popular_scts = 3;
+}
diff --git a/components/crash/content/tools/generate_breakpad_symbols.py b/components/crash/content/tools/generate_breakpad_symbols.py
index e68039d..9939561 100755
--- a/components/crash/content/tools/generate_breakpad_symbols.py
+++ b/components/crash/content/tools/generate_breakpad_symbols.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -9,22 +9,20 @@
 platforms is planned.
 """
 
-from __future__ import print_function
 import collections
 import errno
 import glob
 import multiprocessing
 import optparse
 import os
+import queue
 import re
 import shutil
-import six.moves.queue
 import subprocess
 import sys
 import threading
 import traceback
 
-
 CONCURRENT_TASKS=multiprocessing.cpu_count()
 if sys.platform == 'win32':
   # TODO(crbug.com/1190269) - we can't use more than 56
@@ -221,7 +219,7 @@
 def GetSharedLibraryDependencies(options, binary, exe_path):
   """Return absolute paths to all shared library dependencies of the binary."""
   deps = []
-  if options.platform.startswith('linux'):
+  if options.platform == 'linux':
     deps = GetSharedLibraryDependenciesLinux(binary)
   elif options.platform == 'android':
     deps = GetSharedLibraryDependenciesAndroid(binary)
@@ -247,7 +245,7 @@
      dependencies of the binary, along with the binary itself."""
   binary = os.path.abspath(options.binary)
   exe_path = os.path.dirname(binary)
-  if options.platform.startswith('linux'):
+  if options.platform == 'linux':
     # 'ldd' returns all transitive dependencies for us.
     deps = set(GetSharedLibraryDependencies(options, binary, exe_path))
     deps.add(binary)
@@ -255,12 +253,12 @@
   elif (options.platform == 'darwin' or options.platform == 'android' or
         options.platform == 'chromeos'):
     binaries = set([binary])
-    queue = [binary]
-    while queue:
-      deps = GetSharedLibraryDependencies(options, queue.pop(0), exe_path)
+    q = [binary]
+    while q:
+      deps = GetSharedLibraryDependencies(options, q.pop(0), exe_path)
       new_deps = set(deps) - binaries
       binaries |= new_deps
-      queue.extend(list(new_deps))
+      q.extend(list(new_deps))
     return binaries
   print("Platform not supported.")
   sys.exit(1)
@@ -289,7 +287,7 @@
   """Create the directory to store breakpad symbols in. On Android/Linux, we
      also create a symlink in case the hash in the binary is missing."""
   mkdir_p(output_dir)
-  if options.platform == 'android' or options.platform.startswith('linux'):
+  if options.platform == 'android' or options.platform == 'linux':
     try:
       os.symlink(relative_hash_dir, os.path.join(os.path.dirname(output_dir),
                  '000000000000000000000000000000000'))
@@ -300,7 +298,7 @@
 def GenerateSymbols(options, binaries):
   """Dumps the symbols of binary and places them in the given directory."""
 
-  queue = six.moves.queue.Queue()
+  q = queue.Queue()
   exceptions = []
   print_lock = threading.Lock()
   exceptions_lock = threading.Lock()
@@ -311,7 +309,7 @@
       try:
         should_dump_syms = True
         reason = "no reason"
-        binary = queue.get()
+        binary = q.get()
 
         run_once = True
         while run_once:
@@ -369,17 +367,17 @@
         with exceptions_lock:
           exceptions.append(traceback.format_exc())
       finally:
-        queue.task_done()
+        q.task_done()
 
   for binary in binaries:
-    queue.put(binary)
+    q.put(binary)
 
   for _ in range(options.jobs):
     t = threading.Thread(target=_Worker)
     t.daemon = True
     t.start()
 
-  queue.join()
+  q.join()
   if exceptions:
     exception_str = ('One or more exceptions occurred while generating '
                      'symbols:\n')
diff --git a/components/download/internal/common/download_create_info.cc b/components/download/internal/common/download_create_info.cc
index 880cc32..eaf28c7 100644
--- a/components/download/internal/common/download_create_info.cc
+++ b/components/download/internal/common/download_create_info.cc
@@ -23,6 +23,7 @@
       offset(0),
       has_user_gesture(false),
       transient(false),
+      require_safety_checks(true),
       result(DOWNLOAD_INTERRUPT_REASON_NONE),
       save_info(std::move(save_info)),
       render_process_id(-1),
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc
index 389839f..fa74c65 100644
--- a/components/download/internal/common/download_item_impl.cc
+++ b/components/download/internal/common/download_item_impl.cc
@@ -429,6 +429,7 @@
       delegate_(delegate),
       is_temporary_(!info.transient && !info.save_info->file_path.empty()),
       transient_(info.transient),
+      require_safety_checks_(info.require_safety_checks),
       destination_info_(info.save_info->prompt_for_save_location
                             ? TARGET_DISPOSITION_PROMPT
                             : TARGET_DISPOSITION_OVERWRITE),
@@ -1171,6 +1172,10 @@
   return transient_;
 }
 
+bool DownloadItemImpl::RequireSafetyChecks() const {
+  return require_safety_checks_;
+}
+
 bool DownloadItemImpl::IsParallelDownload() const {
   bool is_parallelizable = job_ ? job_->IsParallelizable() : false;
   return is_parallelizable && download::IsParallelDownloadEnabled();
@@ -2025,7 +2030,7 @@
                      weak_ptr_factory_.GetWeakPtr());
 
   // If an alternate rename handler is specified, use it instead.
-  if (GetRenameHandler()) {
+  if (GetRenameHandler() && !is_temporary_) {
     auto update_callback =
         base::BindRepeating(&DownloadItemImpl::OnRenameHandlerUpdate,
                             weak_ptr_factory_.GetWeakPtr());
diff --git a/components/download/internal/common/download_response_handler.cc b/components/download/internal/common/download_response_handler.cc
index 8347a10..ed1e7f0 100644
--- a/components/download/internal/common/download_response_handler.cc
+++ b/components/download/internal/common/download_response_handler.cc
@@ -60,6 +60,7 @@
     const DownloadUrlParameters::RequestHeadersType& request_headers,
     const std::string& request_origin,
     DownloadSource download_source,
+    bool require_safety_checks,
     std::vector<GURL> url_chain,
     bool is_background_mode)
     : delegate_(delegate),
@@ -80,6 +81,7 @@
       credentials_mode_(resource_request->credentials_mode),
       is_partial_request_(save_info_->offset > 0),
       completed_(false),
+      require_safety_checks_(require_safety_checks),
       abort_reason_(DOWNLOAD_INTERRUPT_REASON_NONE),
       is_background_mode_(is_background_mode) {
   if (!is_parallel_request) {
@@ -162,6 +164,7 @@
   create_info->request_initiator = request_initiator_;
   create_info->credentials_mode = credentials_mode_;
   create_info->isolation_info = isolation_info_;
+  create_info->require_safety_checks = require_safety_checks_;
 
   HandleResponseHeaders(head.headers.get(), create_info.get());
   return create_info;
diff --git a/components/download/internal/common/resource_downloader.cc b/components/download/internal/common/resource_downloader.cc
index ef2afeae..2d2ec13 100644
--- a/components/download/internal/common/resource_downloader.cc
+++ b/components/download/internal/common/resource_downloader.cc
@@ -172,6 +172,7 @@
       download_url_parameters->request_headers(),
       download_url_parameters->request_origin(),
       download_url_parameters->download_source(),
+      download_url_parameters->require_safety_checks(),
       std::vector<GURL>(1, resource_request_->url), is_background_mode);
 
   mojo::PendingRemote<network::mojom::URLLoaderClient> url_loader_client_remote;
@@ -210,9 +211,9 @@
       false, /* fetch_error_body */
       network::mojom::RedirectMode::kFollow,
       download::DownloadUrlParameters::RequestHeadersType(),
-      std::string(), /* request_origin */
-      download::DownloadSource::NAVIGATION, std::move(url_chain),
-      false /* is_background_mode */);
+      std::string(),                              /* request_origin */
+      download::DownloadSource::NAVIGATION, true, /* require_safety_checks */
+      std::move(url_chain), false /* is_background_mode */);
 
   // Simulate on the new URLLoaderClient calls that happened on the old client.
   response_head->cert_status = cert_status;
diff --git a/components/download/public/common/download_create_info.h b/components/download/public/common/download_create_info.h
index 36c85afc2..2481a23 100644
--- a/components/download/public/common/download_create_info.h
+++ b/components/download/public/common/download_create_info.h
@@ -101,6 +101,9 @@
   // short-lived and is not shown in the UI.
   bool transient;
 
+  // Whether this download requires safety checks.
+  bool require_safety_checks;
+
   absl::optional<ui::PageTransition> transition_type;
 
   // The HTTP response headers. This contains a nullptr when the response has
diff --git a/components/download/public/common/download_item.h b/components/download/public/common/download_item.h
index b59a486..06fefe8 100644
--- a/components/download/public/common/download_item.h
+++ b/components/download/public/common/download_item.h
@@ -531,6 +531,10 @@
   // for target file path determination.
   virtual bool IsTransient() const = 0;
 
+  // Returns whether the download requires safety checks. Only downloads
+  // triggered by Chrome itself are excluded from safety checks.
+  virtual bool RequireSafetyChecks() const = 0;
+
   // Returns whether the download item corresponds to a parallel download. This
   // usually means parallel download has been enabled and the download job is
   // parallelizable.
diff --git a/components/download/public/common/download_item_impl.h b/components/download/public/common/download_item_impl.h
index 8b9118a..430cb2f2 100644
--- a/components/download/public/common/download_item_impl.h
+++ b/components/download/public/common/download_item_impl.h
@@ -325,6 +325,7 @@
   bool GetOpened() const override;
   base::Time GetLastAccessTime() const override;
   bool IsTransient() const override;
+  bool RequireSafetyChecks() const override;
   bool IsParallelDownload() const override;
   DownloadCreationType GetDownloadCreationType() const override;
   const absl::optional<DownloadSchedule>& GetDownloadSchedule() const override;
@@ -832,6 +833,9 @@
   // Whether the download item should be transient and not shown in the UI.
   bool transient_ = false;
 
+  // Whether the download requires safe browsing check.
+  bool require_safety_checks_ = true;
+
   // Did the delegate delay calling Complete on this download?
   bool delegate_delayed_complete_ = false;
 
diff --git a/components/download/public/common/download_response_handler.h b/components/download/public/common/download_response_handler.h
index 8702d9c..d56dad69 100644
--- a/components/download/public/common/download_response_handler.h
+++ b/components/download/public/common/download_response_handler.h
@@ -55,6 +55,7 @@
       const DownloadUrlParameters::RequestHeadersType& request_headers,
       const std::string& request_origin,
       DownloadSource download_source,
+      bool require_safety_checks,
       std::vector<GURL> url_chain,
       bool is_background_mode);
 
@@ -111,6 +112,7 @@
   absl::optional<net::IsolationInfo> isolation_info_;
   bool is_partial_request_;
   bool completed_;
+  bool require_safety_checks_;
 
   // The abort reason if this class decides to block the download.
   DownloadInterruptReason abort_reason_;
diff --git a/components/download/public/common/mock_download_item.h b/components/download/public/common/mock_download_item.h
index c0b0357..7ccfb5d 100644
--- a/components/download/public/common/mock_download_item.h
+++ b/components/download/public/common/mock_download_item.h
@@ -130,6 +130,7 @@
   MOCK_CONST_METHOD0(GetOpened, bool());
   MOCK_CONST_METHOD0(GetLastAccessTime, base::Time());
   MOCK_CONST_METHOD0(IsTransient, bool());
+  MOCK_CONST_METHOD0(RequireSafetyChecks, bool());
   MOCK_CONST_METHOD0(IsParallelDownload, bool());
   MOCK_CONST_METHOD0(GetDownloadCreationType, DownloadCreationType());
   MOCK_CONST_METHOD0(GetDownloadSchedule,
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc
index a9865d9..545e690 100644
--- a/components/embedder_support/user_agent_utils.cc
+++ b/components/embedder_support/user_agent_utils.cc
@@ -541,6 +541,7 @@
   // set number. For more information, see the respective headers.
   metadata.architecture = content::GetLowEntropyCpuArchitecture();
   metadata.bitness = content::GetLowEntropyCpuBitness();
+  metadata.wow64 = content::IsWoW64();
 
   return metadata;
 }  // namespace embedder_support
@@ -564,6 +565,7 @@
   // CPU architecture and bitness.`
   spoofed_ua.ua_metadata_override->architecture = "x86";
   spoofed_ua.ua_metadata_override->bitness = "64";
+  spoofed_ua.ua_metadata_override->wow64 = false;
 
   web_contents->SetUserAgentOverride(spoofed_ua, override_in_new_tabs);
 }
diff --git a/components/embedder_support/user_agent_utils_unittest.cc b/components/embedder_support/user_agent_utils_unittest.cc
index 02d04a3..5fc51dbc 100644
--- a/components/embedder_support/user_agent_utils_unittest.cc
+++ b/components/embedder_support/user_agent_utils_unittest.cc
@@ -560,6 +560,7 @@
   EXPECT_EQ(metadata.architecture, content::GetLowEntropyCpuArchitecture());
   EXPECT_EQ(metadata.model, content::BuildModelInfo());
   EXPECT_EQ(metadata.bitness, content::GetLowEntropyCpuBitness());
+  EXPECT_EQ(metadata.wow64, content::IsWoW64());
 }
 
 TEST_P(UserAgentUtilsTest, GenerateBrandVersionList) {
diff --git a/components/exo/data_offer_unittest.cc b/components/exo/data_offer_unittest.cc
index 2217e1d..4450410 100644
--- a/components/exo/data_offer_unittest.cc
+++ b/components/exo/data_offer_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/callback_forward.h"
 #include "base/containers/flat_set.h"
 #include "base/files/file_util.h"
+#include "base/pickle.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/chromeos_buildflags.h"
diff --git a/components/exo/surface_unittest.cc b/components/exo/surface_unittest.cc
index d7a4acdf..09491bf1 100644
--- a/components/exo/surface_unittest.cc
+++ b/components/exo/surface_unittest.cc
@@ -1407,7 +1407,15 @@
   EXPECT_FALSE(surface->HasPendingPerCommitBufferReleaseCallback());
 }
 
-TEST_P(SurfaceTest, PerCommitBufferReleaseCallbackForSameSurface) {
+// TODO(crbug.com/1292674): Flaky on ChromeOS.
+#if BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_PerCommitBufferReleaseCallbackForSameSurface \
+  DISABLED_PerCommitBufferReleaseCallbackForSameSurface
+#else
+#define MAYBE_PerCommitBufferReleaseCallbackForSameSurface \
+  PerCommitBufferReleaseCallbackForSameSurface
+#endif
+TEST_P(SurfaceTest, MAYBE_PerCommitBufferReleaseCallbackForSameSurface) {
   gfx::Size buffer_size(1, 1);
   auto buffer1 = std::make_unique<Buffer>(
       exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
@@ -1448,7 +1456,15 @@
   EXPECT_EQ(buffer_release_count, 1);
 }
 
-TEST_P(SurfaceTest, PerCommitBufferReleaseCallbackForDifferentSurfaces) {
+// TODO(crbug.com/1292674): Flaky on ChromeOS.
+#if BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_PerCommitBufferReleaseCallbackForDifferentSurfaces \
+  DISABLED_PerCommitBufferReleaseCallbackForDifferentSurfaces
+#else
+#define MAYBE_PerCommitBufferReleaseCallbackForDifferentSurfaces \
+  PerCommitBufferReleaseCallbackForDifferentSurfaces
+#endif
+TEST_P(SurfaceTest, MAYBE_PerCommitBufferReleaseCallbackForDifferentSurfaces) {
   gfx::Size buffer_size(1, 1);
   auto buffer1 = std::make_unique<Buffer>(
       exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 75ae645..1d05287 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -413,7 +413,7 @@
   wl_global_create(wl_display_.get(), &xdg_wm_base_interface, 1,
                    xdg_shell_data_.get(), bind_xdg_shell);
 
-  wl_global_create(wl_display_.get(), &zcr_touchpad_haptics_v1_interface, 2,
+  wl_global_create(wl_display_.get(), &zcr_touchpad_haptics_v1_interface, 1,
                    display_, bind_touchpad_haptics);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
diff --git a/components/exo/wayland/zcr_touchpad_haptics.cc b/components/exo/wayland/zcr_touchpad_haptics.cc
index 2ef29d3..d829bf6 100644
--- a/components/exo/wayland/zcr_touchpad_haptics.cc
+++ b/components/exo/wayland/zcr_touchpad_haptics.cc
@@ -23,17 +23,10 @@
   // TODO(b/205702807): Call InputController::PlayHapticTouchpadEffect.
 }
 
-void touchpad_haptics_request_activation_state(wl_client* client,
-                                               wl_resource* resource) {
-  // TODO(b/205702807): Call InputController::HasHapticTouchpad and send it via
-  // activated/deactivated event.
-}
-
 const struct zcr_touchpad_haptics_v1_interface touchpad_haptics_implementation =
     {
         touchpad_haptics_destroy,
         touchpad_haptics_play,
-        touchpad_haptics_request_activation_state,
 };
 
 }  // namespace
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
index 33b86ce3..eaee21bc 100644
--- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
+++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
@@ -166,7 +166,7 @@
 
     /** The keyboard accessory was used to fill payment data into a form. */
     public static final String KEYBOARD_ACCESSORY_PAYMENT_AUTOFILLED =
-            "keyboard_accessory_payment_suggestion_accepted";
+            "autofill_virtual_card_suggestion_accepted";
 
     /** The keyboard accessory was swiped to reveal more suggestions. */
     public static final String KEYBOARD_ACCESSORY_BAR_SWIPED = "keyboard_accessory_bar_swiped";
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
index 892f02c..52299a5 100644
--- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
+++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -96,8 +96,7 @@
     String KEYBOARD_ACCESSORY_PASSWORD_FILLING_FEATURE = "IPH_KeyboardAccessoryPasswordFilling";
     String KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE = "IPH_KeyboardAccessoryPaymentFilling";
     String KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE = "IPH_KeyboardAccessoryPaymentOffer";
-    String KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_FEATURE =
-            "IPH_KeyboardAccessoryPaymentVirtualCard";
+    String KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_FEATURE = "IPH_AutofillVirtualCardSuggestion";
     String KEYBOARD_ACCESSORY_BAR_SWIPING_FEATURE = "IPH_KeyboardAccessoryBarSwiping";
     String INSTANCE_SWITCHER = "IPH_InstanceSwitcher";
     String PREVIEWS_OMNIBOX_UI_FEATURE = "IPH_PreviewsOmniboxUI";
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index cc7ee8c6..ebcd2f6d 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -109,6 +109,7 @@
                     Comparator(EQUAL, 0), 7, 360));
     return config;
   }
+
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS)
 
@@ -717,30 +718,40 @@
     return config;
   }
 
-  if (kIPHKeyboardAccessoryPaymentVirtualCardFeature.name == feature->name) {
-    // A config that allows the virtual card IPH to be shown when a user
-    // interacts with the payment form and triggers the credit card suggestion
-    // list.
+#endif  // BUILDFLAG(IS_ANDROID)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+  if (kIPHAutofillVirtualCardSuggestionFeature.name == feature->name) {
+    // A config that allows the virtual card credit card suggestion IPH to be
+    // shown when:
+    // * it has been shown less than three times in last 90 days;
+    // * the virtual card suggestion has been selected less than twice in last
+    // 90 days.
+
     absl::optional<FeatureConfig> config = FeatureConfig();
     config->valid = true;
     config->availability = Comparator(ANY, 0);
-    config->session_rate = Comparator(ANY, 0);
-    config->trigger =
-        EventConfig("keyboard_accessory_payment_virtual_card_iph_trigger",
-                    Comparator(LESS_THAN, 3), 90, 360);
-    config->used = EventConfig("keyboard_accessory_payment_suggestion_accepted",
+    config->session_rate = Comparator(EQUAL, 0);
+    config->trigger = EventConfig("autofill_virtual_card_iph_trigger",
+                                  Comparator(LESS_THAN, 3), 90, 360);
+    config->used = EventConfig("autofill_virtual_card_suggestion_accepted",
                                Comparator(LESS_THAN, 2), 90, 360);
 
+#if BUILDFLAG(IS_ANDROID)
     SessionRateImpact session_rate_impact;
     session_rate_impact.type = SessionRateImpact::Type::EXPLICIT;
     std::vector<std::string> affected_features;
     affected_features.push_back("IPH_KeyboardAccessoryBarSwiping");
     session_rate_impact.affected_features = affected_features;
     config->session_rate_impact = session_rate_impact;
+#endif  // BUILDFLAG(IS_ANDROID)
+
     return config;
   }
-
-#endif  // BUILDFLAG(IS_ANDROID)
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ||
+        // BUILDFLAG(IS_FUCHSIA)
 
   if (kIPHDummyFeature.name == feature->name) {
     // Only used for tests. Various magic tricks are used below to ensure this
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index cfcf782..be77875 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -187,9 +187,6 @@
     "IPH_KeyboardAccessoryPaymentFilling", base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kIPHKeyboardAccessoryPaymentOfferFeature{
     "IPH_KeyboardAccessoryPaymentOffer", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kIPHKeyboardAccessoryPaymentVirtualCardFeature{
-    "IPH_KeyboardAccessoryPaymentVirtualCard",
-    base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kIPHNewTabPageHomeButtonFeature{
     "IPH_NewTabPageHomeButton", base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kIPHMicToolbarFeature{"IPH_MicToolbar",
@@ -279,6 +276,8 @@
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+const base::Feature kIPHAutofillVirtualCardSuggestionFeature{
+    "IPH_AutofillVirtualCardSuggestion", base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kIPHUpdatedConnectionSecurityIndicatorsFeature{
     "IPH_UpdatedConnectionSecurityIndicators",
     base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 210741d..caee80f 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -117,7 +117,6 @@
 extern const base::Feature kIPHKeyboardAccessoryPasswordFillingFeature;
 extern const base::Feature kIPHKeyboardAccessoryPaymentFillingFeature;
 extern const base::Feature kIPHKeyboardAccessoryPaymentOfferFeature;
-extern const base::Feature kIPHKeyboardAccessoryPaymentVirtualCardFeature;
 extern const base::Feature kIPHMicToolbarFeature;
 extern const base::Feature kIPHNewTabPageHomeButtonFeature;
 extern const base::Feature kIPHPageInfoFeature;
@@ -172,8 +171,11 @@
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+extern const base::Feature kIPHAutofillVirtualCardSuggestionFeature;
 extern const base::Feature kIPHUpdatedConnectionSecurityIndicatorsFeature;
-#endif
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ||
+        // BUILDFLAG(IS_FUCHSIA)
 
 }  // namespace feature_engagement
 
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index efea32b5..aec6f55 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -68,7 +68,6 @@
     &kIPHKeyboardAccessoryPasswordFillingFeature,
     &kIPHKeyboardAccessoryPaymentFillingFeature,
     &kIPHKeyboardAccessoryPaymentOfferFeature,
-    &kIPHKeyboardAccessoryPaymentVirtualCardFeature,
     &kIPHMicToolbarFeature,
     &kIPHNewTabPageHomeButtonFeature,
     &kIPHPageInfoFeature,
@@ -137,6 +136,13 @@
     &kIPHDesktopSharedHighlightingFeature,
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+    &kIPHAutofillVirtualCardSuggestionFeature,
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ||
+        // BUILDFLAG(IS_FUCHSIA)
 };
 }  // namespace
 
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index f68101ec0..a12b3909 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -143,8 +143,6 @@
                        "IPH_KeyboardAccessoryPaymentFilling");
 DEFINE_VARIATION_PARAM(kIPHKeyboardAccessoryPaymentOfferFeature,
                        "IPH_KeyboardAccessoryPaymentOffer");
-DEFINE_VARIATION_PARAM(kIPHKeyboardAccessoryPaymentVirtualCardFeature,
-                       "IPH_KeyboardAccessoryPaymentVirtualCard");
 DEFINE_VARIATION_PARAM(kIPHMicToolbarFeature, "IPH_MicToolbar");
 DEFINE_VARIATION_PARAM(kIPHNewTabPageButtonFeature, "IPH_NewTabPageHomeButton");
 DEFINE_VARIATION_PARAM(kIPHPageInfoFeature, "IPH_PageInfo");
@@ -253,6 +251,14 @@
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+DEFINE_VARIATION_PARAM(kIPHAutofillVirtualCardSuggestionFeature,
+                       "IPH_AutofillVirtualCardSuggestion");
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ||
+        // BUILDFLAG(IS_FUCHSIA)
+
 }  // namespace
 
 // Defines the array of which features should be listed in the chrome://flags
@@ -304,7 +310,6 @@
         VARIATION_ENTRY(kIPHKeyboardAccessoryPasswordFillingFeature),
         VARIATION_ENTRY(kIPHKeyboardAccessoryPaymentFillingFeature),
         VARIATION_ENTRY(kIPHKeyboardAccessoryPaymentOfferFeature),
-        VARIATION_ENTRY(kIPHKeyboardAccessoryPaymentVirtualCardFeature),
         VARIATION_ENTRY(kIPHMicToolbarFeature),
         VARIATION_ENTRY(kIPHNewTabPageButtonFeature),
         VARIATION_ENTRY(kIPHPageInfoFeature),
@@ -370,6 +375,13 @@
         VARIATION_ENTRY(kIPHDesktopSharedHighlightingFeature),
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
+        VARIATION_ENTRY(kIPHAutofillVirtualCardSuggestionFeature),
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ||
+        // BUILDFLAG(IS_FUCHSIA)
 };
 
 #undef DEFINE_VARIATION_PARAM
diff --git a/components/feed/core/v2/public/public_types.cc b/components/feed/core/v2/public/public_types.cc
index 08cb533..bbd116f 100644
--- a/components/feed/core/v2/public/public_types.cc
+++ b/components/feed/core/v2/public/public_types.cc
@@ -154,4 +154,16 @@
   return out << " }";
 }
 
+std::ostream& operator<<(std::ostream& out,
+                         WebFeedPageInformationRequestReason value) {
+  switch (value) {
+    case WebFeedPageInformationRequestReason::kUserRequestedFollow:
+      return out << "kUserRequestedFollow";
+    case WebFeedPageInformationRequestReason::kFollowRecommendation:
+      return out << "kFollowRecommendation";
+    case WebFeedPageInformationRequestReason::kMenuItemPresentation:
+      return out << "kMenuItemPresentation";
+  }
+}
+
 }  // namespace feed
diff --git a/components/feed/core/v2/public/types.h b/components/feed/core/v2/public/types.h
index 0574bd6..00570d86 100644
--- a/components/feed/core/v2/public/types.h
+++ b/components/feed/core/v2/public/types.h
@@ -225,6 +225,27 @@
 
 using NetworkRequestId = base::IdTypeU32<class NetworkRequestIdClass>;
 
+// Values for the UMA
+// ContentSuggestions.Feed.WebFeed.PageInformationRequested histogram.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. This must be kept in sync with
+// WebFeedPageInformationRequestReason in enums.xml.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.feed.webfeed
+enum class WebFeedPageInformationRequestReason : int {
+  // The user requested to Follow the current web page.
+  kUserRequestedFollow = 0,
+  // A Follow recommendation is being considered the current web page.
+  kFollowRecommendation = 1,
+  // The Follow menu item state needs to reflect the current web page.
+  kMenuItemPresentation = 2,
+
+  kMaxValue = kMenuItemPresentation,
+};
+
+// For testing and debugging only.
+std::ostream& operator<<(std::ostream& out,
+                         WebFeedPageInformationRequestReason value);
+
 }  // namespace feed
 
 #endif  // COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_
diff --git a/components/history_clusters/core/BUILD.gn b/components/history_clusters/core/BUILD.gn
index cb9aa49..f4a88f4 100644
--- a/components/history_clusters/core/BUILD.gn
+++ b/components/history_clusters/core/BUILD.gn
@@ -30,6 +30,8 @@
     "history_clusters_service.h",
     "history_clusters_types.cc",
     "history_clusters_types.h",
+    "query_clusters_state.cc",
+    "query_clusters_state.h",
   ]
   if (build_with_on_device_clustering_backend) {
     sources += [
diff --git a/components/history_clusters/core/query_clusters_state.cc b/components/history_clusters/core/query_clusters_state.cc
new file mode 100644
index 0000000..c6b53b1
--- /dev/null
+++ b/components/history_clusters/core/query_clusters_state.cc
@@ -0,0 +1,15 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/history_clusters/core/query_clusters_state.h"
+
+namespace history_clusters {
+
+QueryClustersState::QueryClustersState(
+    base::WeakPtr<HistoryClustersService> service)
+    : service_(service) {}
+
+QueryClustersState::~QueryClustersState() = default;
+
+}  // namespace history_clusters
diff --git a/components/history_clusters/core/query_clusters_state.h b/components/history_clusters/core/query_clusters_state.h
new file mode 100644
index 0000000..cf113c84
--- /dev/null
+++ b/components/history_clusters/core/query_clusters_state.h
@@ -0,0 +1,47 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_HISTORY_CLUSTERS_CORE_QUERY_CLUSTERS_STATE_H_
+#define COMPONENTS_HISTORY_CLUSTERS_CORE_QUERY_CLUSTERS_STATE_H_
+
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "components/history/core/browser/history_types.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace history_clusters {
+
+class HistoryClustersService;
+
+// This object encapsulates the results of a query to HistoryClustersService.
+// It manages fetching more pages from the clustering backend as the user
+// scrolls down.
+//
+// In the future, it will also manage reusing results for new searches, as well
+// as collapsing duplicate clusters across pages.
+//
+// It's the history_clusters equivalent to history::QueryHistoryState.
+class QueryClustersState {
+ public:
+  explicit QueryClustersState(base::WeakPtr<HistoryClustersService> service);
+  ~QueryClustersState();
+
+  QueryClustersState(const QueryClustersState&) = delete;
+
+ private:
+  const base::WeakPtr<HistoryClustersService> service_;
+
+  std::vector<history::Cluster> clusters_;
+
+  // A nullopt `continuation_end_time` means we have exhausted History.
+  // Note that this differs from History itself, which uses base::Time() as the
+  // value to indicate we've exhausted history. I've found that to be not
+  // explicit enough in practice. This value will never be base::Time().
+  absl::optional<base::Time> continuation_end_time_;
+};
+
+}  // namespace history_clusters
+
+#endif  // COMPONENTS_HISTORY_CLUSTERS_CORE_QUERY_CLUSTERS_STATE_H_
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc
index 3ae966a..dcf387aa 100644
--- a/components/omnibox/browser/document_provider.cc
+++ b/components/omnibox/browser/document_provider.cc
@@ -162,17 +162,18 @@
   double InvScore() { return std::pow(1 - weight, count); }
 };
 
-// Extracts a list of strings from a DictionaryValue containing a list of
-// objects containing a string field.
+// Extracts a list of pointers to strings from a DictionaryValue containing a
+// list of objects containing a string field of interest. Note that pointers may
+// be `nullptr` if the value at `field_path` is not found or is not a string.
 std::vector<const std::string*> ExtractResultList(
-    const base::DictionaryValue* result,
+    const base::Value* result,
     const base::StringPiece& list_path,
     const base::StringPiece& field_path) {
   const base::Value* values = result->FindListPath(list_path);
   if (!values)
     return {};
 
-  base::Value::ConstListView list = values->GetList();
+  auto list = values->GetList();
   std::vector<const std::string*> extracted(list.size());
   std::transform(list.begin(), list.end(), extracted.begin(),
                  [field_path](const auto& value) {
@@ -187,8 +188,7 @@
                                                    param_name, default_weight);
 }
 
-int CalculateScore(const std::u16string& input,
-                   const base::DictionaryValue* result) {
+int CalculateScore(const std::u16string& input, const base::Value* result) {
   // Suggestions scored lower than |raw_score_cutoff| will be discarded.
   double raw_score_cutoff = base::GetFieldTrialParamByFeatureAsDouble(
       omnibox::kDocumentProvider, "RawDocScoreCutoff", .25);
@@ -250,7 +250,7 @@
 
 int BoostOwned(const int score,
                const std::string& owner,
-               const base::DictionaryValue* result) {
+               const base::Value* result) {
   int promotion = base::GetFieldTrialParamByFeatureAsInt(
       omnibox::kDocumentProvider, "OwnedDocPromotion", 0);
   int demotion = base::GetFieldTrialParamByFeatureAsInt(
@@ -324,6 +324,11 @@
   return std::string();
 }
 
+std::string FindStringKeyOrEmpty(const base::Value& value, std::string key) {
+  auto* ptr = value.FindStringKey(key);
+  return ptr ? *ptr : "";
+}
+
 }  // namespace
 
 // static
@@ -691,17 +696,13 @@
 ACMatches DocumentProvider::ParseDocumentSearchResults(
     const base::Value& root_val) {
   ACMatches matches;
-  const base::DictionaryValue* root_dict = nullptr;
-  const base::ListValue* results_list = nullptr;
-  if (!root_val.GetAsDictionary(&root_dict)) {
-    return matches;
-  }
 
   // Parse the results.
-  if (!root_dict->GetList("results", &results_list)) {
+  const base::Value* results = root_val.FindListKey("results");
+  if (!results) {
     return matches;
   }
-  size_t num_results = results_list->GetList().size();
+  size_t num_results = results->GetList().size();
   UMA_HISTOGRAM_COUNTS_1M("Omnibox.DocumentSuggest.ResultCount", num_results);
 
   // During development/quality iteration we may wish to defeat server scores.
@@ -732,16 +733,12 @@
   // Ensure server's suggestions are added with monotonically decreasing scores.
   int previous_score = INT_MAX;
   for (size_t i = 0; i < num_results; i++) {
-    const base::Value& result_value = results_list->GetList()[i];
-    if (!result_value.is_dict()) {
+    const base::Value& result = results->GetList()[i];
+    if (!result.is_dict()) {
       return matches;
     }
-    const base::DictionaryValue& result =
-        base::Value::AsDictionaryValue(result_value);
-    std::u16string title;
-    std::u16string url;
-    result.GetString("title", &title);
-    result.GetString("url", &url);
+    const std::string title = FindStringKeyOrEmpty(result, "title");
+    const std::string url = FindStringKeyOrEmpty(result, "url");
     if (title.empty() || url.empty()) {
       continue;
     }
@@ -776,10 +773,10 @@
                             AutocompleteMatchType::DOCUMENT_SUGGESTION);
     // Use full URL for displayed text and navigation. Use "originalUrl" for
     // deduping if present.
-    match.fill_into_edit = url;
+    match.fill_into_edit = base::UTF8ToUTF16(url);
     match.destination_url = GURL(url);
-    std::u16string original_url;
-    if (result.GetString("originalUrl", &original_url)) {
+    const std::string* original_url = result.FindStringKey("originalUrl");
+    if (original_url) {
       // |AutocompleteMatch::GURLToStrippedGURL()| will try to use
       // |GetURLForDeduping()| to extract a doc ID and generate a canonical doc
       // URL; this is ideal as it handles different URL formats pointing to the
@@ -787,23 +784,24 @@
       // generation that can still be used for generic deduping and as a key to
       // |matches_cache_|.
       match.stripped_destination_url = AutocompleteMatch::GURLToStrippedGURL(
-          GURL(original_url), input_, client_->GetTemplateURLService(),
+          GURL(*original_url), input_, client_->GetTemplateURLService(),
           std::u16string());
     }
 
-    match.contents = AutocompleteMatch::SanitizeString(title);
+    match.contents =
+        AutocompleteMatch::SanitizeString(base::UTF8ToUTF16(title));
     match.contents_class = Classify(match.contents, input_.text());
-    const base::DictionaryValue* metadata = nullptr;
-    if (result.GetDictionary("metadata", &metadata)) {
-      std::string mimetype;
-      if (metadata->GetString("mimeType", &mimetype)) {
+    const base::Value* metadata = result.FindDictKey("metadata");
+    if (metadata) {
+      const std::string update_time =
+          FindStringKeyOrEmpty(*metadata, "updateTime");
+      const std::string mimetype = FindStringKeyOrEmpty(*metadata, "mimeType");
+      if (metadata->FindStringKey("mimeType")) {
         match.document_type = GetIconForMIMEType(mimetype);
         match.RecordAdditionalInfo(
             "document type",
             AutocompleteMatch::DocumentTypeString(match.document_type));
       }
-      std::string update_time;
-      metadata->GetString("updateTime", &update_time);
       auto owners = ExtractResultList(&result, "metadata.owner.personNames",
                                       "displayName");
       if (!owners.empty())
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index 5037b35e..1846b38 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -71,7 +71,7 @@
 
   if (subtypes_value == nullptr || !subtypes_value->is_list())
     return result;
-  const auto& subtypes_list = subtypes_value->GetList();
+  auto subtypes_list = subtypes_value->GetList();
 
   if (!subtypes_list.empty() && subtypes_list.size() != expected_size) {
     LOG(WARNING) << "The length of reported subtypes (" << subtypes_list.size()
@@ -86,7 +86,7 @@
     if (!subtypes_item.is_list())
       continue;
 
-    const auto& subtype_list = subtypes_item.GetList();
+    auto subtype_list = subtypes_item.GetList();
     auto& result_subtypes = result[index];
     result_subtypes.reserve(subtype_list.size());
 
@@ -456,75 +456,71 @@
     Results* results) {
   if (!root_val.is_list())
     return false;
-  base::Value::ConstListView root_list = root_val.GetList();
+  auto root_list = root_val.GetList();
 
+  // 1st element: query.
   if (root_list.empty() || !root_list[0].is_string())
     return false;
   std::u16string query = base::UTF8ToUTF16(root_list[0].GetString());
   if (query != input.text())
     return false;
 
+  // 2nd element: suggestions list.
   if (root_list.size() < 2u || !root_list[1].is_list())
     return false;
-  base::Value::ConstListView results_list = root_list[1].GetList();
+  auto results_list = root_list[1].GetList();
 
-  // 3rd element: Description list.
-  absl::optional<base::Value::ConstListView> descriptions;
-  if (root_list.size() > 2u && root_list[2].is_list())
-    descriptions = root_list[2].GetList();
-
-  // 4th element: Disregard the query URL list for now.
+  // 3rd element: Ignore the optional description list for now.
+  // 4th element: Disregard the query URL list.
+  // 5th element: Disregard the optional key-value pairs from the server.
 
   // Reset suggested relevance information.
   results->verbatim_relevance = -1;
 
-  // 5th element: Optional key-value pairs from the Suggest server.
-  const base::ListValue* types = nullptr;
-  const base::ListValue* experiment_stats = nullptr;
-  const base::ListValue* suggestion_details = nullptr;
-  const base::DictionaryValue* extras = nullptr;
-  const base::Value* suggestsubtypes = nullptr;
+  const base::Value* suggest_types = nullptr;
+  const base::Value* suggest_subtypes = nullptr;
+  const base::Value* relevances = nullptr;
+  const base::Value* suggestion_details = nullptr;
+  const base::Value* subtype_identifiers = nullptr;
   int prefetch_index = -1;
   int prerender_index = -1;
 
-  absl::optional<base::Value::ConstListView> subtype_identifiers;
-  absl::optional<base::Value::ConstListView> relevances;
+  if (root_list.size() > 4u && root_list[4].is_dict()) {
+    const base::Value& extras = root_list[4];
 
-  if (root_list.size() > 4u && root_list[4].GetAsDictionary(&extras)) {
-    extras->GetList("google:suggesttype", &types);
+    suggest_types = extras.FindListKey("google:suggesttype");
 
-    suggestsubtypes = extras->FindPath("google:suggestsubtypes");
+    suggest_subtypes = extras.FindListKey("google:suggestsubtypes");
 
+    relevances = extras.FindListKey("google:suggestrelevance");
     // Discard this list if its size does not match that of the suggestions.
-    const base::Value* relevances_value =
-        extras->FindListKey("google:suggestrelevance");
-    if (relevances_value &&
-        relevances_value->GetList().size() == results_list.size()) {
-      relevances = relevances_value->GetList();
+    if (relevances && relevances->GetList().size() != results_list.size()) {
+      relevances = nullptr;
     }
+
     if (absl::optional<int> relevance =
-            extras->FindIntKey("google:verbatimrelevance")) {
+            extras.FindIntKey("google:verbatimrelevance")) {
       results->verbatim_relevance = *relevance;
     }
 
     // Check if the active suggest field trial (if any) has triggered either
     // for the default provider or keyword provider.
     absl::optional<bool> field_trial_triggered =
-        extras->FindBoolKey("google:fieldtrialtriggered");
+        extras.FindBoolKey("google:fieldtrialtriggered");
     results->field_trial_triggered = field_trial_triggered.value_or(false);
 
     results->experiment_stats.clear();
-    if (extras->GetList("google:experimentstats", &experiment_stats) &&
-        experiment_stats) {
-      for (const base::Value& experiment_stat : experiment_stats->GetList())
+    const base::Value* experiment_stats =
+        extras.FindListKey("google:experimentstats");
+    if (experiment_stats) {
+      for (const auto& experiment_stat : experiment_stats->GetList())
         results->experiment_stats.push_back(experiment_stat.Clone());
     }
 
-    const base::DictionaryValue* header_texts = nullptr;
-    if (extras->GetDictionary("google:headertexts", &header_texts) &&
-        header_texts) {
-      const base::DictionaryValue* headers = nullptr;
-      if (header_texts->GetDictionary("a", &headers) && headers) {
+    const base::Value* header_texts = extras.FindDictKey("google:headertexts");
+    if (header_texts) {
+      const base::Value* headers = header_texts->FindDictKey("a");
+      if (headers) {
         for (auto it : headers->DictItems()) {
           int suggestion_group_id;
           base::StringToInt(it.first, &suggestion_group_id);
@@ -533,8 +529,8 @@
         }
       }
 
-      const base::ListValue* hidden_group_ids = nullptr;
-      if (header_texts->GetList("h", &hidden_group_ids) && hidden_group_ids) {
+      const base::Value* hidden_group_ids = header_texts->FindListKey("h");
+      if (hidden_group_ids) {
         for (const auto& value : hidden_group_ids->GetList()) {
           if (value.is_int())
             results->hidden_group_ids.emplace_back(value.GetInt());
@@ -542,39 +538,38 @@
       }
     }
 
-    const base::DictionaryValue* client_data = nullptr;
-    if (extras->GetDictionary("google:clientdata", &client_data) &&
-        client_data) {
-      if (absl::optional<int> phi = client_data->FindIntKey("phi"))
-        prefetch_index = *phi;
-      if (absl::optional<int> pre = client_data->FindIntKey("pre")) {
-        prerender_index = *pre;
-      }
+    const base::Value* client_data = extras.FindDictKey("google:clientdata");
+    if (client_data) {
+      prefetch_index = client_data->FindIntKey("phi").value_or(-1);
+      prerender_index = client_data->FindIntKey("pre").value_or(-1);
     }
 
-    if (extras->GetList("google:suggestdetail", &suggestion_details) &&
-        suggestion_details->GetList().size() != results_list.size())
+    suggestion_details = extras.FindListKey("google:suggestdetail");
+    // Discard this list if its size does not match that of the suggestions.
+    if (suggestion_details &&
+        suggestion_details->GetList().size() != results_list.size()) {
       suggestion_details = nullptr;
+    }
 
     // Legacy code: Get subtype identifiers.
-    const base::Value* subtype_identifiers_value =
-        extras->FindListKey("google:subtypeid");
-    if (subtype_identifiers_value &&
-        subtype_identifiers_value->GetList().size() == results_list.size()) {
-      subtype_identifiers = subtype_identifiers_value->GetList();
+    subtype_identifiers = extras.FindListKey("google:subtypeid");
+    // Discard this list if its size does not match that of the suggestions.
+    if (subtype_identifiers &&
+        subtype_identifiers->GetList().size() != results_list.size()) {
+      subtype_identifiers = nullptr;
     }
 
     // Store the metadata that came with the response in case we need to pass it
     // along with the prefetch query to Instant.
     JSONStringValueSerializer json_serializer(&results->metadata);
-    json_serializer.Serialize(*extras);
+    json_serializer.Serialize(extras);
   }
 
   // Processed list of match subtypes, one vector per match.
   // Note: ParseMatchSubtypes will handle the cases where the key does not
   // exist or contains malformed data.
   std::vector<std::vector<int>> subtypes =
-      ParseMatchSubtypes(suggestsubtypes, results_list.size());
+      ParseMatchSubtypes(suggest_subtypes, results_list.size());
 
   // Clear the previous results now that new results are available.
   results->suggest_results.clear();
@@ -597,11 +592,10 @@
 
     // Apply valid suggested relevance scores; discard invalid lists.
     if (relevances) {
-      const auto& val = (*relevances)[index];
-      if (!val.is_int()) {
-        relevances = absl::nullopt;
+      if (!relevances->GetList()[index].is_int()) {
+        relevances = nullptr;
       } else {
-        relevance = val.GetInt();
+        relevance = relevances->GetList()[index].GetInt();
       }
     }
 
@@ -610,28 +604,24 @@
 
     // Legacy code: if the server sends us a single subtype ID, place it beside
     // other subtypes.
-    if (subtype_identifiers) {
-      int subtype_identifier =
-          (*subtype_identifiers)[index].GetIfInt().value_or(0);
-
-      if (subtype_identifier != 0) {
-        subtypes[index].emplace_back(subtype_identifier);
-      }
+    if (subtype_identifiers && index < subtype_identifiers->GetList().size() &&
+        subtype_identifiers->GetList()[index].is_int()) {
+      subtypes[index].emplace_back(
+          subtype_identifiers->GetList()[index].GetInt());
     }
 
-    if (types && index < types->GetList().size() &&
-        types->GetList()[index].is_string()) {
+    if (suggest_types && index < suggest_types->GetList().size() &&
+        suggest_types->GetList()[index].is_string()) {
       match_type =
-          GetAutocompleteMatchType(types->GetList()[index].GetString());
+          GetAutocompleteMatchType(suggest_types->GetList()[index].GetString());
     }
 
     std::string deletion_url;
-    if (suggestion_details) {
+    if (suggestion_details && index < suggestion_details->GetList().size() &&
+        suggestion_details->GetList()[index].is_dict()) {
       const base::Value& suggestion_detail =
           suggestion_details->GetList()[index];
-      if (suggestion_detail.is_dict()) {
-        deletion_url = FindStringKeyOrEmpty(suggestion_detail, "du");
-      }
+      deletion_url = FindStringKeyOrEmpty(suggestion_detail, "du");
     }
 
     if ((match_type == AutocompleteMatchType::NAVSUGGEST) ||
@@ -641,13 +631,16 @@
                                        std::string()));
       if (url.is_valid()) {
         std::u16string title;
-        if (descriptions.has_value() && index < descriptions.value().size() &&
-            descriptions.value()[index].is_string()) {
-          title = base::UTF8ToUTF16(descriptions.value()[index].GetString());
+        // 3rd element: optional descriptions list
+        if (root_list.size() > 2u && root_list[2].is_list()) {
+          auto descriptions = root_list[2].GetList();
+          if (index < descriptions.size() && descriptions[index].is_string()) {
+            title = base::UTF8ToUTF16(descriptions[index].GetString());
+          }
         }
         results->navigation_results.push_back(NavigationResult(
             scheme_classifier, url, match_type, subtypes[index], title,
-            deletion_url, is_keyword_result, relevance, relevances.has_value(),
+            deletion_url, is_keyword_result, relevance, relevances != nullptr,
             input.text()));
       }
     } else {
@@ -677,42 +670,38 @@
       std::string additional_query_params;
       absl::optional<int> suggestion_group_id;
 
-      if (suggestion_details) {
+      if (suggestion_details &&
+          suggestion_details->GetList()[index].is_dict()) {
         const base::Value& suggestion_detail =
             suggestion_details->GetList()[index];
-        if (suggestion_detail.is_dict()) {
-          match_contents =
-              base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "t"));
-          if (match_contents.empty()) {
-            match_contents = suggestion;
-          }
-          match_contents_prefix =
-              base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "mp"));
-          annotation =
-              base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "a"));
-          image_dominant_color = FindStringKeyOrEmpty(suggestion_detail, "dc");
-          image_url = FindStringKeyOrEmpty(suggestion_detail, "i");
-          additional_query_params =
-              FindStringKeyOrEmpty(suggestion_detail, "q");
+        match_contents =
+            base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "t"));
+        if (match_contents.empty()) {
+          match_contents = suggestion;
+        }
+        match_contents_prefix =
+            base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "mp"));
+        annotation =
+            base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "a"));
+        image_dominant_color = FindStringKeyOrEmpty(suggestion_detail, "dc");
+        image_url = FindStringKeyOrEmpty(suggestion_detail, "i");
+        additional_query_params = FindStringKeyOrEmpty(suggestion_detail, "q");
 
-          // Suggestion group Id.
-          suggestion_group_id = suggestion_detail.FindIntKey("zl");
+        // Suggestion group Id.
+        suggestion_group_id = suggestion_detail.FindIntKey("zl");
 
-          // Extract the Answer, if provided.
-          const base::Value* answer_json =
-              suggestion_detail.FindDictKey("ansa");
-          const std::string* answer_type =
-              suggestion_detail.FindStringKey("ansb");
-          if (answer_json && answer_type) {
-            if (SuggestionAnswer::ParseAnswer(
-                    *answer_json, base::UTF8ToUTF16(*answer_type), &answer)) {
-              base::UmaHistogramSparse("Omnibox.AnswerParseType",
-                                       answer.type());
-              answer_parsed_successfully = true;
-            }
-            UMA_HISTOGRAM_BOOLEAN("Omnibox.AnswerParseSuccess",
-                                  answer_parsed_successfully);
+        // Extract the Answer, if provided.
+        const base::Value* answer_json = suggestion_detail.FindDictKey("ansa");
+        const std::string* answer_type =
+            suggestion_detail.FindStringKey("ansb");
+        if (answer_json && answer_type) {
+          if (SuggestionAnswer::ParseAnswer(
+                  *answer_json, base::UTF8ToUTF16(*answer_type), &answer)) {
+            base::UmaHistogramSparse("Omnibox.AnswerParseType", answer.type());
+            answer_parsed_successfully = true;
           }
+          UMA_HISTOGRAM_BOOLEAN("Omnibox.AnswerParseSuccess",
+                                answer_parsed_successfully);
         }
       }
 
@@ -724,7 +713,7 @@
           base::CollapseWhitespace(match_contents, false),
           match_contents_prefix, annotation, additional_query_params,
           deletion_url, image_dominant_color, image_url, is_keyword_result,
-          relevance, relevances.has_value(), should_prefetch, should_prerender,
+          relevance, relevances != nullptr, should_prefetch, should_prerender,
           trimmed_input));
 
       if (suggestion_group_id) {
@@ -735,6 +724,6 @@
         results->suggest_results.back().SetAnswer(answer);
     }
   }
-  results->relevances_from_server = relevances.has_value();
+  results->relevances_from_server = relevances != nullptr;
   return true;
 }
diff --git a/components/optimization_guide/core/optimization_guide_store.cc b/components/optimization_guide/core/optimization_guide_store.cc
index 080e6ba..7b99acaa 100644
--- a/components/optimization_guide/core/optimization_guide_store.cc
+++ b/components/optimization_guide/core/optimization_guide_store.cc
@@ -293,20 +293,6 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void OptimizationGuideStore::PurgeExpiredHostModelFeatures() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!IsAvailable())
-    return;
-
-  // Load all the host model features to check their expiry times.
-  database_->LoadKeysAndEntriesWithFilter(
-      base::BindRepeating(&DatabasePrefixFilter,
-                          GetHostModelFeaturesEntryKeyPrefix()),
-      base::BindOnce(&OptimizationGuideStore::OnLoadEntriesToPurgeExpired,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
 void OptimizationGuideStore::PurgeInactiveModels() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -457,14 +443,6 @@
   return fetched_update_time_;
 }
 
-base::Time OptimizationGuideStore::GetHostModelFeaturesUpdateTime() const {
-  // If the store is not available, the metadata entries have not been loaded
-  // so there are no host model features.
-  if (!IsAvailable())
-    return base::Time();
-  return host_model_features_update_time_;
-}
-
 // static
 const char OptimizationGuideStore::kStoreSchemaVersion[] = "1";
 
@@ -534,14 +512,6 @@
   return static_cast<proto::OptimizationTarget>(optimization_target_number);
 }
 
-// static
-OptimizationGuideStore::EntryKeyPrefix
-OptimizationGuideStore::GetHostModelFeaturesEntryKeyPrefix() {
-  return base::NumberToString(static_cast<int>(
-             OptimizationGuideStore::StoreEntryType::kHostModelFeatures)) +
-         kKeySectionDelimiter;
-}
-
 void OptimizationGuideStore::UpdateStatus(Status new_status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -784,24 +754,6 @@
     fetched_update_time_ = base::Time();
   }
 
-  auto host_model_features_entry = metadata_entries->find(
-      GetMetadataTypeEntryKey(MetadataType::kHostModelFeatures));
-  bool host_model_features_metadata_loaded = false;
-  host_model_features_update_time_ = base::Time();
-  if (host_model_features_entry != metadata_entries->end()) {
-    DCHECK(host_model_features_entry->second.has_update_time_secs());
-    host_model_features_update_time_ = base::Time::FromDeltaSinceWindowsEpoch(
-        base::Seconds(host_model_features_entry->second.update_time_secs()));
-    host_model_features_metadata_loaded = true;
-  }
-  // TODO(crbug/1001194): Metrics should be separated so that stores maintaining
-  // different information types only record metrics for the types of entries
-  // they store.
-  UMA_HISTOGRAM_BOOLEAN(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      host_model_features_metadata_loaded);
-
   UpdateStatus(Status::kAvailable);
   MaybeLoadEntryKeys(std::move(callback));
 }
@@ -1193,167 +1145,4 @@
   std::move(callback).Run(nullptr);
 }
 
-std::unique_ptr<StoreUpdateData>
-OptimizationGuideStore::CreateUpdateDataForHostModelFeatures(
-    base::Time host_model_features_update_time,
-    base::Time expiry_time) const {
-  // Create and returns a StoreUpdateData object. This object has host model
-  // features from the GetModelsResponse moved into and organizes them in a
-  // format usable by the store. The object will be stored with
-  // UpdateHostModelFeatures().
-  return StoreUpdateData::CreateHostModelFeaturesStoreUpdateData(
-      host_model_features_update_time, expiry_time);
-}
-
-void OptimizationGuideStore::UpdateHostModelFeatures(
-    std::unique_ptr<StoreUpdateData> host_model_features_update_data,
-    base::OnceClosure callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(host_model_features_update_data->update_time());
-
-  if (!IsAvailable()) {
-    std::move(callback).Run();
-    return;
-  }
-
-  host_model_features_update_time_ =
-      *host_model_features_update_data->update_time();
-
-  entry_keys_.reset();
-
-  // This will remove the host model features metadata entry and insert all the
-  // entries currently in |host_model_features_update_data|.
-  database_->UpdateEntriesWithRemoveFilter(
-      host_model_features_update_data->TakeUpdateEntries(),
-      base::BindRepeating(
-          &DatabasePrefixFilter,
-          GetMetadataTypeEntryKey(MetadataType::kHostModelFeatures)),
-      base::BindOnce(&OptimizationGuideStore::OnUpdateStore,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-bool OptimizationGuideStore::FindHostModelFeaturesEntryKey(
-    const std::string& host,
-    OptimizationGuideStore::EntryKey* out_host_model_features_entry_key) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!entry_keys_)
-    return false;
-
-  return FindEntryKeyForHostWithPrefix(host, out_host_model_features_entry_key,
-                                       GetHostModelFeaturesEntryKeyPrefix());
-}
-
-void OptimizationGuideStore::LoadAllHostModelFeatures(
-    AllHostModelFeaturesLoadedCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!IsAvailable()) {
-    std::move(callback).Run({});
-    return;
-  }
-
-  // Load all the host model features within the store.
-  database_->LoadEntriesWithFilter(
-      base::BindRepeating(&DatabasePrefixFilter,
-                          GetHostModelFeaturesEntryKeyPrefix()),
-      base::BindOnce(&OptimizationGuideStore::OnLoadAllHostModelFeatures,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void OptimizationGuideStore::LoadHostModelFeatures(
-    const EntryKey& host_model_features_entry_key,
-    HostModelFeaturesLoadedCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!IsAvailable()) {
-    std::move(callback).Run({});
-    return;
-  }
-
-  // Load all the host model features within the store.
-  database_->GetEntry(
-      host_model_features_entry_key,
-      base::BindOnce(&OptimizationGuideStore::OnLoadHostModelFeatures,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void OptimizationGuideStore::OnLoadHostModelFeatures(
-    HostModelFeaturesLoadedCallback callback,
-    bool success,
-    std::unique_ptr<proto::StoreEntry> entry) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // If either the request failed or the store was set to unavailable after the
-  // request was started, then the loaded host model features should not
-  // be considered valid. Reset the entry so that nothing is returned to the
-  // requester.
-  if (!success || !IsAvailable()) {
-    entry.reset();
-  }
-  if (!entry || !entry->has_host_model_features()) {
-    std::move(callback).Run(nullptr);
-    return;
-  }
-
-  std::unique_ptr<proto::HostModelFeatures> loaded_host_model_features(
-      entry->release_host_model_features());
-  std::move(callback).Run(std::move(loaded_host_model_features));
-}
-
-void OptimizationGuideStore::OnLoadAllHostModelFeatures(
-    AllHostModelFeaturesLoadedCallback callback,
-    bool success,
-    std::unique_ptr<std::vector<proto::StoreEntry>> entries) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // If either the request failed or the store was set to unavailable after the
-  // request was started, then the loaded host model features should not
-  // be considered valid. Reset the entry so that nothing is returned to the
-  // requester.
-  if (!success || !IsAvailable()) {
-    entries.reset();
-  }
-
-  if (!entries || entries->size() == 0) {
-    std::unique_ptr<std::vector<proto::HostModelFeatures>>
-        loaded_host_model_features(nullptr);
-    std::move(callback).Run(std::move(loaded_host_model_features));
-    return;
-  }
-
-  std::unique_ptr<std::vector<proto::HostModelFeatures>>
-      loaded_host_model_features =
-          std::make_unique<std::vector<proto::HostModelFeatures>>();
-  for (auto& entry : *entries.get()) {
-    if (!entry.has_host_model_features())
-      continue;
-    loaded_host_model_features->emplace_back(entry.host_model_features());
-  }
-  std::move(callback).Run(std::move(loaded_host_model_features));
-}
-
-void OptimizationGuideStore::ClearHostModelFeaturesFromDatabase() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  base::UmaHistogramBoolean(
-      "OptimizationGuide.ClearHostModelFeatures.StoreAvailable", IsAvailable());
-  if (!IsAvailable())
-    return;
-
-  auto entries_to_save = std::make_unique<EntryVector>();
-
-  entry_keys_.reset();
-
-  // Removes all |kHostModelFeatures| store entries. OnUpdateStore will handle
-  // updating status and re-filling entry_keys with the entries still in the
-  // store.
-  database_->UpdateEntriesWithRemoveFilter(
-      std::move(entries_to_save),  // this should be empty.
-      base::BindRepeating(&DatabasePrefixFilter,
-                          GetHostModelFeaturesEntryKeyPrefix()),
-      base::BindOnce(&OptimizationGuideStore::OnUpdateStore,
-                     weak_ptr_factory_.GetWeakPtr(), base::DoNothing()));
-}
-
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/optimization_guide_store.h b/components/optimization_guide/core/optimization_guide_store.h
index 2ef0707..38b70f168 100644
--- a/components/optimization_guide/core/optimization_guide_store.h
+++ b/components/optimization_guide/core/optimization_guide_store.h
@@ -40,10 +40,6 @@
       base::OnceCallback<void(const std::string&, std::unique_ptr<MemoryHint>)>;
   using PredictionModelLoadedCallback =
       base::OnceCallback<void(std::unique_ptr<proto::PredictionModel>)>;
-  using HostModelFeaturesLoadedCallback =
-      base::OnceCallback<void(std::unique_ptr<proto::HostModelFeatures>)>;
-  using AllHostModelFeaturesLoadedCallback = base::OnceCallback<void(
-      std::unique_ptr<std::vector<proto::HostModelFeatures>>)>;
   using EntryKey = std::string;
   using StoreEntryProtoDatabase =
       leveldb_proto::ProtoDatabase<proto::StoreEntry>;
@@ -80,16 +76,14 @@
   // cannot be changed, but new types can be added to the end.
   // StoreEntryType should remain synchronized with the
   // HintCacheStoreEntryType in enums.xml.
-  // Also ensure to add to the OptimizationGuide.StoreEntryTypes histogram
-  // suffixes if adding a new one.
   enum class StoreEntryType {
     kEmpty = 0,
     kMetadata = 1,
     kComponentHint = 2,
     kFetchedHint = 3,
     kPredictionModel = 4,
-    kHostModelFeatures = 5,
-    kMaxValue = kHostModelFeatures,
+    kDeprecatedHostModelFeatures = 5,  // deprecated.
+    kMaxValue = kDeprecatedHostModelFeatures,
   };
 
   OptimizationGuideStore(
@@ -172,11 +166,6 @@
   // removed.
   void PurgeExpiredFetchedHints();
 
-  // Removes all host model features that have expired from the store.
-  // |entry_keys_| is updated after the expired host model features are
-  // removed.
-  void PurgeExpiredHostModelFeatures();
-
   // Removes all models that have not been loaded in the max inactive duration
   // configured. |entry_keys| is updated after the inactive models are removed.
   // Respects models' |keep_beyond_valid_duration| setting.
@@ -219,60 +208,11 @@
   // false otherwise.
   bool RemovePredictionModelFromEntryKey(const EntryKey& entry_key);
 
-  // Creates and returns a StoreUpdateData object for host model features. This
-  // object is used to collect a batch of host model features in a format that
-  // is usable to update the store on a background thread. This is always
-  // created when host model features have been successfully fetched from the
-  // remote Optimization Guide Service so the store can update old host model
-  // features.
-  std::unique_ptr<StoreUpdateData> CreateUpdateDataForHostModelFeatures(
-      base::Time host_model_features_update_time,
-      base::Time expiry_time) const;
-
-  // Updates the host model features contained in the store. The callback is run
-  // asynchronously after the database stores the host model features.
-  // Virtualized for testing.
-  virtual void UpdateHostModelFeatures(
-      std::unique_ptr<StoreUpdateData> host_model_features_update_data,
-      base::OnceClosure callback);
-
-  // Finds the entry key for the host model features for |host| if it is known
-  // to the store. Returns true if an entry key is found and
-  // |out_host_model_features_entry_key| is populated with the matching key.
-  bool FindHostModelFeaturesEntryKey(
-      const std::string& host,
-      OptimizationGuideStore::EntryKey* out_host_model_features_entry_key)
-      const;
-
-  // Loads the host model features specified by |host_model_features_entry_key|.
-  // After the load finishes, the host model features data is passed to
-  // |callback|. In the case where the host model features cannot be loaded, the
-  // callback is run with a nullptr. Depending on the load result, the callback
-  // may be synchronous or asynchronous.
-  void LoadHostModelFeatures(const EntryKey& host_model_features_entry_key,
-                             HostModelFeaturesLoadedCallback callback);
-
-  // Loads all the host model features known to the store. After the load
-  // finishes, the host model features data is passed back to |callback|. In the
-  // case where the host model features cannot be loaded, the callback is run
-  // with a nullptr. Depending on the load result, the callback may be
-  // synchronous or asynchronous.
-  // Virtualized for testing.
-  virtual void LoadAllHostModelFeatures(
-      AllHostModelFeaturesLoadedCallback callback);
-
-  // Returns the time that the host model features in the store can be updated.
-  // If |this| is not available, base::Time() is returned.
-  base::Time GetHostModelFeaturesUpdateTime() const;
-
   // Removes fetched hints whose keys are in |hint_keys| and runs |on_success|
   // if successful, otherwise the callback is not run.
   void RemoveFetchedHintsByKey(base::OnceClosure on_success,
                                const base::flat_set<std::string>& hint_keys);
 
-  // Clears all host model features from the database and resets the entry keys.
-  void ClearHostModelFeaturesFromDatabase();
-
   // Returns true if the current status is Status::kAvailable.
   bool IsAvailable() const;
 
@@ -305,7 +245,7 @@
     kSchema = 1,
     kComponent = 2,
     kFetched = 3,
-    kHostModelFeatures = 4,
+    kDeprecatedHostModelFeatures = 4,  // deprecated.
   };
 
   // Current schema version of the hint cache store. When this is changed,
@@ -332,9 +272,6 @@
   // Returns prefix of the key of every prediction model entry: "4_".
   static EntryKeyPrefix GetPredictionModelEntryKeyPrefix();
 
-  // Returns prefix of the key of every host model features entry: "5_".
-  static EntryKeyPrefix GetHostModelFeaturesEntryKeyPrefix();
-
   // Returns the OptimizationTarget from |prediction_model_entry_key|.
   static proto::OptimizationTarget
   GetOptimizationTargetFromPredictionModelEntryKey(
@@ -467,29 +404,6 @@
       PredictionModelLoadedCallback callback,
       bool success);
 
-  // Callback that runs after a host model features entry is loaded from the
-  // database. If there's currently an in-flight update, then the data could be
-  // invalidated, so loaded host model features data is discarded. Otherwise,
-  // the host model features are released into the callback, allowing the caller
-  // to own the host model features without copying it. Regardless of the
-  // success or failure of retrieving the key, the callback always runs (it
-  // simply runs with a nullptr on failure).
-  void OnLoadHostModelFeatures(HostModelFeaturesLoadedCallback callback,
-                               bool success,
-                               std::unique_ptr<proto::StoreEntry> entry);
-
-  // Callback that runs after all the host model features entries are loaded
-  // from the database. If there's currently an in-flight update, then the data
-  // could be invalidated, so loaded host model features data is discarded.
-  // Otherwise, the host model features are released into the callback, allowing
-  // the caller to own the host model features without copying it. Regardless of
-  // the success or failure of retrieving the key, the callback always runs (it
-  // simply runs with a nullptr on failure).
-  void OnLoadAllHostModelFeatures(
-      AllHostModelFeaturesLoadedCallback callback,
-      bool success,
-      std::unique_ptr<std::vector<proto::StoreEntry>> entry);
-
   // Proto database used by the store.
   std::unique_ptr<StoreEntryProtoDatabase> database_;
 
diff --git a/components/optimization_guide/core/optimization_guide_store_unittest.cc b/components/optimization_guide/core/optimization_guide_store_unittest.cc
index 40326eb..6baa370e 100644
--- a/components/optimization_guide/core/optimization_guide_store_unittest.cc
+++ b/components/optimization_guide/core/optimization_guide_store_unittest.cc
@@ -88,8 +88,6 @@
       MetadataSchemaState state,
       absl::optional<size_t> component_hint_count = absl::optional<size_t>(),
       absl::optional<base::Time> fetched_hints_update =
-          absl::optional<base::Time>(),
-      absl::optional<base::Time> host_model_features_update =
           absl::optional<base::Time>()) {
     db_store_.clear();
 
@@ -136,13 +134,6 @@
           .set_update_time_secs(
               fetched_hints_update->ToDeltaSinceWindowsEpoch().InSeconds());
     }
-    if (host_model_features_update) {
-      db_store_[OptimizationGuideStore::GetMetadataTypeEntryKey(
-                    OptimizationGuideStore::MetadataType::kHostModelFeatures)]
-          .set_update_time_secs(
-              host_model_features_update->ToDeltaSinceWindowsEpoch()
-                  .InSeconds());
-    }
   }
 
   // Moves the specified number of component hints into the update data.
@@ -198,21 +189,6 @@
     update_data->CopyPredictionModelIntoUpdateData(*prediction_model);
   }
 
-  // Moves |host_model_features_count| into |update_data|.
-  void SeedHostModelFeaturesUpdateData(StoreUpdateData* update_data,
-                                       size_t host_model_features_count) {
-    for (size_t i = 0; i < host_model_features_count; i++) {
-      std::string host = GetHost(i);
-      proto::HostModelFeatures host_model_features;
-      proto::ModelFeature* model_feature =
-          host_model_features.add_model_features();
-      model_feature->set_feature_name("host_feat1");
-      model_feature->set_double_value(2.0);
-      host_model_features.set_host(host);
-      update_data->CopyHostModelFeaturesIntoUpdateData(host_model_features);
-    }
-  }
-
   void CreateDatabase() {
     // Reset everything.
     db_ = nullptr;
@@ -309,35 +285,12 @@
     }
   }
 
-  void UpdateHostModelFeatures(
-      std::unique_ptr<StoreUpdateData> host_model_features_data,
-      bool update_success = true,
-      bool load_host_model_features_entry_keys_success = true) {
-    EXPECT_CALL(*this, OnUpdateStore());
-    guide_store()->UpdateHostModelFeatures(
-        std::move(host_model_features_data),
-        base::BindOnce(&OptimizationGuideStoreTest::OnUpdateStore,
-                       base::Unretained(this)));
-    // OnUpdateStore callback
-    db()->UpdateCallback(update_success);
-    if (update_success) {
-      // OnLoadEntryKeys callback
-      db()->LoadCallback(load_host_model_features_entry_keys_success);
-    }
-  }
-
   void ClearFetchedHintsFromDatabase() {
     guide_store()->ClearFetchedHintsFromDatabase();
     db()->UpdateCallback(true);
     db()->LoadCallback(true);
   }
 
-  void ClearHostModelFeaturesFromDatabase() {
-    guide_store()->ClearHostModelFeaturesFromDatabase();
-    db()->UpdateCallback(true);
-    db()->LoadCallback(true);
-  }
-
   void PurgeExpiredFetchedHints() {
     guide_store()->PurgeExpiredFetchedHints();
 
@@ -349,17 +302,6 @@
     db()->LoadCallback(true);
   }
 
-  void PurgeExpiredHostModelFeatures() {
-    guide_store()->PurgeExpiredHostModelFeatures();
-
-    // OnLoadExpiredEntriesToPurge
-    db()->LoadCallback(true);
-    // OnUpdateStore
-    db()->UpdateCallback(true);
-    // OnLoadEntryKeys callback
-    db()->LoadCallback(true);
-  }
-
   void PurgeInactiveModels() {
     guide_store()->PurgeInactiveModels();
 
@@ -393,23 +335,6 @@
     }
   }
 
-  // Verifies that the host model features metadata has the expected next update
-  // time.
-  void ExpectHostModelFeaturesMetadata(base::Time update_time) const {
-    const auto& metadata_entry =
-        db_store_.find(OptimizationGuideStore::GetMetadataTypeEntryKey(
-            OptimizationGuideStore::MetadataType::kHostModelFeatures));
-    if (metadata_entry != db_store_.end()) {
-      // The next update time should have same time up to the second as the
-      // metadata entry is stored in seconds.
-      EXPECT_TRUE(base::Time::FromDeltaSinceWindowsEpoch(base::Seconds(
-                      metadata_entry->second.update_time_secs())) -
-                      update_time <
-                  base::Seconds(1));
-    } else {
-      FAIL() << "No host model features metadata found";
-    }
-  }
   // Verifies that the component metadata has the expected version and all
   // expected component hints are present.
   void ExpectComponentHintsPresent(const std::string& version,
@@ -463,14 +388,6 @@
 
   MemoryHint* last_loaded_hint() { return last_loaded_hint_.get(); }
 
-  proto::HostModelFeatures* last_loaded_host_model_features() {
-    return last_loaded_host_model_features_.get();
-  }
-
-  std::vector<proto::HostModelFeatures>* last_loaded_all_host_model_features() {
-    return last_loaded_all_host_model_features_.get();
-  }
-
   proto::PredictionModel* last_loaded_prediction_model() {
     return last_loaded_prediction_model_.get();
   }
@@ -481,18 +398,6 @@
     last_loaded_hint_ = std::move(loaded_hint);
   }
 
-  void OnHostModelFeaturesLoaded(
-      std::unique_ptr<proto::HostModelFeatures> loaded_host_model_features) {
-    last_loaded_host_model_features_ = std::move(loaded_host_model_features);
-  }
-
-  void OnAllHostModelFeaturesLoaded(
-      std::unique_ptr<std::vector<proto::HostModelFeatures>>
-          loaded_all_host_model_features) {
-    last_loaded_all_host_model_features_ =
-        std::move(loaded_all_host_model_features);
-  }
-
   void OnPredictionModelLoaded(
       std::unique_ptr<proto::PredictionModel> loaded_prediction_model) {
     last_loaded_prediction_model_ = std::move(loaded_prediction_model);
@@ -512,9 +417,6 @@
 
   OptimizationGuideStore::EntryKey last_loaded_entry_key_;
   std::unique_ptr<MemoryHint> last_loaded_hint_;
-  std::unique_ptr<proto::HostModelFeatures> last_loaded_host_model_features_;
-  std::unique_ptr<std::vector<proto::HostModelFeatures>>
-      last_loaded_all_host_model_features_;
   std::unique_ptr<proto::PredictionModel> last_loaded_prediction_model_;
 };
 
@@ -742,10 +644,6 @@
   histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.LoadMetadataResult",
       0 /* kSuccess */, 1);
-  histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      false, 1);
 
   histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
@@ -844,11 +742,6 @@
       6 /* kComponentAndFetchedMetadataMissing*/, 1);
 
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      false, 1);
-
-  histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
       1);
   histogram_tester.ExpectBucketCount(
@@ -906,9 +799,6 @@
 
   EXPECT_TRUE(IsMetadataSchemaEntryKeyPresent());
 
-  histogram_tester.ExpectTotalCount(
-      "OptimizationGuide.HintCacheLevelDBStore.LoadMetadataResult", 0);
-
   histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
       1);
@@ -928,15 +818,14 @@
   MetadataSchemaState schema_state = MetadataSchemaState::kValid;
   size_t component_hint_count = 10;
   SeedInitialData(schema_state, component_hint_count,
-                  base::Time().Now(), /* fetch_update_time */
-                  base::Time().Now() /* host_model_features_update_time */);
+                  base::Time().Now() /* fetch_update_time */);
   CreateDatabase();
   InitializeStore(schema_state);
 
   // The store should contain the schema metadata entry, the component metadata
   // entry, and all of the initial component hints.
   EXPECT_EQ(GetDBStoreEntryCount(),
-            static_cast<size_t>(component_hint_count + 4));
+            static_cast<size_t>(component_hint_count + 3));
   EXPECT_EQ(GetStoreEntryKeyCount(), component_hint_count);
 
   EXPECT_TRUE(IsMetadataSchemaEntryKeyPresent());
@@ -947,11 +836,6 @@
       0 /* kSuccess */, 1);
 
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      true, 1);
-
-  histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
       1);
   histogram_tester.ExpectBucketCount(
@@ -993,11 +877,6 @@
       6 /* kComponentAndFetchedMetadataMissing*/, 0);
 
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      false, 1);
-
-  histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
       1);
   histogram_tester.ExpectBucketCount(
@@ -1032,11 +911,6 @@
       4 /* kComponentMetadataMissing*/, 1);
 
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PredictionModelStore."
-      "HostModelFeaturesLoadMetadataResult",
-      false, 1);
-
-  histogram_tester.ExpectBucketCount(
       "OptimizationGuide.HintCacheLevelDBStore.Status", 0 /* kUninitialized */,
       1);
   histogram_tester.ExpectBucketCount(
@@ -2510,202 +2384,6 @@
   EXPECT_FALSE(base::PathExists(file_path));
 }
 
-TEST_F(OptimizationGuideStoreTest, HostModelFeaturesMetadataStored) {
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 10, update_time,
-                  base::Time().Now() /* host_model_features_update_time */);
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  ExpectHostModelFeaturesMetadata(update_time);
-}
-
-TEST_F(OptimizationGuideStoreTest, FindEntryKeyForHostModelFeatures) {
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  size_t update_host_model_features_count = 5;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 0,
-                  base::Time().Now() /* host_model_features_update_time */);
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  std::unique_ptr<StoreUpdateData> update_data =
-      guide_store()->CreateUpdateDataForHostModelFeatures(
-          update_time, update_time +
-                           optimization_guide::features::
-                               StoredHostModelFeaturesFreshnessDuration());
-  ASSERT_TRUE(update_data);
-  SeedHostModelFeaturesUpdateData(update_data.get(),
-                                  update_host_model_features_count);
-  UpdateHostModelFeatures(std::move(update_data));
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    bool success =
-        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key);
-    EXPECT_EQ(success, i < update_host_model_features_count);
-  }
-}
-
-TEST_F(OptimizationGuideStoreTest, LoadHostModelFeaturesForHost) {
-  base::HistogramTester histogram_tester;
-  size_t update_host_model_features_count = 5;
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 0, base::Time().Now());
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  std::unique_ptr<StoreUpdateData> update_data =
-      guide_store()->CreateUpdateDataForHostModelFeatures(
-          update_time, update_time +
-                           optimization_guide::features::
-                               StoredHostModelFeaturesFreshnessDuration());
-  ASSERT_TRUE(update_data);
-  SeedHostModelFeaturesUpdateData(update_data.get(),
-                                  update_host_model_features_count);
-  UpdateHostModelFeatures(std::move(update_data));
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    bool success =
-        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key);
-    EXPECT_TRUE(success);
-
-    guide_store()->LoadHostModelFeatures(
-        entry_key,
-        base::BindOnce(&OptimizationGuideStoreTest::OnHostModelFeaturesLoaded,
-                       base::Unretained(this)));
-
-    // OnPredictionModelLoaded callback
-    db()->GetCallback(true);
-
-    if (!last_loaded_host_model_features()) {
-      FAIL() << "Loaded host model features was null for entry key: "
-             << entry_key;
-    }
-
-    EXPECT_EQ(last_loaded_host_model_features()->host(), host);
-  }
-}
-
-TEST_F(OptimizationGuideStoreTest, LoadAllHostModelFeatures) {
-  base::HistogramTester histogram_tester;
-  size_t update_host_model_features_count = 5;
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 0, base::Time().Now());
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  std::unique_ptr<StoreUpdateData> update_data =
-      guide_store()->CreateUpdateDataForHostModelFeatures(
-          update_time, update_time +
-                           optimization_guide::features::
-                               StoredHostModelFeaturesFreshnessDuration());
-  ASSERT_TRUE(update_data);
-  SeedHostModelFeaturesUpdateData(update_data.get(),
-                                  update_host_model_features_count);
-  UpdateHostModelFeatures(std::move(update_data));
-  guide_store()->LoadAllHostModelFeatures(
-      base::BindOnce(&OptimizationGuideStoreTest::OnAllHostModelFeaturesLoaded,
-                     base::Unretained(this)));
-
-  // OnAllHostModelFeaturesLoaded callback
-  db()->LoadCallback(true);
-
-  std::vector<proto::HostModelFeatures>* all_host_model_features =
-      last_loaded_all_host_model_features();
-  EXPECT_TRUE(all_host_model_features);
-  EXPECT_EQ(update_host_model_features_count, all_host_model_features->size());
-
-  // Build a list of the hosts that are stored in the store.
-  base::flat_set<std::string> hosts = {};
-  for (size_t i = 0; i < update_host_model_features_count; i++)
-    hosts.insert(GetHost(i));
-
-  // Make sure all of the hosts of the host model features are returned.
-  for (const auto& host_model_features : *all_host_model_features)
-    EXPECT_NE(hosts.find(host_model_features.host()), hosts.end());
-}
-
-TEST_F(OptimizationGuideStoreTest, ClearHostModelFeatures) {
-  base::HistogramTester histogram_tester;
-  size_t update_host_model_features_count = 5;
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 0, base::Time().Now());
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  std::unique_ptr<StoreUpdateData> update_data =
-      guide_store()->CreateUpdateDataForHostModelFeatures(
-          update_time, update_time +
-                           optimization_guide::features::
-                               StoredHostModelFeaturesFreshnessDuration());
-  ASSERT_TRUE(update_data);
-  SeedHostModelFeaturesUpdateData(update_data.get(),
-                                  update_host_model_features_count);
-  UpdateHostModelFeatures(std::move(update_data));
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_TRUE(guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
-  }
-
-  // Remove the host model features from the OptimizationGuideStore.
-  ClearHostModelFeaturesFromDatabase();
-  histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.ClearHostModelFeatures.StoreAvailable", true, 1);
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_FALSE(
-        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
-  }
-}
-
-TEST_F(OptimizationGuideStoreTest, PurgeExpiredHostModelFeatures) {
-  base::HistogramTester histogram_tester;
-  size_t update_host_model_features_count = 5;
-  MetadataSchemaState schema_state = MetadataSchemaState::kValid;
-  base::Time update_time = base::Time().Now();
-  SeedInitialData(schema_state, 0, base::Time().Now());
-  CreateDatabase();
-  InitializeStore(schema_state);
-
-  std::unique_ptr<StoreUpdateData> update_data =
-      guide_store()->CreateUpdateDataForHostModelFeatures(
-          update_time, update_time -
-                           optimization_guide::features::
-                               StoredHostModelFeaturesFreshnessDuration());
-  ASSERT_TRUE(update_data);
-  SeedHostModelFeaturesUpdateData(update_data.get(),
-                                  update_host_model_features_count);
-  UpdateHostModelFeatures(std::move(update_data));
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_TRUE(guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
-  }
-
-  // Remove expired host model features from the opt. guide store.
-  PurgeExpiredHostModelFeatures();
-
-  for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host = GetHost(i);
-    OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_FALSE(
-        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
-  }
-}
-
 TEST_F(OptimizationGuideStoreTest, PurgeInactiveModels) {
   base::HistogramTester histogram_tester;
 
diff --git a/components/optimization_guide/core/store_update_data.cc b/components/optimization_guide/core/store_update_data.cc
index 74dcc732..d5c636ef 100644
--- a/components/optimization_guide/core/store_update_data.cc
+++ b/components/optimization_guide/core/store_update_data.cc
@@ -38,40 +38,6 @@
   return base::WrapUnique<StoreUpdateData>(new StoreUpdateData(expiry_time));
 }
 
-// static
-std::unique_ptr<StoreUpdateData>
-StoreUpdateData::CreateHostModelFeaturesStoreUpdateData(
-    base::Time host_model_features_update_time,
-    base::Time expiry_time) {
-  std::unique_ptr<StoreUpdateData> host_model_features_update_data(
-      new StoreUpdateData(host_model_features_update_time, expiry_time));
-  return host_model_features_update_data;
-}
-
-StoreUpdateData::StoreUpdateData(base::Time host_model_features_update_time,
-                                 base::Time expiry_time)
-    : update_time_(host_model_features_update_time),
-      expiry_time_(expiry_time),
-      entries_to_save_(std::make_unique<EntryVector>()) {
-  entry_key_prefix_ =
-      OptimizationGuideStore::GetHostModelFeaturesEntryKeyPrefix();
-  proto::StoreEntry metadata_host_model_features_entry;
-  metadata_host_model_features_entry.set_entry_type(
-      static_cast<proto::StoreEntryType>(
-          OptimizationGuideStore::StoreEntryType::kMetadata));
-  metadata_host_model_features_entry.set_update_time_secs(
-      host_model_features_update_time.ToDeltaSinceWindowsEpoch().InSeconds());
-  entries_to_save_->emplace_back(
-      OptimizationGuideStore::GetMetadataTypeEntryKey(
-          OptimizationGuideStore::MetadataType::kHostModelFeatures),
-      std::move(metadata_host_model_features_entry));
-
-  // |this| may be modified on another thread after construction but all
-  // future modifications, from that call forward, must be made on the same
-  // thread.
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
 StoreUpdateData::StoreUpdateData(base::Time expiry_time)
     : expiry_time_(expiry_time),
       entries_to_save_(std::make_unique<EntryVector>()) {
@@ -161,28 +127,6 @@
                                  std::move(entry_proto));
 }
 
-void StoreUpdateData::CopyHostModelFeaturesIntoUpdateData(
-    const proto::HostModelFeatures& host_model_features) {
-  // All future modifications must be made by the same thread. Note, |this| may
-  // have been constructed on another thread.
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!entry_key_prefix_.empty());
-  DCHECK(expiry_time_);
-
-  // To avoid any unnecessary copying, the host model feature data is moved into
-  // proto::StoreEntry.
-  OptimizationGuideStore::EntryKey host_model_features_entry_key =
-      entry_key_prefix_ + host_model_features.host();
-  proto::StoreEntry entry_proto;
-  entry_proto.set_entry_type(static_cast<proto::StoreEntryType>(
-      OptimizationGuideStore::StoreEntryType::kHostModelFeatures));
-  entry_proto.set_expiry_time_secs(
-      expiry_time_->ToDeltaSinceWindowsEpoch().InSeconds());
-  entry_proto.mutable_host_model_features()->CopyFrom(host_model_features);
-  entries_to_save_->emplace_back(std::move(host_model_features_entry_key),
-                                 std::move(entry_proto));
-}
-
 void StoreUpdateData::CopyPredictionModelIntoUpdateData(
     const proto::PredictionModel& prediction_model) {
   // All future modifications must be made by the same thread. Note, |this| may
diff --git a/components/optimization_guide/core/store_update_data.h b/components/optimization_guide/core/store_update_data.h
index 68a098a..05dbc9a8 100644
--- a/components/optimization_guide/core/store_update_data.h
+++ b/components/optimization_guide/core/store_update_data.h
@@ -16,7 +16,6 @@
 namespace optimization_guide {
 namespace proto {
 class Hint;
-class HostModelFeatures;
 class PredictionModel;
 class StoreEntry;
 }  // namespace proto
@@ -24,8 +23,7 @@
 using EntryVector =
     leveldb_proto::ProtoDatabase<proto::StoreEntry>::KeyEntryVector;
 
-// Holds hint, prediction model, or host model features data for updating the
-// OptimizationGuideStore.
+// Holds hint or prediction model data for updating the OptimizationGuideStore.
 class StoreUpdateData {
  public:
   StoreUpdateData(const StoreUpdateData&) = delete;
@@ -45,12 +43,6 @@
   static std::unique_ptr<StoreUpdateData> CreatePredictionModelStoreUpdateData(
       base::Time expiry_time);
 
-  // Creates an update data object for a host model features update.
-  static std::unique_ptr<StoreUpdateData>
-  CreateHostModelFeaturesStoreUpdateData(
-      base::Time host_model_features_update_time,
-      base::Time expiry_time);
-
   // Returns the component version of a component hint update.
   const absl::optional<base::Version> component_version() const {
     return component_version_;
@@ -66,10 +58,6 @@
   // called, |hint| is no longer valid.
   void MoveHintIntoUpdateData(proto::Hint&& hint);
 
-  // Copies |host_model_features| into this update data.
-  void CopyHostModelFeaturesIntoUpdateData(
-      const proto::HostModelFeatures& host_model_features);
-
   // Copies |prediction_model| into this update data.
   void CopyPredictionModelIntoUpdateData(
       const proto::PredictionModel& prediction_model);
@@ -81,8 +69,6 @@
   StoreUpdateData(absl::optional<base::Version> component_version,
                   absl::optional<base::Time> fetch_update_time,
                   absl::optional<base::Time> expiry_time);
-  StoreUpdateData(base::Time host_model_features_update_time,
-                  base::Time expiry_time);
   explicit StoreUpdateData(base::Time expiry_time);
 
   // The component version of the update data for a component update.
diff --git a/components/optimization_guide/core/store_update_data_unittest.cc b/components/optimization_guide/core/store_update_data_unittest.cc
index 9a38940..e36087ea 100644
--- a/components/optimization_guide/core/store_update_data_unittest.cc
+++ b/components/optimization_guide/core/store_update_data_unittest.cc
@@ -153,33 +153,6 @@
   EXPECT_TRUE(found_prediction_model_entry);
 }
 
-TEST(StoreUpdateDataTest, BuildHostModelFeaturesUpdateData) {
-  // Verify creating a Prediction Model update data.
-  base::Time host_model_features_update_time = base::Time::Now();
-
-  proto::HostModelFeatures host_model_features;
-  host_model_features.set_host("foo.com");
-  proto::ModelFeature* model_feature = host_model_features.add_model_features();
-  model_feature->set_feature_name("host_feat1");
-  model_feature->set_double_value(2.0);
-
-  std::unique_ptr<StoreUpdateData> host_model_features_update =
-      StoreUpdateData::CreateHostModelFeaturesStoreUpdateData(
-          host_model_features_update_time,
-          host_model_features_update_time +
-              optimization_guide::features::
-                  StoredHostModelFeaturesFreshnessDuration());
-  host_model_features_update->CopyHostModelFeaturesIntoUpdateData(
-      std::move(host_model_features));
-  EXPECT_FALSE(host_model_features_update->component_version().has_value());
-  EXPECT_TRUE(host_model_features_update->update_time().has_value());
-  EXPECT_EQ(host_model_features_update_time,
-            *host_model_features_update->update_time());
-  // Verify there are 2 store entries, 1 for the metadata entry and 1 for the
-  // added host model features entry.
-  EXPECT_EQ(2ul, host_model_features_update->TakeUpdateEntries()->size());
-}
-
 }  // namespace
 
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/features.gni b/components/optimization_guide/features.gni
index 2501dd9..b7407c5 100644
--- a/components/optimization_guide/features.gni
+++ b/components/optimization_guide/features.gni
@@ -13,7 +13,17 @@
   # You can set the variable 'build_with_internal_optimization_guide' to true
   # even in a developer build in args.gn.  Setting this variable explicitly to true will
   # cause your build to fail if the internal files are missing.
-  # TODO(crbug/1290461): Re-enable Mac.
+  #
+  # If changing the value of this, you MUST also update the following files depending on the
+  # platform:
+  # Linux: Internal archive files. //chrome/installer/linux/common/installer.include handles the
+  # relevant files not being present.
+  # Mac: //chrome/installer/mac/signing/parts.py
+  # Windows: //chrome/installer/mini_installer/chrome.release and internal archive files
+  #
+  # The library this pulls in depends on open-source LevelDB which is not supported for Fuchsia.
+  # Android and iOS should just work but are not included in the set we release for, so we do
+  # not needlessly increase the binary.
   build_with_internal_optimization_guide =
-      is_chrome_branded && !is_android && !is_ios && !is_fuchsia && !is_mac
+      is_chrome_branded && !is_android && !is_ios && !is_fuchsia
 }
diff --git a/components/policy/core/browser/BUILD.gn b/components/policy/core/browser/BUILD.gn
index db298f4..81441de 100644
--- a/components/policy/core/browser/BUILD.gn
+++ b/components/policy/core/browser/BUILD.gn
@@ -42,6 +42,8 @@
     "url_blocklist_manager.h",
     "url_blocklist_policy_handler.cc",
     "url_blocklist_policy_handler.h",
+    "url_scheme_list_policy_handler.cc",
+    "url_scheme_list_policy_handler.h",
     "webui/json_generation.cc",
     "webui/json_generation.h",
     "webui/machine_level_user_cloud_policy_status_provider.cc",
@@ -140,6 +142,7 @@
     "url_allowlist_policy_handler_unittest.cc",
     "url_blocklist_manager_unittest.cc",
     "url_blocklist_policy_handler_unittest.cc",
+    "url_scheme_list_policy_handler_unittest.cc",
   ]
   deps = [
     ":browser",
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler.cc b/components/policy/core/browser/url_scheme_list_policy_handler.cc
new file mode 100644
index 0000000..9f170a9
--- /dev/null
+++ b/components/policy/core/browser/url_scheme_list_policy_handler.cc
@@ -0,0 +1,93 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/policy/core/browser/url_scheme_list_policy_handler.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/logging.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "base/values.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_pref_names.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"
+
+namespace policy {
+
+URLSchemeListPolicyHandler::URLSchemeListPolicyHandler(const char* policy_name,
+                                                       const char* pref_path)
+    : TypeCheckingPolicyHandler(policy_name, base::Value::Type::LIST),
+      pref_path_(pref_path) {}
+
+URLSchemeListPolicyHandler::~URLSchemeListPolicyHandler() = default;
+
+bool URLSchemeListPolicyHandler::CheckPolicySettings(const PolicyMap& policies,
+                                                     PolicyErrorMap* errors) {
+  if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors))
+    return false;
+
+  const base::Value* schemes = policies.GetValue(policy_name());
+  if (!schemes || schemes->GetList().empty())
+    return true;
+
+  DCHECK(schemes->is_list());
+
+  // Filters more than |url_util::kMaxFiltersPerPolicy| are ignored, add a
+  // warning message.
+  if (schemes->GetList().size() > policy::kMaxUrlFiltersPerPolicy) {
+    errors->AddError(policy_name(),
+                     IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
+                     base::NumberToString(policy::kMaxUrlFiltersPerPolicy));
+  }
+
+  std::vector<std::string> invalid_policies;
+  for (const auto& entry : schemes->GetList()) {
+    if (!ValidatePolicyEntry(entry.GetIfString()))
+      invalid_policies.push_back(entry.GetString());
+  }
+
+  if (!invalid_policies.empty()) {
+    errors->AddError(policy_name(), IDS_POLICY_PROTO_PARSING_ERROR,
+                     base::JoinString(invalid_policies, ","));
+  }
+
+  return invalid_policies.size() < schemes->GetList().size();
+}
+
+void URLSchemeListPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
+                                                     PrefValueMap* prefs) {
+  const base::Value* schemes = policies.GetValue(policy_name());
+  if (!schemes || !schemes->is_list())
+    return;
+  std::vector<base::Value> filtered_schemes;
+  for (const auto& entry : schemes->GetList()) {
+    if (ValidatePolicyEntry(entry.GetIfString()))
+      filtered_schemes.push_back(entry.Clone());
+  }
+  if (filtered_schemes.size() > policy::kMaxUrlFiltersPerPolicy)
+    filtered_schemes.resize(policy::kMaxUrlFiltersPerPolicy);
+
+  prefs->SetValue(pref_path_, base::Value(std::move(filtered_schemes)));
+}
+
+// Validates that policy follows official pattern
+// https://www.chromium.org/administrators/url-blocklist-filter-format
+bool URLSchemeListPolicyHandler::ValidatePolicyEntry(
+    const std::string* policy) {
+  url_matcher::util::FilterComponents components;
+  return policy && url_matcher::util::FilterToComponents(
+                       *policy, &components.scheme, &components.host,
+                       &components.match_subdomains, &components.port,
+                       &components.path, &components.query);
+}
+
+}  // namespace policy
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler.h b/components/policy/core/browser/url_scheme_list_policy_handler.h
new file mode 100644
index 0000000..74329f1
--- /dev/null
+++ b/components/policy/core/browser/url_scheme_list_policy_handler.h
@@ -0,0 +1,41 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_POLICY_CORE_BROWSER_URL_SCHEME_LIST_POLICY_HANDLER_H_
+#define COMPONENTS_POLICY_CORE_BROWSER_URL_SCHEME_LIST_POLICY_HANDLER_H_
+
+#include "base/compiler_specific.h"
+#include "components/policy/core/browser/configuration_policy_handler.h"
+#include "components/policy/policy_export.h"
+
+namespace policy {
+
+// Maps policy to pref like TypeCheckingPolicyHandler while ensuring that the
+// value is a list of urls that follow the url format which documented at
+// http://www.chromium.org/administrators/url-blocklist-filter-format
+class POLICY_EXPORT URLSchemeListPolicyHandler
+    : public TypeCheckingPolicyHandler {
+ public:
+  URLSchemeListPolicyHandler(const char* policy_name, const char* pref_path);
+  URLSchemeListPolicyHandler(const URLSchemeListPolicyHandler&) = delete;
+  URLSchemeListPolicyHandler& operator=(const URLSchemeListPolicyHandler&) =
+      delete;
+  ~URLSchemeListPolicyHandler() override;
+
+  // ConfigurationPolicyHandler methods:
+  bool CheckPolicySettings(const PolicyMap& policies,
+                           PolicyErrorMap* errors) override;
+  void ApplyPolicySettings(const PolicyMap& policies,
+                           PrefValueMap* prefs) override;
+
+ private:
+  bool ValidatePolicyEntry(const std::string* policy);
+  const char* pref_path_;
+
+  FRIEND_TEST_ALL_PREFIXES(URLSchemeListPolicyHandlerTest, ValidatePolicyEntry);
+};
+
+}  // namespace policy
+
+#endif  // COMPONENTS_POLICY_CORE_BROWSER_URL_SCHEME_LIST_POLICY_HANDLER_H_
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc b/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc
new file mode 100644
index 0000000..d1a80c7
--- /dev/null
+++ b/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc
@@ -0,0 +1,232 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/policy/core/browser/url_scheme_list_policy_handler.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_pref_names.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 "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace policy {
+
+namespace {
+
+const char kTestPolicyName[] = "kTestPolicyName";
+const char kTestPrefName[] = "kTestPrefName";
+const char kTestUrl[] = "https://www.example.com";
+const char kNotAUrl[] = "htttps:///abce.NotAUrl..fgh";
+
+}  // namespace
+
+class URLSchemeListPolicyHandlerTest : public testing::Test {
+ public:
+  void SetUp() override {
+    std::string error;
+    DCHECK(error.empty());
+    handler_ = std::make_unique<URLSchemeListPolicyHandler>(kTestPolicyName,
+                                                            kTestPrefName);
+  }
+
+ protected:
+  void SetPolicy(const std::string& key, base::Value value) {
+    policies_.Set(key, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+                  POLICY_SOURCE_CLOUD, std::move(value), nullptr);
+  }
+  bool CheckPolicy(const std::string& key, absl::optional<base::Value> value) {
+    if (value)
+      SetPolicy(key, value.value().Clone());
+    return handler_->CheckPolicySettings(policies_, &errors_);
+  }
+  void ApplyPolicies() { handler_->ApplyPolicySettings(policies_, &prefs_); }
+  base::Value GetPolicyValueWithEntries(size_t len) {
+    std::vector<base::Value> blocklist(len);
+    for (auto& entry : blocklist)
+      entry = base::Value(kTestUrl);
+    return base::Value(std::move(blocklist));
+  }
+
+  std::unique_ptr<URLSchemeListPolicyHandler> handler_;
+  PolicyErrorMap errors_;
+  PolicyMap policies_;
+  PrefValueMap prefs_;
+};
+
+TEST_F(URLSchemeListPolicyHandlerTest, CheckPolicySettings_EmptyPolicy) {
+  EXPECT_TRUE(
+      CheckPolicy(kTestPolicyName, base::Value(base::Value::Type::LIST)));
+  EXPECT_TRUE(errors_.empty());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, CheckPolicySettings_WrongType) {
+  // The policy expects a list. Give it a boolean.
+  EXPECT_FALSE(CheckPolicy(kTestPolicyName, base::Value(false)));
+  EXPECT_EQ(1U, errors_.size());
+  const std::string expected = kTestPolicyName;
+  const std::string actual = errors_.begin()->first;
+  EXPECT_EQ(expected, actual);
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, CheckPolicySettings_NoPolicy) {
+  // The policy expects a list. Give it a boolean.
+  EXPECT_TRUE(CheckPolicy(kTestPolicyName, absl::nullopt));
+  EXPECT_TRUE(errors_.empty());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, CheckPolicySettings_OneBadValue) {
+  // The policy expects a list. Give it a boolean.
+  base::Value in(base::Value::Type::LIST);
+  in.Append(kNotAUrl);
+  in.Append(kTestUrl);
+  EXPECT_TRUE(CheckPolicy(kTestPolicyName, std::move(in)));
+  EXPECT_EQ(1U, errors_.size());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, CheckPolicySettings_SingleBadValue) {
+  // The policy expects a list. Give it a boolean.
+  base::Value in(base::Value::Type::LIST);
+  in.Append(kNotAUrl);
+  EXPECT_FALSE(CheckPolicy(kTestPolicyName, std::move(in)));
+  EXPECT_EQ(1U, errors_.size());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_NothingSpecified) {
+  ApplyPolicies();
+  EXPECT_FALSE(prefs_.GetValue(kTestPolicyName, nullptr));
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_WrongType) {
+  // The policy expects a list. Give it a boolean.
+  SetPolicy(kTestPolicyName, base::Value(false));
+  ApplyPolicies();
+  EXPECT_FALSE(prefs_.GetValue(kTestPrefName, nullptr));
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_Empty) {
+  SetPolicy(kTestPolicyName, base::Value(base::Value::Type::LIST));
+  ApplyPolicies();
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_TRUE(out->GetList().empty());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_WrongElementType) {
+  // The policy expects string-valued elements. Give it booleans.
+  base::Value in(base::Value::Type::LIST);
+  in.Append(kNotAUrl);
+  in.Append(kTestUrl);
+  SetPolicy(kTestPolicyName, std::move(in));
+  ApplyPolicies();
+
+  // The element should be skipped.
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_EQ(1U, out->GetList().size());
+
+  const std::string* out_string = out->GetList()[0].GetIfString();
+  ASSERT_TRUE(out_string);
+  EXPECT_EQ(kTestUrl, *out_string);
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_BadUrl) {
+  // The policy expects a gvalid url schema.
+  base::Value in(base::Value::Type::LIST);
+  in.Append(false);
+  in.Append(kTestUrl);
+  SetPolicy(kTestPolicyName, std::move(in));
+  ApplyPolicies();
+
+  // The element should be skipped.
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_EQ(1U, out->GetList().size());
+
+  const std::string* out_string = out->GetList()[0].GetIfString();
+  ASSERT_TRUE(out_string);
+  EXPECT_EQ(kTestUrl, *out_string);
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_Successful) {
+  base::Value in_url_blocklist(base::Value::Type::LIST);
+  in_url_blocklist.Append(kTestUrl);
+  SetPolicy(kTestPolicyName, std::move(in_url_blocklist));
+  ApplyPolicies();
+
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_EQ(1U, out->GetList().size());
+
+  const std::string* out_string = out->GetList()[0].GetIfString();
+  ASSERT_TRUE(out_string);
+  EXPECT_EQ(kTestUrl, *out_string);
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest,
+       ApplyPolicySettings_CheckPolicySettingsMaxFiltersLimitOK) {
+  base::Value urls = GetPolicyValueWithEntries(policy::kMaxUrlFiltersPerPolicy);
+
+  EXPECT_TRUE(CheckPolicy(kTestPolicyName, std::move(urls)));
+  EXPECT_TRUE(errors_.empty());
+
+  ApplyPolicies();
+
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetList().size());
+}
+
+// Test that the warning message, mapped to
+// |IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING|, is added to
+// |errors_| when URLBlocklist entries exceed the max filters per policy limit.
+TEST_F(URLSchemeListPolicyHandlerTest,
+       ApplyPolicySettings_CheckPolicySettingsMaxFiltersLimitExceeded) {
+  base::Value urls =
+      GetPolicyValueWithEntries(policy::kMaxUrlFiltersPerPolicy + 1);
+
+  EXPECT_TRUE(CheckPolicy(kTestPolicyName, std::move(urls)));
+  EXPECT_EQ(1U, errors_.size());
+
+  ApplyPolicies();
+
+  auto error_str = errors_.GetErrors(kTestPolicyName);
+  auto expected_str = l10n_util::GetStringFUTF16(
+      IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
+      base::NumberToString16(policy::kMaxUrlFiltersPerPolicy));
+  EXPECT_TRUE(error_str.find(expected_str) != std::wstring::npos);
+
+  base::Value* out;
+  EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
+  ASSERT_TRUE(out->is_list());
+  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetList().size());
+}
+
+TEST_F(URLSchemeListPolicyHandlerTest, ValidatePolicyEntry) {
+  std::vector<std::string> good{"http://*", "http:*",
+                                "ws://example.org/component.js", "127.0.0.1:1",
+                                "127.0.0.1:65535"};
+  for (const auto& it : good)
+    EXPECT_TRUE(handler_->ValidatePolicyEntry(&it));
+
+  std::vector<std::string> bad{"wsgi:///rancom,org/", "127.0.0.1:65536"};
+  for (const auto& it : bad)
+    EXPECT_FALSE(handler_->ValidatePolicyEntry(&it));
+}
+
+}  // namespace policy
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 1670e035..f6a3a3a 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -462,6 +462,7 @@
       'desc': '''Policies related to integrated HTTP authentication.''',
       'policies': [
         'AuthSchemes',
+        'AllHttpAuthSchemesAllowedForOrigins',
         'DisableAuthNegotiateCnameLookup',
         'EnableAuthNegotiatePort',
         'BasicAuthOverHttpEnabled',
@@ -5060,6 +5061,25 @@
       Note: Separate multiple values with commas.''',
     },
     {
+      'name': 'AllHttpAuthSchemesAllowedForOrigins',
+      'owners': ['file://components/policy/resources/OWNERS', 'ydago@chromium.org'],
+      'type': 'list',
+      'schema': { 'type': 'array', 'items': { 'type': 'string' } },
+      'supported_on': ['chrome.*:100-','android:100-','chrome_os:100-'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': ['*.example.com'],
+      'id': 950,
+      'caption': '''List of origins allowing all HTTP authentication''',
+      'tags': [],
+      'desc': '''Setting the policy specifies for which origins to allow all the HTTP authentication schemes <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> supports regardless of the <ph name="AUTH_SCHEMES_POLICY_NAME">AuthSchemes</ph> policy.
+
+      Format the origin pattern according to this format (<ph name="URL_SCHEME_FORMAT_LINK">https://www.chromium.org/administrators/url-blocklist-filter-format</ph>). Up to 1,000 exceptions can be defined in <ph name="ALL_HTTP_AUTH_ALLOWED_FOR_ORIGINS_POLICY_NAME">AllHttpAuthSchemesAllowedForOrigins</ph>.
+      Wildcards are allowed for the whole origin or parts of the origin, either the scheme, host, port.''',
+    },
+    {
       'name': 'DisableAuthNegotiateCnameLookup',
       'owners': ['file://components/policy/resources/OWNERS', 'rsorokin@chromium.org'],
       'type': 'main',
@@ -30682,6 +30702,6 @@
   'placeholders': [],
   'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872],
   'deleted_atomic_policy_group_ids': [19],
-  'highest_id_currently_used': 949,
+  'highest_id_currently_used': 950,
   'highest_atomic_group_id_currently_used': 41
 }
diff --git a/components/prefs/pref_member_unittest.cc b/components/prefs/pref_member_unittest.cc
index 291b043a..0cf95bb5 100644
--- a/components/prefs/pref_member_unittest.cc
+++ b/components/prefs/pref_member_unittest.cc
@@ -214,7 +214,7 @@
   string_list.Init(kStringListPref, &prefs);
 
   // Check the defaults
-  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
+  EXPECT_EQ(expected_list, *prefs.GetList(kStringListPref));
   EXPECT_EQ(expected_vector, string_list.GetValue());
   EXPECT_EQ(expected_vector, *string_list);
   EXPECT_TRUE(string_list.IsDefaultValue());
@@ -224,7 +224,7 @@
   expected_vector.push_back("foo");
   string_list.SetValue(expected_vector);
 
-  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
+  EXPECT_EQ(expected_list, *prefs.GetList(kStringListPref));
   EXPECT_EQ(expected_vector, string_list.GetValue());
   EXPECT_EQ(expected_vector, *string_list);
   EXPECT_FALSE(string_list.IsDefaultValue());
@@ -234,7 +234,7 @@
   expected_vector.push_back("bar");
   prefs.Set(kStringListPref, expected_list);
 
-  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
+  EXPECT_EQ(expected_list, *prefs.GetList(kStringListPref));
   EXPECT_EQ(expected_vector, string_list.GetValue());
   EXPECT_EQ(expected_vector, *string_list);
   EXPECT_FALSE(string_list.IsDefaultValue());
@@ -244,7 +244,7 @@
   expected_vector.erase(expected_vector.begin());
   prefs.Set(kStringListPref, expected_list);
 
-  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
+  EXPECT_EQ(expected_list, *prefs.GetList(kStringListPref));
   EXPECT_EQ(expected_vector, string_list.GetValue());
   EXPECT_EQ(expected_vector, *string_list);
   EXPECT_FALSE(string_list.IsDefaultValue());
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
index e0c8b8c..4887f9fa0 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
@@ -328,6 +328,7 @@
   std::unique_ptr<CocoaWindowMoveLoop> window_move_loop_;
   ui::ModalType modal_type_ = ui::MODAL_TYPE_NONE;
   bool is_translucent_window_ = false;
+  bool is_headless_mode_window_ = false;
   id key_down_event_monitor_ = nil;
 
   // Intended for PWAs with window controls overlay display override. These two
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
index 1db44af..fedefaf 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -432,6 +432,7 @@
     mojom::NativeWidgetNSWindowInitParamsPtr params) {
   modal_type_ = params->modal_type;
   is_translucent_window_ = params->is_translucent;
+  is_headless_mode_window_ = params->is_headless_mode_window;
   pending_restoration_data_ = params->state_restoration_data;
 
   // Register for application hide notifications so that visibility can be
@@ -655,6 +656,10 @@
 
 void NativeWidgetNSWindowBridge::SetVisibilityState(
     WindowVisibilityState new_state) {
+  // Avoid changing headless mode window visibility state.
+  if (is_headless_mode_window_)
+    return;
+
   // During session restore this method gets called from RestoreTabsToBrowser()
   // with new_state = kShowAndActivateWindow. We consume restoration data on our
   // first time through this method so we can use its existence as an
diff --git a/components/remote_cocoa/common/native_widget_ns_window.mojom b/components/remote_cocoa/common/native_widget_ns_window.mojom
index 0353678..1c02511c 100644
--- a/components/remote_cocoa/common/native_widget_ns_window.mojom
+++ b/components/remote_cocoa/common/native_widget_ns_window.mojom
@@ -74,6 +74,8 @@
   // NSWindowCollectionBehaviorParticipatesInCycle (this is not the
   // default for NSWindows with NSBorderlessWindowMask).
   bool force_into_collection_cycle;
+  // If true, the window was created in headless mode.
+  bool is_headless_mode_window;
   // An opaque blob of AppKit data which includes, among other things, a
   // window's workspace and fullscreen state, and can be retrieved from or
   // applied to a window.
diff --git a/components/sessions/core/session_command.cc b/components/sessions/core/session_command.cc
index 2de11d954..9b9d1583 100644
--- a/components/sessions/core/session_command.cc
+++ b/components/sessions/core/session_command.cc
@@ -2,7 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <algorithm>
 #include <limits>
+#include <memory>
 
 #include "base/pickle.h"
 #include "components/sessions/core/session_command.h"
diff --git a/components/sync/base/BUILD.gn b/components/sync/base/BUILD.gn
index 354c497..64372f3 100644
--- a/components/sync/base/BUILD.gn
+++ b/components/sync/base/BUILD.gn
@@ -36,14 +36,12 @@
     "ordinal.h",
     "passphrase_enums.cc",
     "passphrase_enums.h",
-    "pref_names.cc",
     "pref_names.h",
     "progress_marker_map.cc",
     "progress_marker_map.h",
     "report_unrecoverable_error.cc",
     "report_unrecoverable_error.h",
     "stop_source.h",
-    "sync_base_switches.cc",
     "sync_base_switches.h",
     "sync_invalidation.cc",
     "sync_invalidation.h",
diff --git a/components/sync/base/pref_names.cc b/components/sync/base/pref_names.cc
deleted file mode 100644
index 7ecf074..0000000
--- a/components/sync/base/pref_names.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/base/pref_names.h"
-
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
-
-namespace syncer {
-
-namespace prefs {
-
-// Boolean specifying whether the user finished setting up sync at least once.
-const char kSyncFirstSetupComplete[] = "sync.has_setup_completed";
-
-// Boolean specifying whether to automatically sync all data types (including
-// future ones, as they're added).  If this is true, the following preferences
-// (kSyncBookmarks, kSyncPasswords, etc.) can all be ignored.
-const char kSyncKeepEverythingSynced[] = "sync.keep_everything_synced";
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-// Boolean pref that records whether OS sync preferences were migrated due to
-// SyncSettingsCategorization rollout.
-const char kOsSyncPrefsMigrated[] = "sync.os_sync_prefs_migrated";
-
-// Boolean specifying whether to automatically sync all Chrome OS specific data
-// types (including future ones). This includes types like printers, OS-only
-// settings, etc. If set, the individual type preferences can be ignored.
-const char kSyncAllOsTypes[] = "sync.all_os_types";
-
-// Booleans specifying whether the user has selected to sync the following
-// OS user selectable types.
-const char kSyncOsApps[] = "sync.os_apps";
-const char kSyncOsPreferences[] = "sync.os_preferences";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-// Booleans specifying whether the user has selected to sync the following
-// user selectable types.
-const char kSyncApps[] = "sync.apps";
-const char kSyncAutofill[] = "sync.autofill";
-const char kSyncBookmarks[] = "sync.bookmarks";
-const char kSyncExtensions[] = "sync.extensions";
-const char kSyncPasswords[] = "sync.passwords";
-const char kSyncPreferences[] = "sync.preferences";
-const char kSyncReadingList[] = "sync.reading_list";
-const char kSyncTabs[] = "sync.tabs";
-const char kSyncThemes[] = "sync.themes";
-const char kSyncTypedUrls[] = "sync.typed_urls";
-const char kSyncWifiConfigurations[] = "sync.wifi_configurations";
-
-// Boolean used by enterprise configuration management in order to lock down
-// sync.
-const char kSyncManaged[] = "sync.managed";
-
-// Boolean whether has requested sync to be enabled. This is set early in the
-// sync setup flow, after the user has pressed "turn on sync" but before they
-// have accepted the confirmation dialog (that maps to kSyncFirstSetupComplete).
-// This is also set to false when sync is disabled by the user in sync settings,
-// or when sync was reset from the dashboard.
-const char kSyncRequested[] = "sync.requested";
-
-// A string that can be used to restore sync encryption infrastructure on
-// startup so that the user doesn't need to provide credentials on each start.
-const char kSyncEncryptionBootstrapToken[] = "sync.encryption_bootstrap_token";
-
-// Stores whether a platform specific passphrase error prompt has been muted by
-// the user (e.g. an Android system notification). Specifically, it stores which
-// major product version was used to mute this error.
-const char kSyncPassphrasePromptMutedProductVersion[] =
-    "sync.passphrase_prompt_muted_product_version";
-
-// Enabled the local sync backend implemented by the LoopbackServer.
-const char kEnableLocalSyncBackend[] = "sync.enable_local_sync_backend";
-
-// Specifies the local sync backend directory. The name is chosen to mimic
-// user-data-dir etc. This flag only matters if the enable-local-sync-backend
-// flag is present.
-const char kLocalSyncBackendDir[] = "sync.local_sync_backend_dir";
-
-#if BUILDFLAG(IS_ANDROID)
-// Stores whether sync should no longer respect the state of master toggle for
-// this user.
-// TODO(crbug.com/1107904): Clean pref when the decoupling logic is removed.
-const char kSyncDecoupledFromAndroidMasterSync[] =
-    "sync.decoupled_from_master_sync";
-#endif  // BUILDFLAG(IS_ANDROID)
-
-}  // namespace prefs
-
-}  // namespace syncer
diff --git a/components/sync/base/pref_names.h b/components/sync/base/pref_names.h
index aa571cf..0a760229 100644
--- a/components/sync/base/pref_names.h
+++ b/components/sync/base/pref_names.h
@@ -12,39 +12,82 @@
 
 namespace prefs {
 
-extern const char kSyncFirstSetupComplete[];
-extern const char kSyncKeepEverythingSynced[];
+// Boolean specifying whether the user finished setting up sync at least once.
+constexpr inline char kSyncFirstSetupComplete[] = "sync.has_setup_completed";
+
+// Boolean specifying whether to automatically sync all data types (including
+// future ones, as they're added).  If this is true, the following preferences
+// (kSyncBookmarks, kSyncPasswords, etc.) can all be ignored.
+constexpr inline char kSyncKeepEverythingSynced[] =
+    "sync.keep_everything_synced";
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-extern const char kOsSyncPrefsMigrated[];
-extern const char kSyncAllOsTypes[];
-extern const char kSyncOsApps[];
-extern const char kSyncOsPreferences[];
+// Boolean pref that records whether OS sync preferences were migrated due to
+// SyncSettingsCategorization rollout.
+constexpr inline char kOsSyncPrefsMigrated[] = "sync.os_sync_prefs_migrated";
+
+// Boolean specifying whether to automatically sync all Chrome OS specific data
+// types (including future ones). This includes types like printers, OS-only
+// settings, etc. If set, the individual type preferences can be ignored.
+constexpr inline char kSyncAllOsTypes[] = "sync.all_os_types";
+
+// Booleans specifying whether the user has selected to sync the following
+// OS user selectable types.
+constexpr inline char kSyncOsApps[] = "sync.os_apps";
+constexpr inline char kSyncOsPreferences[] = "sync.os_preferences";
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-extern const char kSyncApps[];
-extern const char kSyncAutofill[];
-extern const char kSyncBookmarks[];
-extern const char kSyncExtensions[];
-extern const char kSyncPasswords[];
-extern const char kSyncPreferences[];
-extern const char kSyncReadingList[];
-extern const char kSyncTabs[];
-extern const char kSyncThemes[];
-extern const char kSyncTypedUrls[];
-extern const char kSyncWifiConfigurations[];
+// Booleans specifying whether the user has selected to sync the following
+// user selectable types.
+constexpr inline char kSyncApps[] = "sync.apps";
+constexpr inline char kSyncAutofill[] = "sync.autofill";
+constexpr inline char kSyncBookmarks[] = "sync.bookmarks";
+constexpr inline char kSyncExtensions[] = "sync.extensions";
+constexpr inline char kSyncPasswords[] = "sync.passwords";
+constexpr inline char kSyncPreferences[] = "sync.preferences";
+constexpr inline char kSyncReadingList[] = "sync.reading_list";
+constexpr inline char kSyncTabs[] = "sync.tabs";
+constexpr inline char kSyncThemes[] = "sync.themes";
+constexpr inline char kSyncTypedUrls[] = "sync.typed_urls";
+constexpr inline char kSyncWifiConfigurations[] = "sync.wifi_configurations";
 
-extern const char kSyncManaged[];
-extern const char kSyncRequested[];
+// Boolean used by enterprise configuration management in order to lock down
+// sync.
+constexpr inline char kSyncManaged[] = "sync.managed";
 
-extern const char kSyncEncryptionBootstrapToken[];
-extern const char kSyncPassphrasePromptMutedProductVersion[];
+// Boolean whether has requested sync to be enabled. This is set early in the
+// sync setup flow, after the user has pressed "turn on sync" but before they
+// have accepted the confirmation dialog (that maps to kSyncFirstSetupComplete).
+// This is also set to false when sync is disabled by the user in sync settings,
+// or when sync was reset from the dashboard.
+constexpr inline char kSyncRequested[] = "sync.requested";
 
-extern const char kEnableLocalSyncBackend[];
-extern const char kLocalSyncBackendDir[];
+// A string that can be used to restore sync encryption infrastructure on
+// startup so that the user doesn't need to provide credentials on each start.
+constexpr inline char kSyncEncryptionBootstrapToken[] =
+    "sync.encryption_bootstrap_token";
+
+// Stores whether a platform specific passphrase error prompt has been muted by
+// the user (e.g. an Android system notification). Specifically, it stores which
+// major product version was used to mute this error.
+constexpr inline char kSyncPassphrasePromptMutedProductVersion[] =
+    "sync.passphrase_prompt_muted_product_version";
+
+// Enabled the local sync backend implemented by the LoopbackServer.
+constexpr inline char kEnableLocalSyncBackend[] =
+    "sync.enable_local_sync_backend";
+
+// Specifies the local sync backend directory. The name is chosen to mimic
+// user-data-dir etc. This flag only matters if the enable-local-sync-backend
+// flag is present.
+constexpr inline char kLocalSyncBackendDir[] = "sync.local_sync_backend_dir";
 
 #if BUILDFLAG(IS_ANDROID)
-extern const char kSyncDecoupledFromAndroidMasterSync[];
+// Stores whether sync should no longer respect the state of master toggle for
+// this user.
+// TODO(crbug.com/1107904): Clean pref when the decoupling logic is removed.
+constexpr inline char kSyncDecoupledFromAndroidMasterSync[] =
+    "sync.decoupled_from_master_sync";
 #endif  // BUILDFLAG(IS_ANDROID)
 
 }  // namespace prefs
diff --git a/components/sync/base/sync_base_switches.cc b/components/sync/base/sync_base_switches.cc
deleted file mode 100644
index aa254f28..0000000
--- a/components/sync/base/sync_base_switches.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/base/sync_base_switches.h"
-
-#include "base/metrics/field_trial_params.h"
-
-namespace switches {
-
-// Overrides the default server used for profile sync.
-const char kSyncServiceURL[] = "sync-url";
-
-// Specifies the vault server used for trusted vault passphrase.
-const char kTrustedVaultServiceURL[] = "trusted-vault-service-url";
-
-const base::Feature kSyncNigoriRemoveMetadataOnCacheGuidMismatch{
-    "SyncNigoriRemoveMetadataOnCacheGuidMismatch",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace switches
diff --git a/components/sync/base/sync_base_switches.h b/components/sync/base/sync_base_switches.h
index 027ec7e4..57767b41 100644
--- a/components/sync/base/sync_base_switches.h
+++ b/components/sync/base/sync_base_switches.h
@@ -9,10 +9,15 @@
 
 namespace switches {
 
-extern const char kSyncServiceURL[];
-extern const char kTrustedVaultServiceURL[];
+// Overrides the default server used for profile sync.
+constexpr inline char kSyncServiceURL[] = "sync-url";
 
-extern const base::Feature kSyncNigoriRemoveMetadataOnCacheGuidMismatch;
+// Specifies the vault server used for trusted vault passphrase.
+constexpr inline char kTrustedVaultServiceURL[] = "trusted-vault-service-url";
+
+constexpr inline base::Feature kSyncNigoriRemoveMetadataOnCacheGuidMismatch{
+    "SyncNigoriRemoveMetadataOnCacheGuidMismatch",
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 }  // namespace switches
 
diff --git a/components/sync/base/sync_util.cc b/components/sync/base/sync_util.cc
index e7a97c5..db2da85 100644
--- a/components/sync/base/sync_util.cc
+++ b/components/sync/base/sync_util.cc
@@ -52,11 +52,6 @@
 namespace syncer {
 namespace internal {
 
-const char* const kSyncServerUrl = "https://clients4.google.com/chrome-sync";
-
-const char* const kSyncDevServerUrl =
-    "https://clients4.google.com/chrome-sync/dev";
-
 std::string FormatUserAgentForSync(const std::string& system,
                                    version_info::Channel channel) {
   std::string product = STRINGIZE(SYNC_USER_AGENT_PRODUCT);
diff --git a/components/sync/base/sync_util.h b/components/sync/base/sync_util.h
index e3e6050..e6f5c32 100644
--- a/components/sync/base/sync_util.h
+++ b/components/sync/base/sync_util.h
@@ -19,10 +19,12 @@
 namespace internal {
 
 // Default sync server URL. Visible for testing.
-extern const char* const kSyncServerUrl;
+constexpr inline char kSyncServerUrl[] =
+    "https://clients4.google.com/chrome-sync";
 
 // Sync server URL for dev channel users. Visible for testing.
-extern const char* const kSyncDevServerUrl;
+constexpr inline char kSyncDevServerUrl[] =
+    "https://clients4.google.com/chrome-sync/dev";
 
 // Formats user agent string from system string and channel. Visible for
 // testing.
diff --git a/components/sync/driver/sync_auth_manager.cc b/components/sync/driver/sync_auth_manager.cc
index 292063c..2baf45a6 100644
--- a/components/sync/driver/sync_auth_manager.cc
+++ b/components/sync/driver/sync_auth_manager.cc
@@ -85,11 +85,6 @@
 
 }  // namespace
 
-// Enables the retry of the token fetch without backoff on the first fetch
-// cancellation.
-const base::Feature kSyncRetryFirstCanceledTokenFetch = {
-    "SyncRetryFirstCanceledTokenFetch", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables the retry of the token fetch without backoff after the first failure.
 // TODO(crbug.com/1097054): remove once rolled out.
 const base::Feature kSyncRetryFirstTokenFetchAttemptImmediately = {
diff --git a/components/sync/driver/sync_auth_manager.h b/components/sync/driver/sync_auth_manager.h
index dfb4bd7..2cbbdb6 100644
--- a/components/sync/driver/sync_auth_manager.h
+++ b/components/sync/driver/sync_auth_manager.h
@@ -28,7 +28,10 @@
 
 namespace syncer {
 
-extern const base::Feature kSyncRetryFirstCanceledTokenFetch;
+// Enables the retry of the token fetch without backoff on the first fetch
+// cancellation.
+constexpr inline base::Feature kSyncRetryFirstCanceledTokenFetch = {
+    "SyncRetryFirstCanceledTokenFetch", base::FEATURE_ENABLED_BY_DEFAULT};
 
 struct SyncCredentials;
 
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc
index 9565f63..2441fe1 100644
--- a/components/sync/driver/sync_driver_switches.cc
+++ b/components/sync/driver/sync_driver_switches.cc
@@ -23,76 +23,4 @@
 }
 #endif  // BUILDFLAG(IS_IOS)
 
-// Disables syncing browser data to a Google Account.
-const char kDisableSync[] = "disable-sync";
-
-// Allows overriding the deferred init fallback timeout.
-const char kSyncDeferredStartupTimeoutSeconds[] =
-    "sync-deferred-startup-timeout-seconds";
-
-// Enables deferring sync backend initialization until user initiated changes
-// occur.
-const char kSyncDisableDeferredStartup[] = "sync-disable-deferred-startup";
-
-// Controls whether the initial state of the "Capture Specifics" flag on
-// chrome://sync-internals is enabled.
-const char kSyncIncludeSpecificsInProtocolLog[] = "sync-include-specifics";
-
-// This flag causes sync to retry very quickly (see polling_constants.h) the
-// when it encounters an error, as the first step towards exponential backoff.
-const char kSyncShortInitialRetryOverride[] =
-    "sync-short-initial-retry-override";
-
-// This flag significantly shortens the delay between nudge cycles. Its primary
-// purpose is to speed up integration tests. The normal delay allows coalescing
-// and prevention of server overload, so don't use this unless you're really
-// sure that it's what you want.
-const char kSyncShortNudgeDelayForTest[] = "sync-short-nudge-delay-for-test";
-
-// Allows custom passphrase users to receive Wallet data for secondary accounts
-// while in transport-only mode.
-const base::Feature kSyncAllowWalletDataInTransportModeWithCustomPassphrase{
-    "SyncAllowAutofillWalletDataInTransportModeWithCustomPassphrase",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Controls whether to enable syncing of Autofill Wallet offer data.
-const base::Feature kSyncAutofillWalletOfferData{
-    "SyncAutofillWalletOfferData", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Controls whether to enable syncing of Wi-Fi configurations.
-const base::Feature kSyncWifiConfigurations{"SyncWifiConfigurations",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Sync requires policies to be loaded before starting.
-const base::Feature kSyncRequiresPoliciesLoaded{
-    "SyncRequiresPoliciesLoaded", base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Max time to delay the sync startup while waiting for policies to load.
-const base::FeatureParam<base::TimeDelta> kSyncPolicyLoadTimeout{
-    &kSyncRequiresPoliciesLoaded, "SyncPolicyLoadTimeout", base::Seconds(10)};
-
-#if BUILDFLAG(IS_IOS)
-// Whether RPC is enabled.
-const base::Feature kSyncTrustedVaultPassphraseiOSRPC{
-    "SyncTrustedVaultPassphraseiOSRPC", base::FEATURE_ENABLED_BY_DEFAULT};
-#endif  // BUILDFLAG(IS_IOS)
-
-// Keep this entry in sync with the equivalent name in
-// ChromeFeatureList.java.
-const base::Feature kSyncTrustedVaultPassphraseRecovery{
-    "SyncTrustedVaultPassphraseRecovery", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Whether the entry point to opt in to trusted vault in settings should be
-// shown.
-const base::Feature kSyncTrustedVaultPassphrasePromo{
-    "SyncTrustedVaultPassphrasePromo", base::FEATURE_DISABLED_BY_DEFAULT};
-
-#if BUILDFLAG(IS_CHROMEOS)
-// Whether warning should be shown in sync settings page when lacros
-// side-by-side mode is enabled.
-const base::Feature kSyncSettingsShowLacrosSideBySideWarning{
-    "SyncSettingsShowLacrosSideBySideWarning",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
 }  // namespace switches
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h
index 5c9ca959..453525ba 100644
--- a/components/sync/driver/sync_driver_switches.h
+++ b/components/sync/driver/sync_driver_switches.h
@@ -23,33 +23,77 @@
 #endif  // BUILDFLAG(IS_IOS)
 
 // Defines all the command-line switches used by sync driver. All switches in
-// alphabetical order. The switches should be documented alongside the
-// definition of their values in the .cc file.
-extern const char kDisableSync[];
-extern const char kSyncDeferredStartupTimeoutSeconds[];
-extern const char kSyncDisableDeferredStartup[];
-extern const char kSyncIncludeSpecificsInProtocolLog[];
-extern const char kSyncShortInitialRetryOverride[];
-extern const char kSyncShortNudgeDelayForTest[];
+// alphabetical order.
+//
+// Disables syncing browser data to a Google Account.
+constexpr inline char kDisableSync[] = "disable-sync";
+// Allows overriding the deferred init fallback timeout.
+constexpr inline char kSyncDeferredStartupTimeoutSeconds[] =
+    "sync-deferred-startup-timeout-seconds";
+// Enables deferring sync backend initialization until user initiated changes
+// occur.
+constexpr inline char kSyncDisableDeferredStartup[] =
+    "sync-disable-deferred-startup";
+// Controls whether the initial state of the "Capture Specifics" flag on
+// chrome://sync-internals is enabled.
+constexpr inline char kSyncIncludeSpecificsInProtocolLog[] =
+    "sync-include-specifics";
+// This flag causes sync to retry very quickly (see polling_constants.h) the
+// when it encounters an error, as the first step towards exponential backoff.
+constexpr inline char kSyncShortInitialRetryOverride[] =
+    "sync-short-initial-retry-override";
+// This flag significantly shortens the delay between nudge cycles. Its primary
+// purpose is to speed up integration tests. The normal delay allows coalescing
+// and prevention of server overload, so don't use this unless you're really
+// sure that it's what you want.
+constexpr inline char kSyncShortNudgeDelayForTest[] =
+    "sync-short-nudge-delay-for-test";
 
-extern const base::Feature
-    kSyncAllowWalletDataInTransportModeWithCustomPassphrase;
-extern const base::Feature kSyncAutofillWalletOfferData;
-extern const base::Feature kSyncWifiConfigurations;
+// Allows custom passphrase users to receive Wallet data for secondary accounts
+// while in transport-only mode.
+constexpr inline base::Feature
+    kSyncAllowWalletDataInTransportModeWithCustomPassphrase{
+        "SyncAllowAutofillWalletDataInTransportModeWithCustomPassphrase",
+        base::FEATURE_DISABLED_BY_DEFAULT};
 
-extern const base::Feature kSyncRequiresPoliciesLoaded;
-extern const base::FeatureParam<base::TimeDelta> kSyncPolicyLoadTimeout;
+// Controls whether to enable syncing of Autofill Wallet offer data.
+constexpr inline base::Feature kSyncAutofillWalletOfferData{
+    "SyncAutofillWalletOfferData", base::FEATURE_ENABLED_BY_DEFAULT};
+
+// Controls whether to enable syncing of Wi-Fi configurations.
+constexpr inline base::Feature kSyncWifiConfigurations{
+    "SyncWifiConfigurations", base::FEATURE_ENABLED_BY_DEFAULT};
+
+// Sync requires policies to be loaded before starting.
+constexpr inline base::Feature kSyncRequiresPoliciesLoaded{
+    "SyncRequiresPoliciesLoaded", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Max time to delay the sync startup while waiting for policies to load.
+constexpr inline base::FeatureParam<base::TimeDelta> kSyncPolicyLoadTimeout{
+    &kSyncRequiresPoliciesLoaded, "SyncPolicyLoadTimeout", base::Seconds(10)};
 
 #if BUILDFLAG(IS_IOS)
-extern const base::Feature kSyncTrustedVaultPassphraseiOSRPC;
+// Whether RPC is enabled.
+constexpr inline base::Feature kSyncTrustedVaultPassphraseiOSRPC{
+    "SyncTrustedVaultPassphraseiOSRPC", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif  // BUILDFLAG(IS_IOS)
 
-extern const base::Feature kSyncTrustedVaultPassphraseRecovery;
+// Keep this entry in sync with the equivalent name in
+// ChromeFeatureList.java.
+constexpr inline base::Feature kSyncTrustedVaultPassphraseRecovery{
+    "SyncTrustedVaultPassphraseRecovery", base::FEATURE_ENABLED_BY_DEFAULT};
 
-extern const base::Feature kSyncTrustedVaultPassphrasePromo;
+// Whether the entry point to opt in to trusted vault in settings should be
+// shown.
+constexpr inline base::Feature kSyncTrustedVaultPassphrasePromo{
+    "SyncTrustedVaultPassphrasePromo", base::FEATURE_DISABLED_BY_DEFAULT};
 
 #if BUILDFLAG(IS_CHROMEOS)
-extern const base::Feature kSyncSettingsShowLacrosSideBySideWarning;
+// Whether warning should be shown in sync settings page when lacros
+// side-by-side mode is enabled.
+constexpr inline base::Feature kSyncSettingsShowLacrosSideBySideWarning{
+    "SyncSettingsShowLacrosSideBySideWarning",
+    base::FEATURE_ENABLED_BY_DEFAULT};
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace switches
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc
index 73693e6..1575398 100644
--- a/components/sync/driver/sync_internals_util.cc
+++ b/components/sync/driver/sync_internals_util.cc
@@ -34,52 +34,6 @@
 
 namespace sync_ui_util {
 
-const char kIdentityTitle[] = "Identity";
-const char kDetailsKey[] = "details";
-
-// Resource paths.
-const char kAboutJS[] = "about.js";
-const char kChromeSyncJS[] = "chrome_sync.js";
-const char kDataJS[] = "data.js";
-const char kEventsJS[] = "events.js";
-const char kSearchJS[] = "search.js";
-const char kSyncIndexJS[] = "sync_index.js";
-const char kSyncLogJS[] = "sync_log.js";
-const char kSyncNodeBrowserJS[] = "sync_node_browser.js";
-const char kSyncSearchJS[] = "sync_search.js";
-const char kUserEventsJS[] = "user_events.js";
-const char kTrafficLogJS[] = "traffic_log.js";
-const char kInvalidationsJS[] = "invalidations.js";
-
-// Message handlers.
-const char kGetAllNodes[] = "getAllNodes";
-const char kRequestDataAndRegisterForUpdates[] =
-    "requestDataAndRegisterForUpdates";
-const char kRequestIncludeSpecificsInitialState[] =
-    "requestIncludeSpecificsInitialState";
-const char kRequestListOfTypes[] = "requestListOfTypes";
-const char kRequestStart[] = "requestStart";
-const char kRequestStopKeepData[] = "requestStopKeepData";
-const char kRequestStopClearData[] = "requestStopClearData";
-const char kSetIncludeSpecifics[] = "setIncludeSpecifics";
-const char kTriggerRefresh[] = "triggerRefresh";
-const char kWriteUserEvent[] = "writeUserEvent";
-
-// Other strings.
-const char kEntityCounts[] = "entityCounts";
-const char kEntities[] = "entities";
-const char kNonTombstoneEntities[] = "nonTombstoneEntities";
-const char kIncludeSpecifics[] = "includeSpecifics";
-const char kModelType[] = "modelType";
-const char kOnAboutInfoUpdated[] = "onAboutInfoUpdated";
-const char kOnEntityCountsUpdated[] = "onEntityCountsUpdated";
-const char kOnProtocolEvent[] = "onProtocolEvent";
-const char kOnReceivedIncludeSpecificsInitialState[] =
-    "onReceivedIncludeSpecificsInitialState";
-const char kOnReceivedListOfTypes[] = "onReceivedListOfTypes";
-const char kTypes[] = "types";
-const char kOnInvalidationReceived[] = "onInvalidationReceived";
-
 namespace {
 
 const char kUninitialized[] = "Uninitialized";
diff --git a/components/sync/driver/sync_internals_util.h b/components/sync/driver/sync_internals_util.h
index 3de37304..1e8b1ec 100644
--- a/components/sync/driver/sync_internals_util.h
+++ b/components/sync/driver/sync_internals_util.h
@@ -23,51 +23,54 @@
 
 // These strings are used from logs to pull out specific data from sync; we
 // don't want these to ever go out of sync between the logs and sync util.
-extern const char kIdentityTitle[];
-extern const char kDetailsKey[];
+constexpr inline char kIdentityTitle[] = "Identity";
+constexpr inline char kDetailsKey[] = "details";
 
 // Resource paths.
 // Must match the resource file names.
-extern const char kAboutJS[];
-extern const char kChromeSyncJS[];
-extern const char kDataJS[];
-extern const char kEventsJS[];
-extern const char kSearchJS[];
-extern const char kSyncIndexJS[];
-extern const char kSyncLogJS[];
-extern const char kSyncNodeBrowserJS[];
-extern const char kSyncSearchJS[];
-extern const char kUserEventsJS[];
-extern const char kTrafficLogJS[];
-extern const char kInvalidationsJS[];
+constexpr inline char kAboutJS[] = "about.js";
+constexpr inline char kChromeSyncJS[] = "chrome_sync.js";
+constexpr inline char kDataJS[] = "data.js";
+constexpr inline char kEventsJS[] = "events.js";
+constexpr inline char kSearchJS[] = "search.js";
+constexpr inline char kSyncIndexJS[] = "sync_index.js";
+constexpr inline char kSyncLogJS[] = "sync_log.js";
+constexpr inline char kSyncNodeBrowserJS[] = "sync_node_browser.js";
+constexpr inline char kSyncSearchJS[] = "sync_search.js";
+constexpr inline char kUserEventsJS[] = "user_events.js";
+constexpr inline char kTrafficLogJS[] = "traffic_log.js";
+constexpr inline char kInvalidationsJS[] = "invalidations.js";
 
 // Message handlers.
 // Must match the constants used in the resource files.
-extern const char kGetAllNodes[];
-extern const char kRequestDataAndRegisterForUpdates[];
-extern const char kRequestIncludeSpecificsInitialState[];
-extern const char kRequestListOfTypes[];
-extern const char kRequestStart[];
-extern const char kRequestStopKeepData[];
-extern const char kRequestStopClearData[];
-extern const char kSetIncludeSpecifics[];
-extern const char kTriggerRefresh[];
-extern const char kWriteUserEvent[];
+constexpr inline char kGetAllNodes[] = "getAllNodes";
+constexpr inline char kRequestDataAndRegisterForUpdates[] =
+    "requestDataAndRegisterForUpdates";
+constexpr inline char kRequestIncludeSpecificsInitialState[] =
+    "requestIncludeSpecificsInitialState";
+constexpr inline char kRequestListOfTypes[] = "requestListOfTypes";
+constexpr inline char kRequestStart[] = "requestStart";
+constexpr inline char kRequestStopKeepData[] = "requestStopKeepData";
+constexpr inline char kRequestStopClearData[] = "requestStopClearData";
+constexpr inline char kSetIncludeSpecifics[] = "setIncludeSpecifics";
+constexpr inline char kTriggerRefresh[] = "triggerRefresh";
+constexpr inline char kWriteUserEvent[] = "writeUserEvent";
 
 // Other strings.
 // WARNING: Must match the property names used in the resource files.
-extern const char kEntityCounts[];
-extern const char kEntities[];
-extern const char kNonTombstoneEntities[];
-extern const char kIncludeSpecifics[];
-extern const char kModelType[];
-extern const char kOnAboutInfoUpdated[];
-extern const char kOnEntityCountsUpdated[];
-extern const char kOnProtocolEvent[];
-extern const char kOnReceivedIncludeSpecificsInitialState[];
-extern const char kOnReceivedListOfTypes[];
-extern const char kTypes[];
-extern const char kOnInvalidationReceived[];
+constexpr inline char kEntityCounts[] = "entityCounts";
+constexpr inline char kEntities[] = "entities";
+constexpr inline char kNonTombstoneEntities[] = "nonTombstoneEntities";
+constexpr inline char kIncludeSpecifics[] = "includeSpecifics";
+constexpr inline char kModelType[] = "modelType";
+constexpr inline char kOnAboutInfoUpdated[] = "onAboutInfoUpdated";
+constexpr inline char kOnEntityCountsUpdated[] = "onEntityCountsUpdated";
+constexpr inline char kOnProtocolEvent[] = "onProtocolEvent";
+constexpr inline char kOnReceivedIncludeSpecificsInitialState[] =
+    "onReceivedIncludeSpecificsInitialState";
+constexpr inline char kOnReceivedListOfTypes[] = "onReceivedListOfTypes";
+constexpr inline char kTypes[] = "types";
+constexpr inline char kOnInvalidationReceived[] = "onInvalidationReceived";
 
 using IncludeSensitiveData =
     base::StrongAlias<class IncludeSensitiveDataTag, bool>;
diff --git a/components/sync/engine/BUILD.gn b/components/sync/engine/BUILD.gn
index ecc5c48..7f982cf 100644
--- a/components/sync/engine/BUILD.gn
+++ b/components/sync/engine/BUILD.gn
@@ -135,7 +135,6 @@
     "sync_engine.h",
     "sync_engine_event_listener.h",
     "sync_engine_host.h",
-    "sync_engine_switches.cc",
     "sync_engine_switches.h",
     "sync_manager.cc",
     "sync_manager.h",
diff --git a/components/sync/engine/nigori/nigori.cc b/components/sync/engine/nigori/nigori.cc
index cea4029..118953e 100644
--- a/components/sync/engine/nigori/nigori.cc
+++ b/components/sync/engine/nigori/nigori.cc
@@ -37,8 +37,6 @@
 
 namespace syncer {
 
-const char kNigoriKeyName[] = "nigori-key";
-
 namespace {
 
 // NigoriStream simplifies the concatenation operation of the Nigori protocol.
diff --git a/components/sync/engine/nigori/nigori.h b/components/sync/engine/nigori/nigori.h
index 685452f..5567392 100644
--- a/components/sync/engine/nigori/nigori.h
+++ b/components/sync/engine/nigori/nigori.h
@@ -21,7 +21,7 @@
 class KeyDerivationParams;
 
 // TODO(crbug.com/922900): inline kNigoriKeyName into Nigori::Permute().
-extern const char kNigoriKeyName[];
+constexpr inline char kNigoriKeyName[] = "nigori-key";
 
 // A (partial) implementation of Nigori, a protocol to securely store secrets in
 // the cloud. This implementation does not support server authentication or
diff --git a/components/sync/engine/sync_engine_switches.cc b/components/sync/engine/sync_engine_switches.cc
deleted file mode 100644
index f44732f3..0000000
--- a/components/sync/engine/sync_engine_switches.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/sync_engine_switches.h"
-
-namespace switches {
-
-const base::Feature kSyncResetPollIntervalOnStart{
-    "SyncResetPollIntervalOnStart", base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Causes Sync to ignore updates encrypted with keys that have been missing for
-// too long from this client; Sync will proceed normally as if those updates
-// didn't exist.
-const base::Feature kIgnoreSyncEncryptionKeysLongMissing{
-    "IgnoreSyncEncryptionKeysLongMissing", base::FEATURE_DISABLED_BY_DEFAULT};
-
-// The threshold for kIgnoreSyncEncryptionKeysLongMissing to start ignoring keys
-// (measured in number of GetUpdatesResponses messages).
-const base::FeatureParam<int> kMinGuResponsesToIgnoreKey{
-    &kIgnoreSyncEncryptionKeysLongMissing, "MinGuResponsesToIgnoreKey", 50};
-
-// Causes the sync engine to count a quota for commits of data types that can
-// be committed by extension JS API. If the quota is depleted, an extra long
-// nudge delay is applied to that data type. As a result, more changes are
-// likely to get combined into one commit message.
-const base::Feature kSyncExtensionTypesThrottling{
-    "SyncExtensionTypesThrottling", base::FEATURE_DISABLED_BY_DEFAULT};
-
-}  // namespace switches
diff --git a/components/sync/engine/sync_engine_switches.h b/components/sync/engine/sync_engine_switches.h
index 59bafe3ca..8d43b65 100644
--- a/components/sync/engine/sync_engine_switches.h
+++ b/components/sync/engine/sync_engine_switches.h
@@ -10,12 +10,26 @@
 
 namespace switches {
 
-extern const base::Feature kSyncResetPollIntervalOnStart;
+constexpr inline base::Feature kSyncResetPollIntervalOnStart{
+    "SyncResetPollIntervalOnStart", base::FEATURE_DISABLED_BY_DEFAULT};
 
-extern const base::Feature kIgnoreSyncEncryptionKeysLongMissing;
-extern const base::FeatureParam<int> kMinGuResponsesToIgnoreKey;
+// Causes Sync to ignore updates encrypted with keys that have been missing for
+// too long from this client; Sync will proceed normally as if those updates
+// didn't exist.
+constexpr inline base::Feature kIgnoreSyncEncryptionKeysLongMissing{
+    "IgnoreSyncEncryptionKeysLongMissing", base::FEATURE_DISABLED_BY_DEFAULT};
 
-extern const base::Feature kSyncExtensionTypesThrottling;
+// The threshold for kIgnoreSyncEncryptionKeysLongMissing to start ignoring keys
+// (measured in number of GetUpdatesResponses messages).
+constexpr inline base::FeatureParam<int> kMinGuResponsesToIgnoreKey{
+    &kIgnoreSyncEncryptionKeysLongMissing, "MinGuResponsesToIgnoreKey", 50};
+
+// Causes the sync engine to count a quota for commits of data types that can
+// be committed by extension JS API. If the quota is depleted, an extra long
+// nudge delay is applied to that data type. As a result, more changes are
+// likely to get combined into one commit message.
+constexpr inline base::Feature kSyncExtensionTypesThrottling{
+    "SyncExtensionTypesThrottling", base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace switches
 
diff --git a/components/sync/invalidations/BUILD.gn b/components/sync/invalidations/BUILD.gn
index 713dbd2..ad0e619 100644
--- a/components/sync/invalidations/BUILD.gn
+++ b/components/sync/invalidations/BUILD.gn
@@ -13,7 +13,6 @@
     "interested_data_types_manager.cc",
     "interested_data_types_manager.h",
     "invalidations_listener.h",
-    "switches.cc",
     "switches.h",
     "sync_invalidations_service.h",
     "sync_invalidations_service_impl.cc",
diff --git a/components/sync/invalidations/switches.cc b/components/sync/invalidations/switches.cc
deleted file mode 100644
index 61335de..0000000
--- a/components/sync/invalidations/switches.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/invalidations/switches.h"
-
-namespace switches {
-
-const base::Feature kSyncSendInterestedDataTypes = {
-    "SyncSendInterestedDataTypes", base::FEATURE_ENABLED_BY_DEFAULT};
-
-const base::Feature kUseSyncInvalidations = {"UseSyncInvalidations",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
-
-const base::Feature kUseSyncInvalidationsForWalletAndOffer = {
-    "UseSyncInvalidationsForWalletAndOffer", base::FEATURE_DISABLED_BY_DEFAULT};
-
-}  // namespace switches
diff --git a/components/sync/invalidations/switches.h b/components/sync/invalidations/switches.h
index 75f3074..b704d451 100644
--- a/components/sync/invalidations/switches.h
+++ b/components/sync/invalidations/switches.h
@@ -11,7 +11,8 @@
 
 // If enabled, interested data types, excluding Wallet and Offer, will be sent
 // to the Sync Server as part of DeviceInfo.
-extern const base::Feature kSyncSendInterestedDataTypes;
+constexpr inline base::Feature kSyncSendInterestedDataTypes = {
+    "SyncSendInterestedDataTypes", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // If enabled, the device will register with FCM and listen to new
 // invalidations. Also, FCM token will be set in DeviceInfo, which signals to
@@ -19,14 +20,16 @@
 // The device will not subscribe to old invalidations for any data types except
 // Wallet and Offer, since that will be covered by the new system.
 // SyncSendInterestedDataTypes must be enabled for this to take effect.
-extern const base::Feature kUseSyncInvalidations;
+constexpr inline base::Feature kUseSyncInvalidations = {
+    "UseSyncInvalidations", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // If enabled, types related to Wallet and Offer will be included in interested
 // data types, and the device will listen to new invalidations for those types
 // (if they are enabled).
 // The device will not register for old invalidations at all.
 // UseSyncInvalidations must be enabled for this to take effect.
-extern const base::Feature kUseSyncInvalidationsForWalletAndOffer;
+constexpr inline base::Feature kUseSyncInvalidationsForWalletAndOffer = {
+    "UseSyncInvalidationsForWalletAndOffer", base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace switches
 
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc
index dee1069..ebb4935 100644
--- a/components/sync/test/fake_server/fake_server.cc
+++ b/components/sync/test/fake_server/fake_server.cc
@@ -36,9 +36,6 @@
 using syncer::ModelType;
 using syncer::ModelTypeSet;
 
-const char switches::kDisableFakeServerFailureOutput[] =
-    "disable-fake-server-failure-output";
-
 namespace fake_server {
 
 FakeServer::FakeServer()
diff --git a/components/sync/test/fake_server/fake_server.h b/components/sync/test/fake_server/fake_server.h
index 9cded10..ae4e0f6d2 100644
--- a/components/sync/test/fake_server/fake_server.h
+++ b/components/sync/test/fake_server/fake_server.h
@@ -32,7 +32,8 @@
 
 namespace switches {
 
-extern const char kDisableFakeServerFailureOutput[];
+constexpr inline char kDisableFakeServerFailureOutput[] =
+    "disable-fake-server-failure-output";
 
 }  // namespace switches
 
diff --git a/components/sync/trusted_vault/trusted_vault_server_constants.cc b/components/sync/trusted_vault/trusted_vault_server_constants.cc
index 276169b4e..d00c915 100644
--- a/components/sync/trusted_vault/trusted_vault_server_constants.cc
+++ b/components/sync/trusted_vault/trusted_vault_server_constants.cc
@@ -16,18 +16,6 @@
 
 }  // namespace
 
-const int kUnknownConstantKeyVersion = 0;
-
-const char kSyncSecurityDomainName[] = "users/me/securitydomains/chromesync";
-const char kSecurityDomainMemberNamePrefix[] = "users/me/members/";
-const char kJoinSecurityDomainsURLPath[] =
-    "users/me/securitydomains/chromesync:join";
-const char kJoinSecurityDomainsErrorDetailTypeURL[] =
-    "type.googleapis.com/"
-    "google.internal.identity.securitydomain.v1.JoinSecurityDomainErrorDetail";
-extern const char kGetSecurityDomainURLPathAndQuery[] =
-    "users/me/securitydomains/chromesync?view=2";
-
 std::vector<uint8_t> GetConstantTrustedVaultKey() {
   return std::vector<uint8_t>(16, 0);
 }
diff --git a/components/sync/trusted_vault/trusted_vault_server_constants.h b/components/sync/trusted_vault/trusted_vault_server_constants.h
index 01859c1d..bdb8925 100644
--- a/components/sync/trusted_vault/trusted_vault_server_constants.h
+++ b/components/sync/trusted_vault/trusted_vault_server_constants.h
@@ -13,13 +13,18 @@
 
 namespace syncer {
 
-extern const int kUnknownConstantKeyVersion;
+constexpr inline int kUnknownConstantKeyVersion = 0;
 
-extern const char kSyncSecurityDomainName[];
-extern const char kSecurityDomainMemberNamePrefix[];
-extern const char kJoinSecurityDomainsURLPath[];
-extern const char kJoinSecurityDomainsErrorDetailTypeURL[];
-extern const char kGetSecurityDomainURLPathAndQuery[];
+constexpr inline char kSyncSecurityDomainName[] =
+    "users/me/securitydomains/chromesync";
+constexpr inline char kSecurityDomainMemberNamePrefix[] = "users/me/members/";
+constexpr inline char kJoinSecurityDomainsURLPath[] =
+    "users/me/securitydomains/chromesync:join";
+constexpr inline char kJoinSecurityDomainsErrorDetailTypeURL[] =
+    "type.googleapis.com/"
+    "google.internal.identity.securitydomain.v1.JoinSecurityDomainErrorDetail";
+constexpr inline char kGetSecurityDomainURLPathAndQuery[] =
+    "users/me/securitydomains/chromesync?view=2";
 
 std::vector<uint8_t> GetConstantTrustedVaultKey();
 std::string GetGetSecurityDomainMemberURLPathAndQuery(
diff --git a/components/sync/trusted_vault/trusted_vault_switches.cc b/components/sync/trusted_vault/trusted_vault_switches.cc
index ec3f502..0d938de 100644
--- a/components/sync/trusted_vault/trusted_vault_switches.cc
+++ b/components/sync/trusted_vault/trusted_vault_switches.cc
@@ -17,6 +17,9 @@
 
 // Specifies how long requests to vault service shouldn't be retried after
 // encountering transient error.
+// TODO(crbug.com/1292114): Move to the same file as
+// kSyncTrustedVaultPassphraseRecovery so this can be moved to the header as
+// an inline variable.
 const base::FeatureParam<base::TimeDelta>
     kTrustedVaultServiceThrottlingDuration{
         &kSyncTrustedVaultPassphraseRecovery,
diff --git a/components/sync_bookmarks/BUILD.gn b/components/sync_bookmarks/BUILD.gn
index b974e892..4db0271 100644
--- a/components/sync_bookmarks/BUILD.gn
+++ b/components/sync_bookmarks/BUILD.gn
@@ -22,7 +22,6 @@
     "bookmark_sync_service.h",
     "parent_guid_preprocessing.cc",
     "parent_guid_preprocessing.h",
-    "switches.cc",
     "switches.h",
     "synced_bookmark_tracker.cc",
     "synced_bookmark_tracker.h",
diff --git a/components/sync_bookmarks/switches.cc b/components/sync_bookmarks/switches.cc
deleted file mode 100644
index faebd322..0000000
--- a/components/sync_bookmarks/switches.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync_bookmarks/switches.h"
-#include "base/feature_list.h"
-
-namespace switches {
-
-const base::Feature kSyncReuploadBookmarks{"SyncReuploadBookmarks",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
-
-const base::Feature kSyncUseClientTagForBookmarkCommits{
-    "SyncUseClientTagForBookmarkCommits", base::FEATURE_ENABLED_BY_DEFAULT};
-
-const base::Feature kSyncBookmarksEnforceLateMaxEntriesToCommit{
-    "SyncBookmarksEnforceLateMaxEntriesToCommit",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace switches
diff --git a/components/sync_bookmarks/switches.h b/components/sync_bookmarks/switches.h
index fedc326..845573aa 100644
--- a/components/sync_bookmarks/switches.h
+++ b/components/sync_bookmarks/switches.h
@@ -11,12 +11,17 @@
 
 // TODO(crbug.com/1232951): remove the feature toggle once most of bookmarks
 // have been reuploaded.
-extern const base::Feature kSyncReuploadBookmarks;
-extern const base::Feature kSyncUseClientTagForBookmarkCommits;
+constexpr inline base::Feature kSyncReuploadBookmarks{
+    "SyncReuploadBookmarks", base::FEATURE_ENABLED_BY_DEFAULT};
+
+constexpr inline base::Feature kSyncUseClientTagForBookmarkCommits{
+    "SyncUseClientTagForBookmarkCommits", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // TODO(crbug.com/1177798): remove this code after a quick verification that it
 // doesn't cause issues.
-extern const base::Feature kSyncBookmarksEnforceLateMaxEntriesToCommit;
+constexpr inline base::Feature kSyncBookmarksEnforceLateMaxEntriesToCommit{
+    "SyncBookmarksEnforceLateMaxEntriesToCommit",
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 }  // namespace switches
 
diff --git a/components/sync_sessions/BUILD.gn b/components/sync_sessions/BUILD.gn
index e0a7c4e..5c761d9 100644
--- a/components/sync_sessions/BUILD.gn
+++ b/components/sync_sessions/BUILD.gn
@@ -27,7 +27,6 @@
     "session_sync_service_impl.h",
     "sessions_global_id_mapper.cc",
     "sessions_global_id_mapper.h",
-    "switches.cc",
     "switches.h",
     "sync_sessions_client.cc",
     "sync_sessions_client.h",
diff --git a/components/sync_sessions/switches.cc b/components/sync_sessions/switches.cc
deleted file mode 100644
index bc1df38..0000000
--- a/components/sync_sessions/switches.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync_sessions/switches.h"
-
-namespace switches {
-
-// Enables syncing Sessions data type in case when the window doesn't have open
-// tabs anymore.
-const base::Feature kSyncConsiderEmptyWindowsSyncable{
-    "SyncConsiderEmptyWindowsSyncable", base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace switches
diff --git a/components/sync_sessions/switches.h b/components/sync_sessions/switches.h
index 4f15cd9..809fcac 100644
--- a/components/sync_sessions/switches.h
+++ b/components/sync_sessions/switches.h
@@ -9,7 +9,10 @@
 
 namespace switches {
 
-extern const base::Feature kSyncConsiderEmptyWindowsSyncable;
+// Enables syncing Sessions data type in case when the window doesn't have open
+// tabs anymore.
+constexpr inline base::Feature kSyncConsiderEmptyWindowsSyncable{
+    "SyncConsiderEmptyWindowsSyncable", base::FEATURE_ENABLED_BY_DEFAULT};
 
 }  // namespace switches
 
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc
index 66e2789..05dc367 100644
--- a/components/sync_sessions/synced_session_tracker.cc
+++ b/components/sync_sessions/synced_session_tracker.cc
@@ -16,11 +16,6 @@
 
 namespace sync_sessions {
 
-const base::Feature kDeferRecyclingOfSyncTabNodesIfUnsynced{
-    "DeferRecyclingOfSyncTabNodesIfUnsynced", base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kSyncPopulateTabBrowserTypeInGetData{
-    "SyncPopulateTabBrowserTypeInGetData", base::FEATURE_ENABLED_BY_DEFAULT};
-
 namespace {
 
 // Maximum time we allow a local tab stay unmapped (i.e. closed) but not freed
diff --git a/components/sync_sessions/synced_session_tracker.h b/components/sync_sessions/synced_session_tracker.h
index ecd1e331..8d142a6 100644
--- a/components/sync_sessions/synced_session_tracker.h
+++ b/components/sync_sessions/synced_session_tracker.h
@@ -28,9 +28,11 @@
 
 // TODO(crbug.com/882489): Remove feature toggle during code cleanup when a
 // satisfying solution is found for closed tabs.
-extern const base::Feature kDeferRecyclingOfSyncTabNodesIfUnsynced;
+constexpr inline base::Feature kDeferRecyclingOfSyncTabNodesIfUnsynced{
+    "DeferRecyclingOfSyncTabNodesIfUnsynced", base::FEATURE_ENABLED_BY_DEFAULT};
 
-extern const base::Feature kSyncPopulateTabBrowserTypeInGetData;
+constexpr inline base::Feature kSyncPopulateTabBrowserTypeInGetData{
+    "SyncPopulateTabBrowserTypeInGetData", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Class to manage synced sessions. The tracker will own all SyncedSession
 // and SyncedSessionTab objects it creates, and deletes them appropriately on
diff --git a/components/sync_sessions/tab_node_pool.cc b/components/sync_sessions/tab_node_pool.cc
index db03ace..67cc97b 100644
--- a/components/sync_sessions/tab_node_pool.cc
+++ b/components/sync_sessions/tab_node_pool.cc
@@ -18,9 +18,6 @@
 const size_t TabNodePool::kFreeNodesLowWatermark = 25;
 const size_t TabNodePool::kFreeNodesHighWatermark = 100;
 
-const base::Feature kTabNodePoolImmediateDeletion{
-    "TabNodePoolImmediateDeletion", base::FEATURE_ENABLED_BY_DEFAULT};
-
 TabNodePool::TabNodePool() : max_used_tab_node_id_(kInvalidTabNodeID) {}
 
 // static
diff --git a/components/sync_sessions/tab_node_pool.h b/components/sync_sessions/tab_node_pool.h
index dad3ae9..e6b8094 100644
--- a/components/sync_sessions/tab_node_pool.h
+++ b/components/sync_sessions/tab_node_pool.h
@@ -29,7 +29,8 @@
 
 // TODO(crbug.com/882489): Remove feature toggle during code cleanup when a
 // satisfying solution is found for closed tabs.
-extern const base::Feature kTabNodePoolImmediateDeletion;
+constexpr inline base::Feature kTabNodePoolImmediateDeletion{
+    "TabNodePoolImmediateDeletion", base::FEATURE_ENABLED_BY_DEFAULT};
 
 class TabNodePool {
  public:
diff --git a/components/translate/core/common/translate_util.cc b/components/translate/core/common/translate_util.cc
index 938780d5..7ddaeed 100644
--- a/components/translate/core/common/translate_util.cc
+++ b/components/translate/core/common/translate_util.cc
@@ -26,10 +26,15 @@
 const base::Feature kTranslateSubFrames{"TranslateSubFrames",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
+// The feature is disabled on iOS since iOS currently does not support TFLite
+// model execution. The feature is also explicitly disabled on Webview and
+// Weblayer.
+// TODO(crbug.com/1292622): Enable the feature on Webview.
+// TODO(crbug.com/1247836): Enable the feature on WebLayer.
 const base::Feature kTFLiteLanguageDetectionEnabled{
   "TFLiteLanguageDetectionEnabled",
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || \
-    BUILDFLAG(IS_MAC)
+    BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID)
       base::FEATURE_ENABLED_BY_DEFAULT
 #else
       base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/components/viz/service/surfaces/surface_saved_frame.cc b/components/viz/service/surfaces/surface_saved_frame.cc
index 3ebb6e43..233a5b7 100644
--- a/components/viz/service/surfaces/surface_saved_frame.cc
+++ b/components/viz/service/surfaces/surface_saved_frame.cc
@@ -299,9 +299,11 @@
   }
 
   // Return if the result is empty.
-  // TODO(vmpstr): We should log / trace this.
-  if (output_copy->IsEmpty())
+  if (output_copy->IsEmpty()) {
+    LOG(ERROR) << "SurfaceSavedFrame copy output result for shared index "
+               << shared_index << " is empty.";
     return;
+  }
 
   ++valid_result_count_;
   if (!frame_result_) {
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index 84b4cca..74564f98 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -662,6 +662,16 @@
     {switches::kGpuProcess, GpuMain},
   };
 
+  // The hang watcher needs to be started once the feature list is available
+  // but before the IO thread is started.
+  base::ScopedClosureRunner unregister_thread_closure;
+  if (base::HangWatcher::IsEnabled()) {
+    base::HangWatcher::CreateHangWatcherInstance();
+    unregister_thread_closure = base::HangWatcher::RegisterThread(
+        base::HangWatcher::ThreadType::kMainThread);
+    base::HangWatcher::GetInstance()->Start();
+  }
+
   for (size_t i = 0; i < base::size(kMainFunctions); ++i) {
     if (process_type == kMainFunctions[i].name) {
       auto exit_code =
@@ -1086,11 +1096,10 @@
     // The hang watcher needs to be started once the feature list is available
     // but before the IO thread is started.
     if (base::HangWatcher::IsEnabled()) {
-      hang_watcher_ = new base::HangWatcher();
+      base::HangWatcher::CreateHangWatcherInstance();
       unregister_thread_closure_ = base::HangWatcher::RegisterThread(
-          base::HangWatcher::ThreadType::kUIThread);
-      hang_watcher_->Start();
-      ANNOTATE_LEAKING_OBJECT_PTR(hang_watcher_);
+          base::HangWatcher::ThreadType::kMainThread);
+      base::HangWatcher::GetInstance()->Start();
     }
 
     if (has_thread_pool) {
diff --git a/content/app/content_main_runner_impl.h b/content/app/content_main_runner_impl.h
index 2cfcb53..225a0aa9 100644
--- a/content/app/content_main_runner_impl.h
+++ b/content/app/content_main_runner_impl.h
@@ -9,7 +9,6 @@
 
 #include "base/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
-#include "base/threading/hang_watcher.h"
 #include "build/build_config.h"
 #include "content/browser/startup_data_impl.h"
 #include "content/common/content_export.h"
@@ -56,9 +55,6 @@
 
   bool is_browser_main_loop_started_ = false;
 
-  // The hang watcher is leaked to make sure it survives all watched threads.
-  raw_ptr<base::HangWatcher> hang_watcher_;
-
   // Unregisters UI thread from hang watching on destruction.
   // NOTE: The thread should be unregistered before HangWatcher stops so this
   // member must be after |hang_watcher|.
diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc
index 51126060..fbff14b 100644
--- a/content/browser/accessibility/accessibility_action_browsertest.cc
+++ b/content/browser/accessibility/accessibility_action_browsertest.cc
@@ -490,11 +490,11 @@
   ASSERT_NE(nullptr, target);
   EXPECT_EQ(u"Before", target->GetValueForControl());
 
-  AccessibilityNotificationWaiter waiter(
+  AccessibilityNotificationWaiter waiter2(
       shell()->web_contents(), ui::kAXModeComplete,
       ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED);
   GetManager()->SetValue(*target, "Line1\nLine2");
-  waiter.WaitForNotification();
+  waiter2.WaitForNotification();
 
   EXPECT_EQ(u"Line1\nLine2", target->GetValueForControl());
 
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.h b/content/browser/accessibility/browser_accessibility_cocoa.h
index 3f9b75c..aba0e975e 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.h
+++ b/content/browser/accessibility/browser_accessibility_cocoa.h
@@ -145,7 +145,6 @@
 @property(nonatomic, readonly) NSNumber* index;
 @property(nonatomic, readonly) NSNumber* treeItemRowIndex;
 @property(nonatomic, readonly) NSNumber* insertionPointLineNumber;
-@property(nonatomic, readonly) NSNumber* isMultiSelectable;
 @property(nonatomic, readonly) NSNumber* loaded;
 @property(nonatomic, readonly) NSNumber* loadingProgress;
 @property(nonatomic, readonly) NSNumber* maxValue;
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 3112722..23787ef 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -72,8 +72,6 @@
     @"AXEditableAncestor";
 NSString* const NSAccessibilityHighestEditableAncestorAttribute =
     @"AXHighestEditableAncestor";
-NSString* const NSAccessibilityIsMultiSelectableAttribute =
-    @"AXIsMultiSelectable";
 NSString* const NSAccessibilityLoadingProgressAttribute = @"AXLoadingProgress";
 NSString* const NSAccessibilityOwnsAttribute = @"AXOwns";
 NSString* const
@@ -641,7 +639,6 @@
       {NSAccessibilityIndexAttribute, @"index"},
       {NSAccessibilityInsertionPointLineNumberAttribute,
        @"insertionPointLineNumber"},
-      {NSAccessibilityIsMultiSelectableAttribute, @"isMultiSelectable"},
       {NSAccessibilityLanguageAttribute, @"language"},
       {NSAccessibilityLinkedUIElementsAttribute, @"linkedUIElements"},
       {NSAccessibilityLoadingProgressAttribute, @"loadingProgress"},
@@ -1147,12 +1144,6 @@
          _owner->IsInvisibleOrIgnored();
 }
 
-- (NSNumber*)isMultiSelectable {
-  if (![self instanceActive])
-    return nil;
-  return @(GetState(_owner, ax::mojom::State::kMultiselectable));
-}
-
 - (NSString*)language {
   if (![self instanceActive])
     return nil;
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index c9154ee1..d7e376b 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -279,12 +279,8 @@
       break;
     }
     case ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED:
-      // Sometimes `RetargetForEvents` will walk up to the lowest platform leaf
-      // and fire the same event on that node. However, in some rare cases the
-      // leaf node might not be a text field. For example, in the unusual case
-      // when the text field is inside a button, the leaf node is the button not
-      // the text field.
-      if (android_node->IsTextField() && GetFocus() == node)
+      DCHECK(android_node->IsTextField());
+      if (GetFocus() == node)
         wcax->HandleEditableTextChanged(android_node->unique_id());
       break;
 
diff --git a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc
index c034397..61515a9 100644
--- a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc
@@ -241,6 +241,10 @@
   RunTypedTest<kMacAttributes>("ax-math-base.html");
 }
 
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AXIsMultiSelectable) {
+  RunTypedTest<kMacAttributes>("ax-is-multi-selectable.html");
+}
+
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AXMathFractionDenominator) {
   RunTypedTest<kMacAttributes>("ax-math-fraction-denominator.html");
 }
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
index 7ee6971b..562a1f3 100644
--- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -45,7 +45,7 @@
 using ::testing::IsNull;
 using ::testing::Return;
 
-const char kAttributionInternalsUrl[] = "chrome://conversion-internals/";
+const char kAttributionInternalsUrl[] = "chrome://attribution-internals/";
 
 const std::u16string kCompleteTitle = u"Complete";
 const std::u16string kCompleteTitle2 = u"Complete2";
diff --git a/content/browser/attribution_reporting/attribution_internals_ui.h b/content/browser/attribution_reporting/attribution_internals_ui.h
index 8f4770f..53f794ee 100644
--- a/content/browser/attribution_reporting/attribution_internals_ui.h
+++ b/content/browser/attribution_reporting/attribution_internals_ui.h
@@ -18,7 +18,7 @@
 
 class AttributionInternalsHandlerImpl;
 
-// WebUI which handles serving the chrome://conversion-internals page.
+// WebUI which handles serving the chrome://attribution-internals page.
 class CONTENT_EXPORT AttributionInternalsUI : public WebUIController {
  public:
   explicit AttributionInternalsUI(WebUI* web_ui);
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index d71cca9..f9af243 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -12,7 +12,6 @@
 #include "base/command_line.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/rand_util.h"
 #include "base/task/lazy_thread_pool_task_runner.h"
 #include "base/threading/sequence_bound.h"
 #include "base/time/time.h"
@@ -220,6 +219,8 @@
              AttributionStorage::StoreSourceResult result) {
             // TODO(apaseltiner): Consider logging UMA based on `result` to help
             // understand how often this fails due to privacy limits, etc.
+            //
+            // TODO(apaseltiner): Show rejected sources in internals UI.
 
             if (!manager)
               return;
@@ -390,13 +391,6 @@
   if (reports.empty() || IsOffline())
     return;
 
-  // Shuffle new reports to provide plausible deniability on the ordering of
-  // reports that share the same |report_time|. This is important because
-  // multiple conversions for the same impression share the same report time if
-  // they are within the same reporting window, and we do not want to allow
-  // ordering on their conversion metadata bits.
-  base::RandomShuffle(reports.begin(), reports.end());
-
   SendReports(std::move(reports), /*log_metrics=*/true, base::DoNothing());
   StartGetReportsToSendTimer();
 }
diff --git a/content/browser/attribution_reporting/attribution_storage.h b/content/browser/attribution_reporting/attribution_storage.h
index 78c26ec..7e374da 100644
--- a/content/browser/attribution_reporting/attribution_storage.h
+++ b/content/browser/attribution_reporting/attribution_storage.h
@@ -39,7 +39,6 @@
   enum class AttributionType {
     kNavigation = 0,
     kEvent = 1,
-    kAggregate = 2,
   };
 
   // Storage delegate that can supplied to extend basic attribution storage
@@ -89,9 +88,9 @@
     virtual int GetMaxAttributionsPerOrigin() const = 0;
 
     // Returns the maximum number of distinct attribution destinations that can
-    // be in storage at any time for event sources with a given
-    // reporting origin.
-    virtual int GetMaxAttributionDestinationsPerEventSource() const = 0;
+    // be in storage at any time for sources with the same <source site,
+    // reporting origin>.
+    virtual int GetMaxDestinationsPerSourceSiteReportingOrigin() const = 0;
 
     // Returns the rate limits for capping contributions per window.
     virtual RateLimitConfig GetRateLimits(
@@ -114,6 +113,14 @@
     // no delay should be applied, e.g. due to debug mode.
     virtual absl::optional<OfflineReportDelayConfig>
     GetOfflineReportDelayConfig() const = 0;
+
+    // Shuffles reports to provide plausible deniability on the ordering of
+    // reports that share the same |report_time|. This is important because
+    // multiple conversions for the same impression share the same report time
+    // if they are within the same reporting window, and we do not want to allow
+    // ordering on their conversion metadata bits.
+    virtual void ShuffleReports(
+        std::vector<AttributionReport>& reports) const = 0;
   };
 
   struct CONTENT_EXPORT DeactivatedSource {
@@ -140,6 +147,7 @@
       kSuccess,
       kInternalError,
       kInsufficientSourceCapacity,
+      kInsufficientUniqueDestinationCapacity,
     };
 
     explicit StoreSourceResult(
@@ -239,7 +247,7 @@
   // Returns all of the reports that should be sent before
   // |max_report_time|. This call is logically const, and does not modify the
   // underlying storage. |limit| limits the number of reports to return; use
-  // a negative number for no limit.
+  // a negative number for no limit. Reports are shuffled before being returned.
   virtual std::vector<AttributionReport> GetAttributionsToReport(
       base::Time max_report_time,
       int limit = -1) = 0;
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
index 255250f..e0e860c9 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -44,10 +44,9 @@
 }
 
 int AttributionStorageDelegateImpl::
-    GetMaxAttributionDestinationsPerEventSource() const {
+    GetMaxDestinationsPerSourceSiteReportingOrigin() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(apaseltiner): Finalize a value for this.
-  return INT_MAX;
+  return 100;
 }
 
 AttributionStorage::Delegate::RateLimitConfig
@@ -62,11 +61,6 @@
           .time_window = base::Days(30),
           .max_contributions_per_window = 100,
       };
-    case AttributionType::kAggregate:
-      return {
-          .time_window = base::Days(7),
-          .max_contributions_per_window = 65536,
-      };
   }
 }
 
@@ -112,4 +106,10 @@
   };
 }
 
+void AttributionStorageDelegateImpl::ShuffleReports(
+    std::vector<AttributionReport>& reports) const {
+  if (!debug_mode_)
+    base::RandomShuffle(reports.begin(), reports.end());
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.h b/content/browser/attribution_reporting/attribution_storage_delegate_impl.h
index 3ef0520..b8da71b 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.h
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_STORAGE_DELEGATE_IMPL_H_
 #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_STORAGE_DELEGATE_IMPL_H_
 
+#include <vector>
+
 #include "base/sequence_checker.h"
 #include "content/browser/attribution_reporting/attribution_storage.h"
 #include "content/browser/attribution_reporting/common_source_info.h"
@@ -17,6 +19,8 @@
 
 namespace content {
 
+class AttributionReport;
+
 // Implementation of the storage delegate. This class handles assigning
 // report times to newly created reports. It
 // also controls constants for AttributionStorage. This is owned by
@@ -43,7 +47,7 @@
       CommonSourceInfo::SourceType source_type) const override;
   int GetMaxSourcesPerOrigin() const override;
   int GetMaxAttributionsPerOrigin() const override;
-  int GetMaxAttributionDestinationsPerEventSource() const override;
+  int GetMaxDestinationsPerSourceSiteReportingOrigin() const override;
   RateLimitConfig GetRateLimits(
       AttributionStorage::AttributionType attribution_type) const override;
   base::TimeDelta GetDeleteExpiredSourcesFrequency() const override;
@@ -51,6 +55,7 @@
   base::GUID NewReportID() const override;
   absl::optional<OfflineReportDelayConfig> GetOfflineReportDelayConfig()
       const override;
+  void ShuffleReports(std::vector<AttributionReport>& reports) const override;
 
  private:
   // Whether the API is running in debug mode, meaning that there should be
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index d16e0fdab..12367dc7 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -12,7 +12,6 @@
 
 #include "base/bind.h"
 #include "base/check_op.h"
-#include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/files/file_util.h"
 #include "base/guid.h"
@@ -116,17 +115,31 @@
 // Version 15 - 2021/11/13 - https://crrev.com/c/3180180
 //
 // Version 15 adds the conversions.external_report_id column.
-const int kCurrentVersionNumber = 15;
+//
+// Version 16 - 2022/01/31 - https://crrev.com/c/3421414
+//
+// Version 16 replaces the event_source_impression_site_idx with
+// impression_site_reporting_origin_idx, which applies to both source types and
+// includes the reporting origin.
+//
+// Version 17 - 2022/01/31 - https://crrev.com/c/3427311
+//
+// Version 17 removes the rate_limits.bucket and rate_limits.value columns.
+const int kCurrentVersionNumber = 17;
 
 // Earliest version which can use a |kCurrentVersionNumber| database
 // without failing.
-const int kCompatibleVersionNumber = 15;
+const int kCompatibleVersionNumber = 17;
 
 // Latest version of the database that cannot be upgraded to
 // |kCurrentVersionNumber| without razing the database.
 //
 // Versions 1-14 were deprecated by https://crrev.com/c/3421175.
-const int kDeprecatedVersionNumber = 14;
+//
+// Version 15 was deprecated by https://crrev.com/c/3421414.
+//
+// Version 16 was deprecated by https://crrev.com/c/3427311.
+const int kDeprecatedVersionNumber = 16;
 
 void RecordInitializationStatus(
     const AttributionStorageSql::InitStatus status) {
@@ -396,6 +409,11 @@
         StoreSourceResult::Status::kInsufficientSourceCapacity);
   }
 
+  if (!HasCapacityForUniqueDestinationLimitForPendingSource(source)) {
+    return StoreSourceResult(
+        StoreSourceResult::Status::kInsufficientUniqueDestinationCapacity);
+  }
+
   // Wrap the deactivation and insertion in the same transaction. If the
   // deactivation fails, we do not want to store the new source as we may
   // return the wrong set of sources for a trigger.
@@ -403,9 +421,6 @@
   if (!transaction.Begin())
     return StoreSourceResult(StoreSourceResult::Status::kInternalError);
 
-  if (!EnsureCapacityForPendingDestinationLimit(source))
-    return StoreSourceResult(StoreSourceResult::Status::kInternalError);
-
   const std::string serialized_conversion_destination =
       common_info.ConversionDestination().Serialize();
   const std::string serialized_reporting_origin =
@@ -915,6 +930,8 @@
 
   if (!statement.Succeeded())
     return {};
+
+  delegate_->ShuffleReports(reports);
   return reports;
 }
 
@@ -1570,13 +1587,13 @@
   if (!db_->Execute(kImpressionOriginIndexSql))
     return false;
 
-  // Optimizes `EnsureCapacityForPendingDestinationLimit()`, which only needs to
-  // examine active, unconverted, event-source sources.
-  static constexpr char kEventSourceImpressionSiteIndexSql[] =
-      "CREATE INDEX IF NOT EXISTS event_source_impression_site_idx "
-      "ON impressions(impression_site)"
-      "WHERE active = 1 AND num_conversions = 0 AND source_type = 1";
-  if (!db_->Execute(kEventSourceImpressionSiteIndexSql))
+  // Optimizes `HasCapacityForUniqueDestinationLimitForPendingSource()`, which
+  // only needs to examine active, unconverted sources.
+  static constexpr char kImpressionSiteReportingOriginIndexSql[] =
+      "CREATE INDEX IF NOT EXISTS impression_site_reporting_origin_idx "
+      "ON impressions(impression_site,reporting_origin)"
+      "WHERE active=1 AND num_conversions=0";
+  if (!db_->Execute(kImpressionSiteReportingOriginIndexSql))
     return false;
 
   // All columns in this table are const except |report_time| and
@@ -1678,92 +1695,46 @@
   db_init_status_ = DbStatus::kClosed;
 }
 
-bool AttributionStorageSql::EnsureCapacityForPendingDestinationLimit(
-    const StorableSource& source) {
-  // TODO(apaseltiner): Add metrics for how this behaves so we can see how often
-  // sites are hitting the limit.
-
-  if (source.common_info().source_type() !=
-      CommonSourceInfo::SourceType::kEvent)
-    return true;
-
-  static_assert(static_cast<int>(CommonSourceInfo::SourceType::kEvent) == 1,
-                "Update the SQL statement below and this condition");
-
-  const std::string serialized_conversion_destination =
-      source.common_info().ConversionDestination().Serialize();
-
-  // Optimized by `kEventSourceImpressionSiteIndexSql`.
-  static constexpr char kSelectSourcesSql[] =
-      "SELECT impression_id,conversion_destination FROM impressions "
-      DCHECK_SQL_INDEXED_BY("event_source_impression_site_idx")
-      "WHERE impression_site = ? AND source_type = 1 "
-      "AND active = 1 AND num_conversions = 0 "
-      "ORDER BY impression_time ASC";
-  sql::Statement statement(
-      db_->GetCachedStatement(SQL_FROM_HERE, kSelectSourcesSql));
-  statement.BindString(0, source.common_info().ImpressionSite().Serialize());
-
-  base::flat_map<std::string, size_t> conversion_destinations;
-
-  struct SourceData {
-    StoredSource::Id source_id;
-    std::string conversion_destination;
-  };
-  std::vector<SourceData> sources_by_impression_time;
-
-  while (statement.Step()) {
-    SourceData impression_data = {
-        .source_id = StoredSource::Id(statement.ColumnInt64(0)),
-        .conversion_destination = statement.ColumnString(1),
-    };
-
-    // If there's already a source matching the to-be-stored
-    // `impression_site` and `conversion_destination`, then the unique count
-    // won't be changed, so there's nothing else to do.
-    if (impression_data.conversion_destination ==
-        serialized_conversion_destination) {
-      return true;
-    }
-
-    conversion_destinations[impression_data.conversion_destination]++;
-    sources_by_impression_time.push_back(std::move(impression_data));
-  }
-
-  if (!statement.Succeeded())
-    return false;
-
-  const int max = delegate_->GetMaxAttributionDestinationsPerEventSource();
+bool AttributionStorageSql::
+    HasCapacityForUniqueDestinationLimitForPendingSource(
+        const StorableSource& source) {
+  const int max = delegate_->GetMaxDestinationsPerSourceSiteReportingOrigin();
   // TODO(apaseltiner): We could just make
-  // `GetMaxAttributionDestinationsPerEventSource()` return `size_t`, but it
+  // `GetMaxDestinationsPerSourceSiteReportingOrigin()` return `size_t`, but it
   // would be inconsistent with the other `AttributionStorage::Delegate`
   // methods.
   DCHECK_GT(max, 0);
 
-  // Otherwise, if there's capacity for the new `conversion_destination` to be
-  // stored for the `impression_site`, there's nothing else to do.
-  if (conversion_destinations.size() < static_cast<size_t>(max))
-    return true;
+  const std::string serialized_conversion_destination =
+      source.common_info().ConversionDestination().Serialize();
 
-  // Otherwise, delete sources in order by `impression_time` until the
-  // number of distinct `conversion_destination`s is under `max`.
-  std::vector<StoredSource::Id> source_ids_to_delete;
-  for (const auto& source_data : sources_by_impression_time) {
-    auto it = conversion_destinations.find(source_data.conversion_destination);
-    DCHECK(it != conversion_destinations.end());
-    it->second--;
-    if (it->second == 0)
-      conversion_destinations.erase(it);
-    source_ids_to_delete.push_back(source_data.source_id);
-    if (conversion_destinations.size() < static_cast<size_t>(max))
-      break;
+  // Optimized by `kImpressionSiteReportingOriginIndexSql`.
+  static constexpr char kSelectSourcesSql[] =
+      "SELECT conversion_destination FROM impressions "
+      DCHECK_SQL_INDEXED_BY("impression_site_reporting_origin_idx")
+      "WHERE impression_site=? AND reporting_origin=? "
+      "AND active=1 AND num_conversions=0";
+  sql::Statement statement(
+      db_->GetCachedStatement(SQL_FROM_HERE, kSelectSourcesSql));
+  statement.BindString(0, source.common_info().ImpressionSite().Serialize());
+  statement.BindString(
+      1, SerializeOrigin(source.common_info().reporting_origin()));
+
+  base::flat_set<std::string> destinations;
+  while (statement.Step()) {
+    std::string destination = statement.ColumnString(0);
+
+    // The destination isn't new, so it doesn't change the count.
+    if (destination == serialized_conversion_destination)
+      return true;
+
+    destinations.insert(std::move(destination));
+
+    if (destinations.size() == static_cast<size_t>(max))
+      return false;
   }
 
-  return DeleteSources(source_ids_to_delete);
-
-  // Because this is limited to active sources with `num_conversions = 0`,
-  // we should be guaranteed that there is not any corresponding data in the
-  // rate limit table or the report table.
+  return statement.Succeeded();
 }
 
 bool AttributionStorageSql::DeleteSources(
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h
index d4b1d6cd..78b994d 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.h
+++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -171,11 +171,7 @@
   absl::optional<std::vector<int64_t>> ReadDedupKeys(StoredSource::Id source_id)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
 
-  // When storing an event source, deletes active event
-  // sources in order by |impression_time| until there are sufficiently few
-  // unique conversion destinations for the same |impression_site|. Returns
-  // false on failure.
-  [[nodiscard]] bool EnsureCapacityForPendingDestinationLimit(
+  [[nodiscard]] bool HasCapacityForUniqueDestinationLimitForPendingSource(
       const StorableSource& source) VALID_CONTEXT_REQUIRED(sequence_checker_);
 
   [[nodiscard]] bool StoreReport(const AttributionReport& report)
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
index c32b1fa..86ea4ad 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
@@ -29,7 +29,7 @@
   return output;
 }
 
-const int kCurrentVersionNumber = 15;
+const int kCurrentVersionNumber = 17;
 
 }  // namespace
 
@@ -57,7 +57,7 @@
   std::string GetCurrentSchema() {
     base::FilePath current_version_path = temp_directory_.GetPath().Append(
         FILE_PATH_LITERAL("TestCurrentVersion.db"));
-    LoadDatabase(FILE_PATH_LITERAL("version_15.sql"), current_version_path);
+    LoadDatabase(FILE_PATH_LITERAL("version_17.sql"), current_version_path);
     sql::Database db;
     EXPECT_TRUE(db.Open(current_version_path));
     return db.GetSchema();
@@ -136,7 +136,7 @@
 
 TEST_F(AttributionStorageSqlMigrationsTest, MigrateLatestDeprecatedToCurrent) {
   base::HistogramTester histograms;
-  LoadDatabase(FILE_PATH_LITERAL("version_14.sql"), DbPath());
+  LoadDatabase(FILE_PATH_LITERAL("version_16.sql"), DbPath());
 
   // Verify pre-conditions.
   {
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc
index d6749db..e592b3d2 100644
--- a/content/browser/attribution_reporting/attribution_storage_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -929,54 +929,54 @@
 }
 
 TEST_F(AttributionStorageTest,
-       MaxAttributionDestinationsPerSource_AlreadyStored) {
-  const auto impression =
-      SourceBuilder()
-          .SetSourceType(CommonSourceInfo::SourceType::kEvent)
-          .Build();
+       MaxDestinationsPerSource_ScopedToSourceSiteAndReportingOrigin) {
+  delegate()->set_max_destinations_per_source_site_reporting_origin(3);
 
-  // Setting this doesn't affect the test behavior, but makes it clear that the
-  // test passes without depending on the default value of |INT_MAX|.
-  delegate()->set_max_attribution_destinations_per_event_source(1);
-  storage()->StoreSource(impression);
-  storage()->StoreSource(impression);
+  const auto store_source = [&](const char* impression_origin,
+                                const char* reporting_origin,
+                                const char* destination_origin) {
+    return storage()
+        ->StoreSource(
+            SourceBuilder()
+                .SetImpressionOrigin(
+                    url::Origin::Create(GURL(impression_origin)))
+                .SetReportingOrigin(url::Origin::Create(GURL(reporting_origin)))
+                .SetConversionOrigin(
+                    url::Origin::Create(GURL(destination_origin)))
+                .SetExpiry(base::Days(30))
+                .Build())
+        .status;
+  };
 
-  // The second impression's |conversion_destination| matches the first's, so it
-  // doesn't add to the number of distinct values for the |impression_site|,
-  // and both impressions should be stored.
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(2));
-}
+  store_source("https://s1.test", "https://a.r.test", "https://d1.test");
+  store_source("https://s1.test", "https://a.r.test", "https://d2.test");
+  store_source("https://s1.test", "https://a.r.test", "https://d3.test");
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(3));
 
-TEST_F(
-    AttributionStorageTest,
-    MaxAttributionDestinationsPerSource_DifferentImpressionSitesAreIndependent) {
-  // Setting this doesn't affect the test behavior, but makes it clear that the
-  // test passes without depending on the default value of |INT_MAX|.
-  delegate()->set_max_attribution_destinations_per_event_source(1);
-  storage()->StoreSource(
-      SourceBuilder()
-          .SetImpressionOrigin(url::Origin::Create(GURL("https://a.example")))
-          .SetConversionOrigin(url::Origin::Create(GURL("https://c.example")))
-          .SetSourceType(CommonSourceInfo::SourceType::kEvent)
-          .Build());
-  storage()->StoreSource(
-      SourceBuilder()
-          .SetImpressionOrigin(url::Origin::Create(GURL("https://b.example")))
-          .SetConversionOrigin(url::Origin::Create(GURL("https://d.example")))
-          .SetSourceType(CommonSourceInfo::SourceType::kEvent)
-          .Build());
+  // This should succeed because the destination is already present on a pending
+  // source.
+  store_source("https://s1.test", "https://a.r.test", "https://d2.test");
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(4));
 
-  // The two impressions together have 2 distinct |conversion_destination|
-  // values, but they are independent because they vary by |impression_site|, so
-  // both should be stored.
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(2));
+  // This should fail because there are already 3 distinct destinations.
+  EXPECT_EQ(
+      store_source("https://s1.test", "https://a.r.test", "https://d4.test"),
+      AttributionStorage::StoreSourceResult::Status::
+          kInsufficientUniqueDestinationCapacity);
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(4));
+
+  // This should succeed because the source site is different.
+  store_source("https://s2.test", "https://a.r.test", "https://d5.test");
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(5));
+
+  // This should succeed because the reporting origin is different.
+  store_source("https://s1.test", "https://b.r.test", "https://d5.test");
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(6));
 }
 
 TEST_F(AttributionStorageTest,
-       MaxAttributionDestinationsPerSource_IrrelevantForNavigationSources) {
-  // Setting this doesn't affect the test behavior, but makes it clear that the
-  // test passes without depending on the default value of |INT_MAX|.
-  delegate()->set_max_attribution_destinations_per_event_source(1);
+       MaxAttributionDestinationsPerSource_AppliesToNavigationSources) {
+  delegate()->set_max_destinations_per_source_site_reporting_origin(1);
   storage()->StoreSource(
       SourceBuilder()
           .SetConversionOrigin(url::Origin::Create(GURL("https://a.example/")))
@@ -986,100 +986,60 @@
           .SetConversionOrigin(url::Origin::Create(GURL("https://b.example")))
           .Build());
 
-  // Both impressions should be stored because they are navigation source.
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(2));
-}
-
-TEST_F(
-    AttributionStorageTest,
-    MaxAttributionDestinationsPerSource_InsufficientCapacityDeletesOldImpressions) {
-  // Verifies that active sources are removed in order, and that the destination
-  // limit handles multiple active impressions for the same destination when
-  // deleting.
-
-  struct {
-    std::string impression_origin;
-    std::string conversion_origin;
-    int max;
-  } kImpressions[] = {
-      {"https://foo.test.example", "https://a.example", INT_MAX},
-      {"https://bar.test.example", "https://b.example", INT_MAX},
-      {"https://xyz.test.example", "https://a.example", INT_MAX},
-      {"https://ghi.test.example", "https://b.example", INT_MAX},
-      {"https://qrs.test.example", "https://c.example", 2},
-  };
-
-  for (const auto& impression : kImpressions) {
-    delegate()->set_max_attribution_destinations_per_event_source(
-        impression.max);
-    storage()->StoreSource(
-        SourceBuilder()
-            .SetImpressionOrigin(
-                url::Origin::Create(GURL(impression.impression_origin)))
-            .SetConversionOrigin(
-                url::Origin::Create(GURL(impression.conversion_origin)))
-            .SetSourceType(CommonSourceInfo::SourceType::kEvent)
-            .Build());
-    task_environment_.FastForwardBy(base::Milliseconds(1));
-  }
-
-  EXPECT_THAT(storage()->GetActiveSources(),
-              ElementsAre(ImpressionOriginIs(url::Origin::Create(
-                              GURL("https://ghi.test.example"))),
-                          ImpressionOriginIs(url::Origin::Create(
-                              GURL("https://qrs.test.example")))));
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
 }
 
 TEST_F(AttributionStorageTest,
-       MaxAttributionDestinationsPerSource_IgnoresInactiveImpressions) {
-  delegate()->set_max_attributions_per_source(1);
-  delegate()->set_max_attribution_destinations_per_event_source(INT_MAX);
-
+       MaxAttributionDestinationsPerSource_CountsAllSourceTypes) {
+  delegate()->set_max_destinations_per_source_site_reporting_origin(1);
   storage()->StoreSource(
       SourceBuilder()
-          .SetSourceType(CommonSourceInfo::SourceType::kEvent)
+          .SetConversionOrigin(url::Origin::Create(GURL("https://a.example/")))
+          .SetSourceType(CommonSourceInfo::SourceType::kNavigation)
           .Build());
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
-
-  EXPECT_EQ(CreateReportStatus::kSuccess,
-            MaybeCreateAndStoreReport(DefaultTrigger()));
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
-
-  // Force the impression to be deactivated by ensuring that the next report is
-  // in a different window.
-  delegate()->set_report_time_ms(kReportTime + 1);
-  EXPECT_EQ(CreateReportStatus::kPriorityTooLow,
-            MaybeCreateAndStoreReport(DefaultTrigger()));
-  EXPECT_THAT(storage()->GetActiveSources(), IsEmpty());
-
-  task_environment_.FastForwardBy(base::Milliseconds(1));
-  storage()->StoreSource(
-      SourceBuilder()
-          .SetConversionOrigin(url::Origin::Create(GURL("https://a.example")))
-          .SetSourceType(CommonSourceInfo::SourceType::kEvent)
-          .Build());
-  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
-
-  delegate()->set_max_attribution_destinations_per_event_source(1);
-  task_environment_.FastForwardBy(base::Milliseconds(1));
   storage()->StoreSource(
       SourceBuilder()
           .SetConversionOrigin(url::Origin::Create(GURL("https://b.example")))
           .SetSourceType(CommonSourceInfo::SourceType::kEvent)
           .Build());
 
-  // The earliest active impression should be deleted to make room for this new
-  // one.
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
+}
+
+TEST_F(AttributionStorageTest,
+       MaxAttributionDestinationsPerSource_IgnoresInactiveImpressions) {
+  delegate()->set_max_attributions_per_source(1);
+  delegate()->set_max_destinations_per_source_site_reporting_origin(INT_MAX);
+
+  const auto origin_a = url::Origin::Create(GURL("https://a.example"));
+
+  storage()->StoreSource(SourceBuilder().SetConversionOrigin(origin_a).Build());
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
+
+  const auto trigger =
+      TriggerBuilder()
+          .SetConversionDestination(net::SchemefulSite(origin_a))
+          .Build();
+
+  EXPECT_EQ(CreateReportStatus::kSuccess, MaybeCreateAndStoreReport(trigger));
+  EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
+
+  // Force the impression to be deactivated by ensuring that the next report is
+  // in a different window.
+  delegate()->set_report_time_ms(kReportTime + 1);
+  EXPECT_EQ(CreateReportStatus::kPriorityTooLow,
+            MaybeCreateAndStoreReport(trigger));
+  EXPECT_THAT(storage()->GetActiveSources(), IsEmpty());
+
+  delegate()->set_max_destinations_per_source_site_reporting_origin(1);
+  storage()->StoreSource(
+      SourceBuilder()
+          .SetConversionOrigin(url::Origin::Create(GURL("https://b.example")))
+          .Build());
+
   EXPECT_THAT(storage()->GetActiveSources(),
               ElementsAre(ConversionOriginIs(
                   url::Origin::Create(GURL("https://b.example")))));
-
-  // Both the inactive impression and the new one for b.example should be
-  // retained; a.example is the only one that should have been deleted. The
-  // presence of 1 conversion to report implies that the inactive impression
-  // remains in the DB.
-  task_environment_.FastForwardBy(base::Milliseconds(kReportTime));
-  EXPECT_THAT(storage()->GetAttributionsToReport(base::Time::Now()), SizeIs(1));
 }
 
 TEST_F(AttributionStorageTest,
@@ -1707,4 +1667,31 @@
   EXPECT_EQ(storage()->GetNextReportTime(report_time_b), absl::nullopt);
 }
 
+TEST_F(AttributionStorageTest, GetAttributionsToReport_Shuffles) {
+  storage()->StoreSource(SourceBuilder().Build());
+  EXPECT_EQ(
+      CreateReportStatus::kSuccess,
+      MaybeCreateAndStoreReport(TriggerBuilder().SetTriggerData(3).Build()));
+  EXPECT_EQ(
+      CreateReportStatus::kSuccess,
+      MaybeCreateAndStoreReport(TriggerBuilder().SetTriggerData(1).Build()));
+  EXPECT_EQ(
+      CreateReportStatus::kSuccess,
+      MaybeCreateAndStoreReport(TriggerBuilder().SetTriggerData(2).Build()));
+
+  EXPECT_THAT(storage()->GetAttributionsToReport(
+                  /*max_report_time=*/base::Time::Max(), /*limit=*/-1),
+              ElementsAre(EventLevelDataIs(TriggerDataIs(3)),
+                          EventLevelDataIs(TriggerDataIs(1)),
+                          EventLevelDataIs(TriggerDataIs(2))));
+
+  delegate()->set_reverse_reports_on_shuffle(true);
+
+  EXPECT_THAT(storage()->GetAttributionsToReport(
+                  /*max_report_time=*/base::Time::Max(), /*limit=*/-1),
+              ElementsAre(EventLevelDataIs(TriggerDataIs(2)),
+                          EventLevelDataIs(TriggerDataIs(1)),
+                          EventLevelDataIs(TriggerDataIs(3))));
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc
index 0ac01dd..50ca273 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/task_runner_util.h"
@@ -80,9 +81,9 @@
   return max_attributions_per_origin_;
 }
 
-int ConfigurableStorageDelegate::GetMaxAttributionDestinationsPerEventSource()
-    const {
-  return max_attribution_destinations_per_event_source_;
+int ConfigurableStorageDelegate::
+    GetMaxDestinationsPerSourceSiteReportingOrigin() const {
+  return max_destinations_per_source_site_reporting_origin_;
 }
 
 AttributionStorage::Delegate::RateLimitConfig
@@ -110,6 +111,12 @@
   return offline_report_delay_config_;
 }
 
+void ConfigurableStorageDelegate::ShuffleReports(
+    std::vector<AttributionReport>& reports) const {
+  if (reverse_reports_on_shuffle_)
+    base::ranges::reverse(reports);
+}
+
 AttributionManager* TestManagerProvider::GetManager(
     WebContents* web_contents) const {
   return manager_;
@@ -662,6 +669,8 @@
       return out << "kInternalError";
     case StoreSourceResult::Status::kInsufficientSourceCapacity:
       return out << "kInsufficientSourceCapacity";
+    case StoreSourceResult::Status::kInsufficientUniqueDestinationCapacity:
+      return out << "kInsufficientUniqueDestinationCapacity";
   }
 }
 
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h
index 1bd3b0ac..330da3d 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.h
+++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -91,12 +91,13 @@
   int GetMaxAttributionsPerOrigin() const override;
   RateLimitConfig GetRateLimits(
       AttributionStorage::AttributionType attribution_type) const override;
-  int GetMaxAttributionDestinationsPerEventSource() const override;
+  int GetMaxDestinationsPerSourceSiteReportingOrigin() const override;
   base::TimeDelta GetDeleteExpiredSourcesFrequency() const override;
   base::TimeDelta GetDeleteExpiredRateLimitsFrequency() const override;
   base::GUID NewReportID() const override;
   absl::optional<OfflineReportDelayConfig> GetOfflineReportDelayConfig()
       const override;
+  void ShuffleReports(std::vector<AttributionReport>& reports) const override;
 
   void set_max_attributions_per_source(int max) {
     max_attributions_per_source_ = max;
@@ -108,8 +109,8 @@
     max_attributions_per_origin_ = max;
   }
 
-  void set_max_attribution_destinations_per_event_source(int max) {
-    max_attribution_destinations_per_event_source_ = max;
+  void set_max_destinations_per_source_site_reporting_origin(int max) {
+    max_destinations_per_source_site_reporting_origin_ = max;
   }
 
   void set_rate_limits(RateLimitConfig c) { rate_limits_ = c; }
@@ -131,11 +132,15 @@
     offline_report_delay_config_ = config;
   }
 
+  void set_reverse_reports_on_shuffle(bool reverse) {
+    reverse_reports_on_shuffle_ = reverse;
+  }
+
  private:
   int max_attributions_per_source_ = INT_MAX;
   int max_sources_per_origin_ = INT_MAX;
   int max_attributions_per_origin_ = INT_MAX;
-  int max_attribution_destinations_per_event_source_ = INT_MAX;
+  int max_destinations_per_source_site_reporting_origin_ = INT_MAX;
 
   RateLimitConfig rate_limits_ = {
       .time_window = base::TimeDelta::Max(),
@@ -148,6 +153,10 @@
   int report_time_ms_ = 0;
 
   absl::optional<OfflineReportDelayConfig> offline_report_delay_config_;
+
+  // If true, `ShuffleReports()` reverses the reports to allow testing the
+  // proper call from `AttributionStorage::GetAttributionsToReport()`.
+  bool reverse_reports_on_shuffle_ = false;
 };
 
 // Test manager provider which can be used to inject a fake AttributionManager.
diff --git a/content/browser/attribution_reporting/rate_limit_table.cc b/content/browser/attribution_reporting/rate_limit_table.cc
index 6b45be7..61b73aa1 100644
--- a/content/browser/attribution_reporting/rate_limit_table.cc
+++ b/content/browser/attribution_reporting/rate_limit_table.cc
@@ -26,7 +26,6 @@
 constexpr AttributionType kAttributionTypes[] = {
     AttributionType::kNavigation,
     AttributionType::kEvent,
-    AttributionType::kAggregate,
 };
 
 AttributionType AttributionTypeFromSourceType(
@@ -67,13 +66,6 @@
   // |conversion_destination| is the destination of the conversion.
   // |conversion_origin| is the origin of the conversion.
   // |conversion_time| is the report's conversion time.
-  // |bucket| is the bucket for aggregate histogram contributions. It is unused
-  // for now, but we want the table to be extensible to a number of different
-  // types of limits. These include limiting total contributions across all
-  // buckets, as well as limiting the number of contributions to any one bucket.
-  // |value| is the magnitude of this contribution when compared against rate
-  // limits. For event-level rows, this is 1. For aggregate contributions, this
-  // is the value of the individual contribution to a bucket.
   static constexpr char kRateLimitTableSql[] =
       "CREATE TABLE IF NOT EXISTS rate_limits"
       "(rate_limit_id INTEGER PRIMARY KEY NOT NULL,"
@@ -83,9 +75,7 @@
       "impression_origin TEXT NOT NULL,"
       "conversion_destination TEXT NOT NULL,"
       "conversion_origin TEXT NOT NULL,"
-      "conversion_time INTEGER NOT NULL,"
-      "bucket TEXT NOT NULL,"
-      "value INTEGER NOT NULL)";
+      "conversion_time INTEGER NOT NULL)";
   if (!db->Execute(kRateLimitTableSql))
     return false;
 
@@ -126,12 +116,7 @@
       SerializeOrigin(report.source().common_info().impression_origin()),
       report.source().common_info().ConversionDestination().Serialize(),
       SerializeOrigin(report.source().common_info().conversion_origin()),
-      report.trigger_time(),
-      // Rate limits for the event-level API do not have a bucket.
-      /*bucket=*/"",
-      // By supplying 1 here, rate limits for the event-level API act
-      // as a count.
-      /*value=*/1u);
+      report.trigger_time());
 }
 
 bool RateLimitTable::AddRow(
@@ -142,9 +127,7 @@
     const std::string& serialized_impression_origin,
     const std::string& serialized_conversion_destination,
     const std::string& serialized_conversion_origin,
-    base::Time time,
-    const std::string& bucket,
-    uint32_t value) {
+    base::Time time) {
   // Only delete expired rate limits periodically to avoid excessive DB
   // operations.
   const base::TimeDelta delete_frequency =
@@ -160,8 +143,8 @@
   static constexpr char kStoreRateLimitSql[] =
       "INSERT INTO rate_limits"
       "(attribution_type,impression_id,impression_site,impression_origin,"
-      "conversion_destination,conversion_origin,conversion_time,bucket,value)"
-      "VALUES(?,?,?,?,?,?,?,?,?)";
+      "conversion_destination,conversion_origin,conversion_time)"
+      "VALUES(?,?,?,?,?,?,?)";
   sql::Statement statement(
       db->GetCachedStatement(SQL_FROM_HERE, kStoreRateLimitSql));
   statement.BindInt(0, SerializeAttributionType(attribution_type));
@@ -171,8 +154,6 @@
   statement.BindString(4, serialized_conversion_destination);
   statement.BindString(5, serialized_conversion_origin);
   statement.BindTime(6, time);
-  statement.BindString(7, bucket);
-  statement.BindInt64(8, static_cast<int64_t>(value));
   return statement.Run();
 }
 
@@ -214,7 +195,7 @@
   base::Time min_timestamp = now - rate_limits.time_window;
 
   static constexpr char kAttributionAllowedSql[] =
-      "SELECT value FROM rate_limits "
+      "SELECT COUNT(*) FROM rate_limits "
       DCHECK_SQL_INDEXED_BY("rate_limit_impression_site_type_idx")
       "WHERE attribution_type = ? "
       "AND impression_site = ? "
@@ -227,16 +208,13 @@
   statement.BindString(2, serialized_conversion_destination);
   statement.BindTime(3, min_timestamp);
 
-  int64_t sum = 0;
-  while (statement.Step()) {
-    int64_t value = statement.ColumnInt64(0);
-    sum += value;
-  }
-  if (!statement.Succeeded())
+  if (!statement.Step())
     return -1;
 
-  return rate_limits.max_contributions_per_window > sum
-             ? rate_limits.max_contributions_per_window - sum
+  int64_t count = statement.ColumnInt64(0);
+
+  return rate_limits.max_contributions_per_window > count
+             ? rate_limits.max_contributions_per_window - count
              : 0;
 }
 
@@ -373,58 +351,4 @@
   return transaction.Commit();
 }
 
-AttributionAllowedStatus
-RateLimitTable::AddAggregateHistogramContributionsForTesting(
-    sql::Database* db,
-    const StoredSource& source,
-    const std::vector<AggregateHistogramContribution>& contributions) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  base::Time now = base::Time::Now();
-
-  const std::string serialized_impression_site =
-      source.common_info().ImpressionSite().Serialize();
-  const std::string serialized_conversion_destination =
-      source.common_info().ConversionDestination().Serialize();
-
-  const int64_t capacity =
-      GetCapacity(db, AttributionType::kAggregate, serialized_impression_site,
-                  serialized_conversion_destination, now);
-  // This should only be possible if there is DB corruption.
-  if (capacity < 0)
-    return AttributionAllowedStatus::kError;
-  if (capacity == 0)
-    return AttributionAllowedStatus::kNotAllowed;
-
-  int64_t new_sum = 0;
-  for (const auto& contribution : contributions) {
-    DCHECK_GT(contribution.value, 0u);
-    new_sum += contribution.value;
-  }
-
-  if (new_sum > capacity)
-    return AttributionAllowedStatus::kNotAllowed;
-
-  sql::Transaction transaction(db);
-  if (!transaction.Begin())
-    return AttributionAllowedStatus::kError;
-
-  const std::string serialized_impression_origin =
-      SerializeOrigin(source.common_info().impression_origin());
-  const std::string serialized_conversion_origin =
-      SerializeOrigin(source.common_info().conversion_origin());
-
-  for (const auto& contribution : contributions) {
-    if (!AddRow(db, AttributionType::kAggregate, source.source_id(),
-                serialized_impression_site, serialized_impression_origin,
-                serialized_conversion_destination, serialized_conversion_origin,
-                now, contribution.bucket, contribution.value)) {
-      return AttributionAllowedStatus::kError;
-    }
-  }
-
-  return transaction.Commit() ? AttributionAllowedStatus::kAllowed
-                              : AttributionAllowedStatus::kError;
-}
-
 }  // namespace content
diff --git a/content/browser/attribution_reporting/rate_limit_table.h b/content/browser/attribution_reporting/rate_limit_table.h
index 18fa214..5ee69a9 100644
--- a/content/browser/attribution_reporting/rate_limit_table.h
+++ b/content/browser/attribution_reporting/rate_limit_table.h
@@ -29,11 +29,6 @@
 
 class AttributionReport;
 
-struct AggregateHistogramContribution {
-  std::string bucket;
-  uint32_t value;
-};
-
 // Manages storage for rate-limiting reports.
 // This class may be constructed on any sequence but must be accessed and
 // destroyed on the same sequence. The sequence must outlive |this|.
@@ -67,16 +62,6 @@
                                               const AttributionReport& report,
                                               base::Time now);
 
-  // Attempts to add a set of histogram contributions to the rate limit. Returns
-  // `kAllowed` if the contributions were added, `kNotAllowed` if the reports
-  // would have exceeded the limit, and `kError` otherwise. This API will change
-  // as we iterate on the aggregate API, so for now it is only available in
-  // tests.
-  AttributionAllowedStatus AddAggregateHistogramContributionsForTesting(
-      sql::Database* db,
-      const StoredSource& source,
-      const std::vector<AggregateHistogramContribution>& contributions);
-
   // These should be 1:1 with |AttributionStorageSql|'s |ClearData| functions.
   // Returns false on failure.
   [[nodiscard]] bool ClearAllDataAllTime(sql::Database* db);
@@ -110,9 +95,7 @@
       const std::string& serialized_impression_origin,
       const std::string& serialized_conversion_destination,
       const std::string& serialized_conversion_origin,
-      base::Time time,
-      const std::string& bucket,
-      uint32_t value) VALID_CONTEXT_REQUIRED(sequence_checker_);
+      base::Time time) VALID_CONTEXT_REQUIRED(sequence_checker_);
 
   // Returns false on failure.
   [[nodiscard]] bool ClearAllDataInRange(sql::Database* db,
diff --git a/content/browser/attribution_reporting/rate_limit_table_unittest.cc b/content/browser/attribution_reporting/rate_limit_table_unittest.cc
index 6d6e0a7..e058685 100644
--- a/content/browser/attribution_reporting/rate_limit_table_unittest.cc
+++ b/content/browser/attribution_reporting/rate_limit_table_unittest.cc
@@ -465,23 +465,6 @@
       &db, base::Time(), base::Time::Max(),
       base::BindRepeating(std::equal_to<url::Origin>(), example_a)));
   EXPECT_EQ(0u, GetRateLimitRows(&db));
-
-  EXPECT_EQ(AttributionAllowedStatus::kAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db,
-                SourceBuilder()
-                    .SetImpressionOrigin(example_a)
-                    .SetConversionOrigin(example_b)
-                    .SetSourceId(StoredSource::Id(1))
-                    .BuildStored(),
-                {{.bucket = "a", .value = 2}}));
-  EXPECT_EQ(1u, GetRateLimitRows(&db));
-
-  // Should delete (example_a, example_b).
-  EXPECT_TRUE(table()->ClearDataForOriginsInRange(
-      &db, base::Time(), base::Time::Max(),
-      base::BindRepeating(std::equal_to<url::Origin>(), example_a)));
-  EXPECT_EQ(0u, GetRateLimitRows(&db));
 }
 
 TEST_F(RateLimitTableTest, AddRateLimit_DeletesExpiredRateLimits) {
@@ -578,60 +561,4 @@
                 &db, NewConversionReport(example_c, example_d), now));
 }
 
-TEST_F(RateLimitTableTest, Aggregate) {
-  sql::Database db;
-  EXPECT_TRUE(db.Open(db_path()));
-  EXPECT_TRUE(table()->CreateTable(&db));
-
-  delegate()->set_rate_limits({
-      .time_window = base::Days(7),
-      .max_contributions_per_window = 16,
-  });
-
-  const auto impression =
-      SourceBuilder()
-          .SetImpressionOrigin(url::Origin::Create(GURL("https://a.example/")))
-          .SetConversionOrigin(url::Origin::Create(GURL("https://b.example/")))
-          .SetSourceId(StoredSource::Id(1))
-          .BuildStored();
-
-  EXPECT_EQ(AttributionAllowedStatus::kAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db, impression,
-                {
-                    {.bucket = "a", .value = 2},
-                    {.bucket = "b", .value = 5},
-                }));
-
-  EXPECT_EQ(AttributionAllowedStatus::kNotAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db, impression,
-                {
-                    {.bucket = "a", .value = 10},
-                }));
-
-  task_environment_.FastForwardBy(base::Days(7) - base::Milliseconds(1));
-  EXPECT_EQ(AttributionAllowedStatus::kAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db, impression,
-                {
-                    {.bucket = "a", .value = 9},
-                }));
-  EXPECT_EQ(AttributionAllowedStatus::kNotAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db, impression,
-                {
-                    {.bucket = "b", .value = 1},
-                }));
-
-  // This is checking expiry behavior.
-  task_environment_.FastForwardBy(base::Days(1));
-  EXPECT_EQ(AttributionAllowedStatus::kAllowed,
-            table()->AddAggregateHistogramContributionsForTesting(
-                &db, impression,
-                {
-                    {.bucket = "a", .value = 7},
-                }));
-}
-
 }  // namespace content
diff --git a/content/browser/back_forward_cache_basics_browsertest.cc b/content/browser/back_forward_cache_basics_browsertest.cc
index ed38b32..6fc91a3c 100644
--- a/content/browser/back_forward_cache_basics_browsertest.cc
+++ b/content/browser/back_forward_cache_basics_browsertest.cc
@@ -32,6 +32,8 @@
 
 namespace content {
 
+using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
+
 // Navigate from A to B and go back.
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, Basic) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -202,11 +204,11 @@
   ASSERT_TRUE(ExecJs(rfh_b.get(), "history.back();"));
   ASSERT_TRUE(rfh_b.WaitUntilRenderFrameDeleted());
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kRelatedActiveContentsExist,
-       BackForwardCacheMetrics::NotRestoredReason::kBrowsingInstanceNotSwapped},
-      {}, {ShouldSwapBrowsingInstance::kNo_HasRelatedActiveContents}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kRelatedActiveContentsExist,
+                     NotRestoredReason::kBrowsingInstanceNotSwapped},
+                    {},
+                    {ShouldSwapBrowsingInstance::kNo_HasRelatedActiveContents},
+                    {}, {}, FROM_HERE);
 
   // 4) Make the popup drop the window.opener connection. It happens when the
   //    user does an omnibox-initiated navigation, which happens in a new
@@ -596,8 +598,7 @@
   // 3) Go back.
   web_contents()->GetController().GoBack();
   EXPECT_FALSE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::kLoading}, {},
-                    {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kLoading}, {}, {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -634,8 +635,8 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
       {
-          BackForwardCacheMetrics::NotRestoredReason::kLoading,
-          BackForwardCacheMetrics::NotRestoredReason::kSubframeIsNavigating,
+          NotRestoredReason::kLoading,
+          NotRestoredReason::kSubframeIsNavigating,
       },
       {}, {}, {}, {}, FROM_HERE);
 }
@@ -675,8 +676,8 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
       {
-          BackForwardCacheMetrics::NotRestoredReason::kLoading,
-          BackForwardCacheMetrics::NotRestoredReason::kSubframeIsNavigating,
+          NotRestoredReason::kLoading,
+          NotRestoredReason::kSubframeIsNavigating,
       },
       {}, {}, {}, {}, FROM_HERE);
 }
@@ -700,9 +701,8 @@
 
   // Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kHTTPStatusNotOK}, {}, {},
-      {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kHTTPStatusNotOK}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -742,8 +742,7 @@
   web_contents()->GetController().GoBack();
   EXPECT_FALSE(WaitForLoadStop(shell()->web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kHTTPStatusNotOK,
-       BackForwardCacheMetrics::NotRestoredReason::kNoResponseHead},
+      {NotRestoredReason::kHTTPStatusNotOK, NotRestoredReason::kNoResponseHead},
       {}, {}, {}, {}, FROM_HERE);
 }
 
@@ -1130,9 +1129,8 @@
       (use_sticky_feature == StickinessType::kSticky)
           ? blink::scheduler::WebSchedulerTrackedFeature::kDummy
           : blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel;
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {expected_feature}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {expected_feature}, {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(HighCacheSizeBackForwardCacheBrowserTest,
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc
index 375bbea..a7a07d5 100644
--- a/content/browser/back_forward_cache_features_browsertest.cc
+++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -49,6 +49,8 @@
 
 namespace content {
 
+using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
+
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
                        SubframeWithDisallowedFeatureNotCached) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -73,7 +75,7 @@
   // Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kDedicatedWorkerOrWorklet},
       {}, {}, {}, FROM_HERE);
 }
@@ -175,7 +177,7 @@
   // WebTransport.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kWebTransport}, {}, {}, {},
       FROM_HERE);
 }
@@ -252,7 +254,7 @@
   // respectively. Confirm both are recorded.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kWebTransport,
        blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel},
       {}, {}, {}, FROM_HERE);
@@ -312,7 +314,7 @@
   // dedicated worker but was closed, then this doesn't affect the cache usage.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -382,9 +384,8 @@
   // Go back to A.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestRedirected},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestRedirected}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Tests the case when the page starts fetching in a nested dedicated worker,
@@ -460,9 +461,8 @@
   // Go back to A.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestRedirected},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestRedirected}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Tests the case when the page starts fetching in a dedicated worker, goes to
@@ -521,9 +521,8 @@
   // back-forward cache.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Tests the case when the page starts fetching in a nested dedicated worker,
@@ -587,9 +586,8 @@
   // back-forward cache.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Tests the case when fetching started in a dedicated worker and the header was
@@ -638,9 +636,9 @@
   // navigation to B.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kNetworkRequestDatapipeDrainedAsBytesConsumer},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kNetworkRequestDatapipeDrainedAsBytesConsumer}, {},
+      {}, {}, {}, FROM_HERE);
 }
 
 // Tests the case when fetching started in a nested dedicated worker and the
@@ -696,9 +694,9 @@
   // navigation to B.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kNetworkRequestDatapipeDrainedAsBytesConsumer},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kNetworkRequestDatapipeDrainedAsBytesConsumer}, {},
+      {}, {}, {}, FROM_HERE);
 }
 
 // Tests the case when fetch started in a dedicated worker, but the response
@@ -754,9 +752,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestTimeout}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestTimeout}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Tests the case when fetch started in a nested dedicated worker, but the
@@ -819,9 +816,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestTimeout}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestTimeout}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Tests that dedicated workers in back/forward cache are not visible to a
@@ -1054,7 +1050,7 @@
   // Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kSharedWorker}, {}, {}, {},
       FROM_HERE);
 }
@@ -1127,11 +1123,9 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kMediaDevicesDispatcherHost);
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kWasGrantedMediaAccess,
-       BackForwardCacheMetrics::NotRestoredReason::
-           kDisableForRenderFrameHostCalled},
-      {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kWasGrantedMediaAccess,
+                     NotRestoredReason::kDisableForRenderFrameHostCalled},
+                    {}, {}, {reason}, {}, FROM_HERE);
   EXPECT_TRUE(
       tester.IsDisabledForFrameWithReason(process_id, routing_id, reason));
 }
@@ -1175,11 +1169,9 @@
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kMediaDevicesDispatcherHost);
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kWasGrantedMediaAccess,
-       BackForwardCacheMetrics::NotRestoredReason::
-           kDisableForRenderFrameHostCalled},
-      {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kWasGrantedMediaAccess,
+                     NotRestoredReason::kDisableForRenderFrameHostCalled},
+                    {}, {}, {reason}, {}, FROM_HERE);
   EXPECT_TRUE(
       tester.IsDisabledForFrameWithReason(process_id, routing_id, reason));
 }
@@ -1219,9 +1211,8 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kMediaDevicesDispatcherHost);
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
   EXPECT_TRUE(
       tester.IsDisabledForFrameWithReason(process_id, routing_id, reason));
 }
@@ -1276,10 +1267,9 @@
 
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::kWebHID}, {}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::kWebHID}, {},
+                    {}, {}, FROM_HERE);
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
 
@@ -1411,7 +1401,7 @@
   // 3) Go back and make sure the IdleManager page wasn't in the cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kIdleManager}, {}, {}, {},
       FROM_HERE);
 }
@@ -1482,7 +1472,7 @@
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kPaymentManager}, {}, {},
       {}, FROM_HERE);
 
@@ -1534,7 +1524,7 @@
   // 3) Go back and make sure the keyboard lock page wasn't in the cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kKeyboardLock}, {}, {}, {},
       FROM_HERE);
 }
@@ -1599,7 +1589,7 @@
   // 3) Go back and make sure the keyboard lock page wasn't in the cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kKeyboardLock}, {}, {}, {},
       FROM_HERE);
 }
@@ -1680,10 +1670,9 @@
 
   // 3) Go back and make sure the dummy sticky feature page wasn't in the cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::kDummy}, {}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::kDummy}, {},
+                    {}, {}, FROM_HERE);
 }
 
 // Tests which blocklisted features are tracked in the metrics when we used
@@ -1725,10 +1714,9 @@
 
   // Only sticky features are recorded because they're tracked in
   // RenderFrameHostManager::UnloadOldFrame.
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::kDummy}, {}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::kDummy}, {},
+                    {}, {}, FROM_HERE);
 }
 
 // Tests which blocklisted features are tracked in the metrics when we used
@@ -1769,11 +1757,9 @@
     // Only sticky features are recorded because they're tracked in
     // RenderFrameHostManager::UnloadOldFrame.
     ExpectNotRestored(
-        {BackForwardCacheMetrics::NotRestoredReason::
-             kRelatedActiveContentsExist,
-         BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures,
-         BackForwardCacheMetrics::NotRestoredReason::
-             kBrowsingInstanceNotSwapped},
+        {NotRestoredReason::kRelatedActiveContentsExist,
+         NotRestoredReason::kBlocklistedFeatures,
+         NotRestoredReason::kBrowsingInstanceNotSwapped},
         {blink::scheduler::WebSchedulerTrackedFeature::kDummy},
         {ShouldSwapBrowsingInstance::kNo_NotNeededForBackForwardCache}, {}, {},
         FROM_HERE);
@@ -1793,9 +1779,8 @@
     // Non-sticky reasons are not recorded here.
     ExpectNotRestored(
         {
-            BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures,
-            BackForwardCacheMetrics::NotRestoredReason::
-                kBrowsingInstanceNotSwapped,
+            NotRestoredReason::kBlocklistedFeatures,
+            NotRestoredReason::kBrowsingInstanceNotSwapped,
         },
         {blink::scheduler::WebSchedulerTrackedFeature::kDummy},
         {ShouldSwapBrowsingInstance::kNo_NotNeededForBackForwardCache}, {}, {},
@@ -1840,9 +1825,8 @@
   // Non-sticky reasons are not recorded here.
   ExpectNotRestored(
       {
-          BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures,
-          BackForwardCacheMetrics::NotRestoredReason::
-              kBrowsingInstanceNotSwapped,
+          NotRestoredReason::kBlocklistedFeatures,
+          NotRestoredReason::kBrowsingInstanceNotSwapped,
       },
       {blink::scheduler::WebSchedulerTrackedFeature::kDummy},
       {ShouldSwapBrowsingInstance::kNo_NotNeededForBackForwardCache}, {}, {},
@@ -1886,7 +1870,7 @@
   // Because the RenderFrameHostManager changed, the blocklisted features will
   // be tracked in RenderFrameHostManager::UnloadOldFrame.
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -1927,7 +1911,7 @@
   // Because the RenderFrameHostManager changed, the blocklisted features will
   // be tracked in RenderFrameHostManager::UnloadOldFrame.
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -1967,7 +1951,7 @@
   // Because the RenderFrameHostManager changed, the blocklisted features will
   // be tracked in RenderFrameHostManager::UnloadOldFrame.
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -2063,7 +2047,7 @@
     ExpectRestored(FROM_HERE);
   } else {
     ExpectNotRestored(
-        {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+        {NotRestoredReason::kBlocklistedFeatures},
         {blink::scheduler::WebSchedulerTrackedFeature::kAppBanner}, {}, {}, {},
         FROM_HERE);
   }
@@ -2090,7 +2074,7 @@
   // 3) Go back to the page with WebDatabase.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kWebDatabase}, {}, {}, {},
       FROM_HERE);
 }
@@ -2118,7 +2102,7 @@
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kIndexedDBConnection}, {},
       {}, {}, FROM_HERE);
 }
@@ -2171,11 +2155,10 @@
   // 3) Go back to the page with IndexedDB.
   web_contents()->GetController().GoBack();
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::
-           kOutstandingIndexedDBTransaction},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::
+                         kOutstandingIndexedDBTransaction},
+                    {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -2233,7 +2216,7 @@
   // Because the RenderFrameHostManager changed, the blocklisted features will
   // be tracked in RenderFrameHostManager::UnloadOldFrame.
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -2356,7 +2339,7 @@
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kWebTransport}, {}, {}, {},
       FROM_HERE);
 }
@@ -2647,8 +2630,7 @@
   ASSERT_TRUE(HistoryGoBack(tab_x->web_contents()));
   ExpectNotRestored(
       {
-          BackForwardCacheMetrics::NotRestoredReason::
-              kServiceWorkerVersionActivation,
+          NotRestoredReason::kServiceWorkerVersionActivation,
       },
       {}, {}, {}, {}, FROM_HERE);
 }
@@ -2705,9 +2687,8 @@
 
   // 6) Go back to A in |tab_to_be_bfcached|.
   ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kServiceWorkerPostMessage},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kServiceWorkerPostMessage}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, EvictOnServiceWorkerClaim) {
@@ -2754,9 +2735,8 @@
   ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
   EXPECT_TRUE(deleted.deleted());
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kServiceWorkerClaim}, {}, {},
-      {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kServiceWorkerClaim}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -2816,9 +2796,8 @@
   ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
   EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
   EXPECT_TRUE(deleted.deleted());
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kServiceWorkerUnregistration},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kServiceWorkerUnregistration}, {}, {},
+                    {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, CachePagesWithBeacon) {
@@ -3045,9 +3024,8 @@
   ASSERT_TRUE(NavigateToURL(web_contents(),
                             https_server()->GetURL("b.com", "/title1.html")));
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
 }
 
 // Check the BackForwardCache is disabled when the WebUSB feature is used.
@@ -3447,11 +3425,10 @@
 
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::
-           kRequestedBackForwardCacheBlockedSensors},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::
+                         kRequestedBackForwardCacheBlockedSensors},
+                    {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(SensorBackForwardCacheBrowserTest, OrientationCached) {
@@ -3770,10 +3747,9 @@
 
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::kWebRTC}, {}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::kWebRTC}, {},
+                    {}, {}, FROM_HERE);
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
 
@@ -3806,10 +3782,9 @@
 
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
-      {blink::scheduler::WebSchedulerTrackedFeature::kWebLocks}, {}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                    {blink::scheduler::WebSchedulerTrackedFeature::kWebLocks},
+                    {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, WebMidiNotCached) {
@@ -3836,7 +3811,7 @@
   // 3) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kRequestedMIDIPermission},
       {}, {}, {}, FROM_HERE);
 }
@@ -3939,7 +3914,7 @@
   // 5) Go back to the page with SpeechRecognition.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kSpeechRecognizer}, {}, {},
       {}, FROM_HERE);
 }
@@ -4015,7 +3990,7 @@
   // 3) Go back to the page with SpeechSynthesis.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kSpeechSynthesis}, {}, {},
       {}, FROM_HERE);
 }
@@ -4064,9 +4039,8 @@
 
   // 6) Go back to the page with FileChooser.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, CacheWithMediaSession) {
@@ -4178,7 +4152,7 @@
   // 3) Go back to the page A
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 
@@ -4195,7 +4169,7 @@
   // 6) Go back to the page A again.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kKeyboardLock}, {}, {}, {},
       FROM_HERE);
 }
@@ -4243,9 +4217,8 @@
   // The page is not restored due to the playback.
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kMediaSession);
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
 }
 
 class BackForwardCacheBrowserTestWithMediaSessionPlaybackStateChangeSupported
@@ -4349,9 +4322,8 @@
   // The page is not restored since a MediaSession service is used.
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kMediaSessionService);
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
 }
 
 }  // namespace content
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc
index bdc78e5..089b7ca 100644
--- a/content/browser/back_forward_cache_internal_browsertest.cc
+++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -49,6 +49,8 @@
 
 namespace content {
 
+using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
+
 // Ensure flushing the BackForwardCache works properly.
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, BackForwardCacheFlush) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -594,9 +596,8 @@
 
   // 4) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kJavaScriptExecution}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kJavaScriptExecution}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Similar to BackForwardCacheBrowserTest.EvictionOnJavaScriptExecution.
@@ -637,9 +638,8 @@
 
   // 4) Go back to A(B).
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kJavaScriptExecution}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kJavaScriptExecution}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -677,9 +677,8 @@
 
   // 5) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kJavaScriptExecution}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kJavaScriptExecution}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Navigates from page A -> page B -> page C -> page B -> page C. Page B becomes
@@ -718,7 +717,7 @@
   // 4) Navigate back to b.com.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures},
+      {NotRestoredReason::kBlocklistedFeatures},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
   RenderFrameHostImpl* rfh_b_2 = current_frame_host();
@@ -767,9 +766,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kTimeoutPuttingInCache}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kTimeoutPuttingInCache}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Test the race condition where a document is evicted from the BackForwardCache
@@ -828,9 +826,8 @@
   EXPECT_NE(rfh_a2, rfh_b);
   EXPECT_EQ(rfh_a2->GetLastCommittedURL(), url_a);
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kJavaScriptExecution}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kJavaScriptExecution}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Similar to ReissuesNavigationIfEvictedDuringNavigation, except that
@@ -907,9 +904,8 @@
 
   // 4) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kRendererProcessKilled}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kRendererProcessKilled}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // The test is simulating a race condition. The scheduler tracked features are
@@ -1011,18 +1007,16 @@
   EXPECT_EQ(current_frame_host()->GetLastCommittedURL(), url_a1);
   delete_rfh_a2.WaitUntilDeleted();
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBrowsingInstanceNotSwapped},
-      {}, {ShouldSwapBrowsingInstance::kNo_SameSiteNavigation}, {}, {},
-      FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kBrowsingInstanceNotSwapped}, {},
+                    {ShouldSwapBrowsingInstance::kNo_SameSiteNavigation}, {},
+                    {}, FROM_HERE);
 
   // 5) Go to A2.
   ASSERT_TRUE(HistoryGoForward(web_contents()));
 
   ExpectNotRestored(
       {
-          BackForwardCacheMetrics::NotRestoredReason::
-              kConflictingBrowsingInstance,
+          NotRestoredReason::kConflictingBrowsingInstance,
       },
       {}, {}, {}, {}, FROM_HERE);
 }
@@ -1095,9 +1089,8 @@
 
   // 4) Go back to A2.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {RenderFrameHostDisabledForTestingReason()}, {},
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {RenderFrameHostDisabledForTestingReason()}, {},
                     FROM_HERE);
 }
 
@@ -1172,8 +1165,7 @@
 
   // 7) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::kTimeout}, {},
-                    {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kTimeout}, {}, {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -1197,9 +1189,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {RenderFrameHostDisabledForTestingReason()}, {},
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {RenderFrameHostDisabledForTestingReason()}, {},
                     FROM_HERE);
 }
 
@@ -1227,9 +1218,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {RenderFrameHostDisabledForTestingReason()}, {},
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {RenderFrameHostDisabledForTestingReason()}, {},
                     FROM_HERE);
 }
 
@@ -1256,9 +1246,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {RenderFrameHostDisabledForTestingReason()}, {},
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {RenderFrameHostDisabledForTestingReason()}, {},
                     FROM_HERE);
 }
 
@@ -1286,9 +1275,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {RenderFrameHostDisabledForTestingReason()}, {},
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {RenderFrameHostDisabledForTestingReason()}, {},
                     FROM_HERE);
 }
 
@@ -1885,9 +1873,8 @@
 
   // 3) Go back to the page with an inner WebContents.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kHaveInnerContents}, {}, {},
-      {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kHaveInnerContents}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, RestoreWhilePendingCommit) {
@@ -1952,9 +1939,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kIgnoreEventAndEvict}, {},
-      {}, {}, {reason}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kIgnoreEventAndEvict}, {}, {}, {},
+                    {reason}, FROM_HERE);
 }
 
 // Test scenarios where the "BackForwardCache" content flag is enabled but
@@ -2947,9 +2933,8 @@
   // 4) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
 
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kNavigationCancelledWhileRestoring},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNavigationCancelledWhileRestoring}, {},
+                    {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -3082,9 +3067,8 @@
     EXPECT_TRUE(params_capturer.is_overriding_user_agent());
     EXPECT_EQ(user_agent_override,
               EvalJs(shell()->web_contents(), "navigator.userAgent"));
-    ExpectNotRestored(
-        {BackForwardCacheMetrics::NotRestoredReason::kUserAgentOverrideDiffers},
-        {}, {}, {}, {}, FROM_HERE);
+    ExpectNotRestored({NotRestoredReason::kUserAgentOverrideDiffers}, {}, {},
+                      {}, {}, FROM_HERE);
   }
 
   // B should be stored in the back-forward cache.
@@ -3132,9 +3116,8 @@
     EXPECT_FALSE(params_capturer.is_overriding_user_agent());
     EXPECT_NE(user_agent_override,
               EvalJs(shell()->web_contents(), "navigator.userAgent"));
-    ExpectNotRestored(
-        {BackForwardCacheMetrics::NotRestoredReason::kUserAgentOverrideDiffers},
-        {}, {}, {}, {}, FROM_HERE);
+    ExpectNotRestored({NotRestoredReason::kUserAgentOverrideDiffers}, {}, {},
+                      {}, {}, FROM_HERE);
   }
 }
 
@@ -3259,8 +3242,7 @@
   RenderFrameDeletedObserver delete_observer_rfh_b(rfh_b);
 
   ASSERT_TRUE(HistoryGoToOffset(web_contents(), -1));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kBackForwardCacheDisabledForDelegate},
+  ExpectNotRestored({NotRestoredReason::kBackForwardCacheDisabledForDelegate},
                     {}, {}, {}, {}, FROM_HERE);
 }
 
@@ -3517,9 +3499,8 @@
     if (i < kForegroundBackForwardCacheSize) {
       ExpectRestored(FROM_HERE);
     } else {
-      ExpectNotRestored(
-          {BackForwardCacheMetrics::NotRestoredReason::kForegroundCacheLimit},
-          {}, {}, {}, {}, FROM_HERE);
+      ExpectNotRestored({NotRestoredReason::kForegroundCacheLimit}, {}, {}, {},
+                        {}, FROM_HERE);
     }
   }
 }
@@ -3569,9 +3550,8 @@
     if (i < kBackForwardCacheSize) {
       ExpectRestored(FROM_HERE);
     } else {
-      ExpectNotRestored(
-          {BackForwardCacheMetrics::NotRestoredReason::kCacheLimit}, {}, {}, {},
-          {}, FROM_HERE);
+      ExpectNotRestored({NotRestoredReason::kCacheLimit}, {}, {}, {}, {},
+                        FROM_HERE);
     }
   }
 }
@@ -3665,9 +3645,8 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   auto reason = BackForwardCacheDisable::DisabledReason(
       BackForwardCacheDisable::DisabledReasonId::kScreenReader);
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kDisableForRenderFrameHostCalled},
-                    {}, {}, {reason}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kDisableForRenderFrameHostCalled}, {},
+                    {}, {reason}, {}, FROM_HERE);
   EXPECT_TRUE(
       tester.IsDisabledForFrameWithReason(process_id, routing_id, reason));
 }
diff --git a/content/browser/back_forward_cache_network_request_browsertest.cc b/content/browser/back_forward_cache_network_request_browsertest.cc
index b441274..81b1125 100644
--- a/content/browser/back_forward_cache_network_request_browsertest.cc
+++ b/content/browser/back_forward_cache_network_request_browsertest.cc
@@ -20,6 +20,8 @@
 
 namespace content {
 
+using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
+
 // When loading task is unfreezable with the feature flag
 // kLoadingTaskUnfreezable, a page will keep processing the in-flight network
 // requests while the page is frozen in BackForwardCache.
@@ -104,9 +106,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestRedirected},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestRedirected}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Eviction is triggered when a keepalive fetch request gets redirected while
@@ -160,9 +161,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestRedirected},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestRedirected}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 // Tests the case when the header was received before the page is frozen,
@@ -199,9 +199,9 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kNetworkRequestDatapipeDrainedAsBytesConsumer},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kNetworkRequestDatapipeDrainedAsBytesConsumer}, {},
+      {}, {}, {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -284,9 +284,8 @@
 
   // 3) Go back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -433,9 +432,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -516,9 +514,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -646,9 +643,8 @@
   // 4) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 
   // The second page was still loading images when we navigated away, but it's
   // still eligible for back-forward cache.
@@ -704,9 +700,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkRequestTimeout}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkRequestTimeout}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -779,9 +774,8 @@
   // 3) Go back to the first page. We should not restore the page from the
   // back-forward cache.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kNetworkExceedsBufferLimit},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kNetworkExceedsBufferLimit}, {}, {}, {},
+                    {}, FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
diff --git a/content/browser/back_forward_cache_no_store_browsertest.cc b/content/browser/back_forward_cache_no_store_browsertest.cc
index 9b360fdf..c0ef99f2 100644
--- a/content/browser/back_forward_cache_no_store_browsertest.cc
+++ b/content/browser/back_forward_cache_no_store_browsertest.cc
@@ -24,6 +24,8 @@
 
 namespace content {
 
+using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
+
 namespace {
 
 const char kResponseWithNoCache[] =
@@ -145,9 +147,8 @@
   response2.Done();
   observer2.Wait();
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStore}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Test that a page with cache-control:no-store enters bfcache with the flag on,
@@ -210,9 +211,8 @@
   observer2.Wait();
 
   EXPECT_EQ("foo=baz", EvalJs(tab_to_be_bfcached, "document.cookie"));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStoreCookieModified}, {},
+                    {}, {}, {}, FROM_HERE);
 }
 
 // Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182
@@ -263,9 +263,8 @@
   ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
 
   EXPECT_EQ("foo=baz", EvalJs(tab_to_be_bfcached, "document.cookie"));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStoreCookieModified}, {},
+                    {}, {}, {}, FROM_HERE);
   RenderFrameHostImplWrapper rfh_a_2(current_frame_host());
 
   // 6) Navigate away to b.com. |rfh_a_2| should enter bfcache again.
@@ -275,9 +274,8 @@
   // 7) Navigate back to a.com. This time the cookie change has to be reset and
   // gets evicted with a different reason.
   ASSERT_TRUE(HistoryGoBack(tab_to_be_bfcached->web_contents()));
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStore}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Flaky on Cast Audio Linux https://crbug.com/1229182
@@ -340,9 +338,8 @@
   observer2.Wait();
   EXPECT_EQ("foo=bar", EvalJs(tab_to_be_bfcached, "document.cookie"));
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStore}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 // Test that a page with cache-control:no-store records other not restored
@@ -370,10 +367,9 @@
   // 4) Go back.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
 
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kJavaScriptExecution,
-       BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore},
-      {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kJavaScriptExecution,
+                     NotRestoredReason::kCacheControlNoStore},
+                    {}, {}, {}, {}, FROM_HERE);
 }
 
 // Test that a page with cache-control:no-store records other not restored
@@ -403,8 +399,8 @@
   ASSERT_TRUE(HistoryGoBack(web_contents()));
 
   ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures,
-       BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore},
+      {NotRestoredReason::kBlocklistedFeatures,
+       NotRestoredReason::kCacheControlNoStore},
       {blink::scheduler::WebSchedulerTrackedFeature::kBroadcastChannel}, {}, {},
       {}, FROM_HERE);
 }
@@ -493,9 +489,8 @@
   response2.Done();
   observer2.Wait();
   EXPECT_EQ("foo=baz", EvalJs(tab_to_be_bfcached, "document.cookie"));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStoreCookieModified}, {},
+                    {}, {}, {}, FROM_HERE);
 }
 
 // Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182
@@ -560,9 +555,9 @@
   response3.Send(kResponseWithNoCacheWithHTTPOnlyCookie);
   response3.Done();
   observer3.Wait();
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreHTTPOnlyCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreHTTPOnlyCookieModified}, {}, {},
+      {}, {}, FROM_HERE);
 }
 
 // Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182
@@ -628,9 +623,9 @@
   response3.Done();
   observer3.Wait();
 
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreHTTPOnlyCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreHTTPOnlyCookieModified}, {}, {},
+      {}, {}, FROM_HERE);
   RenderFrameHostImplWrapper rfh_a_2(current_frame_host());
 
   // 5) Navigate away to b.com. |rfh_a_2| should enter bfcache again.
@@ -645,9 +640,8 @@
   response4.Send(kResponseWithNoCache);
   response4.Done();
   observer4.Wait();
-  ExpectNotRestored(
-      {BackForwardCacheMetrics::NotRestoredReason::kCacheControlNoStore}, {},
-      {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStore}, {}, {}, {}, {},
+                    FROM_HERE);
 }
 
 class BackForwardCacheBrowserTestRestoreCacheControlNoStoreUnlessCookieChange
@@ -761,9 +755,8 @@
   observer2.Wait();
 
   EXPECT_EQ("foo=baz", EvalJs(tab_to_be_bfcached, "document.cookie"));
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored({NotRestoredReason::kCacheControlNoStoreCookieModified}, {},
+                    {}, {}, {}, FROM_HERE);
 }
 
 // TODO(https://crbug.com/1231849): flaky on Cast Linux.
@@ -828,9 +821,9 @@
   response3.Send(kResponseWithNoCacheWithHTTPOnlyCookie);
   response3.Done();
   observer3.Wait();
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreHTTPOnlyCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreHTTPOnlyCookieModified}, {}, {},
+      {}, {}, FROM_HERE);
 }
 
 class BackForwardCacheBrowserTestRestoreUnlessHTTPOnlyCookieChange
@@ -993,9 +986,9 @@
   response3.Send(kResponseWithNoCacheWithHTTPOnlyCookie);
   response3.Done();
   observer3.Wait();
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreHTTPOnlyCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreHTTPOnlyCookieModified}, {}, {},
+      {}, {}, FROM_HERE);
 }
 
 // TODO(https://crbug.com/1231849): flaky on Cast Linux.
@@ -1058,9 +1051,9 @@
   response3.Send(kResponseWithNoCacheWithHTTPOnlyCookie);
   response3.Done();
   observer3.Wait();
-  ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason::
-                         kCacheControlNoStoreHTTPOnlyCookieModified},
-                    {}, {}, {}, {}, FROM_HERE);
+  ExpectNotRestored(
+      {NotRestoredReason::kCacheControlNoStoreHTTPOnlyCookieModified}, {}, {},
+      {}, {}, FROM_HERE);
 }
 
 }  // namespace content
diff --git a/content/browser/browsing_instance.cc b/content/browser/browsing_instance.cc
index d7040d80..c63bf8c 100644
--- a/content/browser/browsing_instance.cc
+++ b/content/browser/browsing_instance.cc
@@ -25,10 +25,12 @@
 
 BrowsingInstance::BrowsingInstance(
     BrowserContext* browser_context,
-    const WebExposedIsolationInfo& web_exposed_isolation_info)
+    const WebExposedIsolationInfo& web_exposed_isolation_info,
+    bool is_guest)
     : isolation_context_(
           BrowsingInstanceId::FromUnsafeValue(next_browsing_instance_id_++),
-          BrowserOrResourceContext(browser_context)),
+          BrowserOrResourceContext(browser_context),
+          is_guest),
       active_contents_count_(0u),
       default_site_instance_(nullptr),
       web_exposed_isolation_info_(web_exposed_isolation_info) {
@@ -117,8 +119,10 @@
   if (storage_partition_config_.has_value()) {
     // We should only use a single StoragePartition within a BrowsingInstance.
     // If we're attempting to use multiple, something has gone wrong with the
-    // logic at upper layers.
+    // logic at upper layers.  Similarly, whether this StoragePartition is for
+    // a guest should remain constant over a BrowsingInstance's lifetime.
     CHECK_EQ(storage_partition_config_.value(), storage_partition_config);
+    CHECK_EQ(isolation_context_.is_guest(), site_instance->IsGuest());
   } else {
     storage_partition_config_ = storage_partition_config;
   }
diff --git a/content/browser/browsing_instance.h b/content/browser/browsing_instance.h
index 51038066..d4c0aea2 100644
--- a/content/browser/browsing_instance.h
+++ b/content/browser/browsing_instance.h
@@ -92,10 +92,13 @@
   // should contain only cross-origin isolated pages, i.e. pages with
   // cross-origin-opener-policy set to same-origin and
   // cross-origin-embedder-policy set to require-corp, and if so, from which
-  // top level origin.
+  // top level origin. |is_guest| specifies whether this BrowsingInstance will
+  // be used in a <webview> guest; note that this cannot change over the
+  // lifetime of the BrowsingInstance.
   explicit BrowsingInstance(
       BrowserContext* context,
-      const WebExposedIsolationInfo& web_exposed_isolation_info);
+      const WebExposedIsolationInfo& web_exposed_isolation_info,
+      bool is_guest);
 
   ~BrowsingInstance();
 
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 21607fc..14ba950 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -777,7 +777,8 @@
     int child_id,
     BrowserContext* browser_context) {
   Add(child_id, browser_context);
-  LockProcess(IsolationContext(BrowsingInstanceId(1), browser_context),
+  LockProcess(IsolationContext(BrowsingInstanceId(1), browser_context,
+                               /*is_guest=*/false),
               child_id,
               ProcessLock::CreateAllowAnySite(
                   StoragePartitionConfig::CreateDefault(browser_context),
@@ -1661,8 +1662,19 @@
         // prefaced by its id.
         failure_reason += base::StringPrintf(
             "[BI=%d]", browsing_instance_id.GetUnsafeValue());
+
+        // Use the actual process lock's state to compute `is_guest` for the
+        // expected process lock's `isolation_context`.  Guest status doesn't
+        // currently influence the outcome of this access check, and even if it
+        // did, `url` wouldn't be sufficient to tell whether the request
+        // belongs solely to a guest (or non-guest) process.  Note that a guest
+        // isn't allowed to access data outside of its own StoragePartition,
+        // but this is enforced by other means (e.g., resource access APIs
+        // can't name an alternate StoragePartition).
         IsolationContext isolation_context(browsing_instance_id,
-                                           browser_or_resource_context);
+                                           browser_or_resource_context,
+                                           actual_process_lock.is_guest());
+
         // NOTE: If we're on the IO thread, the call to
         // ProcessLock::Create() below will return a ProcessLock with
         // an (internally) identical site_url, one that does not use effective
@@ -2087,7 +2099,7 @@
   BrowserOrResourceContext no_browser_context;
   BrowsingInstanceId null_browsing_instance_id;
   IsolationContext isolation_context(null_browsing_instance_id,
-                                     no_browser_context);
+                                     no_browser_context, /*is_guest=*/false);
   return IsIsolatedOrigin(isolation_context, origin, false);
 }
 
diff --git a/content/browser/child_process_security_policy_unittest.cc b/content/browser/child_process_security_policy_unittest.cc
index f90e707..ea2a45b7 100644
--- a/content/browser/child_process_security_policy_unittest.cc
+++ b/content/browser/child_process_security_policy_unittest.cc
@@ -95,8 +95,7 @@
                          BrowserContext* browser_context,
                          const GURL& url) {
   scoped_refptr<SiteInstanceImpl> site_instance =
-      SiteInstanceImpl::CreateForUrlInfo(browser_context,
-                                         UrlInfo::CreateForTesting(url));
+      SiteInstanceImpl::CreateForTesting(browser_context, url);
   if (site_instance->RequiresDedicatedProcess() &&
       site_instance->GetSiteInfo().ShouldLockProcessToSite(
           site_instance->GetIsolationContext())) {
@@ -220,7 +219,8 @@
                         const url::Origin& origin) {
     ChildProcessSecurityPolicyImpl* p =
         ChildProcessSecurityPolicyImpl::GetInstance();
-    return p->IsIsolatedOrigin(IsolationContext(browsing_instance_id, context),
+    return p->IsIsolatedOrigin(IsolationContext(browsing_instance_id, context,
+                                                /*is_guest=*/false),
                                origin, false /* origin_requests_isolation */);
   }
 
@@ -3040,7 +3040,8 @@
                          .WithOrigin(foo)
                          .WithOriginIsolationRequest(origin_isolation_request));
     scoped_refptr<SiteInstanceImpl> foo_instance =
-        SiteInstanceImpl::CreateForUrlInfo(&context, url_info);
+        SiteInstanceImpl::CreateForUrlInfo(&context, url_info,
+                                           /*is_guest=*/false);
 
     p->Add(kRendererID, &context);
     p->LockProcess(foo_instance->GetIsolationContext(), kRendererID,
@@ -3095,7 +3096,8 @@
 
     UrlInfo url_info(UrlInfoInit(foo.GetURL()).WithOrigin(foo));
     scoped_refptr<SiteInstanceImpl> foo_instance =
-        SiteInstanceImpl::CreateForUrlInfo(&context, url_info);
+        SiteInstanceImpl::CreateForUrlInfo(&context, url_info,
+                                           /*is_guest=*/false);
     p->LockProcess(foo_instance->GetIsolationContext(), kRendererID,
                    ProcessLock::FromSiteInfo(foo_instance->GetSiteInfo()));
 
@@ -3167,8 +3169,7 @@
   TestBrowserContext context;
   {
     scoped_refptr<SiteInstanceImpl> foo_instance =
-        SiteInstanceImpl::CreateForUrlInfo(&context,
-                                           UrlInfo::CreateForTesting(foo_url));
+        SiteInstanceImpl::CreateForTesting(&context, foo_url);
     // Adds the process with an "allow_any_site" lock.
     // The next two statements are basically AddForTesting(...), but with a
     // BrowsingInstanceId based on `foo_instance` and not pinned to '1'.
diff --git a/content/browser/client_hints/client_hints.cc b/content/browser/client_hints/client_hints.cc
index de59226..d507104a 100644
--- a/content/browser/client_hints/client_hints.cc
+++ b/content/browser/client_hints/client_hints.cc
@@ -751,6 +751,10 @@
       AddUAHeader(headers, WebClientHintsType::kUABitness,
                   SerializeHeaderString(ua_metadata->bitness));
     }
+    if (ShouldAddClientHint(data, WebClientHintsType::kUAWoW64)) {
+      AddUAHeader(headers, WebClientHintsType::kUAWoW64,
+                  SerializeHeaderString(ua_metadata->wow64));
+    }
     if (ShouldAddClientHint(data, WebClientHintsType::kUAReduced)) {
       AddUAHeader(headers, WebClientHintsType::kUAReduced,
                   SerializeHeaderString(true));
@@ -770,6 +774,7 @@
     RemoveClientHintHeader(WebClientHintsType::kUABitness, headers);
     RemoveClientHintHeader(WebClientHintsType::kUAReduced, headers);
     RemoveClientHintHeader(WebClientHintsType::kUAFullVersionList, headers);
+    RemoveClientHintHeader(WebClientHintsType::kUAWoW64, headers);
   }
 }
 
@@ -880,7 +885,7 @@
   // If possible, logic should be added above so that the request headers for
   // the newly added client hint can be added to the request.
   static_assert(
-      network::mojom::WebClientHintsType::kFullUserAgent ==
+      network::mojom::WebClientHintsType::kUAWoW64 ==
           network::mojom::WebClientHintsType::kMaxValue,
       "Consider adding client hint request headers from the browser process");
 
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper_unittest.cc b/content/browser/dom_storage/dom_storage_context_wrapper_unittest.cc
index 23d39c2bb..daa5865 100644
--- a/content/browser/dom_storage/dom_storage_context_wrapper_unittest.cc
+++ b/content/browser/dom_storage/dom_storage_context_wrapper_unittest.cc
@@ -39,8 +39,8 @@
     security_policy->AddFutureIsolatedOrigins(
         {test_storage_key1_.origin(), test_storage_key2_.origin()},
         ChildProcessSecurityPolicy::IsolatedOriginSource::TEST);
-    IsolationContext isolation_context(BrowsingInstanceId(1),
-                                       &browser_context_);
+    IsolationContext isolation_context(BrowsingInstanceId(1), &browser_context_,
+                                       /*is_guest=*/false);
     security_policy->LockProcessForTesting(
         isolation_context, kTestProcessIdOrigin1,
         test_storage_key1_.origin().GetURL());
diff --git a/content/browser/isolation_context.cc b/content/browser/isolation_context.cc
index 0373b00..e1e13c1e 100644
--- a/content/browser/isolation_context.cc
+++ b/content/browser/isolation_context.cc
@@ -7,21 +7,26 @@
 namespace content {
 
 IsolationContext::IsolationContext(BrowserContext* browser_context)
-    : browser_or_resource_context_(BrowserOrResourceContext(browser_context)) {
+    : browser_or_resource_context_(BrowserOrResourceContext(browser_context)),
+      is_guest_(false) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 IsolationContext::IsolationContext(BrowsingInstanceId browsing_instance_id,
-                                   BrowserContext* browser_context)
+                                   BrowserContext* browser_context,
+                                   bool is_guest)
     : IsolationContext(browsing_instance_id,
-                       BrowserOrResourceContext(browser_context)) {
+                       BrowserOrResourceContext(browser_context),
+                       is_guest) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 IsolationContext::IsolationContext(
     BrowsingInstanceId browsing_instance_id,
-    BrowserOrResourceContext browser_or_resource_context)
+    BrowserOrResourceContext browser_or_resource_context,
+    bool is_guest)
     : browsing_instance_id_(browsing_instance_id),
-      browser_or_resource_context_(browser_or_resource_context) {}
+      browser_or_resource_context_(browser_or_resource_context),
+      is_guest_(is_guest) {}
 
 }  // namespace content
diff --git a/content/browser/isolation_context.h b/content/browser/isolation_context.h
index 172b072..e08f500 100644
--- a/content/browser/isolation_context.h
+++ b/content/browser/isolation_context.h
@@ -26,9 +26,11 @@
   // creating this object on the IO thread, the BrowserOrResourceContext
   // version should be used instead.
   IsolationContext(BrowsingInstanceId browsing_instance_id,
-                   BrowserContext* browser_context);
+                   BrowserContext* browser_context,
+                   bool is_guest);
   IsolationContext(BrowsingInstanceId browsing_instance_id,
-                   BrowserOrResourceContext browser_or_resource_context);
+                   BrowserOrResourceContext browser_or_resource_context,
+                   bool is_guest);
 
   // Also temporarily allow constructing an IsolationContext not associated
   // with a specific BrowsingInstance.  Callers can use this when they don't
@@ -62,11 +64,19 @@
     return browser_or_resource_context_;
   }
 
+  // True when the BrowsingInstance associated with this context is used in a
+  // <webview> guest.
+  bool is_guest() const { return is_guest_; }
+
  private:
   // When non-null, associates this context with a particular BrowsingInstance.
   BrowsingInstanceId browsing_instance_id_;
 
   BrowserOrResourceContext browser_or_resource_context_;
+
+  // Specifies whether the BrowsingInstance associated with this context is for
+  // a <webview> guest.
+  const bool is_guest_;
 };
 
 }  // namespace content
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc
index d91137c7..437fea29 100644
--- a/content/browser/prerender/prerender_host.cc
+++ b/content/browser/prerender/prerender_host.cc
@@ -92,15 +92,14 @@
                       /*main_frame_name=*/"", /*opener=*/nullptr,
                       /*frame_policy=*/blink::FramePolicy());
 
-    const auto& site_info =
-        static_cast<SiteInstanceImpl*>(site_instance.get())->GetSiteInfo();
     // Use the same SessionStorageNamespace as the primary page for the
     // prerendering page.
     frame_tree_->controller().SetSessionStorageNamespace(
-        site_info.GetStoragePartitionId(site_instance->GetBrowserContext()),
+        site_instance->GetStoragePartitionConfig(),
         web_contents_.GetPrimaryFrameTree()
             .controller()
-            .GetSessionStorageNamespace(site_info));
+            .GetSessionStorageNamespace(
+                site_instance->GetStoragePartitionConfig()));
 
     // TODO(https://crbug.com/1199679): This should be moved to FrameTree::Init
     web_contents_.NotifySwappedFromRenderManager(
diff --git a/content/browser/process_lock.cc b/content/browser/process_lock.cc
index 7212ce7..14c39e5 100644
--- a/content/browser/process_lock.cc
+++ b/content/browser/process_lock.cc
@@ -124,6 +124,9 @@
     if (is_pdf())
       ret += " pdf";
 
+    if (is_guest())
+      ret += " guest";
+
     if (GetWebExposedIsolationInfo().is_isolated()) {
       ret += " cross-origin-isolated";
       if (GetWebExposedIsolationInfo().is_isolated_application())
diff --git a/content/browser/process_lock.h b/content/browser/process_lock.h
index 4dd28b76..5ba02a3 100644
--- a/content/browser/process_lock.h
+++ b/content/browser/process_lock.h
@@ -112,6 +112,10 @@
     return site_info_.has_value() && site_info_->is_error_page();
   }
 
+  bool is_guest() const {
+    return site_info_.has_value() && site_info_->is_guest();
+  }
+
   // Returns the StoragePartitionConfig that corresponds to the SiteInfo the
   // lock is used with.
   StoragePartitionConfig GetStoragePartitionConfig() const;
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 12c11424..067d0df 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -2317,7 +2317,6 @@
     SessionStorageNamespaceImpl* source_namespace =
         static_cast<SessionStorageNamespaceImpl*>(it.second.get());
     session_storage_namespace_map_[it.first] = source_namespace->Clone();
-    OnStoragePartitionIdAdded(it.first);
   }
 
   FinishRestore(source->last_committed_entry_index_, RestoreType::kRestored);
@@ -2736,7 +2735,7 @@
 }
 
 void NavigationControllerImpl::SetSessionStorageNamespace(
-    const StoragePartitionId& partition_id,
+    const StoragePartitionConfig& partition_config,
     SessionStorageNamespace* session_storage_namespace) {
   if (!session_storage_namespace)
     return;
@@ -2746,12 +2745,11 @@
   // so die hard on an error.
   bool successful_insert =
       session_storage_namespace_map_
-          .insert(std::make_pair(partition_id,
+          .insert(std::make_pair(partition_config,
                                  static_cast<SessionStorageNamespaceImpl*>(
                                      session_storage_namespace)))
           .second;
   CHECK(successful_insert) << "Cannot replace existing SessionStorageNamespace";
-  OnStoragePartitionIdAdded(partition_id);
 }
 
 bool NavigationControllerImpl::IsUnmodifiedBlankTab() {
@@ -2762,34 +2760,19 @@
 }
 
 SessionStorageNamespace* NavigationControllerImpl::GetSessionStorageNamespace(
-    const SiteInfo& site_info) {
-  // TODO(acolwell): Remove partition_id logic once we have successfully
-  // migrated the implementation to be a StoragePartitionConfig. At that point
-  // |site_info| can be replaced with a StoragePartitionConfig.
-  const StoragePartitionId partition_id =
-      site_info.GetStoragePartitionId(browser_context_);
-  const StoragePartitionConfig partition_config =
-      site_info.storage_partition_config();
-
+    const StoragePartitionConfig& partition_config) {
   StoragePartition* partition =
       browser_context_->GetStoragePartition(partition_config);
   DOMStorageContextWrapper* context_wrapper =
       static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext());
 
   SessionStorageNamespaceMap::const_iterator it =
-      session_storage_namespace_map_.find(partition_id);
+      session_storage_namespace_map_.find(partition_config);
   if (it != session_storage_namespace_map_.end()) {
     // Ensure that this namespace actually belongs to this partition.
     DCHECK(static_cast<SessionStorageNamespaceImpl*>(it->second.get())
                ->IsFromContext(context_wrapper));
 
-    // Verify that the config we generated now matches the one that
-    // was generated when the namespace was added to the map.
-    if (partition_config != it->first.config()) {
-      LogStoragePartitionIdCrashKeys(it->first, partition_id);
-    }
-    CHECK_EQ(partition_config, it->first.config());
-
     return it->second.get();
   }
 
@@ -2798,16 +2781,16 @@
       SessionStorageNamespaceImpl::Create(context_wrapper);
   SessionStorageNamespaceImpl* session_storage_namespace_ptr =
       session_storage_namespace.get();
-  session_storage_namespace_map_[partition_id] =
+  session_storage_namespace_map_[partition_config] =
       std::move(session_storage_namespace);
-  OnStoragePartitionIdAdded(partition_id);
 
   return session_storage_namespace_ptr;
 }
 
 SessionStorageNamespace*
 NavigationControllerImpl::GetDefaultSessionStorageNamespace() {
-  return GetSessionStorageNamespace(SiteInfo(GetBrowserContext()));
+  return GetSessionStorageNamespace(
+      StoragePartitionConfig::CreateDefault(GetBrowserContext()));
 }
 
 const SessionStorageNamespaceMap&
@@ -4294,31 +4277,6 @@
   NotifyEntryChanged(entry);
 }
 
-void NavigationControllerImpl::OnStoragePartitionIdAdded(
-    const StoragePartitionId& partition_id) {
-  auto it = partition_config_to_id_map_.insert(
-      std::make_pair(partition_id.config(), partition_id));
-  bool successful_insert = it.second;
-  if (!successful_insert) {
-    LogStoragePartitionIdCrashKeys(it.first->second, partition_id);
-  }
-  CHECK(successful_insert);
-}
-
-void NavigationControllerImpl::LogStoragePartitionIdCrashKeys(
-    const StoragePartitionId& original_partition_id,
-    const StoragePartitionId& new_partition_id) {
-  base::debug::SetCrashKeyString(
-      base::debug::AllocateCrashKeyString("original_partition_id",
-                                          base::debug::CrashKeySize::Size256),
-      original_partition_id.ToString());
-
-  base::debug::SetCrashKeyString(
-      base::debug::AllocateCrashKeyString("new_partition_id",
-                                          base::debug::CrashKeySize::Size256),
-      new_partition_id.ToString());
-}
-
 std::vector<blink::mojom::AppHistoryEntryPtr>
 NavigationControllerImpl::PopulateSingleAppHistoryEntryVector(
     Direction direction,
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h
index cb717b2..de8aaa1 100644
--- a/content/browser/renderer_host/navigation_controller_impl.h
+++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -43,7 +43,6 @@
 class FrameTreeNode;
 class NavigationRequest;
 class RenderFrameHostImpl;
-class SiteInfo;
 class SiteInstance;
 struct LoadCommittedDetails;
 
@@ -241,9 +240,9 @@
   bool IsUnmodifiedBlankTab();
 
   // The session storage namespace that all child RenderViews associated with
-  // |site_info| should use.
+  // |partition_config| should use.
   SessionStorageNamespace* GetSessionStorageNamespace(
-      const SiteInfo& site_info);
+      const StoragePartitionConfig& partition_config);
 
   // Returns the index of the specified entry, or -1 if entry is not contained
   // in this NavigationController.
@@ -318,7 +317,7 @@
   // so that we know to load URLs that were pending as "lazy" loads.
   void SetActive(bool is_active);
 
-  // Sets the SessionStorageNamespace for the given |partition_id|. This is
+  // Sets the SessionStorageNamespace for the given |partition_config|. This is
   // used during initialization of a new NavigationController to allow
   // pre-population of the SessionStorageNamespace objects. Session restore,
   // prerendering, and the implementation of window.open() are the primary users
@@ -327,7 +326,7 @@
   // Calling this function when a SessionStorageNamespace has already been
   // associated with a |partition_id| will CHECK() fail.
   void SetSessionStorageNamespace(
-      const StoragePartitionId& partition_id,
+      const StoragePartitionConfig& partition_config,
       SessionStorageNamespace* session_storage_namespace);
 
   // Random data ---------------------------------------------------------------
@@ -723,22 +722,6 @@
   // GetLastCommittedEntryIndex() and length is GetEntryCount().
   void BroadcastHistoryOffsetAndLength();
 
-  // Helper functions used to determine if it is safe to change the internal
-  // representation of StoragePartitionId.
-  //
-  // Called when a new StoragePartitionId is added to
-  // `session_storage_namespace_map_` and adds an entry to
-  // `partition_config_to_id_map_`.
-  void OnStoragePartitionIdAdded(const StoragePartitionId& partition_id);
-  // Called to log a crash dump when unique string representations result in
-  // the same StoragePartitionConfig, or an ID used to lookup a namespace
-  // contains a different config than the one used when the namespace was
-  // added to the map. Both situations imply that there is not a 1:1 mapping
-  // between representations.
-  void LogStoragePartitionIdCrashKeys(
-      const StoragePartitionId& original_partition_id,
-      const StoragePartitionId& new_partition_id);
-
   // Used by PopulateAppHistoryEntryVectors to initialize a single vector.
   enum class Direction { kForward, kBack };
   std::vector<blink::mojom::AppHistoryEntryPtr>
@@ -845,15 +828,6 @@
   // share session storage state with one another.
   SessionStorageNamespaceMap session_storage_namespace_map_;
 
-  // Temporary map that is being used to verify that there is a 1:1
-  // relationship between the string representation used as the key in
-  // `session_storage_namespace_map_` and the StoragePartitionConfig
-  // representation that we plan to migrate the map key to.
-  // TODO(acolwell): Remove this map once we have enough data to determine if
-  // it is safe to change representations or not.
-  std::map<StoragePartitionConfig, StoragePartitionId>
-      partition_config_to_id_map_;
-
   // The maximum number of entries that a navigation controller can store.
   static size_t max_entry_count_for_testing_;
 
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 948de8cf..ea7c39b 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -6733,7 +6733,17 @@
 absl::optional<network::mojom::BlockedByResponseReason>
 NavigationRequest::EnforceCOEP() {
   // https://html.spec.whatwg.org/C/#check-a-navigation-response's-adherence-to-its-embedder-policy
-  auto* parent_frame = GetParentFrame();
+  // Spec should be updated:
+  // https://github.com/shivanigithub/fenced-frame/issues/11
+
+  // Fenced frames should be treated as an embedded frame, thus COEP must apply.
+  // Note: we only check the outer document for fenced frames, because it's
+  // unclear if other embedded cases like Portals should behave the same.
+  // TODO(https://crbug.com/1278207): add other embedded cases if needed.
+  RenderFrameHostImpl* const parent_frame =
+      GetNavigatingFrameType() == FrameType::kFencedFrameRoot
+          ? GetParentFrameOrOuterDocument()
+          : GetParentFrame();
   if (!parent_frame) {
     return absl::nullopt;
   }
diff --git a/content/browser/renderer_host/recently_destroyed_hosts_unittest.cc b/content/browser/renderer_host/recently_destroyed_hosts_unittest.cc
index bccff92e..af69ca9 100644
--- a/content/browser/renderer_host/recently_destroyed_hosts_unittest.cc
+++ b/content/browser/renderer_host/recently_destroyed_hosts_unittest.cc
@@ -53,7 +53,8 @@
 TEST_F(RecentlyDestroyedHostsTest,
        RecordMetricIfReusableHostRecentlyDestroyed) {
   const IsolationContext isolation_context(BrowsingInstanceId(1),
-                                           &browser_context_);
+                                           &browser_context_,
+                                           /*is_guest=*/false);
   const ProcessLock process_lock = ProcessLock::Create(
       isolation_context,
       UrlInfo::CreateForTesting(GURL("https://www.google.com"),
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index cf25ece..5c6e185 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -10997,7 +10997,8 @@
             navigation_request->frame_tree_node()
                 ->frame_tree()
                 ->controller()
-                .GetSessionStorageNamespace(GetSiteInstance()->GetSiteInfo())
+                .GetSessionStorageNamespace(
+                    GetSiteInstance()->GetStoragePartitionConfig())
                 ->id();
         partition->BindSessionStorageAreaForProcess(
             process_id, commit_params->storage_key, namespace_id,
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index c6cdb89..aba74f8 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -25,7 +25,6 @@
 #include "base/trace_event/typed_macros.h"
 #include "build/build_config.h"
 #include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/devtools/render_frame_devtools_agent_host.h"
 #include "content/browser/net/cross_origin_opener_policy_reporter.h"
 #include "content/browser/process_lock.h"
 #include "content/browser/renderer_host/agent_scheduling_group_host.h"
@@ -60,11 +59,11 @@
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/render_widget_host_iterator.h"
 #include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/site_isolation_policy.h"
 #include "content/public/common/child_process_host.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/referrer.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
 #include "services/network/public/cpp/features.h"
@@ -1810,8 +1809,10 @@
 
   SiteInstance* current_instance = render_frame_host_->GetSiteInstance();
 
-  // We do not currently swap processes for navigations in webview tag guests.
-  if (current_instance->IsGuest()) {
+  // Do not currently swap processes for navigations in webview tag guests,
+  // unless site isolation is enabled for them.
+  if (current_instance->IsGuest() &&
+      !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) {
     AppendReason(reason,
                  "GetSiteInstanceForNavigation => current_instance (IsGuest)");
     return current_instance;
@@ -2408,9 +2409,22 @@
     return candidate_instance;
   }
 
-  // Otherwise return a newly created one.
+  // Otherwise return a new SiteInstance in a new BrowsingInstance.
+  UrlInfo dest_url_info = descriptor.dest_url_info;
+  if (current_instance->IsGuest()) {
+    // If the current SiteInstance is for a guest, the new unrelated
+    // SiteInstance must also be for a guest and must stay in the same
+    // StoragePartition.  Note that we should only attempt BrowsingInstance
+    // swaps in guests when site isolation for guests is enabled.
+    DCHECK(SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled());
+    dest_url_info = UrlInfo(
+        UrlInfoInit(descriptor.dest_url_info)
+            .WithStoragePartitionConfig(
+                current_instance->GetSiteInfo().storage_partition_config()));
+  }
   return SiteInstanceImpl::CreateForUrlInfo(
-      GetNavigationController().GetBrowserContext(), descriptor.dest_url_info);
+      GetNavigationController().GetBrowserContext(), dest_url_info,
+      current_instance->IsGuest());
 }
 
 bool RenderFrameHostManager::CanUseSourceSiteInstance(
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc
index 0c456ae..abb765d 100644
--- a/content/browser/renderer_host/render_frame_proxy_host.cc
+++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -19,7 +19,6 @@
 #include "base/stl_util.h"
 #include "base/trace_event/typed_macros.h"
 #include "content/browser/bad_message.h"
-#include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/renderer_host/agent_scheduling_group_host.h"
 #include "content/browser/renderer_host/cross_process_frame_connector.h"
@@ -32,7 +31,6 @@
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
-#include "content/browser/scoped_active_url.h"
 #include "content/browser/site_instance_group.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 5cf4fd6..56c0891 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -294,8 +294,7 @@
       delegate_(delegate),
       render_view_host_map_id_(frame_tree->GetRenderViewHostMapId(
           static_cast<SiteInstanceImpl*>(instance)->group())),
-      site_info_(static_cast<SiteInstanceImpl*>(instance)
-                     ->GetSiteInfoForRenderViewHost()),
+      storage_partition_config_(instance->GetStoragePartitionConfig()),
       routing_id_(routing_id),
       main_frame_routing_id_(main_frame_routing_id),
       frame_tree_(frame_tree) {
@@ -479,7 +478,9 @@
   }
 
   params->session_storage_namespace_id =
-      frame_tree_->controller().GetSessionStorageNamespace(site_info_)->id();
+      frame_tree_->controller()
+          .GetSessionStorageNamespace(storage_partition_config_)
+          ->id();
   params->hidden = frame_tree_->delegate()->IsHidden();
   params->never_composited = delegate_->IsNeverComposited();
   params->window_was_opened_by_another_window =
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index c2d024d..9e32df9 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -56,7 +56,6 @@
 
 class AgentSchedulingGroupHost;
 class RenderProcessHost;
-class SiteInfo;
 class TimeoutMonitor;
 
 // A callback which will be called immediately before EnterBackForwardCache
@@ -382,14 +381,10 @@
   // by frames with SiteInstances that generate an ID that matches this field.
   FrameTree::RenderViewHostMapId render_view_host_map_id_;
 
-  // SiteInfo taken from the SiteInstance passed into the constructor. It is
-  // used to determine if this is a guest view and provides information for
-  // selecting the session storage namespace for this view.
-  //
-  // TODO(acolwell): Replace this with StoragePartitionConfig once we no longer
-  // need a StoragePartitionId and StoragePartitionConfig to lookup a
-  // SessionStorageNamespace.
-  SiteInfo site_info_;
+  // StoragePartitionConfig taken from the SiteInstance passed into the
+  // constructor. It provides information for selecting the session storage
+  // namespace for this view.
+  const StoragePartitionConfig storage_partition_config_;
 
   // Routing ID for this RenderViewHost.
   const int routing_id_;
diff --git a/content/browser/site_info.cc b/content/browser/site_info.cc
index 4f5b3898..c4ca282 100644
--- a/content/browser/site_info.cc
+++ b/content/browser/site_info.cc
@@ -17,6 +17,7 @@
 #include "content/public/browser/site_isolation_policy.h"
 #include "content/public/browser/storage_partition_config.h"
 #include "content/public/common/content_client.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/url_constants.h"
 #include "net/base/escape.h"
@@ -206,14 +207,24 @@
 SiteInfo SiteInfo::CreateForGuest(
     BrowserContext* browser_context,
     const StoragePartitionConfig& partition_config) {
-  GURL guest_site_url = GetSiteURLForGuestPartitionConfig(partition_config);
-
-  // Currently, site URLs for guests are expected to have a special value
-  // computed in |guest_site_url|.  So, set site and lock URLs directly without
-  // the site URL conversions we typically do for user-provided URLs.
+  // Traditionally, site URLs for guests were expected to have a special value
+  // that encodes the StoragePartition information. With site isolation for
+  // guests, however, this is no longer the case, and guests may use regular
+  // site and lock URLs, and the StoragePartition information is maintained in
+  // a separate SiteInfo field.  See https://crbug.com/1267977 for more info.
   //
-  // TODO(alexmos): Once guests support site isolation, this should no longer
-  // need to use the special guest site URLs.  See https://crbug.com/1267977.
+  // Thus, when site isolation for guests is not used, set the site and lock
+  // URLs to the legacy value.  Otherwise, leave them as empty for now; this
+  // function is called when a guest SiteInstance is first created (prior to
+  // any navigations), so there is no URL at this point to compute proper site
+  // and lock URLs.  Future navigations (if any) in the guest, will follow the
+  // normal process selection paths and use SiteInstances with real site and
+  // lock URLs.
+  GURL guest_site_url =
+      SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()
+          ? GURL()
+          : GetSiteURLForGuestPartitionConfig(partition_config);
+
   return SiteInfo(guest_site_url, guest_site_url,
                   false /* requires_origin_keyed_process */, partition_config,
                   WebExposedIsolationInfo::CreateNonIsolated(),
@@ -324,7 +335,7 @@
                   storage_partition_config.value(),
                   url_info.web_exposed_isolation_info.value_or(
                       WebExposedIsolationInfo::CreateNonIsolated()),
-                  false /* is_guest */,
+                  isolation_context.is_guest(),
                   does_site_request_dedicated_process_for_coop, is_jitless,
                   url_info.is_pdf);
 }
@@ -420,7 +431,8 @@
     // SiteInfo.
     if (policy->GetMatchingProcessIsolatedOrigin(
             IsolationContext(BrowsingInstanceId(0),
-                             isolation_context.browser_or_resource_context()),
+                             isolation_context.browser_or_resource_context(),
+                             isolation_context.is_guest()),
             url::Origin::Create(process_lock_url_),
             false /* origin_requests_isolation */, &result_origin)) {
       non_oac_site_info.process_lock_url_ = result_origin.GetURL();
@@ -610,15 +622,11 @@
   if (!RequiresDedicatedProcess(isolation_context))
     return false;
 
-  // Guest processes cannot be locked to a specific site because guests always
-  // use a single SiteInstance for all URLs it loads. The SiteInfo for those
-  // URLs do not match the SiteInfo of the guest SiteInstance so we skip
-  // locking the guest process.
-  // TODO(acolwell): Revisit this once we have the ability to store guest state
-  // and StoragePartition information in SiteInfo instead of packing this info
-  // into the guest site URL. Once we have these capabilities we won't need to
-  // restrict guests to a single SiteInstance.
-  if (is_guest_)
+  // Legacy guest processes without site isolation support cannot be locked to
+  // a specific site, because those guests always use a single SiteInstance for
+  // all URLs they load. The SiteInfo for those URLs do not match the SiteInfo
+  // of the guest SiteInstance so we skip locking these guest processes.
+  if (is_guest_ && !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled())
     return false;
 
   // Most WebUI processes should be locked on all platforms.  The only exception
@@ -660,14 +668,6 @@
                                                                 site_url_);
 }
 
-StoragePartitionId SiteInfo::GetStoragePartitionId(
-    BrowserContext* browser_context) const {
-  if (site_url().is_empty())
-    return StoragePartitionId(browser_context);
-
-  return StoragePartitionId(site_url().spec(), storage_partition_config());
-}
-
 // static
 StoragePartitionConfig SiteInfo::GetStoragePartitionConfigForUrl(
     BrowserContext* browser_context,
diff --git a/content/browser/site_info.h b/content/browser/site_info.h
index 02a2ae52..6ff2e69 100644
--- a/content/browser/site_info.h
+++ b/content/browser/site_info.h
@@ -48,6 +48,10 @@
       BrowserContext* browser_context,
       const StoragePartitionConfig storage_partition_config,
       const WebExposedIsolationInfo& web_exposed_isolation_info);
+
+  // Helper to create a SiteInfo for a <webview> guest.  This helper can be
+  // used for a new guest associated with a specific StoragePartitionConfig
+  // (prior to navigations).
   static SiteInfo CreateForGuest(
       BrowserContext* browser_context,
       const StoragePartitionConfig& partition_config);
@@ -259,12 +263,9 @@
   // RenderProcessHost per site for the entire browser context.
   bool ShouldUseProcessPerSite(BrowserContext* browser_context) const;
 
-  // Get the partition ID or StoragePartitionConfig for this object given a
-  // specific `browser_context`. The BrowserContext will affect whether the
-  // partition is forced to be in memory based on whether it is off-the-record
-  // or not.
-  StoragePartitionId GetStoragePartitionId(
-      BrowserContext* browser_context) const;
+  // Get the StoragePartitionConfig, which describes the StoragePartition this
+  // SiteInfo is associated with.  For example, this will correspond to a
+  // non-default StoragePartition for <webview> guests.
   const StoragePartitionConfig& storage_partition_config() const {
     return storage_partition_config_;
   }
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index a4016c6..41eac9e4 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -131,18 +131,31 @@
     BrowserContext* browser_context) {
   DCHECK(browser_context);
   return base::WrapRefCounted(new SiteInstanceImpl(new BrowsingInstance(
-      browser_context, WebExposedIsolationInfo::CreateNonIsolated())));
+      browser_context, WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false)));
 }
 
 // static
 scoped_refptr<SiteInstanceImpl> SiteInstanceImpl::CreateForUrlInfo(
     BrowserContext* browser_context,
-    const UrlInfo& url_info) {
+    const UrlInfo& url_info,
+    bool is_guest) {
+  CHECK(!is_guest || url_info.storage_partition_config.has_value());
+
+  if (is_guest && !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) {
+    // Guests without site isolation support need to use a SiteInfo with a
+    // special site URL and process lock URL computed in CreateForGuest().
+    return CreateForGuest(browser_context,
+                          url_info.storage_partition_config.value());
+  }
+
   DCHECK(browser_context);
   // This will create a new SiteInstance and BrowsingInstance.
-  scoped_refptr<BrowsingInstance> instance(new BrowsingInstance(
-      browser_context, url_info.web_exposed_isolation_info.value_or(
-                           WebExposedIsolationInfo::CreateNonIsolated())));
+  scoped_refptr<BrowsingInstance> instance(
+      new BrowsingInstance(browser_context,
+                           url_info.web_exposed_isolation_info.value_or(
+                               WebExposedIsolationInfo::CreateNonIsolated()),
+                           is_guest));
 
   // Note: The |allow_default_instance| value used here MUST match the value
   // used in DoesSiteForURLMatch().
@@ -160,14 +173,16 @@
   DCHECK(url_info.storage_partition_config.has_value());
   scoped_refptr<SiteInstanceImpl> site_instance;
 
-  if (is_guest) {
+  if (is_guest && !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) {
     site_instance = CreateForGuest(browser_context,
                                    url_info.storage_partition_config.value());
   } else {
     // This will create a new SiteInstance and BrowsingInstance.
-    scoped_refptr<BrowsingInstance> instance(new BrowsingInstance(
-        browser_context, url_info.web_exposed_isolation_info.value_or(
-                             WebExposedIsolationInfo::CreateNonIsolated())));
+    scoped_refptr<BrowsingInstance> instance(
+        new BrowsingInstance(browser_context,
+                             url_info.web_exposed_isolation_info.value_or(
+                                 WebExposedIsolationInfo::CreateNonIsolated()),
+                             is_guest));
 
     // We do NOT want to allow the default site instance here because workers
     // need to be kept separate from other sites.
@@ -175,6 +190,7 @@
         url_info, /* allow_default_instance */ false);
   }
   DCHECK(!site_instance->GetSiteInfo().is_error_page());
+  DCHECK_EQ(site_instance->IsGuest(), is_guest);
   site_instance->is_for_service_worker_ = true;
 
   // Attempt to reuse a renderer process if possible. Note that in the
@@ -202,10 +218,10 @@
       SiteInfo::CreateForGuest(browser_context, partition_config);
   scoped_refptr<SiteInstanceImpl> site_instance =
       base::WrapRefCounted(new SiteInstanceImpl(new BrowsingInstance(
-          browser_context, guest_site_info.web_exposed_isolation_info())));
+          browser_context, guest_site_info.web_exposed_isolation_info(),
+          /*is_guest=*/true)));
 
   site_instance->SetSiteInfoInternal(guest_site_info);
-
   return site_instance;
 }
 
@@ -217,7 +233,8 @@
   DCHECK(browser_context);
   // This will create a new SiteInstance and BrowsingInstance.
   scoped_refptr<BrowsingInstance> instance(new BrowsingInstance(
-      browser_context, WebExposedIsolationInfo::CreateNonIsolated()));
+      browser_context, WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false));
   auto site_instance = instance->GetSiteInstanceForURL(
       UrlInfo(UrlInfoInit(url)), /* allow_default_instance */ false);
   site_instance->set_process_reuse_policy(
@@ -231,7 +248,8 @@
     const GURL& url) {
   DCHECK(browser_context);
   return SiteInstanceImpl::CreateForUrlInfo(browser_context,
-                                            UrlInfo::CreateForTesting(url));
+                                            UrlInfo::CreateForTesting(url),
+                                            /*is_guest=*/false);
 }
 
 // static
@@ -449,12 +467,8 @@
            browsing_instance_->web_exposed_isolation_info());
 
   if (verify_storage_partition_info_) {
-    auto* browser_context = browsing_instance_->GetBrowserContext();
-    auto old_partition_id = site_info_.GetStoragePartitionId(browser_context);
     auto old_partition_config = site_info_.storage_partition_config();
-    auto new_partition_id = site_info.GetStoragePartitionId(browser_context);
     auto new_partition_config = site_info.storage_partition_config();
-    CHECK_EQ(old_partition_id, new_partition_id);
     CHECK_EQ(old_partition_config, new_partition_config);
   }
   // Remember that this SiteInstance has been used to load a URL, even if the
@@ -574,24 +588,12 @@
   return site_info_;
 }
 
-const SiteInfo& SiteInstanceImpl::GetSiteInfoForRenderViewHost() {
-  if (!has_site_) {
-    // Note: `site_info_` has not been set yet. When the RenderViewHost uses
-    // this SiteInfo to generate a partition ID it will be using an empty
-    // SiteInfo. This is ok as long as the ID does not change when `site_info_`
-    // is actually set. Enable the verification code in SetSiteInfoInternal() to
-    // verify that the partition info does not change.
-    verify_storage_partition_info_ = true;
-  }
-
-  return site_info_;
-}
-
 SiteInfo SiteInstanceImpl::DeriveSiteInfo(const UrlInfo& url_info,
                                           bool is_related) {
-  if (IsGuest()) {
-    // Guests currently must stay in the same SiteInstance no matter what the
-    // information in |url_info| so we return the current SiteInfo.
+  if (IsGuest() && !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) {
+    // Guests without site isolation support currently must stay in the same
+    // SiteInstance no matter what the information in |url_info| so we return
+    // the current SiteInfo.
     return site_info_;
   }
 
@@ -613,6 +615,14 @@
   // since they're deriving a SiteInfo from this SiteInstance.
   UrlInfo overridden_url_info = url_info;
   overridden_url_info.web_exposed_isolation_info = GetWebExposedIsolationInfo();
+
+  // New SiteInfos created for site-isolated guests should keep the same
+  // StoragePartition.
+  if (IsGuest()) {
+    overridden_url_info.storage_partition_config =
+        GetSiteInfo().storage_partition_config();
+  }
+
   return SiteInfo::Create(GetIsolationContext(), overridden_url_info);
 }
 
@@ -631,9 +641,9 @@
 
 scoped_refptr<SiteInstanceImpl> SiteInstanceImpl::GetRelatedSiteInstanceImpl(
     const UrlInfo& url_info) {
-  if (IsGuest()) {
-    // Until guests support site isolation (https://crbug.com/1267977), there
-    // should only be one guest SiteInstance per BrowsingInstance.
+  if (IsGuest() && !SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) {
+    // Without site isolation in guests, there should only be one guest
+    // SiteInstance per BrowsingInstance.
     return this;
   }
 
@@ -780,7 +790,8 @@
     const GURL& url) {
   DCHECK(browser_context);
   return SiteInstanceImpl::CreateForUrlInfo(browser_context,
-                                            UrlInfo(UrlInfoInit(url)));
+                                            UrlInfo(UrlInfoInit(url)),
+                                            /*is_guest=*/false);
 }
 
 // static
@@ -1236,9 +1247,10 @@
   process_->SetIsUsed();
 
   if (site_info_.ShouldLockProcessToSite(GetIsolationContext())) {
-    // Sanity check that this won't try to assign an origin lock to a <webview>
-    // process, which can't be locked.
-    CHECK(!process_->IsForGuestsOnly());
+    // Sanity check that this won't try to assign an origin lock to a
+    // non-site-isolated <webview> process, which can't be locked.
+    if (!SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled())
+      CHECK(!process_->IsForGuestsOnly());
 
     ProcessLock lock_to_set = ProcessLock::FromSiteInfo(GetSiteInfo());
     if (!process_lock.is_locked_to_site()) {
diff --git a/content/browser/site_instance_impl.h b/content/browser/site_instance_impl.h
index 05cd345d..953c5e6 100644
--- a/content/browser/site_instance_impl.h
+++ b/content/browser/site_instance_impl.h
@@ -64,19 +64,29 @@
   SiteInstanceImpl(const SiteInstanceImpl&) = delete;
   SiteInstanceImpl& operator=(const SiteInstanceImpl&) = delete;
 
-  // Methods for creating new SiteInstances. The documentation for these methods
-  // are on the SiteInstance::Create* methods with the same name.
+  // Methods for creating a new SiteInstance in a new BrowsingInstance. The
+  // documentation for these methods are on the SiteInstance::Create* methods
+  // with the same name.
   static scoped_refptr<SiteInstanceImpl> Create(
       BrowserContext* browser_context);
-  // `url_info` contains the GURL for which we want to create a SiteInstance,
-  // along with other state relevant to making process allocation decisions.
-  static scoped_refptr<SiteInstanceImpl> CreateForUrlInfo(
-      BrowserContext* browser_context,
-      const UrlInfo& url_info);
   static scoped_refptr<SiteInstanceImpl> CreateForGuest(
       BrowserContext* browser_context,
       const StoragePartitionConfig& partition_config);
 
+  // Similar to above, but creates an appropriate SiteInstance in a new
+  // BrowsingInstance for a particular `url_info`. This is a more generic
+  // version of SiteInstance::CreateForURL(). `url_info` contains the GURL for
+  // which we want to create a SiteInstance, along with other state relevant to
+  // making process allocation decisions. `is_guest` specifies whether the
+  // newly SiteInstance and BrowsingInstance is for a <webview> guest. This is
+  // used in site-isolated guests to support cross-BrowsingInstance navigations
+  // within a guest; when true, the guest's StoragePartition information must
+  // also be provided in `url_info`.
+  static scoped_refptr<SiteInstanceImpl> CreateForUrlInfo(
+      BrowserContext* browser_context,
+      const UrlInfo& url_info,
+      bool is_guest);
+
   // Creates a SiteInstance that will be use for a service worker.
   // `url_info` - The UrlInfo for the service worker. It contains the URL and
   //              other information necessary to take process model decisions.
@@ -253,18 +263,6 @@
   // GetSiteURL().
   const SiteInfo& GetSiteInfo();
 
-  // Called when a RenderViewHost was created with this object. It returns the
-  // same information as GetSiteInfo(), but also enables extra checks to ensure
-  // that the StoragePartition info for this object does not change when
-  // |site_info_| is set. This is important to verify if the SiteInfo has not
-  // been explicitly set at the time of this call (e.g. first navigation in a
-  // new tab).
-  // TODO(acolwell) : Remove once RenderViewHost no longer needs to store a
-  // SiteInfo and can store a StoragePartitionConfig instead. Extra verification
-  // should be enabled when the config is fetched and |site_info_| has not been
-  // set yet.
-  const SiteInfo& GetSiteInfoForRenderViewHost();
-
   // Derives a new SiteInfo based on this SiteInstance's current state, and
   // the information provided in `url_info`. This function is slightly different
   // than SiteInfo::Create() because it takes into account information
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index 3b18222..3bd64e0 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -505,8 +505,8 @@
   scoped_command_line.GetProcessCommandLine()->RemoveSwitch(
       switches::kSitePerProcess);
 
-  auto site_instance = SiteInstanceImpl::CreateForUrlInfo(
-      &browser_context, UrlInfo::CreateForTesting(GURL("http://foo.com")));
+  auto site_instance = SiteInstanceImpl::CreateForTesting(
+      &browser_context, GURL("http://foo.com"));
 
   EXPECT_TRUE(site_instance->IsDefaultSiteInstance());
   EXPECT_TRUE(site_instance->HasSite());
@@ -851,7 +851,8 @@
       switches::kProcessPerSite));
   std::unique_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
   BrowsingInstance* browsing_instance = new BrowsingInstance(
-      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated());
+      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false);
 
   const GURL url_a1("http://www.google.com/1.html");
   scoped_refptr<SiteInstanceImpl> site_instance_a1(
@@ -884,7 +885,8 @@
   // A visit to the original site in a new BrowsingInstance (same or different
   // browser context) should return a different SiteInstance.
   BrowsingInstance* browsing_instance2 = new BrowsingInstance(
-      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated());
+      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false);
   // Ensure the new SiteInstance is ref counted so that it gets deleted.
   scoped_refptr<SiteInstanceImpl> site_instance_a2_2(
       browsing_instance2->GetSiteInstanceForURL(
@@ -926,7 +928,8 @@
       switches::kProcessPerSite);
   std::unique_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
   scoped_refptr<BrowsingInstance> browsing_instance = new BrowsingInstance(
-      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated());
+      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false);
 
   const GURL url_a1("http://www.google.com/1.html");
   scoped_refptr<SiteInstanceImpl> site_instance_a1(
@@ -959,7 +962,8 @@
   // A visit to the original site in a new BrowsingInstance (same browser
   // context) should return a different SiteInstance with the same process.
   BrowsingInstance* browsing_instance2 = new BrowsingInstance(
-      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated());
+      browser_context.get(), WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false);
   scoped_refptr<SiteInstanceImpl> site_instance_a1_2(
       browsing_instance2->GetSiteInstanceForURL(
           UrlInfo::CreateForTesting(url_a1), false));
@@ -972,7 +976,8 @@
   std::unique_ptr<TestBrowserContext> browser_context2(
       new TestBrowserContext());
   BrowsingInstance* browsing_instance3 = new BrowsingInstance(
-      browser_context2.get(), WebExposedIsolationInfo::CreateNonIsolated());
+      browser_context2.get(), WebExposedIsolationInfo::CreateNonIsolated(),
+      /*is_guest=*/false);
   scoped_refptr<SiteInstanceImpl> site_instance_a2_3(
       browsing_instance3->GetSiteInstanceForURL(
           UrlInfo::CreateForTesting(url_a2), false));
@@ -1907,13 +1912,13 @@
   EXPECT_FALSE(error_site_info.web_exposed_isolation_info().is_isolated());
 
   // Verify that non-error URLs don't generate error page SiteInfos.
-  const auto instance = SiteInstanceImpl::CreateForUrlInfo(
-      context(), UrlInfo::CreateForTesting(non_error_page_url));
+  const auto instance =
+      SiteInstanceImpl::CreateForTesting(context(), non_error_page_url);
   EXPECT_NE(instance->GetSiteInfo(), error_site_info);
 
   // Verify that an error page URL results in error page SiteInfos.
-  const auto error_instance = SiteInstanceImpl::CreateForUrlInfo(
-      context(), UrlInfo::CreateForTesting(error_page_url));
+  const auto error_instance =
+      SiteInstanceImpl::CreateForTesting(context(), error_page_url);
   EXPECT_EQ(error_instance->GetSiteInfo(), error_site_info);
   EXPECT_FALSE(error_instance->IsCrossOriginIsolated());
 
@@ -1945,7 +1950,8 @@
   // Create a SiteInstance for test_url in the special StoragePartition, and
   // verify that the StoragePartition is correct.
   const auto partitioned_instance =
-      SiteInstanceImpl::CreateForUrlInfo(context(), partitioned_url_info);
+      SiteInstanceImpl::CreateForUrlInfo(context(), partitioned_url_info,
+                                         /*is_guest=*/false);
   EXPECT_EQ(non_default_partition_config,
             static_cast<SiteInstanceImpl*>(partitioned_instance.get())
                 ->GetSiteInfo()
@@ -1996,7 +2002,8 @@
   // skip over the check for OAC process isolated origins, which is required for
   // this test to operate.
   SiteInfo site_info_for_a_foo = SiteInfo::Create(
-      IsolationContext(BrowsingInstanceId::FromUnsafeValue(42), context()),
+      IsolationContext(BrowsingInstanceId::FromUnsafeValue(42), context(),
+                       /*is_guest=*/false),
       UrlInfo(UrlInfoInit(a_foo_url).WithOriginIsolationRequest(
           UrlInfo::OriginIsolationRequest::kOriginAgentCluster)));
   EXPECT_TRUE(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 390b2f1..da0870f 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3802,9 +3802,8 @@
   auto* source_site_instance =
       static_cast<SiteInstanceImpl*>(opener->GetSiteInstance());
 
-  const auto& partition_id =
-      source_site_instance->GetSiteInfo().GetStoragePartitionId(
-          GetBrowserContext());
+  const auto& partition_config =
+      source_site_instance->GetStoragePartitionConfig();
 
   {
     StoragePartition* partition =
@@ -3825,7 +3824,7 @@
         static_cast<WebContentsImpl*>(delegate_->CreateCustomWebContents(
             opener, source_site_instance, is_new_browsing_instance,
             opener->GetLastCommittedURL(), params.frame_name, params.target_url,
-            partition_id, session_storage_namespace));
+            partition_config, session_storage_namespace));
     if (!web_contents_impl)
       return nullptr;
     return &web_contents_impl->GetPrimaryFrameTree();
@@ -3872,7 +3871,7 @@
   auto* new_contents_impl = new_contents.get();
 
   new_contents_impl->GetController().SetSessionStorageNamespace(
-      partition_id, session_storage_namespace);
+      partition_config, session_storage_namespace);
 
   // If the new frame has a name, make sure any SiteInstances that can find
   // this named frame have proxies for it.  Must be called after
diff --git a/content/browser/web_database/web_database_host_impl_unittest.cc b/content/browser/web_database/web_database_host_impl_unittest.cc
index 783a444..aab6933 100644
--- a/content/browser/web_database/web_database_host_impl_unittest.cc
+++ b/content/browser/web_database/web_database_host_impl_unittest.cc
@@ -134,7 +134,8 @@
 
   void LockProcessToURL(const GURL& url) {
     ChildProcessSecurityPolicyImpl::GetInstance()->LockProcessForTesting(
-        IsolationContext(BrowsingInstanceId(1), browser_context()),
+        IsolationContext(BrowsingInstanceId(1), browser_context(),
+                         /*is_guest=*/false),
         process_id(), url);
   }
 
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc
index aed81f97..c6dda0e 100644
--- a/content/browser/webauth/authenticator_common.cc
+++ b/content/browser/webauth/authenticator_common.cc
@@ -1519,40 +1519,43 @@
           blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR);
       return;
     case device::GetAssertionStatus::kSuccess:
-      DCHECK(response_data.has_value());
-      DCHECK(authenticator);
+      break;
+  }
+
+  DCHECK_EQ(status_code, device::GetAssertionStatus::kSuccess);
+  DCHECK(response_data.has_value());
+  DCHECK(authenticator);
 
 #if BUILDFLAG(IS_WIN)
-      GetWebAuthenticationDelegate()->OperationSucceeded(
-          GetBrowserContext(), authenticator->IsWinNativeApiAuthenticator());
+  GetWebAuthenticationDelegate()->OperationSucceeded(
+      GetBrowserContext(), authenticator->IsWinNativeApiAuthenticator());
 #endif
 
-      // Show an account picker for requests with empty allow lists.
-      // Authenticators may omit the identifying information in the user entity
-      // if only one credential matches, or if they have account selection UI
-      // built-in. In that case, consider that credential pre-selected.
-      if (empty_allow_list_ &&
-          (response_data->size() > 1 ||
-           (response_data->at(0).user_entity &&
-            (response_data->at(0).user_entity->name ||
-             response_data->at(0).user_entity->display_name)))) {
-        std::vector<device::PublicKeyCredentialUserEntity> users_list;
-        users_list.reserve(response_data->size());
-        for (const auto& response : *response_data) {
-          if (response.user_entity) {
-            users_list.push_back(*response.user_entity);
-          }
-        }
-        request_delegate_->SelectAccount(
-            std::move(*response_data),
-            base::BindOnce(&AuthenticatorCommon::OnAccountSelected,
-                           weak_factory_.GetWeakPtr()));
-      } else {
-        OnAccountSelected(std::move(response_data->at(0)));
+  // Show an account picker for requests with empty allow lists.
+  // Authenticators may omit the identifying information in the user entity
+  // if only one credential matches, or if they have account selection UI
+  // built-in. In that case, consider that credential pre-selected.
+  // Authenticators can also use the userSelected signal (from CTAP 2.1)
+  // to indicate that selection has already occurred.
+  if (empty_allow_list_ && !response_data->at(0).user_selected &&
+      (response_data->size() > 1 ||
+       (response_data->at(0).user_entity &&
+        (response_data->at(0).user_entity->name ||
+         response_data->at(0).user_entity->display_name)))) {
+    std::vector<device::PublicKeyCredentialUserEntity> users_list;
+    users_list.reserve(response_data->size());
+    for (const auto& response : *response_data) {
+      if (response.user_entity) {
+        users_list.push_back(*response.user_entity);
       }
-      return;
+    }
+    request_delegate_->SelectAccount(
+        std::move(*response_data),
+        base::BindOnce(&AuthenticatorCommon::OnAccountSelected,
+                       weak_factory_.GetWeakPtr()));
+  } else {
+    OnAccountSelected(std::move(response_data->at(0)));
   }
-  NOTREACHED();
 }
 
 void AuthenticatorCommon::OnAccountSelected(
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index 8ffd364..55a42ab4 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -6797,6 +6797,35 @@
   EXPECT_TRUE(HasUV(result.response));
 }
 
+TEST_F(ResidentKeyAuthenticatorImplTest, GetAssertionUserSelected) {
+  ASSERT_TRUE(virtual_device_factory_->mutable_state()->InjectResidentKey(
+      /*credential_id=*/{{4, 3, 2, 1}}, kTestRelyingPartyId,
+      /*user_id=*/{{1, 2, 3, 4}}, "Test", "User"));
+
+  for (const bool internal_account_chooser : {false, true}) {
+    SCOPED_TRACE(internal_account_chooser);
+
+    device::VirtualCtap2Device::Config config;
+    config.pin_support = true;
+    config.resident_key_support = true;
+    config.internal_account_chooser = internal_account_chooser;
+    virtual_device_factory_->SetCtap2Config(config);
+
+    // |SelectAccount| should not be called when userSelected is set.
+    if (internal_account_chooser) {
+      test_client_.expected_accounts = "<invalid>";
+    } else {
+      test_client_.expected_accounts = "01020304:Test:User";
+      test_client_.selected_user_id = {1, 2, 3, 4};
+    }
+    GetAssertionResult result =
+        AuthenticatorGetAssertion(get_credential_options());
+
+    EXPECT_EQ(AuthenticatorStatus::SUCCESS, result.status);
+    EXPECT_TRUE(HasUV(result.response));
+  }
+}
+
 TEST_F(ResidentKeyAuthenticatorImplTest, GetAssertionSingleWithPII) {
   ASSERT_TRUE(virtual_device_factory_->mutable_state()->InjectResidentKey(
       /*credential_id=*/{{4, 3, 2, 1}}, kTestRelyingPartyId,
@@ -8080,7 +8109,8 @@
               std::move(ble_advert_callback_), &virtual_device_),
           network_context_.get(), root_secret_, "Test Authenticator",
           zero_qr_secret_, peer_identity_x962_,
-          /*contact_id=*/absl::nullopt);
+          /*contact_id=*/absl::nullopt,
+          /*use_new_crypter_construction=*/false);
 
   EXPECT_EQ(AuthenticatorMakeCredential().status, AuthenticatorStatus::SUCCESS);
   EXPECT_EQ(pairings_.size(), 0u);
@@ -8107,7 +8137,8 @@
               std::move(ble_advert_callback_), &virtual_device_),
           network_context_.get(), root_secret_, "Test Authenticator",
           zero_qr_secret_, peer_identity_x962_,
-          /*contact_id=*/absl::nullopt);
+          /*contact_id=*/absl::nullopt,
+          /*use_new_crypter_construction=*/false);
 
   PublicKeyCredentialRequestOptionsPtr options =
       GetTestPublicKeyCredentialRequestOptions();
@@ -8121,6 +8152,34 @@
   EXPECT_EQ(pairings_.size(), 0u);
 }
 
+TEST_F(CableV2AuthenticatorImplTest, QRBasedNewCrypterConstruction) {
+  // The new Crypter construction should be transparently supported by the
+  // client code.
+  auto discovery = std::make_unique<device::cablev2::Discovery>(
+      device::FidoRequestType::kGetAssertion, network_context_.get(),
+      qr_generator_key_, std::move(ble_advert_events_),
+      /*pairings=*/std::vector<std::unique_ptr<device::cablev2::Pairing>>(),
+      /*contact_device_stream=*/nullptr,
+      /*extension_contents=*/std::vector<device::CableDiscoveryData>(),
+      GetPairingCallback());
+
+  AuthenticatorEnvironmentImpl::GetInstance()
+      ->ReplaceDefaultDiscoveryFactoryForTesting(
+          std::make_unique<DiscoveryFactory>(std::move(discovery)));
+
+  std::unique_ptr<device::cablev2::authenticator::Transaction> transaction =
+      device::cablev2::authenticator::TransactFromQRCode(
+          device::cablev2::authenticator::NewMockPlatform(
+              std::move(ble_advert_callback_), &virtual_device_),
+          network_context_.get(), root_secret_, "Test Authenticator",
+          zero_qr_secret_, peer_identity_x962_,
+          /*contact_id=*/absl::nullopt,
+          /*use_new_crypter_construction=*/true);
+
+  EXPECT_EQ(AuthenticatorMakeCredential().status, AuthenticatorStatus::SUCCESS);
+  EXPECT_EQ(pairings_.size(), 0u);
+}
+
 TEST_F(CableV2AuthenticatorImplTest, PairingBased) {
   // First do unpaired exchange to get pairing data.
   auto discovery = std::make_unique<device::cablev2::Discovery>(
@@ -8141,7 +8200,8 @@
           device::cablev2::authenticator::NewMockPlatform(
               std::move(ble_advert_callback_), &virtual_device_),
           network_context_.get(), root_secret_, "Test Authenticator",
-          zero_qr_secret_, peer_identity_x962_, contact_id);
+          zero_qr_secret_, peer_identity_x962_, contact_id,
+          /*use_new_crypter_construction=*/false);
 
   EXPECT_EQ(AuthenticatorMakeCredential().status, AuthenticatorStatus::SUCCESS);
   EXPECT_EQ(pairings_.size(), 1u);
diff --git a/content/browser/worker_host/shared_worker_service_impl.cc b/content/browser/worker_host/shared_worker_service_impl.cc
index 7b230a7..3c92583 100644
--- a/content/browser/worker_host/shared_worker_service_impl.cc
+++ b/content/browser/worker_host/shared_worker_service_impl.cc
@@ -289,17 +289,13 @@
   // account.
   scoped_refptr<SiteInstanceImpl> site_instance = creator.GetSiteInstance();
   if (site_instance->IsCrossOriginIsolated()) {
-    if (partition->is_guest()) {
-      site_instance = SiteInstanceImpl::CreateForGuest(
-          partition->browser_context(), partition->GetConfig());
-    } else {
-      site_instance = SiteInstanceImpl::CreateForUrlInfo(
-          partition->browser_context(),
-          UrlInfo(UrlInfoInit(instance.url())
-                      .WithStoragePartitionConfig(partition->GetConfig())
-                      .WithWebExposedIsolationInfo(
-                          WebExposedIsolationInfo::CreateNonIsolated())));
-    }
+    site_instance = SiteInstanceImpl::CreateForUrlInfo(
+        partition->browser_context(),
+        UrlInfo(UrlInfoInit(instance.url())
+                    .WithStoragePartitionConfig(partition->GetConfig())
+                    .WithWebExposedIsolationInfo(
+                        WebExposedIsolationInfo::CreateNonIsolated())),
+        partition->is_guest());
   }
 
   RenderProcessHost* worker_process_host = site_instance->GetProcess();
diff --git a/content/common/cursors/webcursor.cc b/content/common/cursors/webcursor.cc
index b6e0d02..c8b6b9d 100644
--- a/content/common/cursors/webcursor.cc
+++ b/content/common/cursors/webcursor.cc
@@ -22,17 +22,16 @@
 WebCursor::WebCursor(const WebCursor& other) = default;
 
 bool WebCursor::SetCursor(const ui::Cursor& cursor) {
-  // This value matches kMaximumCursorSize from Blink's EventHandler.
-  static constexpr int kMaximumCursorSize = 128;
+  static constexpr int kMaxSize = 1024;
   if (cursor.image_scale_factor() < 0.01f ||
       cursor.image_scale_factor() > 100.f ||
       (cursor.type() == ui::mojom::CursorType::kCustom &&
-       (cursor.custom_bitmap().width() > kMaximumCursorSize ||
-        cursor.custom_bitmap().height() > kMaximumCursorSize ||
+       (cursor.custom_bitmap().width() > kMaxSize ||
+        cursor.custom_bitmap().height() > kMaxSize ||
         cursor.custom_bitmap().width() / cursor.image_scale_factor() >
-            kMaximumCursorSize ||
+            kMaxSize ||
         cursor.custom_bitmap().height() / cursor.image_scale_factor() >
-            kMaximumCursorSize))) {
+            kMaxSize))) {
     return false;
   }
 
diff --git a/content/common/cursors/webcursor_mac.mm b/content/common/cursors/webcursor_mac.mm
index fdc70bd..f85c421f 100644
--- a/content/common/cursors/webcursor_mac.mm
+++ b/content/common/cursors/webcursor_mac.mm
@@ -265,7 +265,6 @@
     case ui::mojom::CursorType::kCustom:
       return CreateCustomCursor(cursor_);
     case ui::mojom::CursorType::kNull:
-      return [NSCursor arrowCursor];
     case ui::mojom::CursorType::kDndNone:
     case ui::mojom::CursorType::kDndMove:
     case ui::mojom::CursorType::kDndCopy:
diff --git a/content/common/cursors/webcursor_unittest.cc b/content/common/cursors/webcursor_unittest.cc
index 07f33106..9601f15a 100644
--- a/content/common/cursors/webcursor_unittest.cc
+++ b/content/common/cursors/webcursor_unittest.cc
@@ -122,11 +122,11 @@
 
   // SetCursor should return false when the image width is too large.
   cursor.set_image_scale_factor(1.f);
-  cursor.set_custom_bitmap(CreateTestBitmap(129, 3));
+  cursor.set_custom_bitmap(CreateTestBitmap(1025, 3));
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 
   // SetCursor should return false when the image height is too large.
-  cursor.set_custom_bitmap(CreateTestBitmap(3, 129));
+  cursor.set_custom_bitmap(CreateTestBitmap(3, 1025));
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 
   // SetCursor should return false when the scaled image width is too large.
@@ -136,7 +136,7 @@
 
   // SetCursor should return false when the scaled image height is too large.
   cursor.set_image_scale_factor(0.1f);
-  cursor.set_custom_bitmap(CreateTestBitmap(5, 20));
+  cursor.set_custom_bitmap(CreateTestBitmap(5, 200));
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 }
 
diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
index 0975ef2..62a9ca2 100644
--- a/content/common/user_agent.cc
+++ b/content/common/user_agent.cc
@@ -226,11 +226,12 @@
 #endif
 
 #if BUILDFLAG(IS_WIN)
-  if (!cpu_type.empty())
+  if (!cpu_type.empty()) {
     base::StringAppendF(&os_cpu, "Windows NT %s; %s", os_version.c_str(),
                         cpu_type.c_str());
-  else
+  } else {
     base::StringAppendF(&os_cpu, "Windows NT %s", os_version.c_str());
+  }
 #else
   base::StringAppendF(&os_cpu,
 #if BUILDFLAG(IS_MAC)
@@ -349,4 +350,13 @@
   return user_agent;
 }
 
+bool IsWoW64() {
+#if BUILDFLAG(IS_WIN)
+  base::win::OSInfo* os_info = base::win::OSInfo::GetInstance();
+  return os_info->IsWowX86OnAMD64();
+#else
+  return false;
+#endif
+}
+
 }  // namespace content
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index 0c1e511e..9f840287 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -15,6 +15,8 @@
 #include "base/message_loop/message_pump_type.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/clamped_math.h"
+#include "base/process/process_metrics.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -433,6 +435,20 @@
   sandbox_options.accelerated_video_encode_enabled =
       !gpu_prefs.disable_accelerated_video_encode;
 
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_VAAPI)
+  // Increase the FD limit by 512 on VA-API Chrome OS devices in order to
+  // avoid running out of FDs in cases where many decoders are running
+  // concurrently. See b/215553848.
+  // TODO(b/195769334): revisit the need for this once out-of-process video
+  // decoding has been fully implemented.
+  const auto current_max_fds =
+      base::saturated_cast<unsigned int>(base::GetMaxFds());
+  constexpr unsigned int kMaxFDsDelta = 1u << 9;
+  const auto new_max_fds =
+      static_cast<int>(base::ClampAdd(current_max_fds, kMaxFDsDelta));
+  base::IncreaseFdLimitTo(base::checked_cast<unsigned int>(new_max_fds));
+#endif
+
   bool res = sandbox::policy::SandboxLinux::GetInstance()->InitializeSandbox(
       sandbox::policy::SandboxTypeFromCommandLine(
           *base::CommandLine::ForCurrentProcess()),
diff --git a/content/public/browser/session_storage_namespace.cc b/content/public/browser/session_storage_namespace.cc
index 9b5165e6..2b164d3 100644
--- a/content/public/browser/session_storage_namespace.cc
+++ b/content/public/browser/session_storage_namespace.cc
@@ -10,8 +10,8 @@
     BrowserContext* browser_context,
     scoped_refptr<SessionStorageNamespace> session_storage_namespace) {
   SessionStorageNamespaceMap session_storage_namespace_map;
-  session_storage_namespace_map[StoragePartitionId(browser_context)] =
-      session_storage_namespace;
+  session_storage_namespace_map[StoragePartitionConfig::CreateDefault(
+      browser_context)] = session_storage_namespace;
   return session_storage_namespace_map;
 }
 
diff --git a/content/public/browser/session_storage_namespace.h b/content/public/browser/session_storage_namespace.h
index b9664b3f..026471d 100644
--- a/content/public/browser/session_storage_namespace.h
+++ b/content/public/browser/session_storage_namespace.h
@@ -36,12 +36,12 @@
   virtual ~SessionStorageNamespace() {}
 };
 
-// Used to store mappings of StoragePartition id to SessionStorageNamespace.
-typedef std::map<StoragePartitionId, scoped_refptr<SessionStorageNamespace>>
+// Used to store mappings of StoragePartitionConfig to SessionStorageNamespace.
+typedef std::map<StoragePartitionConfig, scoped_refptr<SessionStorageNamespace>>
     SessionStorageNamespaceMap;
 
 // Helper function that creates a SessionStorageNamespaceMap and assigns
-// `session_storage_namespace` to the default StoragePartitionId.
+// `session_storage_namespace` to the default StoragePartitionConfig.
 CONTENT_EXPORT SessionStorageNamespaceMap
 CreateMapWithDefaultSessionStorageNamespace(
     BrowserContext* browser_context,
diff --git a/content/public/browser/site_isolation_policy.cc b/content/public/browser/site_isolation_policy.cc
index 18ace25..6c4781e 100644
--- a/content/public/browser/site_isolation_policy.cc
+++ b/content/public/browser/site_isolation_policy.cc
@@ -219,6 +219,11 @@
 }
 
 // static
+bool SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled() {
+  return base::FeatureList::IsEnabled(features::kSiteIsolationForGuests);
+}
+
+// static
 std::string SiteIsolationPolicy::GetIsolatedOriginsFromCommandLine() {
   std::string cmdline_arg =
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
diff --git a/content/public/browser/site_isolation_policy.h b/content/public/browser/site_isolation_policy.h
index c2f0145..018845f 100644
--- a/content/public/browser/site_isolation_policy.h
+++ b/content/public/browser/site_isolation_policy.h
@@ -67,6 +67,9 @@
   // persisted across restarts.
   static bool ShouldPersistIsolatedCOOPSites();
 
+  // Returns true when site isolation is turned on for <webview> guests.
+  static bool IsSiteIsolationForGuestsEnabled();
+
   // Applies isolated origins from all available sources, including the
   // command-line switch, field trials, enterprise policy, and the embedder.
   // See also AreIsolatedOriginsEnabled. These origins apply globally to the
diff --git a/content/public/browser/storage_partition_config.cc b/content/public/browser/storage_partition_config.cc
index b430ebb6..160c24c 100644
--- a/content/public/browser/storage_partition_config.cc
+++ b/content/public/browser/storage_partition_config.cc
@@ -13,21 +13,6 @@
 
 namespace content {
 
-StoragePartitionId::StoragePartitionId(BrowserContext* browser_context)
-    : config_(StoragePartitionConfig::CreateDefault(browser_context)) {}
-
-StoragePartitionId::StoragePartitionId(const std::string& partition_id,
-                                       const StoragePartitionConfig& config)
-    : id_(partition_id), config_(config) {
-  DCHECK(id_.empty() || GURL(id_).is_valid());
-}
-
-std::string StoragePartitionId::ToString() const {
-  std::stringstream ss;
-  ss << "id='" << id_ << "' config=" << config_;
-  return ss.str();
-}
-
 StoragePartitionConfig::StoragePartitionConfig() = default;
 StoragePartitionConfig::StoragePartitionConfig(const StoragePartitionConfig&) =
     default;
diff --git a/content/public/browser/storage_partition_config.h b/content/public/browser/storage_partition_config.h
index ebbff9a..c602c564 100644
--- a/content/public/browser/storage_partition_config.h
+++ b/content/public/browser/storage_partition_config.h
@@ -105,42 +105,6 @@
 CONTENT_EXPORT std::ostream& operator<<(std::ostream& out,
                                         const StoragePartitionConfig& config);
 
-// Represents the storage partition ID that is used as the key for the
-// SessionStorageNamespaceMap. This type is to help facilitate migrating the
-// map key away from a string to a StoragePartitionConfig.
-class CONTENT_EXPORT StoragePartitionId {
- public:
-  explicit StoragePartitionId(BrowserContext* browser_context);
-  StoragePartitionId(const std::string& partition_id,
-                     const StoragePartitionConfig& config);
-  StoragePartitionId(const StoragePartitionId&) = default;
-  StoragePartitionId& operator=(const StoragePartitionId&) = default;
-
-  const StoragePartitionConfig& config() const { return config_; }
-
-  bool operator==(const StoragePartitionId& rhs) const {
-    return config_ == rhs.config_;
-  }
-  bool operator!=(const StoragePartitionId& rhs) const {
-    return config_ != rhs.config_;
-  }
-  bool operator<(const StoragePartitionId& rhs) const {
-    return config_ < rhs.config_;
-  }
-
-  // String representation of this object for debug logging purposes.
-  std::string ToString() const;
-
- private:
-  std::string id_;
-
-  // Config generated with the same information used to generate |id_|.
-  // Currently this field is being used to determine if we can replace the
-  // string representation with a StoragePartitionConfig, and |id_| is ignored
-  // in favor of |config_|, but the results are expected to be equivalent.
-  StoragePartitionConfig config_;
-};
-
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_STORAGE_PARTITION_CONFIG_H_
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index 3defcf1..9701abb99 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -135,7 +135,7 @@
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
-    const StoragePartitionId& partition_id,
+    const StoragePartitionConfig& partition_config,
     SessionStorageNamespace* session_storage_namespace) {
   return nullptr;
 }
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 390aec52..5211198 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -336,7 +336,7 @@
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
-      const StoragePartitionId& partition_id,
+      const StoragePartitionConfig& partition_config,
       SessionStorageNamespace* session_storage_namespace);
 
   // Notifies the delegate about the creation of a new WebContents. This
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 868a12c..718ea14 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -91,6 +91,7 @@
   IPC_STRUCT_TRAITS_MEMBER(model)
   IPC_STRUCT_TRAITS_MEMBER(mobile)
   IPC_STRUCT_TRAITS_MEMBER(bitness)
+  IPC_STRUCT_TRAITS_MEMBER(wow64)
 IPC_STRUCT_TRAITS_END()
 
 IPC_ENUM_TRAITS_MAX_VALUE(blink::UserAgentBrandVersionType,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index d32de3f..f37e70ad 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -879,6 +879,11 @@
     kSiteIsolationForCrossOriginOpenerPolicyExpirationTimeoutParam{
         &kSiteIsolationForCrossOriginOpenerPolicy, "expiration_timeout",
         base::Days(7)};
+
+// This feature turns on site isolation support in <webview> guests.
+const base::Feature kSiteIsolationForGuests{"SiteIsolationForGuests",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+
 // When enabled, OOPIFs will not try to reuse compatible processes from
 // unrelated tabs.
 const base::Feature kDisableProcessReuse{"DisableProcessReuse",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 40338e45..f03c422 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -198,6 +198,7 @@
     kSiteIsolationForCrossOriginOpenerPolicyMaxSitesParam;
 CONTENT_EXPORT extern const base::FeatureParam<base::TimeDelta>
     kSiteIsolationForCrossOriginOpenerPolicyExpirationTimeoutParam;
+CONTENT_EXPORT extern const base::Feature kSiteIsolationForGuests;
 CONTENT_EXPORT extern const base::Feature kDisableProcessReuse;
 CONTENT_EXPORT extern const base::Feature
     kSkipEarlyCommitPendingForCrashedFrame;
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc
index 2e72ca2..a502f88 100644
--- a/content/public/common/url_constants.cc
+++ b/content/public/common/url_constants.cc
@@ -25,7 +25,7 @@
 #endif
 const char kGoogleChromeScheme[] = "googlechrome";
 
-const char kChromeUIAttributionInternalsHost[] = "conversion-internals";
+const char kChromeUIAttributionInternalsHost[] = "attribution-internals";
 const char kChromeUIIndexedDBInternalsHost[] = "indexeddb-internals";
 const char kChromeUIBlobInternalsHost[] = "blob-internals";
 const char kChromeUIBrowserCrashHost[] = "inducebrowsercrashforrealz";
diff --git a/content/public/common/user_agent.h b/content/public/common/user_agent.h
index 5219fa13..deff015 100644
--- a/content/public/common/user_agent.h
+++ b/content/public/common/user_agent.h
@@ -110,6 +110,10 @@
     const std::string& os_info,
     const std::string& product);
 
+// Returns true if the binary was built in 32-bit mode and is running on 64-bit
+// Windows; returns false otherwise.
+CONTENT_EXPORT bool IsWoW64();
+
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_COMMON_USER_AGENT_H_
diff --git a/content/public/test/fake_download_item.cc b/content/public/test/fake_download_item.cc
index 5648d1ca..7bb8e911 100644
--- a/content/public/test/fake_download_item.cc
+++ b/content/public/test/fake_download_item.cc
@@ -354,6 +354,11 @@
   return false;
 }
 
+bool FakeDownloadItem::RequireSafetyChecks() const {
+  NOTREACHED();
+  return false;
+}
+
 bool FakeDownloadItem::CanResume() const {
   NOTREACHED();
   return false;
diff --git a/content/public/test/fake_download_item.h b/content/public/test/fake_download_item.h
index 6d0990b..5cca954 100644
--- a/content/public/test/fake_download_item.h
+++ b/content/public/test/fake_download_item.h
@@ -72,6 +72,7 @@
   bool IsPaused() const override;
   bool AllowMetered() const override;
   bool IsTemporary() const override;
+  bool RequireSafetyChecks() const override;
   bool CanResume() const override;
   int64_t GetBytesWasted() const override;
   int32_t GetAutoResumeCount() const override;
diff --git a/content/renderer/gpu_benchmarking_extension.cc b/content/renderer/gpu_benchmarking_extension.cc
index 5e0a87a..bc2d20e 100644
--- a/content/renderer/gpu_benchmarking_extension.cc
+++ b/content/renderer/gpu_benchmarking_extension.cc
@@ -66,6 +66,7 @@
 // an experimental, fragile, and diagnostic-only document type.
 #include "third_party/skia/src/utils/SkMultiPictureDocument.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/gfx/ca_layer_result.h"
 #include "v8/include/v8-context.h"
 #include "v8/include/v8-exception.h"
 #include "v8/include/v8-function.h"
@@ -254,38 +255,46 @@
   v8::Persistent<v8::Context> context_;
 };
 
-void OnMicroBenchmarkCompleted(CallbackAndContext* callback_and_context,
-                               base::Value result) {
-  v8::Isolate* isolate = callback_and_context->isolate();
-  v8::HandleScope scope(isolate);
-  v8::Local<v8::Context> context = callback_and_context->GetContext();
-  v8::Context::Scope context_scope(context);
-  WebLocalFrame* frame = WebLocalFrame::FrameForContext(context);
-  if (frame) {
-    v8::Local<v8::Value> value =
-        V8ValueConverter::Create()->ToV8Value(&result, context);
-    v8::Local<v8::Value> argv[] = {value};
-
-    frame->CallFunctionEvenIfScriptDisabled(callback_and_context->GetCallback(),
-                                            v8::Object::New(isolate), 1, argv);
-  }
-}
-
-void RunCallbackHelper(CallbackAndContext* callback_and_context) {
+void RunCallbackHelper(CallbackAndContext* callback_and_context,
+                       absl::optional<base::Value> value) {
   v8::Isolate* isolate = callback_and_context->isolate();
   v8::HandleScope scope(isolate);
   v8::Local<v8::Context> context = callback_and_context->GetContext();
   v8::Context::Scope context_scope(context);
   v8::Local<v8::Function> callback = callback_and_context->GetCallback();
   WebLocalFrame* frame = WebLocalFrame::FrameForContext(context);
+
   if (frame && !callback.IsEmpty()) {
-    frame->CallFunctionEvenIfScriptDisabled(callback, v8::Object::New(isolate),
-                                            0, nullptr);
+    if (value.has_value()) {
+      v8::Local<v8::Value> v8_value =
+          V8ValueConverter::Create()->ToV8Value(&value.value(), context);
+      v8::Local<v8::Value> argv[] = {v8_value};
+      frame->CallFunctionEvenIfScriptDisabled(
+          callback, v8::Object::New(isolate), /*argc=*/1, argv);
+    } else {
+      frame->CallFunctionEvenIfScriptDisabled(
+          callback, v8::Object::New(isolate), 0, nullptr);
+    }
   }
 }
 
+void OnMicroBenchmarkCompleted(CallbackAndContext* callback_and_context,
+                               base::Value result) {
+  RunCallbackHelper(callback_and_context,
+                    absl::optional<base::Value>(std::move(result)));
+}
+
+#if BUILDFLAG(IS_MAC)
+void OnSwapCompletedWithCoreAnimationErrorCode(
+    CallbackAndContext* callback_and_context,
+    gfx::CALayerResult error_code) {
+  RunCallbackHelper(callback_and_context,
+                    absl::optional<base::Value>((base::Value(error_code))));
+}
+#endif
+
 void OnSyntheticGestureCompleted(CallbackAndContext* callback_and_context) {
-  RunCallbackHelper(callback_and_context);
+  RunCallbackHelper(callback_and_context, /*value=*/{});
 }
 
 bool ThrowIfPointOutOfBounds(GpuBenchmarkingContext* context,
@@ -547,7 +556,7 @@
 
 void OnSwapCompletedHelper(CallbackAndContext* callback_and_context,
                            base::TimeTicks) {
-  RunCallbackHelper(callback_and_context);
+  RunCallbackHelper(callback_and_context, /*value=*/{});
 }
 
 // This function is only used for correctness testing of this experimental
@@ -669,6 +678,10 @@
       .SetMethod("startProfiling", &GpuBenchmarking::StartProfiling)
       .SetMethod("stopProfiling", &GpuBenchmarking::StopProfiling)
       .SetMethod("freeze", &GpuBenchmarking::Freeze)
+#if BUILDFLAG(IS_MAC)
+      .SetMethod("addCoreAnimationStatusEventListener",
+                 &GpuBenchmarking::AddCoreAnimationStatusEventListener)
+#endif
       .SetMethod("addSwapCompletionEventListener",
                  &GpuBenchmarking::AddSwapCompletionEventListener);
 }
@@ -1438,4 +1451,24 @@
   return true;
 }
 
+#if BUILDFLAG(IS_MAC)
+int GpuBenchmarking::AddCoreAnimationStatusEventListener(gin::Arguments* args) {
+  v8::Local<v8::Function> callback;
+  if (!GetArg(args, &callback))
+    return false;
+  GpuBenchmarkingContext context(render_frame_.get());
+
+  auto callback_and_context = base::MakeRefCounted<CallbackAndContext>(
+      args->isolate(), callback, context.web_frame()->MainWorldScriptContext());
+  context.web_frame()->FrameWidget()->NotifyCoreAnimationErrorCode(
+      base::BindOnce(&OnSwapCompletedWithCoreAnimationErrorCode,
+                     base::RetainedRef(callback_and_context)));
+  // Request a begin frame explicitly, as the test-api expects a 'swap' to
+  // happen for the above queued swap promise even if there is no actual update.
+  context.layer_tree_host()->SetNeedsAnimateIfNotInsideMainFrame();
+
+  return true;
+}
+#endif
+
 }  // namespace content
diff --git a/content/renderer/gpu_benchmarking_extension.h b/content/renderer/gpu_benchmarking_extension.h
index 45e3059..d1a2310 100644
--- a/content/renderer/gpu_benchmarking_extension.h
+++ b/content/renderer/gpu_benchmarking_extension.h
@@ -105,6 +105,11 @@
   // The callback is removed once it's executed.
   bool AddSwapCompletionEventListener(gin::Arguments* args);
 
+  // For Mac only, returns the error code why CoreAnimation Renderer is not used
+  // in the requested frame. It's less efficient when this path is not hit.
+  // See "ui/gfx/ca_layer_result.h" for error codes.
+  int AddCoreAnimationStatusEventListener(gin::Arguments* args);
+
   base::WeakPtr<RenderFrameImpl> render_frame_;
   mojo::Remote<mojom::InputInjector> input_injector_;
 };
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index d4aa790..2d6de5b 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -222,6 +222,7 @@
   metadata.model = BuildModelInfo();
 
   metadata.bitness = GetLowEntropyCpuBitness();
+  metadata.wow64 = content::IsWoW64();
 
   return metadata;
 }
diff --git a/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt
index 9e14da91..71e8858 100644
--- a/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt
@@ -4,7 +4,7 @@
 ++++++iframe focusable
 ++++++++rootWebArea focusable
 ++++++++++genericContainer ignored
-++++++++++++genericContainer editable focusable invisible multiline richlyEditable
+++++++++++++genericContainer editable focusable invisible multiline richlyEditable value='1'
 ++++++++++++++staticText ignored invisible name='1'
 ++++++iframe focusable
 ++++++++rootWebArea focusable
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-android-external.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-android-external.txt
index abea14f..d1b566e 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-android-external.txt
@@ -1,9 +1,9 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++EditText text:"Foo\nBar\nBar\nBaz\nBaz" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable"]
+++EditText text:"Foo\n\nBar\n\nBar\n\nBaz\n\nBaz" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable"]
 ++++TextView text:"Foo" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++++EditText text:"Bar" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="nested, not editable, rich"]
 ++++++TextView text:"Bar" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++++EditText text:"Bar" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="nested, not editable, plain"]
 ++++EditText text:"Baz" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="nested, editable, rich"]
 ++++EditText text:"Baz" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="nested, editable, plain"]
-++EditText text:"Foo\nBar\nBar\nBaz\nBaz" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="editable"]
\ No newline at end of file
+++EditText text:"Foo\n\nBar\n\nBar\n\nBaz\n\nBaz" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="editable"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt
index 4f53cdd4..41a06dd 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++textField name='not editable' value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz' nonAtomicTextFieldRoot=true
+++++++textField name='not editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' nonAtomicTextFieldRoot=true
 ++++++++paragraph
 ++++++++++staticText name='Foo'
 ++++++++++++inlineTextBox name='Foo'
@@ -19,7 +19,7 @@
 ++++++++textField editable multiline richlyEditable name='nested, editable, plain' value='Baz' nonAtomicTextFieldRoot=true
 ++++++++++staticText editable richlyEditable name='Baz'
 ++++++++++++inlineTextBox editable richlyEditable name='Baz'
-++++++textField editable multiline richlyEditable name='editable' value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz' nonAtomicTextFieldRoot=true
+++++++textField editable multiline richlyEditable name='editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' nonAtomicTextFieldRoot=true
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='Foo'
 ++++++++++++inlineTextBox editable richlyEditable name='Foo'
@@ -36,4 +36,4 @@
 ++++++++++++++inlineTextBox editable richlyEditable name='Baz'
 ++++++++textField editable multiline richlyEditable name='nested, editable, plain' value='Baz' nonAtomicTextFieldRoot=true
 ++++++++++staticText editable richlyEditable name='Baz'
-++++++++++++inlineTextBox editable richlyEditable name='Baz'
\ No newline at end of file
+++++++++++++inlineTextBox editable richlyEditable name='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt
index 79f094e..4a33726 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXTextField AXDescription='not editable' AXValue='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz'
+++AXTextField AXDescription='not editable' AXValue='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
 ++++AXGroup
 ++++++AXStaticText AXValue='Foo'
 ++++AXTextField AXDescription='nested, not editable, rich' AXValue='Bar'
@@ -12,7 +12,7 @@
 ++++++++AXStaticText AXValue='Baz'
 ++++AXTextArea AXDescription='nested, editable, plain' AXValue='Baz'
 ++++++AXStaticText AXValue='Baz'
-++AXTextArea AXDescription='editable' AXValue='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz'
+++AXTextArea AXDescription='editable' AXValue='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
 ++++AXGroup
 ++++++AXStaticText AXValue='Foo'
 ++++AXTextField AXDescription='nested, not editable, rich' AXValue='Bar'
@@ -24,4 +24,4 @@
 ++++++AXGroup
 ++++++++AXStaticText AXValue='Baz'
 ++++AXTextArea AXDescription='nested, editable, plain' AXValue='Baz'
-++++++AXStaticText AXValue='Baz'
\ No newline at end of file
+++++++AXStaticText AXValue='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt
index 0f66e0a..c6d78b8cf 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Document
-++Edit Name='not editable' Value.Value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz'
+++Edit Name='not editable' Value.Value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
 ++++Group IsControlElement=false
 ++++++Text Name='Foo'
 ++++Edit Name='nested, not editable, rich' Value.Value='Bar'
@@ -12,7 +12,7 @@
 ++++++++Text Name='Baz'
 ++++Edit Name='nested, editable, plain' Value.Value='Baz'
 ++++++Text Name='Baz'
-++Edit Name='editable' Value.Value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz'
+++Edit Name='editable' Value.Value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
 ++++Group IsControlElement=false
 ++++++Text Name='Foo'
 ++++Edit Name='nested, not editable, rich' Value.Value='Bar'
@@ -24,4 +24,4 @@
 ++++++Group IsControlElement=false
 ++++++++Text Name='Baz'
 ++++Edit Name='nested, editable, plain' Value.Value='Baz'
-++++++Text Name='Baz'
\ No newline at end of file
+++++++Text Name='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt
index 6e0990a5..5a8e252 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_TEXT name='not editable' value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz'
+++ROLE_SYSTEM_TEXT name='not editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
 ++++IA2_ROLE_PARAGRAPH
 ++++++ROLE_SYSTEM_STATICTEXT name='Foo'
 ++++ROLE_SYSTEM_TEXT name='nested, not editable, rich' value='Bar'
@@ -12,7 +12,7 @@
 ++++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
 ++++ROLE_SYSTEM_TEXT name='nested, editable, plain' value='Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
 ++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
-++ROLE_SYSTEM_TEXT name='editable' value='Foo<newline>Bar<newline>Bar<newline>Baz<newline>Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++ROLE_SYSTEM_TEXT name='editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
 ++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
 ++++++ROLE_SYSTEM_STATICTEXT name='Foo' IA2_STATE_EDITABLE
 ++++ROLE_SYSTEM_TEXT name='nested, not editable, rich' value='Bar' IA2_STATE_EDITABLE
@@ -24,4 +24,4 @@
 ++++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
 ++++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
 ++++ROLE_SYSTEM_TEXT name='nested, editable, plain' value='Baz' IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
-++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
\ No newline at end of file
+++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-android-external.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-android-external.txt
index e8646e7b..d839cce 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea", hasImage="true"]
-++EditText text:"focusable: oklink name: \n" clickable editable focusable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable"]
+++EditText text:"focusable: ok link name: " clickable editable focusable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable"]
 ++++TextView text:"focusable: " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++Button text:"ok" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
 ++++View text:"null" contentDescription:"link" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html#"]
@@ -8,7 +8,7 @@
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="labelText"]
 ++++++TextView text:"name: " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++++EditText clickable editable focusable inputType:1 textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="name:"]
-++EditText text:"focusable: oklink name: \n" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="editable"]
+++EditText text:"focusable: ok link name: " clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="editable"]
 ++++TextView text:"focusable: " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++Button text:"ok" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
 ++++View text:"null" contentDescription:"link" clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html#"]
@@ -17,7 +17,7 @@
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="labelText", clickableScore="100"]
 ++++++TextView text:"name: " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++++EditText clickable editable focusable inputType:1 textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300", hint="name:"]
-++EditText text:"focusable: oklink name: \n" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable or focusable"]
+++EditText text:"focusable: ok link name: " clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", hint="not editable or focusable"]
 ++++TextView text:"focusable: " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++Button text:"ok" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
 ++++View text:"null" contentDescription:"link" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html#"]
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt
index aeaaca3..b329d11 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++textField name='not editable' value='focusable: oklink name: <newline>'
+++++++textField name='not editable' value='focusable: ok link name: '
 ++++++++staticText name='focusable: '
 ++++++++++inlineTextBox name='focusable: '
 ++++++++button name='ok'
@@ -17,7 +17,7 @@
 ++++++++++++inlineTextBox name='name: '
 ++++++++++textField name='name:'
 ++++++++++++genericContainer
-++++++textField multiline name='editable' value='focusable: oklink name: <newline>'
+++++++textField multiline name='editable' value='focusable: ok link name: '
 ++++++++staticText name='focusable: '
 ++++++++++inlineTextBox name='focusable: '
 ++++++++button name='ok'
@@ -33,7 +33,7 @@
 ++++++++++++inlineTextBox name='name: '
 ++++++++++textField name='name:'
 ++++++++++++genericContainer
-++++++textField name='not editable or focusable' value='focusable: oklink name: <newline>'
+++++++textField name='not editable or focusable' value='focusable: ok link name: '
 ++++++++staticText name='focusable: '
 ++++++++++inlineTextBox name='focusable: '
 ++++++++button name='ok'
@@ -50,4 +50,4 @@
 ++++++++++textField name='name:'
 ++++++++++++genericContainer
 ++++++textField name='not editable, img child'
-++++++++image
\ No newline at end of file
+++++++++image
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt
index ada427b..5a83dd05 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXTextField AXDescription='not editable' AXValue='focusable: oklink name: <newline>'
+++AXTextField AXDescription='not editable' AXValue='focusable: ok link name: '
 ++++AXStaticText AXValue='focusable: '
 ++++AXButton AXTitle='ok'
 ++++AXLink AXDescription='link'
@@ -8,7 +8,7 @@
 ++++AXGroup
 ++++++AXStaticText AXValue='name: '
 ++++++AXTextField AXTitle='name:'
-++AXTextArea AXDescription='editable' AXValue='focusable: oklink name: <newline>'
+++AXTextArea AXDescription='editable' AXValue='focusable: ok link name: '
 ++++AXStaticText AXValue='focusable: '
 ++++AXButton AXTitle='ok'
 ++++AXLink AXDescription='link'
@@ -17,7 +17,7 @@
 ++++AXGroup
 ++++++AXStaticText AXValue='name: '
 ++++++AXTextField AXTitle='name:'
-++AXTextField AXDescription='not editable or focusable' AXValue='focusable: oklink name: <newline>'
+++AXTextField AXDescription='not editable or focusable' AXValue='focusable: ok link name: '
 ++++AXStaticText AXValue='focusable: '
 ++++AXButton AXTitle='ok'
 ++++AXLink AXDescription='link'
@@ -27,4 +27,4 @@
 ++++++AXStaticText AXValue='name: '
 ++++++AXTextField AXTitle='name:'
 ++AXTextField AXDescription='not editable, img child'
-++++AXImage
\ No newline at end of file
+++++AXImage
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt
index 9bd36c3..094371e 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt
@@ -1,5 +1,5 @@
 Document
-++Edit Name='not editable' Value.Value='focusable: oklink name: <newline>'
+++Edit Name='not editable' Value.Value='focusable: ok link name: '
 ++++Text Name='focusable: '
 ++++Button Name='ok'
 ++++Hyperlink Name='link'
@@ -8,7 +8,7 @@
 ++++Text
 ++++++Text Name='name: '
 ++++++Edit Name='name:'
-++Edit Name='editable' Value.Value='focusable: oklink name: <newline>'
+++Edit Name='editable' Value.Value='focusable: ok link name: '
 ++++Text Name='focusable: '
 ++++Button Name='ok'
 ++++Hyperlink Name='link'
@@ -17,7 +17,7 @@
 ++++Text
 ++++++Text Name='name: '
 ++++++Edit Name='name:'
-++Edit Name='not editable or focusable' Value.Value='focusable: oklink name: <newline>'
+++Edit Name='not editable or focusable' Value.Value='focusable: ok link name: '
 ++++Text Name='focusable: '
 ++++Button Name='ok'
 ++++Hyperlink Name='link'
@@ -27,4 +27,4 @@
 ++++++Text Name='name: '
 ++++++Edit Name='name:'
 ++Edit Name='not editable, img child'
-++++Image
\ No newline at end of file
+++++Image
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt
index 71ca2f3..bea47fd8 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_TEXT name='not editable' value='focusable: oklink name: <newline>' FOCUSABLE
+++ROLE_SYSTEM_TEXT name='not editable' value='focusable: ok link name: ' FOCUSABLE
 ++++ROLE_SYSTEM_STATICTEXT name='focusable: '
 ++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
 ++++ROLE_SYSTEM_LINK name='link' FOCUSABLE
@@ -8,7 +8,7 @@
 ++++IA2_ROLE_LABEL
 ++++++ROLE_SYSTEM_STATICTEXT name='name: '
 ++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
-++ROLE_SYSTEM_TEXT name='editable' value='focusable: oklink name: <newline>' FOCUSABLE IA2_STATE_MULTI_LINE
+++ROLE_SYSTEM_TEXT name='editable' value='focusable: ok link name: ' FOCUSABLE IA2_STATE_MULTI_LINE
 ++++ROLE_SYSTEM_STATICTEXT name='focusable: '
 ++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
 ++++ROLE_SYSTEM_LINK name='link'
@@ -17,7 +17,7 @@
 ++++IA2_ROLE_LABEL
 ++++++ROLE_SYSTEM_STATICTEXT name='name: '
 ++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
-++ROLE_SYSTEM_TEXT name='not editable or focusable' value='focusable: oklink name: <newline>'
+++ROLE_SYSTEM_TEXT name='not editable or focusable' value='focusable: ok link name: '
 ++++ROLE_SYSTEM_STATICTEXT name='focusable: '
 ++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
 ++++ROLE_SYSTEM_LINK name='link' FOCUSABLE
@@ -27,4 +27,4 @@
 ++++++ROLE_SYSTEM_STATICTEXT name='name: '
 ++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
 ++ROLE_SYSTEM_TEXT name='not editable, img child'
-++++ROLE_SYSTEM_GRAPHIC READONLY
\ No newline at end of file
+++++ROLE_SYSTEM_GRAPHIC READONLY
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-mac.txt b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-mac.txt
index b4b48acc..106c299 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-mac.txt
@@ -2,8 +2,8 @@
 ++AXTextArea AXRoleDescription='text entry area' AXValue='TextBox1'
 ++++AXHeading AXRoleDescription='heading' AXTitle='TextBox1' AXValue=1
 ++++++AXStaticText AXRoleDescription='text' AXValue='TextBox1'
-++AXTextArea AXRoleDescription='text entry area' AXValue='TextBox2<newline>Some text.'
+++AXTextArea AXRoleDescription='text entry area' AXValue='TextBox2<newline><newline>Some text.'
 ++++AXHeading AXRoleDescription='heading' AXTitle='TextBox2' AXValue=2
 ++++++AXStaticText AXRoleDescription='text' AXValue='TextBox2'
 ++++AXGroup AXRoleDescription='group'
-++++++AXStaticText AXRoleDescription='text' AXValue='Some text.'
\ No newline at end of file
+++++++AXStaticText AXRoleDescription='text' AXValue='Some text.'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt
index 7d8ff23d..9586f352 100644
--- a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt
@@ -2,7 +2,7 @@
 ++ROLE_SYSTEM_TEXT value='TextBox1' FOCUSABLE IA2_STATE_MULTI_LINE xml-roles:textbox ia2_hypertext='<obj0>' n_characters=1 caret_offset=0 n_selections=0
 ++++IA2_ROLE_HEADING name='TextBox1' ia2_hypertext='TextBox1' n_characters=8 n_selections=0
 ++++++ROLE_SYSTEM_STATICTEXT name='TextBox1' ia2_hypertext='TextBox1' n_characters=8 n_selections=0
-++ROLE_SYSTEM_TEXT value='TextBox2<newline>Some text.' FOCUSABLE IA2_STATE_MULTI_LINE xml-roles:textbox ia2_hypertext='<obj0><obj1>' n_characters=2 n_selections=0
+++ROLE_SYSTEM_TEXT value='TextBox2<newline><newline>Some text.' FOCUSABLE IA2_STATE_MULTI_LINE xml-roles:textbox ia2_hypertext='<obj0><obj1>' n_characters=2 n_selections=0
 ++++IA2_ROLE_HEADING name='TextBox2' ia2_hypertext='TextBox2' n_characters=8 n_selections=0
 ++++++ROLE_SYSTEM_STATICTEXT name='TextBox2' ia2_hypertext='TextBox2' n_characters=8 n_selections=0
 ++++IA2_ROLE_PARAGRAPH ia2_hypertext='Some text.' n_characters=10 n_selections=0
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt
index 1ac2ddc7..f7a2b4b0 100644
--- a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt
@@ -1,4 +1,2 @@
-AXValueChanged on AXTextField AXDescription='initially not editable' AXValue='foo ok'
-AXValueChanged on AXWebArea
 === Start Continuation ===
-AXValueChanged on AXTextArea AXDescription='initially editable' AXValue='foo ok'
\ No newline at end of file
+AXValueChanged on AXTextArea AXDescription='initially editable' AXValue='foo ok'
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt
index d8618c8..0c902bf 100644
--- a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt
@@ -1,9 +1,8 @@
 EVENT_OBJECT_STATECHANGE on <button> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE IA2_STATE_EDITABLE
 EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="foo " IA2_STATE_EDITABLE
 EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="ok" IA2_STATE_EDITABLE
-EVENT_OBJECT_VALUECHANGE on <div#txt1> role=ROLE_SYSTEM_TEXT name="initially not editable" value="foo ok" FOCUSABLE IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
 === Start Continuation ===
 EVENT_OBJECT_STATECHANGE on <button> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
 EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="foo "
 EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="ok"
-EVENT_OBJECT_VALUECHANGE on <div#txt2> role=ROLE_SYSTEM_TEXT name="initially editable" value="foo ok" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_MULTI_LINE,IA2_STATE_SELECTABLE_TEXT
\ No newline at end of file
+EVENT_OBJECT_VALUECHANGE on <div#txt2> role=ROLE_SYSTEM_TEXT name="initially editable" value="foo ok" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_MULTI_LINE,IA2_STATE_SELECTABLE_TEXT
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-android-external.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-android-external.txt
index af4bbe77..2bc4b611b 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-android-external.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea", hasImage="true"]
-++EditText text:"A contenteditable with a link and an \n\n and a Button.\nAlways expose editable tables as tables.\n1. Editable list item." clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="genericContainer", clickableScore="200", hasImage="true"]
+++EditText text:"A contenteditable with a link and an  and a .\n\nAlways expose editable tables as tables.\nEditable list item." clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="genericContainer", clickableScore="200", hasImage="true"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="paragraph", clickableScore="100", hasImage="true"]
 ++++++TextView text:"A contenteditable with a " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++++View text:"null" contentDescription:"link" clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/html/contenteditable-descendants.html#"]
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-android.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-android.txt
index b63dd68..8940e44 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-android.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused scrollable
-++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='A contenteditable with a link and an <newline><newline> and a Button.<newline>Always expose editable tables as tables.<newline>1. Editable list item.' text_change_added_count=117
+++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' text_change_added_count=107
 ++++android.view.View
 ++++++android.widget.TextView name='A contenteditable with a '
 ++++++android.view.View role_description='link' clickable link name='link'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
index e060e1d6..57404c36 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an <newline><newline> and a Button.<newline>Always expose editable tables as tables.<newline>1. Editable list item.' nonAtomicTextFieldRoot=true
+++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' nonAtomicTextFieldRoot=true
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='A contenteditable with a '
 ++++++++++++inlineTextBox editable richlyEditable name='A contenteditable with a '
@@ -35,4 +35,4 @@
 ++++++++++inlineTextBox name='Non-editable paragraph.'
 ++++++paragraph editable multiline richlyEditable value='Should keep the role but change the state.' nonAtomicTextFieldRoot=true
 ++++++++staticText editable richlyEditable name='Should keep the role but change the state.'
-++++++++++inlineTextBox editable richlyEditable name='Should keep the role but change the state.'
\ No newline at end of file
+++++++++++inlineTextBox editable richlyEditable name='Should keep the role but change the state.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
index c508fd22..0c6b2cc 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0><obj1><obj2>' n_selections=0
-++IA2_ROLE_SECTION value='A contenteditable with a link and an <newline><newline> and a Button.<newline>Always expose editable tables as tables.<newline>1. Editable list item.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0><obj1><obj2>' n_selections=0
+++IA2_ROLE_SECTION value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0><obj1><obj2>' n_selections=0
 ++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE ia2_hypertext='A contenteditable with a <obj1> and an <obj3> and a <obj5>.' n_selections=0
 ++++++ROLE_SYSTEM_STATICTEXT name='A contenteditable with a ' IA2_STATE_EDITABLE ia2_hypertext='A contenteditable with a ' n_selections=0
 ++++++ROLE_SYSTEM_LINK name='link' LINKED IA2_STATE_EDITABLE ia2_hypertext='link' n_selections=0
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
index e27c3b1..06dde4ae 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an <newline><newline> and a Button.<newline>Always expose editable tables as tables.<newline>1. Editable list item.' nonAtomicTextFieldRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3
+++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' nonAtomicTextFieldRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='A contenteditable with a '
 ++++++++++++inlineTextBox editable richlyEditable name='A contenteditable with a '
@@ -29,4 +29,4 @@
 ++++++++++++listMarker name='1. '
 ++++++++++++++staticText ignored name='1. '
 ++++++++++++staticText editable richlyEditable name='Editable list item.'
-++++++++++++++inlineTextBox editable richlyEditable name='Editable list item.'
\ No newline at end of file
+++++++++++++++inlineTextBox editable richlyEditable name='Editable list item.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
index 18747d0b..b59997ce 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=1 n_selections=1 selection_start=0 selection_end=1
-++IA2_ROLE_SECTION value='A contenteditable with a link and an <newline><newline> and a Button.<newline>Always expose editable tables as tables.<newline>1. Editable list item.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0><obj1><obj2>' caret_offset=3 n_selections=1 selection_start=0 selection_end=3
+++IA2_ROLE_SECTION value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0><obj1><obj2>' caret_offset=3 n_selections=1 selection_start=0 selection_end=3
 ++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE ia2_hypertext='A contenteditable with a <obj1> and an <obj3> and a <obj5>.' n_selections=1 selection_start=0 selection_end=3
 ++++++ROLE_SYSTEM_STATICTEXT name='A contenteditable with a ' IA2_STATE_EDITABLE ia2_hypertext='A contenteditable with a ' n_selections=1 selection_start=0 selection_end=3
 ++++++ROLE_SYSTEM_LINK name='link' LINKED IA2_STATE_EDITABLE ia2_hypertext='link' n_selections=1 selection_start=0 selection_end=3
diff --git a/content/test/data/accessibility/html/contenteditable-docs-li-disable-ng-layout-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-docs-li-disable-ng-layout-expected-blink.txt
index 97a840ff..1626aca 100644
--- a/content/test/data/accessibility/html/contenteditable-docs-li-disable-ng-layout-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-docs-li-disable-ng-layout-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea isLineBreakingObject=true
 ++genericContainer ignored isLineBreakingObject=true
 ++++genericContainer ignored isLineBreakingObject=true
-++++++textField multiline value='Beginning<newline>1. A plain list item<newline>2. A list item<newline>with a br (line break) inside it<newline>3. A list item with an inner p role=presentation<newline>4. A list item with both a br and <newline>an inner p role=presentation<newline>5. A list item with inner spans on each line<newline>and separated by a br<newline>6. A list item with a role presentation, and two inner spans, each separated by a space<newline>7. A list item with a role presentation, and two inner spans, <newline>each separated by a br<newline>8. Hello world this is like docs markup without the weird presentational br<newline>9. Hello world this is just like docs, and your kitchen sink<newline>The end' isLineBreakingObject=true
+++++++textField multiline value='Beginning<newline><newline>A plain list item<newline>A list item<newline>with a br (line break) inside it<newline><newline>A list item with an inner p role=presentation<newline><newline>A list item with both a br and<newline>an inner p role=presentation<newline><newline>A list item with inner spans on each line<newline>and separated by a br<newline><newline>A list item with a role presentation, and two inner spans, each separated by a space<newline><newline>A list item with a role presentation, and two inner spans,<newline>each separated by a br<newline><newline>Hello world this is like docs markup without the weird presentational br<newline><newline>Hello<newline>world this<newline>is just like docs, and your kitchen sink<newline><newline>The end' isLineBreakingObject=true
 ++++++++paragraph isLineBreakingObject=true
 ++++++++++staticText name='Beginning'
 ++++++++++++inlineTextBox name='Beginning'
@@ -86,4 +86,4 @@
 ++++++++++++++inlineTextBox name='is just like docs, and your kitchen sink'
 ++++++++paragraph isLineBreakingObject=true
 ++++++++++staticText name='The end'
-++++++++++++inlineTextBox name='The end'
\ No newline at end of file
+++++++++++++inlineTextBox name='The end'
diff --git a/content/test/data/accessibility/html/contenteditable-docs-li-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-docs-li-expected-blink.txt
index e13dd5e..3e7287c1 100644
--- a/content/test/data/accessibility/html/contenteditable-docs-li-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-docs-li-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea isLineBreakingObject=true
 ++genericContainer ignored isLineBreakingObject=true
 ++++genericContainer ignored isLineBreakingObject=true
-++++++textField multiline value='Beginning<newline>1. A plain list item<newline>2. A list item<newline>with a br (line break) inside it<newline>3. A list item with an inner p role=presentation<newline>4. A list item with both a br and<newline>an inner p role=presentation<newline>5. A list item with inner spans on each line<newline>and separated by a br<newline>6. A list item with a role presentation, and two inner spans, each separated by a space<newline>7. A list item with a role presentation, and two inner spans,<newline>each separated by a br<newline>8. Hello world this is like docs markup without the weird presentational br<newline>9. Hello world this is just like docs, and your kitchen sink<newline>The end' isLineBreakingObject=true
+++++++textField multiline value='Beginning<newline><newline>A plain list item<newline>A list item<newline>with a br (line break) inside it<newline><newline>A list item with an inner p role=presentation<newline><newline>A list item with both a br and<newline>an inner p role=presentation<newline><newline>A list item with inner spans on each line<newline>and separated by a br<newline><newline>A list item with a role presentation, and two inner spans, each separated by a space<newline><newline>A list item with a role presentation, and two inner spans,<newline>each separated by a br<newline><newline>Hello world this is like docs markup without the weird presentational br<newline><newline>Hello<newline>world this<newline>is just like docs, and your kitchen sink<newline><newline>The end' isLineBreakingObject=true
 ++++++++paragraph isLineBreakingObject=true
 ++++++++++staticText name='Beginning'
 ++++++++++++inlineTextBox name='Beginning'
@@ -93,4 +93,4 @@
 ++++++++++++++inlineTextBox name='is just like docs, and your kitchen sink'
 ++++++++paragraph isLineBreakingObject=true
 ++++++++++staticText name='The end'
-++++++++++++inlineTextBox name='The end'
\ No newline at end of file
+++++++++++++inlineTextBox name='The end'
diff --git a/content/test/data/accessibility/html/contenteditable-li-contains-presentation-disable-ng-layout-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-li-contains-presentation-disable-ng-layout-expected-blink.txt
index 4335406..b90c035 100644
--- a/content/test/data/accessibility/html/contenteditable-li-contains-presentation-disable-ng-layout-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-li-contains-presentation-disable-ng-layout-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea isLineBreakingObject=true
 ++genericContainer ignored isLineBreakingObject=true
 ++++genericContainer ignored isLineBreakingObject=true
-++++++genericContainer multiline value='1. text in span in presentational paragraph in li<newline>2. A list item with both a br and<newline>an inner p role=presentation' isLineBreakingObject=true
+++++++genericContainer multiline value='text in span in presentational paragraph in li<newline><newline>A list item with both a br and<newline>an inner p role=presentation' isLineBreakingObject=true
 ++++++++list isLineBreakingObject=true
 ++++++++++listItem isLineBreakingObject=true
 ++++++++++++listMarker name='1. ' nextOnLineId=inlineTextBox:"text in span in presentational paragraph in li"
diff --git a/content/test/data/accessibility/html/contenteditable-li-contains-presentation-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-li-contains-presentation-expected-blink.txt
index c04d0eb..7db603e54 100644
--- a/content/test/data/accessibility/html/contenteditable-li-contains-presentation-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-li-contains-presentation-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea isLineBreakingObject=true
 ++genericContainer ignored isLineBreakingObject=true
 ++++genericContainer ignored isLineBreakingObject=true
-++++++genericContainer multiline value='1. text in span in presentational paragraph in li<newline>2. A list item with both a br and<newline>an inner p role=presentation' isLineBreakingObject=true
+++++++genericContainer multiline value='text in span in presentational paragraph in li<newline><newline>A list item with both a br and<newline>an inner p role=presentation' isLineBreakingObject=true
 ++++++++list isLineBreakingObject=true
 ++++++++++listItem isLineBreakingObject=true
 ++++++++++++listMarker name='1. ' nextOnLineId=inlineTextBox:"text in span in presentational paragraph in li"
@@ -16,4 +16,4 @@
 ++++++++++++lineBreak name='<newline>' previousOnLineId=inlineTextBox:"A list item with both a br and" isLineBreakingObject=true
 ++++++++++++++inlineTextBox name='<newline>' previousOnLineId=inlineTextBox:"A list item with both a br and" isLineBreakingObject=true
 ++++++++++++staticText name='an inner p role=presentation'
-++++++++++++++inlineTextBox name='an inner p role=presentation'
\ No newline at end of file
+++++++++++++++inlineTextBox name='an inner p role=presentation'
diff --git a/content/test/data/accessibility/html/contenteditable-spans-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-spans-expected-blink.txt
index 6e7ee5a..9243d89 100644
--- a/content/test/data/accessibility/html/contenteditable-spans-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-spans-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++textField multiline value='ABCDEF<newline>XYZ123'
+++++++textField multiline value='ABCDEF<newline><newline>XYZ123'
 ++++++++paragraph
 ++++++++++staticText name='ABC' nextOnLineId=inlineTextBox:"DEF"
 ++++++++++++inlineTextBox name='ABC' nextOnLineId=inlineTextBox:"DEF"
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android-external.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android-external.txt
index fc49c8c..e02f8ad 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android-external.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++EditText text:"This is editable.\nThis is not editable.\nBut this one is.\nSo is this one." clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="genericContainer", clickableScore="200"]
+++EditText text:"This is editable.\n\nThis is not editable.\n\n\nBut this one is.\n\nSo is this one." clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="genericContainer", clickableScore="200"]
 ++++TextView text:"This is editable." actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph", clickableScore="100"]
 ++++TextView text:"This is not editable." actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++View text:"\n" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="lineBreak", clickableScore="100"]
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android.txt
index 37d2c6d..73db664 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused scrollable
-++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='This is editable.<newline>This is not editable.<newline>But this one is.<newline>So is this one.' text_change_added_count=72
+++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' text_change_added_count=76
 ++++android.widget.TextView name='This is editable.'
 ++++android.widget.TextView name='This is not editable.'
 ++++android.view.View name='<newline>'
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
index afa2ee6..b4cd8d8b 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='This is editable.<newline>This is not editable.<newline>But this one is.<newline>So is this one.' nonAtomicTextFieldRoot=true
+++++++genericContainer editable multiline richlyEditable value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' nonAtomicTextFieldRoot=true
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='This is editable.'
 ++++++++++++inlineTextBox editable richlyEditable name='This is editable.'
@@ -15,4 +15,4 @@
 ++++++++++++++inlineTextBox editable richlyEditable name='But this one is.'
 ++++++++paragraph editable multiline richlyEditable value='So is this one.' nonAtomicTextFieldRoot=true
 ++++++++++staticText editable richlyEditable name='So is this one.'
-++++++++++++inlineTextBox editable richlyEditable name='So is this one.'
\ No newline at end of file
+++++++++++++inlineTextBox editable richlyEditable name='So is this one.'
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-mac.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-mac.txt
index 89fbcde55..83d98fd7 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-mac.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXTextArea AXValue='This is editable.<newline>This is not editable.<newline>But this one is.<newline>So is this one.'
+++AXTextArea AXValue='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.'
 ++++AXGroup
 ++++++AXStaticText AXValue='This is editable.'
 ++++AXStaticText AXValue='This is not editable.'
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-win.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-win.txt
index a81a566..60c6953 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0
-++IA2_ROLE_SECTION value='This is editable.<newline>This is not editable.<newline>But this one is.<newline>So is this one.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0>This is not editable.<newline><obj3><obj4>' n_selections=0
+++IA2_ROLE_SECTION value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE ia2_hypertext='<obj0>This is not editable.<newline><obj3><obj4>' n_selections=0
 ++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE ia2_hypertext='This is editable.' n_selections=0
 ++++++ROLE_SYSTEM_STATICTEXT name='This is editable.' IA2_STATE_EDITABLE ia2_hypertext='This is editable.' n_selections=0
 ++++ROLE_SYSTEM_STATICTEXT name='This is not editable.' ia2_hypertext='This is not editable.' n_selections=0
diff --git a/content/test/data/accessibility/html/design-mode-expected-blink.txt b/content/test/data/accessibility/html/design-mode-expected-blink.txt
index ccab1de8..fe54203c 100644
--- a/content/test/data/accessibility/html/design-mode-expected-blink.txt
+++ b/content/test/data/accessibility/html/design-mode-expected-blink.txt
@@ -1,6 +1,6 @@
 rootWebArea editable richlyEditable htmlTag='#document'
-++genericContainer editable ignored richlyEditable htmlTag='html' value='Hello' nonAtomicTextFieldRoot=true
-++++genericContainer editable richlyEditable htmlTag='body' value='Hello' nonAtomicTextFieldRoot=true
+++genericContainer editable ignored richlyEditable htmlTag='html' nonAtomicTextFieldRoot=true
+++++genericContainer editable richlyEditable htmlTag='body' nonAtomicTextFieldRoot=true
 ++++++paragraph editable richlyEditable htmlTag='p'
 ++++++++staticText editable richlyEditable name='Hello'
-++++++++++inlineTextBox editable richlyEditable name='Hello'
\ No newline at end of file
+++++++++++inlineTextBox editable richlyEditable name='Hello'
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-android.txt b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-android.txt
index a5d0235..1315d17 100644
--- a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-android.txt
+++ b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-android.txt
@@ -1,2 +1,4 @@
 android.webkit.WebView focusable focused scrollable
-++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='<newline>' hint='Done' text_change_added_count=1
\ No newline at end of file
+++android.widget.EditText clickable editable_text focusable multiline hint='Done'
+++++android.widget.TextView
+++++android.widget.TextView
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-blink.txt b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-blink.txt
index 9e5f909..22293a0 100644
--- a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-blink.txt
+++ b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-blink.txt
@@ -1,5 +1,5 @@
 rootWebArea
 ++genericContainer ignored
-++++genericContainer multiline name='Done' value='<newline>'
+++++genericContainer multiline name='Done'
 ++++++genericContainer
-++++++genericContainer
\ No newline at end of file
+++++++genericContainer
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt
index b4e82f8..dadf6f64 100644
--- a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt
+++ b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt
@@ -1,4 +1,4 @@
 AXWebArea
-++AXTextArea AXDescription='Done' AXValue='<newline>'
+++AXTextArea AXDescription='Done'
 ++++AXGroup
-++++AXGroup
\ No newline at end of file
+++++AXGroup
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt
index d8cc9dc..23d066f 100644
--- a/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt
+++ b/content/test/data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt
@@ -1,4 +1,4 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++IA2_ROLE_SECTION name='Done' value='<newline>' FOCUSABLE IA2_STATE_MULTI_LINE
+++IA2_ROLE_SECTION name='Done' FOCUSABLE IA2_STATE_MULTI_LINE
 ++++IA2_ROLE_SECTION
 ++++IA2_ROLE_SECTION
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/selectmenu-expected-android-external.txt b/content/test/data/accessibility/html/selectmenu-expected-android-external.txt
index 37a6350..a6bd028b 100644
--- a/content/test/data/accessibility/html/selectmenu-expected-android-external.txt
+++ b/content/test/data/accessibility/html/selectmenu-expected-android-external.txt
@@ -1,10 +1,11 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++View viewIdResName:"A" actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
-++++View text:"Option 1, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
-++++View text:"Option 2, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
-++++View text:"Option 3, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
-++View viewIdResName:"B" actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
-++++TextView text:"Custom selectmenu button" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
-++++View text:"Option 1, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
-++++View text:"Option 2, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
-++++View text:"Option 3, in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
\ No newline at end of file
+++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
+++++View viewIdResName:"A" actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
+++++++View text:"Option 1" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
+++++++View text:"Option 2" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
+++++++View text:"Option 3" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
+++++View viewIdResName:"B" actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
+++++++TextView text:"Custom selectmenu button" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
+++++++View text:"Option 1" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
+++++++View text:"Option 2" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
+++++++View text:"Option 3" stateDescription:"in list, item 1 of 0" clickable focusable CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listBoxOption", clickableScore="200"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ul-contenteditable-expected-android-external.txt b/content/test/data/accessibility/html/ul-contenteditable-expected-android-external.txt
index 820da000..3c5c608e 100644
--- a/content/test/data/accessibility/html/ul-contenteditable-expected-android-external.txt
+++ b/content/test/data/accessibility/html/ul-contenteditable-expected-android-external.txt
@@ -1,2 +1,2 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++EditText text:"• Hello\n• Bye" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
\ No newline at end of file
+++EditText text:"Hello\n\nBye" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ul-contenteditable-expected-blink.txt b/content/test/data/accessibility/html/ul-contenteditable-expected-blink.txt
index 771c648..249fb77 100644
--- a/content/test/data/accessibility/html/ul-contenteditable-expected-blink.txt
+++ b/content/test/data/accessibility/html/ul-contenteditable-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++textField multiline value='%E2%80%A2 Hello<newline>%E2%80%A2 Bye'
+++++++textField multiline value='Hello<newline><newline>Bye'
 ++++++++list
 ++++++++++listItem
 ++++++++++++listMarker name='%E2%80%A2 '
@@ -12,4 +12,4 @@
 ++++++++++++listMarker name='%E2%80%A2 '
 ++++++++++++++staticText ignored name='%E2%80%A2 '
 ++++++++++++staticText name='Bye'
-++++++++++++++inlineTextBox name='Bye'
\ No newline at end of file
+++++++++++++++inlineTextBox name='Bye'
diff --git a/content/test/data/accessibility/html/ul-contenteditable-expected-win.txt b/content/test/data/accessibility/html/ul-contenteditable-expected-win.txt
index 643fd51..134a4ca 100644
--- a/content/test/data/accessibility/html/ul-contenteditable-expected-win.txt
+++ b/content/test/data/accessibility/html/ul-contenteditable-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++ROLE_SYSTEM_TEXT value='%E2%80%A2 Hello<newline>%E2%80%A2 Bye' FOCUSABLE IA2_STATE_MULTI_LINE
+++ROLE_SYSTEM_TEXT value='Hello<newline><newline>Bye' FOCUSABLE IA2_STATE_MULTI_LINE
 ++++ROLE_SYSTEM_LIST
 ++++++ROLE_SYSTEM_LISTITEM
 ++++++++ROLE_SYSTEM_STATICTEXT name='%E2%80%A2 '
diff --git a/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable-expected.txt b/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable-expected.txt
new file mode 100644
index 0000000..694ed6c80
--- /dev/null
+++ b/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable-expected.txt
@@ -0,0 +1,6 @@
+listbox.accessibilityAttributeNames.has(AXIsMultiSelectable)='no'
+listbox.accessibilityAttributeValue(AXIsMultiSelectable)=1
+listbox_not.accessibilityAttributeNames.has(AXIsMultiSelectable)='no'
+listbox_not.accessibilityAttributeValue(AXIsMultiSelectable)=0
+not_applicable.accessibilityAttributeNames.has(AXIsMultiSelectable)='no'
+not_applicable.accessibilityAttributeValue(AXIsMultiSelectable)=0
diff --git a/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable.html b/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable.html
new file mode 100644
index 0000000..8c5ea4f6
--- /dev/null
+++ b/content/test/data/accessibility/mac/attributes/ax-is-multi-selectable.html
@@ -0,0 +1,13 @@
+<!--
+@SCRIPT:
+  listbox.accessibilityAttributeNames.has(AXIsMultiSelectable)
+  listbox.accessibilityAttributeValue(AXIsMultiSelectable)
+  listbox_not.accessibilityAttributeNames.has(AXIsMultiSelectable)
+  listbox_not.accessibilityAttributeValue(AXIsMultiSelectable)
+  not_applicable.accessibilityAttributeNames.has(AXIsMultiSelectable)
+  not_applicable.accessibilityAttributeValue(AXIsMultiSelectable)
+-->
+<!DOCTYPE html>
+<ul id="listbox" role="listbox" aria-multiselectable="true"></ul>
+<ul id="listbox_not" role="listbox"></ul>
+<div id="not_applicable"></div>
diff --git a/content/test/data/accessibility/regression/content-visibility-with-pseudo-element-expected-blink.txt b/content/test/data/accessibility/regression/content-visibility-with-pseudo-element-expected-blink.txt
index 7b781af..c0232ef 100644
--- a/content/test/data/accessibility/regression/content-visibility-with-pseudo-element-expected-blink.txt
+++ b/content/test/data/accessibility/regression/content-visibility-with-pseudo-element-expected-blink.txt
@@ -1,3 +1,3 @@
 rootWebArea name='done'
-++genericContainer ignored value='%E2%80%A2 <newline>%E2%80%A2 target'
-++++genericContainer value='%E2%80%A2 <newline>%E2%80%A2 target'
\ No newline at end of file
+++genericContainer ignored
+++++genericContainer
diff --git a/content/test/data/attribution_reporting/databases/version_14.sql b/content/test/data/attribution_reporting/databases/version_14.sql
deleted file mode 100644
index 3e69052..0000000
--- a/content/test/data/attribution_reporting/databases/version_14.sql
+++ /dev/null
@@ -1,39 +0,0 @@
-PRAGMA foreign_keys=OFF;
-
-BEGIN TRANSACTION;
-
-CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL);
-
-CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL);
-
-CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY NOT NULL,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL,bucket TEXT NOT NULL,value INTEGER NOT NULL);
-
-CREATE TABLE dedup_keys(impression_id INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(impression_id,dedup_key))WITHOUT ROWID;
-
-CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
-
-INSERT INTO meta VALUES('mmap_status','-1');
-INSERT INTO meta VALUES('version','14');
-INSERT INTO meta VALUES('last_compatible_version','14');
-
-CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin);
-
-CREATE INDEX impression_expiry_idx ON impressions(expiry_time);
-
-CREATE INDEX impression_origin_idx ON impressions(impression_origin);
-
-CREATE INDEX event_source_impression_site_idx ON impressions(impression_site)WHERE active = 1 AND num_conversions = 0 AND source_type = 1;
-
-CREATE INDEX conversion_report_idx ON conversions(report_time);
-
-CREATE INDEX conversion_impression_id_idx ON conversions(impression_id);
-
-CREATE INDEX rate_limit_impression_site_type_idx ON rate_limits(attribution_type,conversion_destination,impression_site,conversion_time);
-
-CREATE INDEX rate_limit_attribution_type_conversion_time_idx ON rate_limits(attribution_type,conversion_time);
-
-CREATE INDEX rate_limit_impression_id_idx ON rate_limits(impression_id);
-
-INSERT INTO conversions VALUES (1,2,3,4,5,6,7);
-
-COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_15.sql b/content/test/data/attribution_reporting/databases/version_16.sql
similarity index 88%
rename from content/test/data/attribution_reporting/databases/version_15.sql
rename to content/test/data/attribution_reporting/databases/version_16.sql
index ef1c280..c691a2b 100644
--- a/content/test/data/attribution_reporting/databases/version_15.sql
+++ b/content/test/data/attribution_reporting/databases/version_16.sql
@@ -13,8 +13,8 @@
 CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
 
 INSERT INTO meta VALUES('mmap_status','-1');
-INSERT INTO meta VALUES('version','15');
-INSERT INTO meta VALUES('last_compatible_version','15');
+INSERT INTO meta VALUES('version','16');
+INSERT INTO meta VALUES('last_compatible_version','16');
 
 CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin);
 
@@ -22,7 +22,7 @@
 
 CREATE INDEX impression_origin_idx ON impressions(impression_origin);
 
-CREATE INDEX event_source_impression_site_idx ON impressions(impression_site)WHERE active = 1 AND num_conversions = 0 AND source_type = 1;
+CREATE INDEX impression_site_reporting_origin_idx ON impressions(impression_site,reporting_origin)WHERE active=1 AND num_conversions=0;
 
 CREATE INDEX conversion_report_idx ON conversions(report_time);
 
@@ -34,4 +34,6 @@
 
 CREATE INDEX rate_limit_impression_id_idx ON rate_limits(impression_id);
 
+INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8);
+
 COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_15.sql b/content/test/data/attribution_reporting/databases/version_17.sql
similarity index 86%
copy from content/test/data/attribution_reporting/databases/version_15.sql
copy to content/test/data/attribution_reporting/databases/version_17.sql
index ef1c280..7de963fc 100644
--- a/content/test/data/attribution_reporting/databases/version_15.sql
+++ b/content/test/data/attribution_reporting/databases/version_17.sql
@@ -6,15 +6,15 @@
 
 CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL);
 
-CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY NOT NULL,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL,bucket TEXT NOT NULL,value INTEGER NOT NULL);
+CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY NOT NULL,attribution_type INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,conversion_time INTEGER NOT NULL);
 
 CREATE TABLE dedup_keys(impression_id INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(impression_id,dedup_key))WITHOUT ROWID;
 
 CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
 
 INSERT INTO meta VALUES('mmap_status','-1');
-INSERT INTO meta VALUES('version','15');
-INSERT INTO meta VALUES('last_compatible_version','15');
+INSERT INTO meta VALUES('version','17');
+INSERT INTO meta VALUES('last_compatible_version','17');
 
 CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin);
 
@@ -22,7 +22,7 @@
 
 CREATE INDEX impression_origin_idx ON impressions(impression_origin);
 
-CREATE INDEX event_source_impression_site_idx ON impressions(impression_site)WHERE active = 1 AND num_conversions = 0 AND source_type = 1;
+CREATE INDEX impression_site_reporting_origin_idx ON impressions(impression_site,reporting_origin)WHERE active=1 AND num_conversions=0;
 
 CREATE INDEX conversion_report_idx ON conversions(report_time);
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 91d79d7..327a463 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -213,7 +213,6 @@
 # ========================
 
 # Failing new updated tests
-crbug.com/891861 conformance2/extensions/webgl-multi-draw-instanced-base-vertex-base-instance.html [ Failure ]
 crbug.com/1131224 conformance2/rendering/framebuffer-mismatched-attachment-targets.html [ Failure ]
 crbug.com/1108086 [ no-passthrough ] conformance2/renderbuffers/framebuffer-object-attachment.html [ Failure ]
 crbug.com/angleproject/4807 [ win angle-d3d11 passthrough ] conformance2/glsl3/switch-case.html [ Failure ]
@@ -267,9 +266,8 @@
 crbug.com/1198658 [ android android-pixel-2 ] deqp/functional/gles3/shaderoperator/binary_operator_* [ Failure ]
 crbug.com/1198658 [ android android-pixel-2 ] deqp/functional/gles3/shaderoperator/unary_operator_* [ Failure ]
 
-# Temporary suppression while we wait for a spec update.
-# TODO(jmadill): Remove when possible.
-crbug.com/angleproject/6358 conformance/programs/program-test.html [ Failure ]
+# New validation was not implemented on the validating command decoder.
+crbug.com/angleproject/6358 [ no-passthrough ] conformance/programs/program-test.html [ Failure ]
 
 ####################
 # Win failures     #
@@ -593,6 +591,10 @@
 crbug.com/630800 [ nvidia mac ] deqp/functional/gles3/fbocompleteness.html [ Failure ]
 crbug.com/811614 [ amd mac ] deqp/functional/gles3/negativeshaderapi.html [ Failure ]
 crbug.com/811614 [ intel mac ] deqp/functional/gles3/negativeshaderapi.html [ Failure ]
+crbug.com/1289803 [ mac no-passthrough ] conformance2/extensions/webgl-multi-draw-instanced-base-vertex-base-instance.html [ Failure ]
+crbug.com/1289803 [ mac passthrough angle-opengl ] conformance2/extensions/webgl-multi-draw-instanced-base-vertex-base-instance.html [ Failure ]
+# The extension is not supported on ANGLE/Metal yet but we intend to make it work.
+crbug.com/891861 [ mac passthrough angle-metal ] conformance2/extensions/webgl-multi-draw-instanced-base-vertex-base-instance.html [ Skip ]
 
 # Mac Retina NVIDIA
 crbug.com/728271 [ mac nvidia-0xfe9 ] deqp/functional/gles3/shaderindexing/mat_01.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index addf3be..2e74056 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -329,9 +329,8 @@
 
 crbug.com/953120 conformance/programs/program-handling.html [ Failure ]
 
-# Temporary suppression while we wait for a spec update.
-# TODO(jmadill): Remove when possible.
-crbug.com/angleproject/6358 conformance/programs/program-test.html [ Failure ]
+# New validation was not implemented on the validating command decoder.
+crbug.com/angleproject/6358 [ no-passthrough ] conformance/programs/program-test.html [ Failure ]
 
 # Win / AMD / Passthrough command decoder / D3D11
 crbug.com/1282819 [ win amd-0x6613 angle-d3d11 passthrough ] conformance/canvas/canvas-test.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
index e90dc3214..2747daf3 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
+++ b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
@@ -1,3 +1,3 @@
 # AUTOGENERATED FILE - DO NOT EDIT
 # SEE roll_webgl_conformance.py
-Current webgl revision b1f3776e4913637221733a4da09f3339e783b771
+Current webgl revision cf04aebdf9b53bb2853f22a81465688daf879ec6
diff --git a/device/fido/authenticator_get_assertion_response.h b/device/fido/authenticator_get_assertion_response.h
index 0b29f28f3..b6c5a04 100644
--- a/device/fido/authenticator_get_assertion_response.h
+++ b/device/fido/authenticator_get_assertion_response.h
@@ -63,6 +63,10 @@
   // capable authenticator and the credential has an associated large blob key.
   absl::optional<std::array<uint8_t, kLargeBlobKeyLength>> large_blob_key;
 
+  // user_selected indicates that the authenticator has a UI and has already
+  // shown the user an account chooser for the empty-allowList request.
+  bool user_selected = false;
+
   // The large blob associated with the credential.
   absl::optional<std::vector<uint8_t>> large_blob;
 
diff --git a/device/fido/cable/v2_authenticator.cc b/device/fido/cable/v2_authenticator.cc
index 73501aa5..94481a56 100644
--- a/device/fido/cable/v2_authenticator.cc
+++ b/device/fido/cable/v2_authenticator.cc
@@ -229,6 +229,7 @@
       network::mojom::NetworkContext* network_context,
       base::span<const uint8_t> secret,
       base::span<const uint8_t, device::kP256X962Length> peer_identity,
+      bool use_new_crypter_construction,
       GeneratePairingDataCallback generate_pairing_data)
       : platform_(platform),
         tunnel_id_(device::cablev2::Derive<EXTENT(tunnel_id_)>(
@@ -242,7 +243,8 @@
         network_context_(network_context),
         peer_identity_(device::fido_parsing_utils::Materialize(peer_identity)),
         generate_pairing_data_(std::move(generate_pairing_data)),
-        secret_(fido_parsing_utils::Materialize(secret)) {
+        secret_(fido_parsing_utils::Materialize(secret)),
+        use_new_crypter_construction_(use_new_crypter_construction) {
     DCHECK_EQ(state_, State::kNone);
     state_ = State::kConnecting;
 
@@ -270,7 +272,8 @@
             device::cablev2::DerivedValueType::kEIDKey)),
         network_context_(network_context),
         secret_(fido_parsing_utils::Materialize(secret)),
-        local_identity_(std::move(local_identity)) {
+        local_identity_(std::move(local_identity)),
+        use_new_crypter_construction_(false) {
     DCHECK_EQ(state_, State::kNone);
 
     state_ = State::kConnectingPaired;
@@ -411,6 +414,9 @@
         update_callback_.Run(Platform::Status::HANDSHAKE_COMPLETE);
         websocket_client_->Write(response);
         crypter_ = std::move(result->first);
+        if (use_new_crypter_construction_) {
+          crypter_->UseNewConstruction();
+        }
 
         cbor::Value::MapValue post_handshake_msg;
         post_handshake_msg.emplace(1, BuildGetInfoResponse());
@@ -480,6 +486,7 @@
   GeneratePairingDataCallback generate_pairing_data_;
   const std::vector<uint8_t> secret_;
   bssl::UniquePtr<EC_KEY> local_identity_;
+  const bool use_new_crypter_construction_;
   GURL target_;
   std::unique_ptr<Platform::BLEAdvert> ble_advert_;
   base::RepeatingCallback<void(Update)> update_callback_;
@@ -948,15 +955,16 @@
     const std::string& authenticator_name,
     base::span<const uint8_t, 16> qr_secret,
     base::span<const uint8_t, kP256X962Length> peer_identity,
-    absl::optional<std::vector<uint8_t>> contact_id) {
+    absl::optional<std::vector<uint8_t>> contact_id,
+    bool use_new_crypter_construction) {
   auto generate_pairing_data = PairingDataGenerator::GetClosure(
       root_secret, authenticator_name, std::move(contact_id));
 
   Platform* const platform_ptr = platform.get();
   return std::make_unique<CTAP2Processor>(
-      std::make_unique<TunnelTransport>(platform_ptr, network_context,
-                                        qr_secret, peer_identity,
-                                        std::move(generate_pairing_data)),
+      std::make_unique<TunnelTransport>(
+          platform_ptr, network_context, qr_secret, peer_identity,
+          use_new_crypter_construction, std::move(generate_pairing_data)),
       std::move(platform));
 }
 
diff --git a/device/fido/cable/v2_authenticator.h b/device/fido/cable/v2_authenticator.h
index 7c8c449..ef480e43d 100644
--- a/device/fido/cable/v2_authenticator.h
+++ b/device/fido/cable/v2_authenticator.h
@@ -143,7 +143,8 @@
     // TODO: name this constant.
     base::span<const uint8_t, 16> qr_secret,
     base::span<const uint8_t, kP256X962Length> peer_identity,
-    absl::optional<std::vector<uint8_t>> contact_id);
+    absl::optional<std::vector<uint8_t>> contact_id,
+    bool use_new_crypter_construction);
 
 // TransactFromFCM starts a network-based transaction based on the decoded
 // contents of a cloud message.
diff --git a/device/fido/cable/v2_handshake.cc b/device/fido/cable/v2_handshake.cc
index 7666780..5264fda3 100644
--- a/device/fido/cable/v2_handshake.cc
+++ b/device/fido/cable/v2_handshake.cc
@@ -406,8 +406,18 @@
     FIDO_LOG(ERROR) << "Invalid compressed public key in QR data";
     return absl::nullopt;
   }
-
   ret.peer_identity = *peer_identity;
+
+  const auto it = qr_contents_map.find(cbor::Value(2));
+  if (it != qr_contents_map.end()) {
+    if (!it->second.is_integer()) {
+      return absl::nullopt;
+    }
+    ret.num_known_domains = it->second.GetInteger();
+  } else {
+    ret.num_known_domains = 0;
+  }
+
   return ret;
 }
 
@@ -817,6 +827,10 @@
   return true;
 }
 
+void Crypter::UseNewConstruction() {
+  new_construction_ = true;
+}
+
 bool Crypter::IsCounterpartyOfForTesting(const Crypter& other) const {
   return read_key_ == other.write_key_ && write_key_ == other.read_key_;
 }
diff --git a/device/fido/cable/v2_handshake.h b/device/fido/cable/v2_handshake.h
index ac60bcd..1b89ca1a 100644
--- a/device/fido/cable/v2_handshake.h
+++ b/device/fido/cable/v2_handshake.h
@@ -108,6 +108,11 @@
 struct COMPONENT_EXPORT(DEVICE_FIDO) Components {
   std::array<uint8_t, device::kP256X962Length> peer_identity;
   std::array<uint8_t, 16> secret;
+  // num_known_domains is the number of registered tunnel server domains known
+  // to the device showing the QR code. Authenticators can use this to fallback
+  // to a hashed domain if their registered domain isn't going to work with this
+  // client.
+  int64_t num_known_domains;
 };
 
 COMPONENT_EXPORT(DEVICE_FIDO)
@@ -214,6 +219,10 @@
   bool Decrypt(base::span<const uint8_t> ciphertext,
                std::vector<uint8_t>* out_plaintext);
 
+  // Encrypt and decrypt with big-endian nonces and no additional data. This
+  // is the format in the spec and that we want to transition to.
+  void UseNewConstruction();
+
   // IsCounterpartyOfForTesting returns true if |other| is the mirror-image of
   // this object. (I.e. read/write keys are equal but swapped.)
   bool IsCounterpartyOfForTesting(const Crypter& other) const;
diff --git a/device/fido/cable/v2_handshake_unittest.cc b/device/fido/cable/v2_handshake_unittest.cc
index d992e17..886fdad 100644
--- a/device/fido/cable/v2_handshake_unittest.cc
+++ b/device/fido/cable/v2_handshake_unittest.cc
@@ -86,6 +86,9 @@
                    &qr_key[qr_key.size() - decoded->secret.size()],
                    decoded->secret.size()),
             0);
+  // There are two registered domains at the time of writing the test. That
+  // number should only grow over time.
+  EXPECT_GE(decoded->num_known_domains, 2u);
 
   url[0] ^= 4;
   EXPECT_FALSE(qr::Parse(url));
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc
index 98ee9f7..2ee1b5f 100644
--- a/device/fido/device_response_converter.cc
+++ b/device/fido/device_response_converter.cc
@@ -183,6 +183,15 @@
     response.num_credentials = it->second.GetUnsigned();
   }
 
+  it = response_map.find(CBOR(0x06));
+  if (it != response_map.end()) {
+    if (!it->second.is_bool() || response.num_credentials.has_value()) {
+      return absl::nullopt;
+    }
+
+    response.user_selected = it->second.GetBool();
+  }
+
   it = response_map.find(CBOR(0x07));
   if (it != response_map.end()) {
     if (!it->second.is_bytestring()) {
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc
index 94c636e..a0d6e10 100644
--- a/device/fido/get_assertion_request_handler.cc
+++ b/device/fido/get_assertion_request_handler.cc
@@ -133,8 +133,11 @@
 }
 
 // ResponseValid returns whether |response| is permissible for the given
-// |authenticator| and |request|.
-bool ResponseValid(const FidoAuthenticator& authenticator,
+// |authenticator| and |request|. |is_first_response| is true if this is the
+// first assertion response read. For responses to getNextAssertion commands
+// it should be false.
+bool ResponseValid(bool is_first_response,
+                   const FidoAuthenticator& authenticator,
                    const CtapGetAssertionRequest& request,
                    const CtapGetAssertionOptions& options,
                    const AuthenticatorGetAssertionResponse& response) {
@@ -191,6 +194,11 @@
     return false;
   }
 
+  if (!is_first_response && response.user_selected) {
+    // It is invalid to set `userSelected` on subsequent responses.
+    return false;
+  }
+
   return true;
 }
 
@@ -574,7 +582,8 @@
                absl::nullopt, authenticator);
       return;
     }
-    if (!ResponseValid(*authenticator, request, options_, *response)) {
+    if (!ResponseValid(/*is_first_response=*/true, *authenticator, request,
+                       options_, *response)) {
       FIDO_LOG(ERROR) << "Failing assertion request due to bad response from "
                       << authenticator->GetDisplayName();
       std::move(completion_callback_)
@@ -644,8 +653,8 @@
     return;
   }
 
-  if (!response ||
-      !ResponseValid(*authenticator, request, options_, *response)) {
+  if (!response || !ResponseValid(/*is_first_response=*/true, *authenticator,
+                                  request, options_, *response)) {
     FIDO_LOG(ERROR) << "Failing assertion request due to bad response from "
                     << authenticator->GetDisplayName();
     std::move(completion_callback_)
@@ -699,7 +708,8 @@
     return;
   }
 
-  if (!ResponseValid(*authenticator, request, options_, *response)) {
+  if (!ResponseValid(/*is_first_response=*/false, *authenticator, request,
+                     options_, *response)) {
     FIDO_LOG(ERROR) << "Failing assertion request due to bad response from "
                     << authenticator->GetDisplayName();
     std::move(completion_callback_)
diff --git a/device/fido/get_assertion_task.cc b/device/fido/get_assertion_task.cc
index d04bd97..0ef692f 100644
--- a/device/fido/get_assertion_task.cc
+++ b/device/fido/get_assertion_task.cc
@@ -274,6 +274,16 @@
   }
 
   if (response_code == CtapDeviceResponseCode::kSuccess) {
+    if (response_data->user_selected && !allow_list.empty()) {
+      // The userSelected signal is only valid if the request had an empty
+      // allowList.
+      FIDO_LOG(DEBUG)
+          << "Assertion response has userSelected for non-empty allowList";
+      std::move(callback_).Run(CtapDeviceResponseCode::kCtap2ErrOther,
+                               absl::nullopt);
+      return;
+    }
+
     if (!SetResponseCredential(&response_data.value(), allow_list)) {
       FIDO_LOG(DEBUG)
           << "Assertion response has invalid credential information";
diff --git a/device/fido/public_key_credential_user_entity.cc b/device/fido/public_key_credential_user_entity.cc
index 7415829..7eca94b 100644
--- a/device/fido/public_key_credential_user_entity.cc
+++ b/device/fido/public_key_credential_user_entity.cc
@@ -24,6 +24,9 @@
 
   PublicKeyCredentialUserEntity user(id_it->second.GetBytestring());
 
+  // Note: this code treats `name` and `displayName` fields as optional, but
+  // they are required in the spec:
+  // https://www.w3.org/TR/webauthn-2/#dictionary-user-credential-params
   auto name_it = cbor_map.find(cbor::Value(kEntityNameMapKey));
   if (name_it != cbor_map.end()) {
     if (!name_it->second.is_string()) {
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index 33bfe11c..714ade8e 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -433,6 +433,9 @@
   if (response.num_credentials) {
     response_map.emplace(5, response.num_credentials.value());
   }
+  if (response.user_selected) {
+    response_map.emplace(6, true);
+  }
   if (response.large_blob_key) {
     response_map.emplace(0x07, cbor::Value(*response.large_blob_key));
   }
@@ -1504,6 +1507,13 @@
     memcpy(hmac_shared_key->data(), shared_key.data(), shared_key.size());
   }
 
+  if (request.allow_list.empty() && found_registrations.size() > 1 &&
+      config_.internal_account_chooser) {
+    // Simulate a local account chooser by erasing all but the first result.
+    found_registrations.erase(found_registrations.begin() + 1,
+                              found_registrations.end());
+  }
+
   // This implementation does not sort credentials by creation time as the spec
   // requires.
   bool done_first = false;
@@ -1611,6 +1621,10 @@
       assertion.user_entity = registration.second->user.value();
     }
 
+    if (request.allow_list.empty() && config_.internal_account_chooser) {
+      assertion.user_selected = true;
+    }
+
     if (request.large_blob_key) {
       if (!config_.large_blob_support) {
         return CtapDeviceResponseCode::kCtap2ErrUnsupportedExtension;
diff --git a/device/fido/virtual_ctap2_device.h b/device/fido/virtual_ctap2_device.h
index a97f365..49517912 100644
--- a/device/fido/virtual_ctap2_device.h
+++ b/device/fido/virtual_ctap2_device.h
@@ -189,6 +189,12 @@
     // response.
     PINUVAuthProtocol pin_protocol = PINUVAuthProtocol::kV1;
 
+    // internal_account_chooser indicates that the authenticator has a screen
+    // and thus presents the account chooser for discoverable credential
+    // assertions itself. This causes userSelected to be asserted on those
+    // responses.
+    bool internal_account_chooser = false;
+
     // override_response_map allows overriding the response for a given command
     // with a given code. The actual command won't be executed.
     base::flat_map<CtapRequestCommand, CtapDeviceResponseCode>
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.cc b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
index b1c4872..ce83daee 100644
--- a/extensions/browser/guest_view/extension_options/extension_options_guest.cc
+++ b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
@@ -229,7 +229,7 @@
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace) {
   // To get links out of the guest view, we just open the URL in a new tab.
   // TODO(ericzeng): Open the tab in the background if the click was a
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.h b/extensions/browser/guest_view/extension_options/extension_options_guest.h
index 0d6ab312..7350382 100644
--- a/extensions/browser/guest_view/extension_options/extension_options_guest.h
+++ b/extensions/browser/guest_view/extension_options/extension_options_guest.h
@@ -67,7 +67,7 @@
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace) final;
 
   // content::WebContentsObserver implementation.
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
index 2a8095b..0b01120f 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -400,7 +400,7 @@
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
-    const content::StoragePartitionId& partition_id,
+    const content::StoragePartitionConfig& partition_config,
     content::SessionStorageNamespace* session_storage_namespace) {
   content::OpenURLParams open_params(target_url, content::Referrer(),
                                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
index 1b38877..ef6faf31 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -180,7 +180,7 @@
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
-      const content::StoragePartitionId& partition_id,
+      const content::StoragePartitionConfig& partition_config,
       content::SessionStorageNamespace* session_storage_namespace) override;
 
   // Updates the fullscreen state for the guest. Returns whether the change
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index c1652095..599dcac04f9 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4563,7 +4563,13 @@
   }
 
   if (shader_spec == SH_WEBGL2_SPEC) {
-    resources.ANGLE_base_vertex_base_instance =
+    // The gl_BaseVertex/BaseInstance shader builtins is disabled in ANGLE for
+    // WebGL As they are removed in
+    // https://github.com/KhronosGroup/WebGL/pull/3278
+    // To re-enable the shader
+    // builtins add back SH_EMULATE_GL_BASE_VERTEX_BASE_INSTANCE to
+    // ShCompileOptions in ANGLE
+    resources.ANGLE_base_vertex_base_instance_shader_builtin =
         (draw_instanced_base_vertex_base_instance_explicitly_enabled_ &&
          features().webgl_draw_instanced_base_vertex_base_instance) ||
         (multi_draw_instanced_base_vertex_base_instance_explicitly_enabled_ &&
diff --git a/gpu/command_buffer/service/webgpu_decoder.cc b/gpu/command_buffer/service/webgpu_decoder.cc
index d66b5da..a5ce0cd0 100644
--- a/gpu/command_buffer/service/webgpu_decoder.cc
+++ b/gpu/command_buffer/service/webgpu_decoder.cc
@@ -4,6 +4,7 @@
 
 #include "gpu/command_buffer/service/webgpu_decoder.h"
 
+#include "gpu/command_buffer/service/shared_context_state.h"
 #include "ui/gl/buildflags.h"
 
 #if BUILDFLAG(USE_DAWN)
@@ -20,11 +21,12 @@
     SharedImageManager* shared_image_manager,
     MemoryTracker* memory_tracker,
     gles2::Outputter* outputter,
-    const GpuPreferences& gpu_preferences) {
+    const GpuPreferences& gpu_preferences,
+    scoped_refptr<SharedContextState> shared_context_state) {
 #if BUILDFLAG(USE_DAWN)
-  return CreateWebGPUDecoderImpl(client, command_buffer_service,
-                                 shared_image_manager, memory_tracker,
-                                 outputter, gpu_preferences);
+  return CreateWebGPUDecoderImpl(
+      client, command_buffer_service, shared_image_manager, memory_tracker,
+      outputter, gpu_preferences, std::move(shared_context_state));
 #else
   NOTREACHED();
   return nullptr;
diff --git a/gpu/command_buffer/service/webgpu_decoder.h b/gpu/command_buffer/service/webgpu_decoder.h
index 7d730cd..2761be03 100644
--- a/gpu/command_buffer/service/webgpu_decoder.h
+++ b/gpu/command_buffer/service/webgpu_decoder.h
@@ -14,6 +14,7 @@
 class DecoderClient;
 struct GpuPreferences;
 class MemoryTracker;
+class SharedContextState;
 class SharedImageManager;
 
 namespace gles2 {
@@ -25,12 +26,14 @@
 class GPU_GLES2_EXPORT WebGPUDecoder : public DecoderContext,
                                        public CommonDecoder {
  public:
-  static WebGPUDecoder* Create(DecoderClient* client,
-                               CommandBufferServiceBase* command_buffer_service,
-                               SharedImageManager* shared_image_manager,
-                               MemoryTracker* memory_tracker,
-                               gles2::Outputter* outputter,
-                               const GpuPreferences& gpu_preferences);
+  static WebGPUDecoder* Create(
+      DecoderClient* client,
+      CommandBufferServiceBase* command_buffer_service,
+      SharedImageManager* shared_image_manager,
+      MemoryTracker* memory_tracker,
+      gles2::Outputter* outputter,
+      const GpuPreferences& gpu_preferences,
+      scoped_refptr<SharedContextState> shared_context_state);
 
   WebGPUDecoder(const WebGPUDecoder&) = delete;
   WebGPUDecoder& operator=(const WebGPUDecoder&) = delete;
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 5678740..1cb4031d 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -13,28 +13,34 @@
 #include <memory>
 #include <vector>
 
+#include "base/bits.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/numerics/checked_math.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/common/mailbox.h"
 #include "gpu/command_buffer/common/webgpu_cmd_format.h"
 #include "gpu/command_buffer/service/command_buffer_service.h"
 #include "gpu/command_buffer/service/dawn_platform.h"
 #include "gpu/command_buffer/service/dawn_service_memory_transfer_service.h"
 #include "gpu/command_buffer/service/decoder_client.h"
+#include "gpu/command_buffer/service/shared_context_state.h"
 #include "gpu/command_buffer/service/shared_image_factory.h"
 #include "gpu/command_buffer/service/shared_image_manager.h"
 #include "gpu/command_buffer/service/shared_image_representation.h"
+#include "gpu/command_buffer/service/skia_utils.h"
 #include "gpu/command_buffer/service/webgpu_decoder.h"
 #include "gpu/config/gpu_preferences.h"
 #include "ipc/ipc_channel.h"
+#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
 #include "ui/gl/gl_context_egl.h"
 #include "ui/gl/gl_surface_egl.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <dawn_native/D3D12Backend.h>
+#include <dawn_native/VulkanBackend.h>
 #include "ui/gl/gl_angle_util_win.h"
 #endif
 
@@ -52,6 +58,18 @@
 
 static_assert(kDawnReturnCmdsOffset < kMaxWireBufferSize, "");
 
+// TODO(crbug.com/1266549): Support Storage usage
+static constexpr uint32_t kAllowedWritableMailboxTextureUsages =
+    static_cast<uint32_t>(WGPUTextureUsage_CopyDst |
+                          WGPUTextureUsage_RenderAttachment);
+
+static constexpr uint32_t kAllowedReadableMailboxTextureUsages =
+    static_cast<uint32_t>(WGPUTextureUsage_CopySrc |
+                          WGPUTextureUsage_TextureBinding);
+
+static constexpr uint32_t kAllowedMailboxTextureUsages =
+    kAllowedWritableMailboxTextureUsages | kAllowedReadableMailboxTextureUsages;
+
 class WireServerCommandSerializer : public dawn::wire::CommandSerializer {
  public:
   explicit WireServerCommandSerializer(DecoderClient* client);
@@ -149,7 +167,8 @@
                     SharedImageManager* shared_image_manager,
                     MemoryTracker* memory_tracker,
                     gles2::Outputter* outputter,
-                    const GpuPreferences& gpu_preferences);
+                    const GpuPreferences& gpu_preferences,
+                    scoped_refptr<SharedContextState> shared_context_state);
 
   WebGPUDecoderImpl(const WebGPUDecoderImpl&) = delete;
   WebGPUDecoderImpl& operator=(const WebGPUDecoderImpl&) = delete;
@@ -423,6 +442,22 @@
                              const dawn::native::Adapter& adapter,
                              const char* error_message = nullptr);
 
+  class SharedImageRepresentationAndAccess;
+
+  std::unique_ptr<SharedImageRepresentationAndAccess> AssociateMailboxDawn(
+      const Mailbox& mailbox,
+      MailboxFlags flags,
+      WGPUDevice device,
+      WGPUBackendType backendType,
+      WGPUTextureUsage usage);
+
+  std::unique_ptr<SharedImageRepresentationAndAccess>
+  AssociateMailboxUsingSkiaFallback(const Mailbox& mailbox,
+                                    MailboxFlags flags,
+                                    WGPUDevice device,
+                                    WGPUTextureUsage usage);
+
+  scoped_refptr<SharedContextState> shared_context_state_;
   const GrContextType gr_context_type_;
 
   std::unique_ptr<SharedImageRepresentationFactory>
@@ -441,11 +476,391 @@
   std::unique_ptr<dawn::wire::WireServer> wire_server_;
   std::unique_ptr<WireServerCommandSerializer> wire_serializer_;
 
-  // Helper struct which holds a representation and its ScopedAccess, ensuring
-  // safe destruction order.
-  struct SharedImageRepresentationAndAccess {
-    std::unique_ptr<SharedImageRepresentationDawn> representation;
-    std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess> access;
+  // Helper class whose derived implementations holds a representation
+  // and its ScopedAccess, ensuring safe destruction order.
+  class SharedImageRepresentationAndAccess {
+   public:
+    virtual ~SharedImageRepresentationAndAccess() = default;
+    // Get an unowned reference to the WGPUTexture for the shared image.
+    virtual WGPUTexture texture() const = 0;
+  };
+
+  // Wraps a |SharedImageRepresentationDawn| as a WGPUTexture.
+  class SharedImageRepresentationAndAccessDawn
+      : public SharedImageRepresentationAndAccess {
+   public:
+    SharedImageRepresentationAndAccessDawn(
+        std::unique_ptr<SharedImageRepresentationDawn> representation,
+        std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess> access)
+        : representation_(std::move(representation)),
+          access_(std::move(access)) {}
+
+    WGPUTexture texture() const override { return access_->texture(); }
+
+   private:
+    std::unique_ptr<SharedImageRepresentationDawn> representation_;
+    std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess> access_;
+  };
+
+  // Wraps a |SharedImageRepresentationSkia| and exposes
+  // it as a WGPUTexture by performing CPU readbacks/uploads.
+  class SharedImageRepresentationAndAccessSkiaFallback
+      : public SharedImageRepresentationAndAccess {
+   public:
+    static std::unique_ptr<SharedImageRepresentationAndAccessSkiaFallback>
+    Create(scoped_refptr<SharedContextState> shared_context_state,
+           std::unique_ptr<SharedImageRepresentationSkia> representation,
+           const DawnProcTable& procs,
+           WGPUDevice device,
+           WGPUTextureUsage usage) {
+      viz::ResourceFormat format = representation->format();
+      // Include list of formats this is tested to work with.
+      // See gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
+      switch (format) {
+// TODO(crbug.com/1241369): Handle additional formats.
+#if !BUILDFLAG(IS_MAC)
+        case viz::ResourceFormat::RGBA_8888:
+#endif  // !BUILDFLAG(IS_MAC)
+        case viz::ResourceFormat::BGRA_8888:
+          break;
+        default:
+          return nullptr;
+      }
+
+      // Make sure we can create a WebGPU texture for this format
+      if (viz::ToWGPUFormat(format) == WGPUTextureFormat_Undefined) {
+        return nullptr;
+      }
+
+      const bool is_initialized = representation->IsCleared();
+      auto result =
+          base::WrapUnique(new SharedImageRepresentationAndAccessSkiaFallback(
+              std::move(shared_context_state), std::move(representation), procs,
+              device, usage));
+      if (is_initialized && !result->PopulateFromSkia()) {
+        return nullptr;
+      }
+      return result;
+    }
+
+    ~SharedImageRepresentationAndAccessSkiaFallback() override {
+      // If we have write access, flush any writes by uploading
+      // into the SkSurface.
+      if ((usage_ & kAllowedWritableMailboxTextureUsages) != 0) {
+        if (UploadContentsToSkia()) {
+          // Upload to skia was successful. Mark the contents as initialized.
+          representation_->SetCleared();
+        } else {
+          DLOG(ERROR) << "Failed to write to SkSurface.";
+        }
+      }
+
+      procs_.textureDestroy(texture_);
+      procs_.textureRelease(texture_);
+      procs_.deviceRelease(device_);
+    }
+
+    WGPUTexture texture() const override { return texture_; }
+
+   private:
+    SharedImageRepresentationAndAccessSkiaFallback(
+        scoped_refptr<SharedContextState> shared_context_state,
+        std::unique_ptr<SharedImageRepresentationSkia> representation,
+        const DawnProcTable& procs,
+        WGPUDevice device,
+        WGPUTextureUsage usage)
+        : shared_context_state_(std::move(shared_context_state)),
+          representation_(std::move(representation)),
+          procs_(procs),
+          device_(device),
+          usage_(usage) {
+      // Create a WGPUTexture to hold the image contents.
+      // It should be internally copyable so Chrome can internally perform
+      // copies with it, but Javascript cannot (unless |usage| contains copy
+      // src/dst).
+      WGPUDawnTextureInternalUsageDescriptor internal_usage_desc = {
+          .chain = {.sType = WGPUSType_DawnTextureInternalUsageDescriptor},
+          .internalUsage =
+              static_cast<WGPUTextureUsageFlags>(WGPUTextureUsage_CopyDst) |
+              static_cast<WGPUTextureUsageFlags>(WGPUTextureUsage_CopySrc),
+      };
+      WGPUTextureDescriptor texture_desc = {
+          .nextInChain = &internal_usage_desc.chain,
+          .usage = static_cast<WGPUTextureUsageFlags>(usage),
+          .dimension = WGPUTextureDimension_2D,
+          .size = {static_cast<uint32_t>(representation_->size().width()),
+                   static_cast<uint32_t>(representation_->size().height()), 1},
+          .format = viz::ToWGPUFormat(representation_->format()),
+          .mipLevelCount = 1,
+          .sampleCount = 1,
+      };
+
+      procs_.deviceReference(device_);
+      texture_ = procs_.deviceCreateTexture(device, &texture_desc);
+      DCHECK(texture_);
+    }
+
+    bool ComputeStagingBufferParams(const SkImageInfo& image_info,
+                                    uint32_t* bytes_per_row,
+                                    size_t* buffer_size) const {
+      DCHECK(bytes_per_row);
+      DCHECK(buffer_size);
+
+      base::CheckedNumeric<uint32_t> checked_bytes_per_row(
+          image_info.bytesPerPixel());
+      checked_bytes_per_row *= image_info.width();
+
+      uint32_t packed_bytes_per_row;
+      if (!checked_bytes_per_row.AssignIfValid(&packed_bytes_per_row)) {
+        return false;
+      }
+
+      // Align up to 256, required by WebGPU buffer->texture and texture->buffer
+      // copies.
+      checked_bytes_per_row = base::bits::AlignUp(packed_bytes_per_row, 256);
+      if (!checked_bytes_per_row.AssignIfValid(bytes_per_row)) {
+        return false;
+      }
+      if (*bytes_per_row < packed_bytes_per_row) {
+        // Overflow in AlignUp.
+        return false;
+      }
+
+      base::CheckedNumeric<size_t> checked_buffer_size = checked_bytes_per_row;
+      checked_buffer_size *= image_info.height();
+
+      return checked_buffer_size.AssignIfValid(buffer_size);
+    }
+
+    bool PopulateFromSkia() {
+      std::vector<GrBackendSemaphore> begin_semaphores;
+      std::vector<GrBackendSemaphore> end_semaphores;
+      auto scoped_read_access = representation_->BeginScopedReadAccess(
+          &begin_semaphores, &end_semaphores);
+      if (!scoped_read_access) {
+        DLOG(ERROR) << "PopulateFromSkia: Couldn't begin shared image access";
+        return false;
+      }
+
+      // Wait for any work that previously used the image.
+      WaitForSemaphores(std::move(begin_semaphores));
+
+      // Make an SkImage to read the image contents
+      auto sk_image = scoped_read_access->CreateSkImage(
+          shared_context_state_->gr_context());
+      if (!sk_image) {
+        DLOG(ERROR) << "Couldn't make SkImage";
+        return false;
+      }
+
+      uint32_t bytes_per_row;
+      size_t buffer_size;
+      if (!ComputeStagingBufferParams(sk_image->imageInfo(), &bytes_per_row,
+                                      &buffer_size)) {
+        return false;
+      }
+
+      // Create a staging buffer to hold pixel data which will be uploaded into
+      // a texture.
+      WGPUBufferDescriptor buffer_desc = {
+          .usage = WGPUBufferUsage_CopySrc,
+          .size = buffer_size,
+          .mappedAtCreation = true,
+      };
+      WGPUBuffer buffer = procs_.deviceCreateBuffer(device_, &buffer_desc);
+
+      // Read back the Skia image contents into the staging buffer.
+      void* dst_pointer = procs_.bufferGetMappedRange(buffer, 0, 0);
+      DCHECK(dst_pointer);
+      if (!sk_image->readPixels(shared_context_state_->gr_context(),
+                                sk_image->imageInfo(), dst_pointer,
+                                bytes_per_row, 0, 0)) {
+        procs_.bufferRelease(buffer);
+        DLOG(ERROR) << "Failed to read from SkImage";
+        return false;
+      }
+      // Unmap the buffer.
+      procs_.bufferUnmap(buffer);
+
+      // ReadPixels finished; signal the semaphores.
+      SignalSemaphores(std::move(end_semaphores));
+
+      // Copy from the staging WGPUBuffer into the WGPUTexture.
+      WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = {
+          .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor},
+          .useInternalUsages = true,
+      };
+      WGPUCommandEncoderDescriptor command_encoder_desc = {
+          .nextInChain = &internal_usage_desc.chain,
+      };
+      WGPUCommandEncoder encoder =
+          procs_.deviceCreateCommandEncoder(device_, &command_encoder_desc);
+      WGPUImageCopyBuffer buffer_copy = {
+          .layout =
+              {
+                  .bytesPerRow = bytes_per_row,
+                  .rowsPerImage = WGPU_COPY_STRIDE_UNDEFINED,
+              },
+          .buffer = buffer,
+      };
+      WGPUImageCopyTexture texture_copy = {
+          .texture = texture_,
+      };
+      WGPUExtent3D extent = {
+          static_cast<uint32_t>(representation_->size().width()),
+          static_cast<uint32_t>(representation_->size().height()), 1};
+      procs_.commandEncoderCopyBufferToTexture(encoder, &buffer_copy,
+                                               &texture_copy, &extent);
+      WGPUCommandBuffer commandBuffer =
+          procs_.commandEncoderFinish(encoder, nullptr);
+      procs_.commandEncoderRelease(encoder);
+
+      WGPUQueue queue = procs_.deviceGetQueue(device_);
+      procs_.queueSubmit(queue, 1, &commandBuffer);
+      procs_.commandBufferRelease(commandBuffer);
+      procs_.queueRelease(queue);
+      procs_.bufferRelease(buffer);
+
+      return true;
+    }
+
+    bool UploadContentsToSkia() {
+      std::vector<GrBackendSemaphore> begin_semaphores;
+      std::vector<GrBackendSemaphore> end_semaphores;
+      auto scoped_write_access = representation_->BeginScopedWriteAccess(
+          &begin_semaphores, &end_semaphores,
+          SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      if (!scoped_write_access) {
+        DLOG(ERROR)
+            << "UploadContentsToSkia: Couldn't begin shared image access";
+        return false;
+      }
+
+      auto* surface = scoped_write_access->surface();
+
+      uint32_t bytes_per_row;
+      size_t buffer_size;
+      if (!ComputeStagingBufferParams(surface->imageInfo(), &bytes_per_row,
+                                      &buffer_size)) {
+        return false;
+      }
+
+      // Create a staging buffer to read back from the texture.
+      WGPUBufferDescriptor buffer_desc = {
+          .usage = WGPUBufferUsage_CopyDst | WGPUBufferUsage_MapRead,
+          .size = buffer_size,
+      };
+      WGPUBuffer buffer = procs_.deviceCreateBuffer(device_, &buffer_desc);
+
+      WGPUImageCopyTexture texture_copy = {
+          .texture = texture_,
+      };
+      WGPUImageCopyBuffer buffer_copy = {
+          .layout =
+              {
+                  .bytesPerRow = bytes_per_row,
+                  .rowsPerImage = WGPU_COPY_STRIDE_UNDEFINED,
+              },
+          .buffer = buffer,
+      };
+      WGPUExtent3D extent = {
+          static_cast<uint32_t>(representation_->size().width()),
+          static_cast<uint32_t>(representation_->size().height()), 1};
+
+      // Copy from the texture into the staging buffer.
+      WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = {
+          .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor},
+          .useInternalUsages = true,
+      };
+      WGPUCommandEncoderDescriptor command_encoder_desc = {
+          .nextInChain = &internal_usage_desc.chain,
+      };
+      WGPUCommandEncoder encoder =
+          procs_.deviceCreateCommandEncoder(device_, &command_encoder_desc);
+      procs_.commandEncoderCopyTextureToBuffer(encoder, &texture_copy,
+                                               &buffer_copy, &extent);
+      WGPUCommandBuffer commandBuffer =
+          procs_.commandEncoderFinish(encoder, nullptr);
+      procs_.commandEncoderRelease(encoder);
+
+      WGPUQueue queue = procs_.deviceGetQueue(device_);
+      procs_.queueSubmit(queue, 1, &commandBuffer);
+      procs_.commandBufferRelease(commandBuffer);
+      procs_.queueRelease(queue);
+
+      struct Userdata {
+        bool map_complete = false;
+        WGPUBufferMapAsyncStatus status;
+      } userdata;
+
+      // Map the staging buffer for read.
+      procs_.bufferMapAsync(
+          buffer, WGPUMapMode_Read, 0, WGPU_WHOLE_MAP_SIZE,
+          [](WGPUBufferMapAsyncStatus status, void* void_userdata) {
+            Userdata* userdata = static_cast<Userdata*>(void_userdata);
+            userdata->status = status;
+            userdata->map_complete = true;
+          },
+          &userdata);
+
+      // While the map is in flight, wait for any work that previously used the
+      // image.
+      WaitForSemaphores(std::move(begin_semaphores));
+
+      // Poll for the map to complete.
+      while (!userdata.map_complete) {
+        base::PlatformThread::Sleep(base::Milliseconds(1));
+        procs_.deviceTick(device_);
+      }
+
+      if (userdata.status != WGPUBufferMapAsyncStatus_Success) {
+        procs_.bufferRelease(buffer);
+        return false;
+      }
+      const void* data = procs_.bufferGetConstMappedRange(buffer, 0, 0);
+      DCHECK(data);
+      surface->writePixels(SkPixmap(surface->imageInfo(), data, bytes_per_row),
+                           /*x*/ 0, /*y*/ 0);
+
+      procs_.bufferRelease(buffer);
+      SignalSemaphores(std::move(end_semaphores));
+
+      return true;
+    }
+
+    void WaitForSemaphores(std::vector<GrBackendSemaphore> semaphores) {
+      if (semaphores.empty())
+        return;
+
+      bool wait_result = shared_context_state_->gr_context()->wait(
+          semaphores.size(), semaphores.data(),
+          /*deleteSemaphoresAfterWait=*/false);
+      DCHECK(wait_result);
+    }
+
+    void SignalSemaphores(std::vector<GrBackendSemaphore> semaphores) {
+      if (semaphores.empty())
+        return;
+
+      GrFlushInfo flush_info = {
+          .fNumSemaphores = semaphores.size(),
+          .fSignalSemaphores = semaphores.data(),
+      };
+      // Note: this is a no-op if vk_context_provider is null.
+      AddVulkanCleanupTaskForSkiaFlush(
+          shared_context_state_->vk_context_provider(), &flush_info);
+      auto flush_result =
+          shared_context_state_->gr_context()->flush(flush_info);
+      DCHECK(flush_result == GrSemaphoresSubmitted::kYes);
+      shared_context_state_->gr_context()->submit();
+    }
+
+    scoped_refptr<SharedContextState> shared_context_state_;
+    std::unique_ptr<SharedImageRepresentationSkia> representation_;
+    const DawnProcTable& procs_;
+    WGPUDevice device_;
+    WGPUTexture texture_;
+    WGPUTextureUsage usage_;
   };
 
   // Map from the <ID, generation> pair for a wire texture to the shared image
@@ -489,10 +904,11 @@
     SharedImageManager* shared_image_manager,
     MemoryTracker* memory_tracker,
     gles2::Outputter* outputter,
-    const GpuPreferences& gpu_preferences) {
-  return new WebGPUDecoderImpl(client, command_buffer_service,
-                               shared_image_manager, memory_tracker, outputter,
-                               gpu_preferences);
+    const GpuPreferences& gpu_preferences,
+    scoped_refptr<SharedContextState> shared_context_state) {
+  return new WebGPUDecoderImpl(
+      client, command_buffer_service, shared_image_manager, memory_tracker,
+      outputter, gpu_preferences, std::move(shared_context_state));
 }
 
 WebGPUDecoderImpl::WebGPUDecoderImpl(
@@ -501,8 +917,10 @@
     SharedImageManager* shared_image_manager,
     MemoryTracker* memory_tracker,
     gles2::Outputter* outputter,
-    const GpuPreferences& gpu_preferences)
+    const GpuPreferences& gpu_preferences,
+    scoped_refptr<SharedContextState> shared_context_state)
     : WebGPUDecoder(client, command_buffer_service, outputter),
+      shared_context_state_(std::move(shared_context_state)),
       gr_context_type_(gpu_preferences.gr_context_type),
       shared_image_representation_factory_(
           std::make_unique<SharedImageRepresentationFactory>(
@@ -626,7 +1044,7 @@
   // WGPUDeviceProperties struct which contains WGPUSupportedLimits, not
   // WGPURequiredLimits. It should be WGPURequiredLimits, but to avoid
   // additional custom serialization, we reuse the WGPUDeviceProperties struct
-  // until requestDevice is implemented in dawn_wire.
+  // until requestDevice is implemented in dawn::wire.
   WGPURequiredLimits requiredLimits;
   requiredLimits.nextInChain = nullptr;
   requiredLimits.limits = request_device_properties.limits.limits;
@@ -759,6 +1177,12 @@
   dxgi_device->GetAdapter(&dxgi_adapter);
   dawn::native::d3d12::AdapterDiscoveryOptions options(std::move(dxgi_adapter));
   dawn_instance_->DiscoverAdapters(&options);
+
+  // Also discover the SwiftShader adapter. It will be discovered by default
+  // for other OSes in DiscoverDefaultAdapters.
+  dawn::native::vulkan::AdapterDiscoveryOptions swiftShaderOptions;
+  swiftShaderOptions.forceSwiftShader = true;
+  dawn_instance_->DiscoverAdapters(&swiftShaderOptions);
 #else
   dawn_instance_->DiscoverDefaultAdapters();
 #endif
@@ -1137,6 +1561,63 @@
   return error::kNoError;
 }
 
+std::unique_ptr<WebGPUDecoderImpl::SharedImageRepresentationAndAccess>
+WebGPUDecoderImpl::AssociateMailboxDawn(const Mailbox& mailbox,
+                                        MailboxFlags flags,
+                                        WGPUDevice device,
+                                        WGPUBackendType backendType,
+                                        WGPUTextureUsage usage) {
+  std::unique_ptr<SharedImageRepresentationDawn> shared_image =
+      shared_image_representation_factory_->ProduceDawn(mailbox, device,
+                                                        backendType);
+
+  if (!shared_image) {
+    DLOG(ERROR) << "AssociateMailbox: Couldn't produce shared image";
+    return nullptr;
+  }
+
+  if (flags & WEBGPU_MAILBOX_DISCARD) {
+    // Set contents to uncleared.
+    shared_image->SetClearedRect(gfx::Rect());
+  }
+
+  std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess> scoped_access =
+      shared_image->BeginScopedAccess(
+          usage, SharedImageRepresentation::AllowUnclearedAccess::kYes);
+  if (!scoped_access) {
+    DLOG(ERROR) << "AssociateMailbox: Couldn't begin shared image access";
+    return nullptr;
+  }
+
+  return std::make_unique<SharedImageRepresentationAndAccessDawn>(
+      std::move(shared_image), std::move(scoped_access));
+}
+
+std::unique_ptr<WebGPUDecoderImpl::SharedImageRepresentationAndAccess>
+WebGPUDecoderImpl::AssociateMailboxUsingSkiaFallback(const Mailbox& mailbox,
+                                                     MailboxFlags flags,
+                                                     WGPUDevice device,
+                                                     WGPUTextureUsage usage) {
+  // Produce a Skia image from the mailbox.
+  std::unique_ptr<SharedImageRepresentationSkia> shared_image =
+      shared_image_representation_factory_->ProduceSkia(
+          mailbox, shared_context_state_.get());
+
+  if (!shared_image) {
+    DLOG(ERROR) << "AssociateMailbox: Couldn't produce shared image";
+    return nullptr;
+  }
+
+  if (flags & WEBGPU_MAILBOX_DISCARD) {
+    // Set contents to uncleared.
+    shared_image->SetClearedRect(gfx::Rect());
+  }
+
+  return SharedImageRepresentationAndAccessSkiaFallback::Create(
+      shared_context_state_, std::move(shared_image), dawn::native::GetProcs(),
+      device, usage);
+}
+
 error::Error WebGPUDecoderImpl::HandleAssociateMailboxImmediate(
     uint32_t immediate_data_size,
     const volatile void* cmd_data) {
@@ -1165,10 +1646,7 @@
   DLOG_IF(ERROR, !mailbox.Verify())
       << "AssociateMailbox was passed an invalid mailbox";
 
-  static constexpr uint32_t kAllowedTextureUsages = static_cast<uint32_t>(
-      WGPUTextureUsage_CopySrc | WGPUTextureUsage_CopyDst |
-      WGPUTextureUsage_TextureBinding | WGPUTextureUsage_RenderAttachment);
-  if (usage & ~kAllowedTextureUsages) {
+  if (usage & ~kAllowedMailboxTextureUsages) {
     DLOG(ERROR) << "AssociateMailbox: Invalid usage";
     return error::kInvalidArguments;
   }
@@ -1178,42 +1656,29 @@
     return error::kInvalidArguments;
   }
 
-  // Create a WGPUTexture from the mailbox.
-  std::unique_ptr<SharedImageRepresentationDawn> shared_image =
-      shared_image_representation_factory_->ProduceDawn(
-          mailbox, device, device_adapter_properties_[device_id].backendType);
-  if (!shared_image) {
-    DLOG(ERROR) << "AssociateMailbox: Couldn't produce shared image";
-    return error::kInvalidArguments;
+  std::unique_ptr<SharedImageRepresentationAndAccess> representation_and_access;
+  if (device_adapter_properties_[device_id].adapterType ==
+      WGPUAdapterType_CPU) {
+    representation_and_access =
+        AssociateMailboxUsingSkiaFallback(mailbox, flags, device, usage);
+  } else {
+    representation_and_access = AssociateMailboxDawn(
+        mailbox, flags, device,
+        device_adapter_properties_[device_id].backendType, usage);
   }
 
-  if (flags & WEBGPU_MAILBOX_DISCARD) {
-    // Set contents to uncleared.
-    shared_image->SetClearedRect(gfx::Rect());
-  }
-
-  std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess>
-      shared_image_access = shared_image->BeginScopedAccess(
-          usage, SharedImageRepresentation::AllowUnclearedAccess::kYes);
-  if (!shared_image_access) {
-    DLOG(ERROR) << "AssociateMailbox: Couldn't begin shared image access";
+  if (!representation_and_access) {
     return error::kInvalidArguments;
   }
 
   // Inject the texture in the dawn::wire::Server and remember which shared
   // image it is associated with.
-  if (!wire_server_->InjectTexture(shared_image_access->texture(), id,
+  if (!wire_server_->InjectTexture(representation_and_access->texture(), id,
                                    generation, device_id, device_generation)) {
     DLOG(ERROR) << "AssociateMailbox: Invalid texture ID";
     return error::kInvalidArguments;
   }
 
-  std::unique_ptr<SharedImageRepresentationAndAccess>
-      representation_and_access =
-          std::make_unique<SharedImageRepresentationAndAccess>();
-  representation_and_access->representation = std::move(shared_image);
-  representation_and_access->access = std::move(shared_image_access);
-
   std::tuple<uint32_t, uint32_t> id_and_generation{id, generation};
   auto insertion = associated_shared_image_map_.emplace(
       id_and_generation, std::move(representation_and_access));
@@ -1268,7 +1733,7 @@
     return error::kInvalidArguments;
   }
 
-  WGPUTexture texture = it->second->access->texture();
+  WGPUTexture texture = it->second->texture();
   DCHECK(texture);
   if (!dawn::native::IsTextureSubresourceInitialized(texture, 0, 1, 0, 1)) {
     // The compositor renders uninitialized textures as red. If the texture is
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.h b/gpu/command_buffer/service/webgpu_decoder_impl.h
index d5bf337..4d572d0 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.h
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.h
@@ -7,12 +7,15 @@
 
 #include "gpu/gpu_gles2_export.h"
 
+#include "base/memory/scoped_refptr.h"
+
 namespace gpu {
 
 class CommandBufferServiceBase;
 class DecoderClient;
 struct GpuPreferences;
 class MemoryTracker;
+class SharedContextState;
 class SharedImageManager;
 
 namespace gles2 {
@@ -29,7 +32,8 @@
     SharedImageManager* shared_image_manager,
     MemoryTracker* memory_tracker,
     gles2::Outputter* outputter,
-    const GpuPreferences& gpu_preferences);
+    const GpuPreferences& gpu_preferences,
+    scoped_refptr<SharedContextState> shared_context_state);
 
 }  // namespace webgpu
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/webgpu_decoder_unittest.cc b/gpu/command_buffer/service/webgpu_decoder_unittest.cc
index 2a715407..6f77250 100644
--- a/gpu/command_buffer/service/webgpu_decoder_unittest.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_unittest.cc
@@ -12,6 +12,7 @@
 #include "gpu/command_buffer/service/context_group.h"
 #include "gpu/command_buffer/service/decoder_client.h"
 #include "gpu/command_buffer/service/gpu_tracer.h"
+#include "gpu/command_buffer/service/shared_context_state.h"
 #include "gpu/command_buffer/service/test_helper.h"
 #include "gpu/config/gpu_test_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -35,7 +36,7 @@
     command_buffer_service_ = std::make_unique<FakeCommandBufferServiceBase>();
     decoder_.reset(WebGPUDecoder::Create(
         decoder_client_.get(), command_buffer_service_.get(), nullptr, nullptr,
-        &outputter_, GpuPreferences()));
+        &outputter_, GpuPreferences(), nullptr));
     ASSERT_EQ(decoder_->Initialize(), ContextResult::kSuccess);
 
     constexpr uint32_t kAdapterClientID = 0;
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
index 9dc48d1..c7f02e1 100644
--- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -47,9 +47,65 @@
   mock_device_error_callback->Call(type, message, userdata);
 }
 
+struct WebGPUMailboxTestParams : WebGPUTest::Options {
+  viz::ResourceFormat format;
+};
+
+std::ostream& operator<<(std::ostream& os,
+                         const WebGPUMailboxTestParams& options) {
+  switch (options.format) {
+    case viz::ResourceFormat::RGBA_8888:
+      os << "RGBA_8888";
+      break;
+    case viz::ResourceFormat::BGRA_8888:
+      os << "BGRA_8888";
+      break;
+    default:
+      NOTREACHED();
+  }
+  if (options.enable_unsafe_webgpu) {
+    os << "_UnsafeWebGPU";
+  }
+  if (options.force_fallback_adapter) {
+    os << "_FallbackAdapter";
+  }
+  return os;
+}
+
 }  // namespace
 
-class WebGPUMailboxTest : public WebGPUTest {
+class WebGPUMailboxTest
+    : public WebGPUTest,
+      public testing::WithParamInterface<WebGPUMailboxTestParams> {
+ public:
+  static std::vector<WebGPUMailboxTestParams> TestParams() {
+    WebGPUMailboxTestParams options = {};
+
+    WebGPUMailboxTestParams fallback_options = {};
+    fallback_options.force_fallback_adapter = true;
+    // Unsafe WebGPU currently required for SwiftShader fallback.
+    fallback_options.enable_unsafe_webgpu = true;
+
+    std::vector<WebGPUMailboxTestParams> params;
+
+    for (viz::ResourceFormat format : {
+// TODO(crbug.com/1241369): Handle additional formats.
+#if !BUILDFLAG(IS_MAC)
+           viz::ResourceFormat::RGBA_8888,
+#endif  // !BUILDFLAG(IS_MAC)
+               viz::ResourceFormat::BGRA_8888,
+         }) {
+      WebGPUMailboxTestParams o = options;
+      o.format = format;
+      params.push_back(o);
+
+      o = fallback_options;
+      o.format = format;
+      params.push_back(o);
+    }
+    return params;
+  }
+
  protected:
   void SetUp() override {
 #if BUILDFLAG(IS_MAC)
@@ -65,7 +121,7 @@
 #endif
 
     WebGPUTest::SetUp();
-    Initialize(WebGPUTest::Options());
+    Initialize(GetParam());
 
     mock_buffer_map_callback =
         std::make_unique<testing::StrictMock<MockBufferMapCallback>>();
@@ -106,12 +162,46 @@
                                &entries_processed);
   }
 
+  void InitializeTextureColor(wgpu::Device device,
+                              const Mailbox& mailbox,
+                              wgpu::Color clearColor) {
+    gpu::webgpu::ReservedTexture reservation =
+        webgpu()->ReserveTexture(device.Get());
+
+    webgpu()->AssociateMailbox(
+        reservation.deviceId, reservation.deviceGeneration, reservation.id,
+        reservation.generation, WGPUTextureUsage_RenderAttachment,
+        webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
+    wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
+
+    // Clear the texture using a render pass.
+    wgpu::RenderPassColorAttachment color_desc = {};
+    color_desc.view = texture.CreateView();
+    color_desc.loadOp = wgpu::LoadOp::Clear;
+    color_desc.storeOp = wgpu::StoreOp::Store;
+    color_desc.clearColor = clearColor;
+
+    wgpu::RenderPassDescriptor render_pass_desc = {};
+    render_pass_desc.colorAttachmentCount = 1;
+    render_pass_desc.colorAttachments = &color_desc;
+
+    wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+    wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&render_pass_desc);
+    pass.EndPass();
+    wgpu::CommandBuffer commands = encoder.Finish();
+
+    wgpu::Queue queue = device.GetQueue();
+    queue.Submit(1, &commands);
+
+    webgpu()->DissociateMailbox(reservation.id, reservation.generation);
+  }
+
 #if BUILDFLAG(IS_MAC)
   bool mac_m1_ = false;
 #endif
 };
 
-TEST_F(WebGPUMailboxTest, AssociateMailboxCmd) {
+TEST_P(WebGPUMailboxTest, AssociateMailboxCmd) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -124,7 +214,7 @@
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
 
@@ -233,7 +323,7 @@
   GetGpuServiceHolder()->gpu_thread_task_runner()->RunsTasksInCurrentSequence();
 }
 
-TEST_F(WebGPUMailboxTest, DissociateMailboxCmd) {
+TEST_P(WebGPUMailboxTest, DissociateMailboxCmd) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -246,7 +336,7 @@
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
 
@@ -304,7 +394,7 @@
 // For simplicity of the test the image is shared between a Dawn device and
 // itself: we render to it using the Dawn device, then re-associate it to a
 // Dawn texture and read back the values that were written.
-TEST_F(WebGPUMailboxTest, WriteToMailboxThenReadFromIt) {
+TEST_P(WebGPUMailboxTest, WriteToMailboxThenReadFromIt) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -317,7 +407,7 @@
   // Create the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
   SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
@@ -326,38 +416,7 @@
   wgpu::Device device = GetNewDevice();
 
   // Part 1: Write to the texture using Dawn
-  {
-    // Register the shared image as a Dawn texture in the wire.
-    gpu::webgpu::ReservedTexture reservation =
-        webgpu()->ReserveTexture(device.Get());
-
-    webgpu()->AssociateMailbox(
-        reservation.deviceId, reservation.deviceGeneration, reservation.id,
-        reservation.generation, WGPUTextureUsage_RenderAttachment,
-        webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox));
-    wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-
-    // Clear the texture using a render pass.
-    wgpu::RenderPassColorAttachment color_desc = {};
-    color_desc.view = texture.CreateView();
-    color_desc.loadOp = wgpu::LoadOp::Clear;
-    color_desc.storeOp = wgpu::StoreOp::Store;
-    color_desc.clearColor = {0, 255, 0, 255};
-
-    wgpu::RenderPassDescriptor render_pass_desc = {};
-    render_pass_desc.colorAttachmentCount = 1;
-    render_pass_desc.colorAttachments = &color_desc;
-
-    wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
-    wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&render_pass_desc);
-    pass.EndPass();
-    wgpu::CommandBuffer commands = encoder.Finish();
-
-    wgpu::Queue queue = device.GetQueue();
-    queue.Submit(1, &commands);
-
-    webgpu()->DissociateMailbox(reservation.id, reservation.generation);
-  }
+  InitializeTextureColor(device, mailbox, {0.0, 0.0, 1.0, 1.0});
 
   // Part 2: Read back the texture using Dawn
   {
@@ -368,7 +427,7 @@
     webgpu()->AssociateMailbox(
         reservation.deviceId, reservation.deviceGeneration, reservation.id,
         reservation.generation, WGPUTextureUsage_CopySrc,
-        webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox));
+        webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
     wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
 
     // Copy the texture in a mappable buffer.
@@ -407,13 +466,197 @@
 
     WaitForCompletion(device);
 
-    const void* data = readback_buffer.GetConstMappedRange(0, 4);
-    EXPECT_EQ(0xFF00FF00, *static_cast<const uint32_t*>(data));
+    const void* data = readback_buffer.GetConstMappedRange();
+    switch (GetParam().format) {
+      case viz::ResourceFormat::RGBA_8888:
+        EXPECT_EQ(0xFFFF0000u, *static_cast<const uint32_t*>(data));
+        break;
+      case viz::ResourceFormat::BGRA_8888:
+        EXPECT_EQ(0xFF0000FFu, *static_cast<const uint32_t*>(data));
+        break;
+      default:
+        NOTREACHED();
+    }
   }
 }
 
+// Test that an uninitialized shared image is lazily cleared by Dawn when it is
+// read.
+TEST_P(WebGPUMailboxTest, ReadUninitializedSharedImage) {
+  if (!WebGPUSupported()) {
+    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+    return;
+  }
+  if (!WebGPUSharedImageSupported()) {
+    LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
+    return;
+  }
+
+  // Create the shared image.
+  SharedImageInterface* sii = GetSharedImageInterface();
+  Mailbox mailbox = sii->CreateSharedImage(
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
+      kNullSurfaceHandle);
+  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
+  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
+
+  wgpu::Device device = GetNewDevice();
+
+  // Set the texture contents to non-zero so we can test a lazy clear occurs.
+  InitializeTextureColor(device, mailbox, {1.0, 0, 0, 1.0});
+
+  // Register the shared image as a Dawn texture in the wire.
+  gpu::webgpu::ReservedTexture reservation =
+      webgpu()->ReserveTexture(device.Get());
+
+  // Associate the mailbox. Using WEBGPU_MAILBOX_DISCARD will set the contents
+  // to uncleared.
+  webgpu()->AssociateMailbox(reservation.deviceId, reservation.deviceGeneration,
+                             reservation.id, reservation.generation,
+                             WGPUTextureUsage_CopySrc,
+                             webgpu::WEBGPU_MAILBOX_DISCARD,
+                             reinterpret_cast<const GLbyte*>(&mailbox));
+  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
+
+  // Copy the texture in a mappable buffer.
+  wgpu::BufferDescriptor buffer_desc;
+  buffer_desc.size = 4;
+  buffer_desc.usage = wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
+  wgpu::Buffer readback_buffer = device.CreateBuffer(&buffer_desc);
+
+  wgpu::ImageCopyTexture copy_src = {};
+  copy_src.texture = texture;
+  copy_src.mipLevel = 0;
+  copy_src.origin = {0, 0, 0};
+
+  wgpu::ImageCopyBuffer copy_dst = {};
+  copy_dst.buffer = readback_buffer;
+  copy_dst.layout.offset = 0;
+  copy_dst.layout.bytesPerRow = 256;
+
+  wgpu::Extent3D copy_size = {1, 1, 1};
+
+  wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+  encoder.CopyTextureToBuffer(&copy_src, &copy_dst, &copy_size);
+  wgpu::CommandBuffer commands = encoder.Finish();
+
+  wgpu::Queue queue = device.GetQueue();
+  queue.Submit(1, &commands);
+
+  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
+
+  // Map the buffer and assert the pixel is the correct value.
+  readback_buffer.MapAsync(wgpu::MapMode::Read, 0, 4, ToMockBufferMapCallback,
+                           nullptr);
+  EXPECT_CALL(*mock_buffer_map_callback,
+              Call(WGPUBufferMapAsyncStatus_Success, nullptr))
+      .Times(1);
+
+  WaitForCompletion(device);
+
+  const void* data = readback_buffer.GetConstMappedRange(0, 4);
+  // Contents should be black because the texture was lazily cleared.
+  EXPECT_EQ(0x00000000u, *static_cast<const uint32_t*>(data));
+}
+
+// Test that an uninitialized shared image is lazily cleared by Dawn when it is
+// read.
+TEST_P(WebGPUMailboxTest, ReadWritableUninitializedSharedImage) {
+  if (!WebGPUSupported()) {
+    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+    return;
+  }
+  if (!WebGPUSharedImageSupported()) {
+    LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
+    return;
+  }
+
+  // Create the shared image.
+  SharedImageInterface* sii = GetSharedImageInterface();
+  Mailbox mailbox = sii->CreateSharedImage(
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
+      kNullSurfaceHandle);
+  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
+  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
+
+  wgpu::Device device = GetNewDevice();
+
+  // Set the texture contents to non-zero so we can test a lazy clear occurs.
+  InitializeTextureColor(device, mailbox, {1.0, 0, 0, 1.0});
+
+  // Register the shared image as a Dawn texture in the wire.
+  gpu::webgpu::ReservedTexture reservation =
+      webgpu()->ReserveTexture(device.Get());
+
+  // Associate the mailbox. Using WEBGPU_MAILBOX_DISCARD will set the contents
+  // to uncleared.
+  webgpu()->AssociateMailbox(
+      reservation.deviceId, reservation.deviceGeneration, reservation.id,
+      reservation.generation,
+      WGPUTextureUsage_CopySrc | WGPUTextureUsage_RenderAttachment,
+      webgpu::WEBGPU_MAILBOX_DISCARD,
+      reinterpret_cast<const GLbyte*>(&mailbox));
+  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
+
+  // Read the texture using a render pass. Load+Store the contents.
+  // Uninitialized contents should not be loaded.
+  wgpu::RenderPassColorAttachment color_desc = {};
+  color_desc.view = texture.CreateView();
+  color_desc.loadOp = wgpu::LoadOp::Load;
+  color_desc.storeOp = wgpu::StoreOp::Store;
+
+  wgpu::RenderPassDescriptor render_pass_desc = {};
+  render_pass_desc.colorAttachmentCount = 1;
+  render_pass_desc.colorAttachments = &color_desc;
+
+  wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+  wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&render_pass_desc);
+  pass.EndPass();
+
+  // Copy the texture in a mappable buffer.
+  wgpu::BufferDescriptor buffer_desc;
+  buffer_desc.size = 4;
+  buffer_desc.usage = wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
+  wgpu::Buffer readback_buffer = device.CreateBuffer(&buffer_desc);
+
+  wgpu::ImageCopyTexture copy_src = {};
+  copy_src.texture = texture;
+  copy_src.mipLevel = 0;
+  copy_src.origin = {0, 0, 0};
+
+  wgpu::ImageCopyBuffer copy_dst = {};
+  copy_dst.buffer = readback_buffer;
+  copy_dst.layout.offset = 0;
+  copy_dst.layout.bytesPerRow = 256;
+
+  wgpu::Extent3D copy_size = {1, 1, 1};
+
+  encoder.CopyTextureToBuffer(&copy_src, &copy_dst, &copy_size);
+  wgpu::CommandBuffer commands = encoder.Finish();
+
+  wgpu::Queue queue = device.GetQueue();
+  queue.Submit(1, &commands);
+
+  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
+
+  // Map the buffer and assert the pixel is the correct value.
+  readback_buffer.MapAsync(wgpu::MapMode::Read, 0, 4, ToMockBufferMapCallback,
+                           nullptr);
+  EXPECT_CALL(*mock_buffer_map_callback,
+              Call(WGPUBufferMapAsyncStatus_Success, nullptr))
+      .Times(1);
+
+  WaitForCompletion(device);
+
+  const void* data = readback_buffer.GetConstMappedRange(0, 4);
+  // Contents should be black because the texture was lazily cleared.
+  EXPECT_EQ(0x00000000u, *static_cast<const uint32_t*>(data));
+}
+
 // Tests that using a shared image aftr it is dissociated produces an error.
-TEST_F(WebGPUMailboxTest, ErrorWhenUsingTextureAfterDissociate) {
+TEST_P(WebGPUMailboxTest, ErrorWhenUsingTextureAfterDissociate) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -426,7 +669,7 @@
   // Create a the shared image
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
-      viz::ResourceFormat::BGRA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
   SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
@@ -445,13 +688,22 @@
   webgpu()->AssociateMailbox(
       reservation.deviceId, reservation.deviceGeneration, reservation.id,
       reservation.generation, WGPUTextureUsage_CopySrc,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox));
+      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
   webgpu()->DissociateMailbox(reservation.id, reservation.generation);
 
   wgpu::TextureDescriptor dst_desc = {};
   dst_desc.size = {1, 1};
   dst_desc.usage = wgpu::TextureUsage::CopyDst;
-  dst_desc.format = wgpu::TextureFormat::BGRA8Unorm;
+  switch (GetParam().format) {
+    case viz::ResourceFormat::RGBA_8888:
+      dst_desc.format = wgpu::TextureFormat::RGBA8Unorm;
+      break;
+    case viz::ResourceFormat::BGRA_8888:
+      dst_desc.format = wgpu::TextureFormat::BGRA8Unorm;
+      break;
+    default:
+      NOTREACHED();
+  }
 
   wgpu::ImageCopyTexture src_image = {};
   src_image.texture = texture;
@@ -494,7 +746,7 @@
 // the move-assignment operator to be called. In this case the defaulted
 // move-assignment would first move `representation` then `access`. Causing
 // incorrect member destruction order for the move-to object.
-TEST_F(WebGPUMailboxTest, UseA_UseB_DestroyA_DestroyB) {
+TEST_P(WebGPUMailboxTest, UseA_UseB_DestroyA_DestroyB) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -507,11 +759,11 @@
   // Create a the shared images.
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox_a = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
   Mailbox mailbox_b = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
 
@@ -524,14 +776,14 @@
   webgpu()->AssociateMailbox(
       reservation_a.deviceId, reservation_a.deviceGeneration, reservation_a.id,
       reservation_a.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox_a));
+      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox_a));
 
   gpu::webgpu::ReservedTexture reservation_b =
       webgpu()->ReserveTexture(device.Get());
   webgpu()->AssociateMailbox(
       reservation_b.deviceId, reservation_b.deviceGeneration, reservation_b.id,
       reservation_b.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox_b));
+      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox_b));
 
   // Dissociate both mailboxes in the same order.
   webgpu()->DissociateMailbox(reservation_a.id, reservation_a.generation);
@@ -545,7 +797,7 @@
 // images was stored globally instead of per-device. This meant that of two
 // devices tried to create shared images with the same (id, generation) (which
 // is possible because they can be on different Dawn wires) they would conflict.
-TEST_F(WebGPUMailboxTest, AssociateOnTwoDevicesAtTheSameTime) {
+TEST_P(WebGPUMailboxTest, AssociateOnTwoDevicesAtTheSameTime) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -564,12 +816,12 @@
   // Create a the shared images.
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox_a = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
 
   Mailbox mailbox_b = sii->CreateSharedImage(
-      viz::ResourceFormat::RGBA_8888, {1, 1}, gfx::ColorSpace::CreateSRGB(),
+      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
       kNullSurfaceHandle);
 
@@ -583,14 +835,14 @@
   webgpu()->AssociateMailbox(
       reservation_a.deviceId, reservation_a.deviceGeneration, reservation_a.id,
       reservation_a.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox_a));
+      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox_a));
 
   gpu::webgpu::ReservedTexture reservation_b =
       webgpu()->ReserveTexture(device_b.Get());
   webgpu()->AssociateMailbox(
       reservation_b.deviceId, reservation_b.deviceGeneration, reservation_b.id,
       reservation_b.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<GLbyte*>(&mailbox_b));
+      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox_b));
 
   // Dissociate both mailboxes in the same order.
   webgpu()->DissociateMailbox(reservation_a.id, reservation_a.generation);
@@ -600,4 +852,9 @@
   webgpu()->FlushCommands();
 }
 
+INSTANTIATE_TEST_SUITE_P(,
+                         WebGPUMailboxTest,
+                         ::testing::ValuesIn(WebGPUMailboxTest::TestParams()),
+                         ::testing::PrintToStringParamName());
+
 }  // namespace gpu
diff --git a/gpu/command_buffer/tests/webgpu_test.cc b/gpu/command_buffer/tests/webgpu_test.cc
index 753c455..9badba7 100644
--- a/gpu/command_buffer/tests/webgpu_test.cc
+++ b/gpu/command_buffer/tests/webgpu_test.cc
@@ -13,8 +13,10 @@
 #include "components/viz/test/test_gpu_service_holder.h"
 #include "gpu/command_buffer/client/webgpu_cmd_helper.h"
 #include "gpu/command_buffer/client/webgpu_implementation.h"
+#include "gpu/command_buffer/service/service_utils.h"
 #include "gpu/command_buffer/service/webgpu_decoder.h"
 #include "gpu/config/gpu_test_config.h"
+#include "gpu/ipc/host/gpu_memory_buffer_support.h"
 #include "gpu/ipc/in_process_command_buffer.h"
 #include "gpu/ipc/webgpu_in_process_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -79,15 +81,16 @@
 
   gpu::GpuPreferences gpu_preferences;
   gpu_preferences.enable_webgpu = true;
+  gpu_preferences.use_passthrough_cmd_decoder =
+      gles2::UsePassthroughCommandDecoder(
+          base::CommandLine::ForCurrentProcess());
 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && BUILDFLAG(USE_DAWN)
   gpu_preferences.use_vulkan = gpu::VulkanImplementationName::kNative;
   gpu_preferences.gr_context_type = gpu::GrContextType::kVulkan;
-#elif BUILDFLAG(IS_WIN)
-  // D3D shared images are only supported with passthrough command decoder.
-  gpu_preferences.use_passthrough_cmd_decoder = true;
 #endif
-
   gpu_preferences.enable_unsafe_webgpu = options.enable_unsafe_webgpu;
+  gpu_preferences.texture_target_exception_list =
+      gpu::CreateBufferUsageAndFormatExceptionList();
 
   gpu_service_holder_ =
       std::make_unique<viz::TestGpuServiceHolder>(gpu_preferences);
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index 621ebf2e..a767aad 100644
--- a/gpu/ipc/in_process_command_buffer.cc
+++ b/gpu/ipc/in_process_command_buffer.cc
@@ -496,7 +496,7 @@
         webgpu::WebGPUDecoder::Create(
             this, command_buffer_.get(), task_executor_->shared_image_manager(),
             gpu_dependency_->memory_tracker(), task_executor_->outputter(),
-            task_executor_->gpu_preferences()));
+            task_executor_->gpu_preferences(), context_state_));
     gpu::ContextResult result = webgpu_decoder->Initialize();
     if (result != gpu::ContextResult::kSuccess) {
       DestroyOnGpuThread();
diff --git a/gpu/ipc/raster_in_process_context.cc b/gpu/ipc/raster_in_process_context.cc
index 7ea593c..5d89c78 100644
--- a/gpu/ipc/raster_in_process_context.cc
+++ b/gpu/ipc/raster_in_process_context.cc
@@ -13,7 +13,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
 #include "gpu/command_buffer/client/raster_cmd_helper.h"
-#include "gpu/command_buffer/client/raster_implementation.h"
 #include "gpu/command_buffer/client/raster_implementation_gles.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
 #include "gpu/command_buffer/client/transfer_buffer.h"
@@ -108,7 +107,7 @@
   return command_buffer_->GetGpuFeatureInfo();
 }
 
-raster::RasterInterface* RasterInProcessContext::GetImplementation() {
+raster::RasterImplementation* RasterInProcessContext::GetImplementation() {
   return raster_implementation_.get();
 }
 
diff --git a/gpu/ipc/raster_in_process_context.h b/gpu/ipc/raster_in_process_context.h
index 5ebbcd8..d89adae 100644
--- a/gpu/ipc/raster_in_process_context.h
+++ b/gpu/ipc/raster_in_process_context.h
@@ -9,6 +9,7 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/task/single_thread_task_runner.h"
+#include "gpu/command_buffer/client/raster_implementation.h"
 #include "gpu/ipc/command_buffer_task_executor.h"
 #include "gpu/ipc/in_process_command_buffer.h"
 
@@ -21,11 +22,6 @@
 struct GpuFeatureInfo;
 struct SharedMemoryLimits;
 
-namespace raster {
-class RasterInterface;
-class RasterImplementation;
-}  // namespace raster
-
 // Runs client and server side command buffer code in process. Only supports
 // RasterInterface.
 class RasterInProcessContext {
@@ -37,9 +33,7 @@
 
   ~RasterInProcessContext();
 
-  // |attrib_list| must be null or a NONE-terminated list of attribute/value
-  // pairs. |gpu_channel_manager| should be non-null when used in the GPU
-  // process.
+  // |gpu_channel_manager| should be non-null when used in the GPU process.
   ContextResult Initialize(
       CommandBufferTaskExecutor* task_executor,
       const ContextCreationAttribs& attribs,
@@ -55,7 +49,7 @@
 
   // Allows direct access to the RasterImplementation so a
   // RasterInProcessContext can be used without making it current.
-  gpu::raster::RasterInterface* GetImplementation();
+  gpu::raster::RasterImplementation* GetImplementation();
 
   ContextSupport* GetContextSupport();
 
diff --git a/gpu/ipc/service/webgpu_command_buffer_stub.cc b/gpu/ipc/service/webgpu_command_buffer_stub.cc
index 9145cc7..4000849 100644
--- a/gpu/ipc/service/webgpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/webgpu_command_buffer_stub.cc
@@ -101,6 +101,16 @@
     return ContextResult::kFatalFailure;
   }
 
+  ContextResult result;
+  scoped_refptr<SharedContextState> shared_context_state =
+      manager->GetSharedContextState(&result);
+  if (!shared_context_state) {
+    LOG(ERROR) << "ContextResult::kFatalFailure: "
+                  "Failed to create WebGPU decoder state.";
+    DCHECK_NE(result, gpu::ContextResult::kSuccess);
+    return result;
+  }
+
   share_group_ = manager->share_group();
   use_virtualized_gl_context_ = false;
 
@@ -110,13 +120,14 @@
       std::make_unique<CommandBufferService>(this, memory_tracker_.get());
   std::unique_ptr<webgpu::WebGPUDecoder> decoder(webgpu::WebGPUDecoder::Create(
       this, command_buffer_.get(), manager->shared_image_manager(),
-      memory_tracker_.get(), manager->outputter(), manager->gpu_preferences()));
+      memory_tracker_.get(), manager->outputter(), manager->gpu_preferences(),
+      std::move(shared_context_state)));
 
   sync_point_client_state_ =
       channel_->sync_point_manager()->CreateSyncPointClientState(
           CommandBufferNamespace::GPU_IO, command_buffer_id_, sequence_id_);
 
-  ContextResult result = decoder->Initialize();
+  result = decoder->Initialize();
   if (result != gpu::ContextResult::kSuccess) {
     DLOG(ERROR) << "Failed to initialize decoder.";
     return result;
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc
index 7f77999..c73231c 100644
--- a/headless/lib/headless_content_main_delegate.cc
+++ b/headless/lib/headless_content_main_delegate.cc
@@ -118,6 +118,8 @@
   ui::ResourceBundle::InitSharedInstanceWithLocale(
       locale, nullptr, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
   // Otherwise, load resources.pak, chrome_100 and chrome_200.
+  base::FilePath resources_pak =
+      resource_dir.Append(FILE_PATH_LITERAL("resources.pak"));
   base::FilePath chrome_100_pak =
       resource_dir.Append(FILE_PATH_LITERAL("chrome_100_percent.pak"));
   base::FilePath chrome_200_pak =
@@ -126,7 +128,9 @@
 #if BUILDFLAG(IS_MAC) && !defined(COMPONENT_BUILD)
   // In non component builds, check if fall back in Resources/ folder is
   // available.
-  if (!base::PathExists(chrome_100_pak)) {
+  if (!base::PathExists(resources_pak)) {
+    resources_pak =
+        resource_dir.Append(FILE_PATH_LITERAL("Resources/resources.pak"));
     chrome_100_pak = resource_dir.Append(
         FILE_PATH_LITERAL("Resources/chrome_100_percent.pak"));
     chrome_200_pak = resource_dir.Append(
@@ -134,6 +138,8 @@
   }
 #endif
 
+  ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
+      resources_pak, ui::kScaleFactorNone);
   ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(chrome_100_pak,
                                                               ui::k100Percent);
   ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(chrome_200_pak,
diff --git a/infra/archive_config/test-ash-chrome.yaml b/infra/archive_config/test-ash-chrome.yaml
new file mode 100644
index 0000000..b64ad38
--- /dev/null
+++ b/infra/archive_config/test-ash-chrome.yaml
@@ -0,0 +1,26 @@
+package: chromium/testing/linux-ash-chromium/x86_64/ash.zip
+description: Prebuilt test binary.
+install_mode: copy
+data:
+  - file: chrome
+  - file: chrome-wrapper
+  - file: chrome_100_percent.pak
+  - file: chrome_200_percent.pak
+  - file: chrome_crashpad_handler
+  - file: icudtl.dat
+  - file: keyboard_resources.pak
+  - file: libclearkeycdm.so
+  - file: libminigbm.so
+  - file: MEIPreload/manifest.json
+  - file: MEIPreload/preloaded_data.pb
+  - file: nacl_helper
+  - file: nacl_helper_bootstrap
+  - file: nacl_irt_x86_64.nexe
+  - file: product_logo_48.png
+  - file: resources.pak
+  - file: snapshot_blob.bin
+  - file: test_ash_chrome
+  - file: xdg-mime
+  - file: xdg-settings
+  - dir: locales/
+  - dir: resources/
diff --git a/infra/config/generated/builders/ci/linux-ash-chromium-generator-rel/properties.textpb b/infra/config/generated/builders/ci/linux-ash-chromium-generator-rel/properties.textpb
index 2013c465..9139904 100644
--- a/infra/config/generated/builders/ci/linux-ash-chromium-generator-rel/properties.textpb
+++ b/infra/config/generated/builders/ci/linux-ash-chromium-generator-rel/properties.textpb
@@ -10,7 +10,7 @@
           "version": "{%chromium_version%}"
         },
         "yaml_files": [
-          "gen_linux_ash_chromium_cipd_yaml_cipd.yaml"
+          "test_ash_chrome.yaml"
         ]
       }
     ]
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index e5248bd..3b06621 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -33680,7 +33680,7 @@
         '          "version": "{%chromium_version%}"'
         '        },'
         '        "yaml_files": ['
-        '          "gen_linux_ash_chromium_cipd_yaml_cipd.yaml"'
+        '          "test_ash_chrome.yaml"'
         '        ]'
         '      }'
         '    ]'
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
index 5854e50..4b4abec 100644
--- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -53,7 +53,7 @@
             "cipd_archive_datas": [
                 {
                     "yaml_files": [
-                        "gen_linux_ash_chromium_cipd_yaml_cipd.yaml",
+                        "test_ash_chrome.yaml",
                     ],
                     "refs": [
                         "{%channel%}",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index 55d3363..e0739fd 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -584,6 +584,10 @@
   TabLifecycleDependencies dependencies;
   dependencies.prerenderService =
       PrerenderServiceFactory::GetForBrowserState(browserState);
+  dependencies.sideSwipeController = browserViewController.sideSwipeController;
+  dependencies.sadTabCoordinator = browserViewController.sadTabCoordinator;
+  dependencies.downloadManagerCoordinator =
+      browserViewController.downloadManagerCoordinator;
 
   self.tabLifecycleMediator = [[TabLifecycleMediator alloc]
       initWithWebStateList:self.browser->GetWebStateList()
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller+delegates.h b/ios/chrome/browser/ui/browser_view/browser_view_controller+delegates.h
index e5536be1..de515ff 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller+delegates.h
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller+delegates.h
@@ -8,14 +8,28 @@
 #import "ios/chrome/browser/ui/browser_view/browser_view_controller.h"
 #import "ios/chrome/browser/ui/browser_view/common_tab_helper_delegate.h"
 
-// Category on BrowserViewController that
-// declares the BVC's conformance to several tab helper delegate protocols
+@class DownloadManagerCoordinator;
+@class SadTabCoordinator;
+@class SideSwipeController;
+
+// Category on BrowserViewController that that exposes some internal controllers
+// and coordinators that are used to set up tab helper delegates. This category
+// also declares the BVC's conformance to several tab helper delegate protocols
 // (enumerated in common_tab_helper_delegate.h) which are used to set up tab
 // helpers. This category is scaffolding for refactoring these delegate
 // responsibilities out of the BVC; its use should be limited, and the goal is
 // to remove properties and protocols from it (and from the BVC).
 @interface BrowserViewController (Delegates) <CommonTabHelperDelegate>
 
+@property(nonatomic, strong, readonly) SideSwipeController* sideSwipeController;
+
+// TODO(crbug.com/1272494): Move this to BrowserCoordinator.
+@property(nonatomic, strong, readonly) SadTabCoordinator* sadTabCoordinator;
+
+// TODO(crbug.com/1272495): Move this to BrowserCoordinator.
+@property(nonatomic, strong, readonly)
+    DownloadManagerCoordinator* downloadManagerCoordinator;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_BROWSER_VIEW_CONTROLLER_DELEGATES_H_
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 79f0aaa..1655318 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -32,7 +32,6 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/crash_report/crash_keys_helper.h"
-#import "ios/chrome/browser/download/download_manager_tab_helper.h"
 #include "ios/chrome/browser/feature_engagement/tracker_factory.h"
 #include "ios/chrome/browser/feature_engagement/tracker_util.h"
 #import "ios/chrome/browser/find_in_page/find_tab_helper.h"
@@ -171,7 +170,6 @@
 #include "ios/public/provider/chrome/browser/voice_search/voice_search_api.h"
 #include "ios/public/provider/chrome/browser/voice_search/voice_search_controller.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
-#import "ios/web/public/deprecated/crw_web_controller_util.h"
 #include "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state_observer_bridge.h"
@@ -347,6 +345,7 @@
   AlertCoordinator* _alertCoordinatorForNetExport;
 
   // Coordinator for displaying Sad Tab.
+  // TODO(crbug.com/1272494): Move SadTabCoordinator to BrowserCoordinator.
   SadTabCoordinator* _sadTabCoordinator;
 
   ToolbarCoordinatorAdaptor* _toolbarCoordinatorAdaptor;
@@ -364,6 +363,8 @@
   std::unique_ptr<FullscreenUIUpdater> _fullscreenUIUpdater;
 
   // Coordinator for the Download Manager UI.
+  // TODO(crbug.com/1272495): Move DownloadManagerCoordinator to
+  // BrowserCoordinator.
   DownloadManagerCoordinator* _downloadManagerCoordinator;
 
   // A map associating webStates with their NTP coordinators.
@@ -411,8 +412,6 @@
     BrowserContainerViewController* browserContainerViewController;
 // Invisible button used to dismiss the keyboard.
 @property(nonatomic, strong) UIButton* typingShield;
-// The browser's side swipe controller.  Lazily instantiated on the first call.
-@property(nonatomic, strong, readonly) SideSwipeController* sideSwipeController;
 // The object that manages keyboard commands on behalf of the BVC.
 @property(nonatomic, strong, readonly) KeyCommandsProvider* keyCommandsProvider;
 // Whether the controller's view is currently available.
@@ -666,6 +665,38 @@
   [self updateOverlayContainerOrder];
 }
 
+#pragma mark - Delegates Category Properties
+
+// Lazily creates the SideSwipeController on first access.
+- (SideSwipeController*)sideSwipeController {
+  if (!_sideSwipeController) {
+    _sideSwipeController =
+        [[SideSwipeController alloc] initWithBrowser:self.browser];
+    [_sideSwipeController setSnapshotDelegate:self];
+    _sideSwipeController.toolbarInteractionHandler = self.toolbarInterface;
+    _sideSwipeController.primaryToolbarSnapshotProvider =
+        self.primaryToolbarCoordinator;
+    _sideSwipeController.secondaryToolbarSnapshotProvider =
+        self.secondaryToolbarCoordinator;
+    [_sideSwipeController setSwipeDelegate:self];
+    if (!base::FeatureList::IsEnabled(kModernTabStrip)) {
+      [_sideSwipeController setTabStripDelegate:self.legacyTabStripCoordinator];
+    }
+  }
+  return _sideSwipeController;
+}
+
+// TODO(crbug.com/1272494): Move SadTabCoordinator to BrowserCoordinator.
+- (SadTabCoordinator*)sadTabCoordinator {
+  return _sadTabCoordinator;
+}
+
+// TODO(crbug.com/1272495): Move DownloadManagerCoordinator to
+// BrowserCoordinator.
+- (DownloadManagerCoordinator*)downloadManagerCoordinator {
+  return _downloadManagerCoordinator;
+}
+
 #pragma mark - Private Properties
 
 - (void)ensureBrowserViewHiderCoordinatorStarted {
@@ -689,24 +720,6 @@
   self.browserViewHiderCoordinator = browserViewHiderCoordinator;
 }
 
-- (SideSwipeController*)sideSwipeController {
-  if (!_sideSwipeController) {
-    _sideSwipeController =
-        [[SideSwipeController alloc] initWithBrowser:self.browser];
-    [_sideSwipeController setSnapshotDelegate:self];
-    _sideSwipeController.toolbarInteractionHandler = self.toolbarInterface;
-    _sideSwipeController.primaryToolbarSnapshotProvider =
-        self.primaryToolbarCoordinator;
-    _sideSwipeController.secondaryToolbarSnapshotProvider =
-        self.secondaryToolbarCoordinator;
-    [_sideSwipeController setSwipeDelegate:self];
-    if (!base::FeatureList::IsEnabled(kModernTabStrip)) {
-      [_sideSwipeController setTabStripDelegate:self.legacyTabStripCoordinator];
-    }
-  }
-  return _sideSwipeController;
-}
-
 - (KeyCommandsProvider*)keyCommandsProvider {
   if (!_keyCommandsProvider) {
     _keyCommandsProvider = [_dependencyFactory newKeyCommandsProvider];
@@ -1778,6 +1791,12 @@
   if (self.currentWebState) {
     self.currentWebState->GetWebViewProxy().scrollViewProxy.clipsToBounds = NO;
   }
+
+  // TODO(crbug.com/1272494): Move SadTabCoordinator to BrowserCoordinator.
+  _sadTabCoordinator = [[SadTabCoordinator alloc]
+      initWithBaseViewController:self.browserContainerViewController
+                         browser:self.browser];
+  _sadTabCoordinator.overscrollDelegate = self;
 }
 
 // On iOS7, iPad should match iOS6 status bar.  Install a simple black bar under
@@ -2116,14 +2135,10 @@
   self.omniboxHandler =
       HandlerForProtocol(self.browser->GetCommandDispatcher(), OmniboxCommands);
 
-  _sadTabCoordinator = [[SadTabCoordinator alloc]
-      initWithBaseViewController:self.browserContainerViewController
-                         browser:self.browser];
-  _sadTabCoordinator.overscrollDelegate = self;
-
   // If there are any existing SadTabHelpers in
   // |self.browser->GetWebStateList()|, update the helpers delegate with the new
   // |_sadTabCoordinator|.
+  // TODO(crbug.com/1272496) : Move this update into TabLifecycleMediator.
   DCHECK(_sadTabCoordinator);
   WebStateList* webStateList = self.browser->GetWebStateList();
   for (int i = 0; i < webStateList->count(); i++) {
@@ -2603,17 +2618,9 @@
     OverscrollActionsTabHelper::FromWebState(webState)->SetDelegate(self);
   }
 
-  web_deprecated::SetSwipeRecognizerProvider(webState,
-                                             self.sideSwipeController);
-  SadTabTabHelper::FromWebState(webState)->SetDelegate(_sadTabCoordinator);
   NetExportTabHelper::CreateForWebState(webState, self);
   CaptivePortalTabHelper::CreateForWebState(webState, self);
 
-  // DownloadManagerTabHelper cannot function without delegate.
-  DCHECK(_downloadManagerCoordinator);
-  DownloadManagerTabHelper::CreateForWebState(webState,
-                                              _downloadManagerCoordinator);
-
   NewTabPageTabHelper::FromWebState(webState)->SetDelegate(self);
 
   if (AccountConsistencyService* accountConsistencyService =
@@ -2632,7 +2639,6 @@
   if (!webState->IsRealized())
     return;
 
-  // TODO(crbug.com/1069763): do not pass the browser to PasswordTabHelper.
   if (PasswordTabHelper* passwordTabHelper =
           PasswordTabHelper::FromWebState(webState)) {
     passwordTabHelper->SetBaseViewController(nil);
@@ -2644,7 +2650,6 @@
     OverscrollActionsTabHelper::FromWebState(webState)->SetDelegate(nil);
   }
 
-  web_deprecated::SetSwipeRecognizerProvider(webState, nil);
   if (AccountConsistencyService* accountConsistencyService =
           ios::AccountConsistencyServiceFactory::GetForBrowserState(
               self.browserState)) {
diff --git a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.h b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.h
index 6d0a13e..e549084 100644
--- a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.h
+++ b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.h
@@ -9,10 +9,16 @@
 
 #import "ios/chrome/browser/ui/browser_view/common_tab_helper_delegate.h"
 
+@class DownloadManagerCoordinator;
 class PrerenderService;
+@class SadTabCoordinator;
+@class SideSwipeController;
 class WebStateList;
 
 typedef struct {
+  SideSwipeController* sideSwipeController;
+  SadTabCoordinator* sadTabCoordinator;
+  DownloadManagerCoordinator* downloadManagerCoordinator;
   PrerenderService* prerenderService;
 } TabLifecycleDependencies;
 
diff --git a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm
index a1514f7..bee2043d 100644
--- a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm
+++ b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm
@@ -4,11 +4,17 @@
 
 #import "ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.h"
 
+#import "ios/chrome/browser/download/download_manager_tab_helper.h"
 #import "ios/chrome/browser/prerender/prerender_service.h"
 #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
+#import "ios/chrome/browser/ui/download/download_manager_coordinator.h"
+#import "ios/chrome/browser/ui/sad_tab/sad_tab_coordinator.h"
+#import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h"
+#import "ios/chrome/browser/web/sad_tab_tab_helper.h"
 #import "ios/chrome/browser/web_state_list/web_state_dependency_installation_observer.h"
 #import "ios/chrome/browser/web_state_list/web_state_dependency_installer_bridge.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/web/public/deprecated/crw_web_controller_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -26,6 +32,9 @@
 
   // Other tab helper dependencies.
   PrerenderService* _prerenderService;
+  __weak SideSwipeController* _sideSwipeController;
+  __weak SadTabCoordinator* _sadTabCoordinator;
+  __weak DownloadManagerCoordinator* _downloadManagerCoordinator;
 }
 
 - (instancetype)initWithWebStateList:(WebStateList*)webStateList
@@ -33,6 +42,9 @@
                         dependencies:(TabLifecycleDependencies)dependencies {
   if (self = [super init]) {
     _prerenderService = dependencies.prerenderService;
+    _sideSwipeController = dependencies.sideSwipeController;
+    _sadTabCoordinator = dependencies.sadTabCoordinator;
+    _downloadManagerCoordinator = dependencies.downloadManagerCoordinator;
 
     // Set the delegate before any of the dependency observers, because they
     // will do delegate installation on creation.
@@ -61,6 +73,14 @@
   DCHECK(webState->IsRealized());
 
   SnapshotTabHelper::FromWebState(webState)->SetDelegate(_delegate);
+
+  web_deprecated::SetSwipeRecognizerProvider(webState, _sideSwipeController);
+  SadTabTabHelper::FromWebState(webState)->SetDelegate(_sadTabCoordinator);
+
+  // DownloadManagerTabHelper cannot function without its delegate.
+  DCHECK(_downloadManagerCoordinator);
+  DownloadManagerTabHelper::CreateForWebState(webState,
+                                              _downloadManagerCoordinator);
 }
 
 - (void)uninstallDependencyForWebState:(web::WebState*)webState {
@@ -70,6 +90,7 @@
   // Remove delegates for tab helpers which may otherwise do bad things during
   // shutdown.
   SnapshotTabHelper::FromWebState(webState)->SetDelegate(nil);
+  web_deprecated::SetSwipeRecognizerProvider(webState, nil);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
index 71b125b..4eb9ec1c1 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -175,6 +175,8 @@
   DownloadManagerMediator _mediator;
   StoreKitCoordinator* _storeKitCoordinator;
   UnopenedDownloadsTracker _unopenedDownloads;
+  // YES after _stop has been called.
+  BOOL _stopped;
 }
 @end
 
@@ -186,8 +188,7 @@
 @synthesize bottomMarginHeightAnchor = _bottomMarginHeightAnchor;
 
 - (void)dealloc {
-  [self stop];
-  [[InstallationNotifier sharedInstance] unregisterForNotifications:self];
+  DCHECK(_stopped);
 }
 
 - (void)start {
@@ -226,6 +227,9 @@
 
   [_storeKitCoordinator stop];
   _storeKitCoordinator = nil;
+
+  [[InstallationNotifier sharedInstance] unregisterForNotifications:self];
+  _stopped = YES;
 }
 
 - (UIViewController*)viewController {
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
index 3f16c27..b18e847 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
@@ -199,6 +199,7 @@
     [viewController.delegate
         downloadManagerViewControllerDidStartDownload:viewController];
 
+    [coordinator_ stop];
     // Destroy coordinator before destroying the download task.
     coordinator_ = nil;
   }
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm
index 35c45cc8..ae59e91 100644
--- a/ios/chrome/browser/ui/main/scene_controller.mm
+++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -2748,7 +2748,9 @@
     (signin_ui::CompletionCallback)completion {
   DCHECK(self.signinCoordinator);
   if (!signin::IsSigninAllowedByPolicy()) {
-    completion(/*success=*/NO);
+    if (completion) {
+      completion(/*success=*/NO);
+    }
     [self.signinCoordinator stop];
     id<PolicyChangeCommands> handler = HandlerForProtocol(
         self.signinCoordinator.browser->GetCommandDispatcher(),
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index 5a1ff320..e81385a 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -178,7 +178,6 @@
     "//ios/web:eg_app_support+eg2",
     "//ios/web/common",
     "//ios/web/public",
-    "//ios/web/public/deprecated",
     "//ios/web/public/js_messaging",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test:util",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 59a57e7..5ccf3166 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -588,8 +588,6 @@
 // Executes JavaScript on current WebState, and waits for either the completion
 // or timeout. If execution does not complete within a timeout a GREYAssert is
 // induced.
-- (id)executeJavaScript:(NSString*)javaScript;
-
 - (base::Value)evaluateJavaScript:(NSString*)javaScript [[nodiscard]];
 
 // Executes JavaScript on current WebState. This function should be used in
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index eef41366..524be44 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -1147,13 +1147,6 @@
   EG_TEST_HELPER_ASSERT_NO_ERROR([ChromeEarlGreyAppInterface clearBookmarks]);
 }
 
-- (id)executeJavaScript:(NSString*)JS {
-  NSError* error = nil;
-  id result = [ChromeEarlGreyAppInterface executeJavaScript:JS error:&error];
-  EG_TEST_HELPER_ASSERT_NO_ERROR(error);
-  return result;
-}
-
 - (base::Value)evaluateJavaScript:(NSString*)javaScript {
   JavaScriptExecutionResult* result =
       [ChromeEarlGreyAppInterface executeJavaScript:javaScript];
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index 0f276be..48f3114 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -467,12 +467,6 @@
 
 #pragma mark - JavaScript Utilities (EG2)
 
-// Executes JavaScript on current WebState, and waits for either the completion
-// or timeout. If execution does not complete within a timeout or JavaScript
-// exception is thrown, returns an NSError indicating why the operation failed,
-// otherwise returns object representing execution result.
-+ (id)executeJavaScript:(NSString*)javaScript error:(NSError**)error;
-
 // Executes JavaScript through the WebState's WebFrame and waits for either the
 // completion or timeout. If execution does not complete within a timeout or
 // JavaScript exception is thrown, |success| is NO.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index b430978..166d7b4 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -54,7 +54,6 @@
 #import "ios/testing/open_url_context.h"
 #include "ios/testing/verify_custom_webkit.h"
 #import "ios/web/common/features.h"
-#import "ios/web/public/deprecated/crw_js_injection_receiver.h"
 #import "ios/web/public/js_messaging/web_frame.h"
 #import "ios/web/public/js_messaging/web_frame_util.h"
 #import "ios/web/public/navigation/navigation_manager.h"
@@ -923,36 +922,6 @@
 
 #pragma mark - JavaScript Utilities (EG2)
 
-+ (id)executeJavaScript:(NSString*)javaScript error:(NSError**)outError {
-  __block bool handlerCalled = false;
-  __block id blockResult = nil;
-  __block NSError* blockError = nil;
-  [chrome_test_util::GetCurrentWebState()->GetJSInjectionReceiver()
-      executeJavaScript:javaScript
-      completionHandler:^(id result, NSError* error) {
-        handlerCalled = true;
-        blockResult = [result copy];
-        blockError = [error copy];
-      }];
-
-  bool completed = WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
-    return handlerCalled;
-  });
-
-  if (completed) {
-    NSError* __autoreleasing autoreleasedError = blockError;
-    *outError = autoreleasedError;
-  } else {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Did not complete execution of JavaScript: %@",
-                         javaScript];
-    NSError* __autoreleasing autoreleasedError =
-        testing::NSErrorWithLocalizedDescription(errorDescription);
-    *outError = autoreleasedError;
-  }
-  return blockResult;
-}
-
 + (JavaScriptExecutionResult*)executeJavaScript:(NSString*)javaScript {
   __block bool handlerCalled = false;
   __block NSString* blockResult = nil;
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 0e1adf8..a29e4cc 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d72acc13503097754c30dab2d7008b89d9aa1897
\ No newline at end of file
+669012c105e8ac83c7679dcc1ab5f1e3ef596ff6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index e6d3e66..3bd7046f 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-aafd9a62f4ea760d4f15ace9dc2be1204b34dfa2
\ No newline at end of file
+41305ecb3796995947799de415965d14c55a310a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 2799784..400a382 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-202196c9ef7fee42d70bf7ffe9b80677b876ae91
\ No newline at end of file
+5b984a6dc3ac154ff5cc31095308bcbaa1c8734a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 679a5ff..aacecb5 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-285816d1d62fe596af9603ea6a37d5ff8b16859c
\ No newline at end of file
+4baf3e62f2cb30a996282ccda2ff33383a32e019
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 088934b..7d5c3ca8 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-fef5205011dd9bf55dac4e98d4c29790dddcfec6
\ No newline at end of file
+cb425de4f6fdc5b83db8dd3cead2d444f5fba709
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index e051588..fcc164f 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-f3503a4a3161f581601e99a7172f39e23a58cc33
\ No newline at end of file
+3629aeaf2b5a128522d99e83ecac320cb3e91fd9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 19c998a7..4db26dd 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-946f5f5fbb5973e7f685555f042723182fa0ba61
\ No newline at end of file
+303883b579c086c290afa2edbfc70409caef9874
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 0ad6ed0b..40796a9 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-2912bdbd8f1fad18ec8a4beb13bb0f492b65a478
\ No newline at end of file
+c3db4a32cb28a44fbeaf4199c1b56b34e34d750c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index eaabffb..a8bda26f 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-037e8e86ee27b9b62a88428c4ec59737be6c9d4a
\ No newline at end of file
+fdb6e115e4849b2bb08728ee0500948a40937a40
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index f4fb1dd..80aa478c 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4dc5165d2137baae13e945d92a8d9ff98c753330
\ No newline at end of file
+7f1d4898e946f59d8cd956a698af2a1dead50f81
\ No newline at end of file
diff --git a/media/base/feedback_signal_accumulator.h b/media/base/feedback_signal_accumulator.h
index 2aa09e1..0261727 100644
--- a/media/base/feedback_signal_accumulator.h
+++ b/media/base/feedback_signal_accumulator.h
@@ -5,6 +5,8 @@
 #ifndef MEDIA_BASE_FEEDBACK_SIGNAL_ACCUMULATOR_H_
 #define MEDIA_BASE_FEEDBACK_SIGNAL_ACCUMULATOR_H_
 
+#include <algorithm>
+#include <cmath>
 #include <ostream>
 
 #include "base/time/time.h"
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index bec86bb8..111899b 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -497,6 +497,12 @@
         discard_front_samples = 0;
       }
 
+      if (discard_front_samples < 0) {
+        // See https://crbug.com/1189939 and https://trac.ffmpeg.org/ticket/9622
+        DLOG(ERROR) << "Negative skip samples are not allowed.";
+        discard_front_samples = 0;
+      }
+
       const int discard_end_samples =
           base::ByteSwapToLE32(*(skip_samples_ptr + kSkipEndSamplesOffset));
 
diff --git a/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc
index e889563..cd865eb 100644
--- a/media/gpu/video_encode_accelerator_tests.cc
+++ b/media/gpu/video_encode_accelerator_tests.cc
@@ -425,8 +425,6 @@
 
   // It is expected that our hw encoders don't produce key frames in a short
   // time span like a few hundred frames.
-  // TODO(hiroh): This might be wrong on some platforms. Needs to update.
-  // Encode the first frame, this should always be a keyframe.
   encoder->EncodeUntil(VideoEncoder::kBitstreamReady, 1u);
   EXPECT_TRUE(encoder->WaitUntilIdle());
   EXPECT_EQ(encoder->GetEventCount(VideoEncoder::kKeyFrame), 1u);
@@ -436,20 +434,11 @@
   // Check if there is no keyframe except the first frame.
   EXPECT_EQ(encoder->GetEventCount(VideoEncoder::kKeyFrame), 1u);
   encoder->ForceKeyFrame();
-  // Since kFrameReleased and kBitstreamReady events are asynchronous, the
-  // number of bitstreams being processed is unknown. We check keyframe request
-  // is applied by seeing if there is a keyframe in a few frames after
-  // requested. 10 is arbitrarily chosen.
-  constexpr size_t kKeyFrameRequestWindow = 10u;
-  encoder->EncodeUntil(VideoEncoder::kBitstreamReady,
-                       std::min(middle_frame + kKeyFrameRequestWindow,
-                                config.num_frames_to_encode));
-  EXPECT_TRUE(encoder->WaitUntilIdle());
-  EXPECT_EQ(encoder->GetEventCount(VideoEncoder::kKeyFrame), 2u);
 
   // Encode until the end of stream.
   encoder->Encode();
   EXPECT_TRUE(encoder->WaitForFlushDone());
+  // Check if there are two key frames, first frame and one on ForceKeyFrame().
   EXPECT_EQ(encoder->GetEventCount(VideoEncoder::kKeyFrame), 2u);
   EXPECT_EQ(encoder->GetFlushDoneCount(), 1u);
   EXPECT_EQ(encoder->GetFrameReleasedCount(), config.num_frames_to_encode);
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc
index 4b4c23f..f5cc9ae 100644
--- a/net/http/http_auth_handler_factory.cc
+++ b/net/http/http_auth_handler_factory.cc
@@ -94,7 +94,7 @@
 void HttpAuthHandlerRegistryFactory::SetHttpAuthPreferences(
     const std::string& scheme,
     const HttpAuthPreferences* prefs) {
-  HttpAuthHandlerFactory* factory = GetRegisteredSchemeFactory(scheme);
+  HttpAuthHandlerFactory* factory = GetSchemeFactory(scheme);
   if (factory)
     factory->set_http_auth_preferences(prefs);
 }
@@ -111,16 +111,6 @@
   }
 }
 
-HttpAuthHandlerFactory* HttpAuthHandlerRegistryFactory::GetSchemeFactory(
-    const std::string& scheme) const {
-  std::string lower_scheme = base::ToLowerASCII(scheme);
-  const auto& allowed_schemes = GetAllowedAuthSchemes();
-  if (allowed_schemes.find(lower_scheme) == allowed_schemes.end()) {
-    return nullptr;
-  }
-  return GetRegisteredSchemeFactory(scheme);
-}
-
 // static
 std::unique_ptr<HttpAuthHandlerRegistryFactory>
 HttpAuthHandlerFactory::CreateDefault(
@@ -213,12 +203,17 @@
   auto scheme = challenge->auth_scheme();
 
   int net_error;
-
   if (scheme.empty()) {
     handler->reset();
     net_error = ERR_INVALID_RESPONSE;
   } else {
-    auto* factory = GetSchemeFactory(scheme);
+    bool all_schemes_allowed_for_origin =
+        http_auth_preferences() &&
+        http_auth_preferences()->IsAllowedToUseAllHttpAuthSchemes(
+            scheme_host_port);
+    auto* factory = all_schemes_allowed_for_origin || IsSchemeAllowed(scheme)
+                        ? GetSchemeFactory(scheme)
+                        : nullptr;
     if (!factory) {
       handler->reset();
       net_error = ERR_UNSUPPORTED_AUTH_SCHEME;
@@ -242,17 +237,33 @@
   return net_error;
 }
 
-const std::set<std::string>&
-HttpAuthHandlerRegistryFactory::GetAllowedAuthSchemes() const {
-  if (http_auth_preferences() &&
-      http_auth_preferences()->allowed_schemes().has_value()) {
-    return *http_auth_preferences()->allowed_schemes();
-  }
-  return default_auth_schemes_;
+bool HttpAuthHandlerRegistryFactory::IsSchemeAllowedForTesting(
+    const std::string& scheme) const {
+  return IsSchemeAllowed(scheme);
 }
 
-HttpAuthHandlerFactory*
-HttpAuthHandlerRegistryFactory::GetRegisteredSchemeFactory(
+bool HttpAuthHandlerRegistryFactory::IsSchemeAllowed(
+    const std::string& scheme) const {
+  const std::set<std::string>& allowed_schemes =
+      http_auth_preferences() && http_auth_preferences()->allowed_schemes()
+          ? *http_auth_preferences()->allowed_schemes()
+          : default_auth_schemes_;
+  return allowed_schemes.find(scheme) != allowed_schemes.end();
+}
+
+#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID) && BUILDFLAG(IS_POSIX)
+absl::optional<std::string>
+HttpAuthHandlerRegistryFactory::GetNegotiateLibraryNameForTesting() const {
+  if (!IsSchemeAllowed(kNegotiateAuthScheme))
+    return absl::nullopt;
+
+  return reinterpret_cast<net::HttpAuthHandlerNegotiate::Factory*>(
+             GetSchemeFactory(net::kNegotiateAuthScheme))
+      ->GetLibraryNameForTesting();  // IN-TEST
+}
+#endif
+
+HttpAuthHandlerFactory* HttpAuthHandlerRegistryFactory::GetSchemeFactory(
     const std::string& scheme) const {
   std::string lower_scheme = base::ToLowerASCII(scheme);
   auto it = factory_map_.find(lower_scheme);
diff --git a/net/http/http_auth_handler_factory.h b/net/http/http_auth_handler_factory.h
index 4c089081b..5a41e68d 100644
--- a/net/http/http_auth_handler_factory.h
+++ b/net/http/http_auth_handler_factory.h
@@ -195,13 +195,6 @@
   void RegisterSchemeFactory(const std::string& scheme,
                              HttpAuthHandlerFactory* factory);
 
-  // Retrieve the factory for the specified |scheme|. If no factory exists
-  // for the |scheme|, nullptr is returned. The returned factory must not be
-  // deleted by the caller, and it is guaranteed to be valid until either
-  // a new factory is registered for the same scheme, or until this
-  // registry factory is destroyed.
-  HttpAuthHandlerFactory* GetSchemeFactory(const std::string& scheme) const;
-
   // Creates an HttpAuthHandlerRegistryFactory.
   //
   // |prefs| is a pointer to the (single) authentication preferences object.
@@ -241,16 +234,25 @@
                         const NetLogWithSource& net_log,
                         HostResolver* host_resolver,
                         std::unique_ptr<HttpAuthHandler>* handler) override;
-  const std::set<std::string>& GetAllowedAuthSchemes() const;
+
+#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID) && BUILDFLAG(IS_POSIX)
+  absl::optional<std::string> GetNegotiateLibraryNameForTesting() const;
+#endif
+
+  // Returns true if the scheme is allowed to be used for all origins. An auth
+  // handler may still be created for an origin if that origin is allowed by
+  // policy to use all supported auth handlers.
+  bool IsSchemeAllowedForTesting(const std::string& scheme) const;
 
  private:
+  bool IsSchemeAllowed(const std::string& scheme) const;
+
   // Retrieve the factory for the specified |scheme|. If no factory exists
   // for the |scheme|, nullptr is returned. The returned factory must not be
   // deleted by the caller, and it is guaranteed to be valid until either
   // a new factory is registered for the same scheme, or until this
   // registry factory is destroyed.
-  HttpAuthHandlerFactory* GetRegisteredSchemeFactory(
-      const std::string& scheme) const;
+  HttpAuthHandlerFactory* GetSchemeFactory(const std::string& scheme) const;
 
   using FactoryMap =
       std::map<std::string, std::unique_ptr<HttpAuthHandlerFactory>>;
diff --git a/net/http/http_auth_handler_factory_unittest.cc b/net/http/http_auth_handler_factory_unittest.cc
index ad6c0d38..ac993f0fe 100644
--- a/net/http/http_auth_handler_factory_unittest.cc
+++ b/net/http/http_auth_handler_factory_unittest.cc
@@ -6,6 +6,8 @@
 
 #include <memory>
 
+#include "base/bind.h"
+#include "base/callback.h"
 #include "build/build_config.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_isolation_key.h"
@@ -217,6 +219,59 @@
   }
 }
 
+TEST(HttpAuthHandlerFactoryTest, HttpAuthUrlFilter) {
+  std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+
+  MockAllowHttpAuthPreferences http_auth_preferences;
+  // Set the Preference that blocks Basic Auth over HTTP on all of the
+  // factories. It shouldn't impact any behavior except for the Basic factory.
+  http_auth_preferences.set_basic_over_http_enabled(false);
+  // Set the preference that only allows "https://www.example.com" to use HTTP
+  // auth.
+  http_auth_preferences.set_http_auth_scheme_filter(
+      base::BindRepeating([](const url::SchemeHostPort& scheme_host_port) {
+        return scheme_host_port ==
+               url::SchemeHostPort(GURL("https://www.example.com"));
+      }));
+
+  std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
+      HttpAuthHandlerFactory::CreateDefault(&http_auth_preferences));
+
+  GURL nonsecure_origin("http://www.example.com");
+  GURL secure_origin("https://www.example.com");
+
+  SSLInfo null_ssl_info;
+  const HttpAuth::Target kTargets[] = {HttpAuth::AUTH_SERVER,
+                                       HttpAuth::AUTH_PROXY};
+  struct TestCase {
+    int expected_net_error;
+    const GURL origin;
+    const char* challenge;
+  } const kTestCases[] = {
+    {OK, secure_origin, "Basic realm=\"FooBar\""},
+    {ERR_UNSUPPORTED_AUTH_SCHEME, nonsecure_origin, "Basic realm=\"FooBar\""},
+    {OK, secure_origin, "Digest realm=\"FooBar\", nonce=\"xyz\""},
+    {OK, nonsecure_origin, "Digest realm=\"FooBar\", nonce=\"xyz\""},
+    {OK, secure_origin, "Ntlm"},
+    {OK, nonsecure_origin, "Ntlm"},
+#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
+    {OK, secure_origin, "Negotiate"},
+    {OK, nonsecure_origin, "Negotiate"},
+#endif
+  };
+
+  for (const auto target : kTargets) {
+    for (const TestCase& test_case : kTestCases) {
+      std::unique_ptr<HttpAuthHandler> handler;
+      int rv = http_auth_handler_factory->CreateAuthHandlerFromString(
+          test_case.challenge, target, null_ssl_info, NetworkIsolationKey(),
+          url::SchemeHostPort(test_case.origin), NetLogWithSource(),
+          host_resolver.get(), &handler);
+      EXPECT_THAT(rv, IsError(test_case.expected_net_error));
+    }
+  }
+}
+
 TEST(HttpAuthHandlerFactoryTest, BasicFactoryRespectsHTTPEnabledPref) {
   std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
   std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
diff --git a/net/http/http_auth_handler_fuzzer.cc b/net/http/http_auth_handler_fuzzer.cc
index 8608a23..a325a3e 100644
--- a/net/http/http_auth_handler_fuzzer.cc
+++ b/net/http/http_auth_handler_fuzzer.cc
@@ -31,10 +31,8 @@
   }
   std::unique_ptr<net::HttpAuthHandlerRegistryFactory> factory =
       net::HttpAuthHandlerFactory::CreateDefault();
-  net::HttpAuthHandlerFactory* scheme_factory =
-      factory->GetSchemeFactory(scheme);
 
-  if (!scheme_factory)
+  if (!factory->IsSchemeAllowedForTesting(scheme))
     return 0;
 
   std::string challenge = data_provider.ConsumeRandomLengthString(500);
@@ -45,7 +43,7 @@
   auto host_resolver = std::make_unique<net::MockHostResolver>();
   std::unique_ptr<net::HttpAuthHandler> handler;
 
-  scheme_factory->CreateAuthHandlerFromString(
+  factory->CreateAuthHandlerFromString(
       challenge, net::HttpAuth::AUTH_SERVER, null_ssl_info,
       net::NetworkIsolationKey(), scheme_host_port, net::NetLogWithSource(),
       host_resolver.get(), &handler);
diff --git a/net/http/http_auth_preferences.cc b/net/http/http_auth_preferences.cc
index 7484485..4fa3e69d 100644
--- a/net/http/http_auth_preferences.cc
+++ b/net/http/http_auth_preferences.cc
@@ -68,6 +68,12 @@
   allow_default_credentials_ = creds;
 }
 
+bool HttpAuthPreferences::IsAllowedToUseAllHttpAuthSchemes(
+    const url::SchemeHostPort& scheme_host_port) const {
+  return !http_auth_scheme_filter_ ||
+         http_auth_scheme_filter_.Run(scheme_host_port);
+}
+
 void HttpAuthPreferences::SetServerAllowlist(
     const std::string& server_allowlist) {
   std::unique_ptr<HttpAuthFilter> allowlist;
diff --git a/net/http/http_auth_preferences.h b/net/http/http_auth_preferences.h
index 555c4f3..894ffefe 100644
--- a/net/http/http_auth_preferences.h
+++ b/net/http/http_auth_preferences.h
@@ -9,6 +9,7 @@
 #include <set>
 #include <string>
 
+#include "base/callback.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "net/base/net_export.h"
@@ -100,6 +101,13 @@
     allowed_schemes_ = allowed_schemes;
   }
 
+  void set_http_auth_scheme_filter(
+      base::RepeatingCallback<bool(const url::SchemeHostPort&)>&& filter) {
+    http_auth_scheme_filter_ = std::move(filter);
+  }
+
+  bool IsAllowedToUseAllHttpAuthSchemes(const url::SchemeHostPort& url) const;
+
   void SetServerAllowlist(const std::string& server_allowlist);
 
   void SetDelegateAllowlist(const std::string& delegate_allowlist);
@@ -135,6 +143,9 @@
 
   absl::optional<std::set<std::string>> allowed_schemes_;
   std::unique_ptr<URLSecurityManager> security_manager_;
+  base::RepeatingCallback<bool(const url::SchemeHostPort&)>
+      http_auth_scheme_filter_ =
+          base::RepeatingCallback<bool(const url::SchemeHostPort&)>();
 };
 
 }  // namespace net
diff --git a/net/http/http_auth_preferences_unittest.cc b/net/http/http_auth_preferences_unittest.cc
index 9d34118..c349b72 100644
--- a/net/http/http_auth_preferences_unittest.cc
+++ b/net/http/http_auth_preferences_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/callback.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_runner.h"
@@ -94,4 +95,16 @@
                                        url::SchemeHostPort(GURL("abc"))));
 }
 
+TEST(HttpAuthPreferencesTest, HttpAuthSchemesFilter) {
+  HttpAuthPreferences http_auth_preferences;
+  http_auth_preferences.set_http_auth_scheme_filter(
+      base::BindRepeating([](const url::SchemeHostPort& scheme_host_port) {
+        return scheme_host_port.GetURL() == GURL("https://www.google.com");
+      }));
+  EXPECT_TRUE(http_auth_preferences.IsAllowedToUseAllHttpAuthSchemes(
+      url::SchemeHostPort(GURL("https://www.google.com"))));
+  EXPECT_FALSE(http_auth_preferences.IsAllowedToUseAllHttpAuthSchemes(
+      url::SchemeHostPort(GURL("https://www.example.com"))));
+}
+
 }  // namespace net
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index 7d9a0f3..5f6261d 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -588,6 +588,8 @@
 EVENT_TYPE(SSL_CONFIRM_HANDSHAKE)
 
 // An SSL connection sent or received a handshake message.
+// `SSL_ENCYPTED_CLIENT_HELLO` means the handshake message was not sent over the
+// wire but encrypted with the Encrypted ClientHello (ECH) extension.
 // The following parameters are attached:
 //   {
 //     "type": <The type of the handshake message, as an integer>
@@ -596,6 +598,7 @@
 //   }
 EVENT_TYPE(SSL_HANDSHAKE_MESSAGE_RECEIVED)
 EVENT_TYPE(SSL_HANDSHAKE_MESSAGE_SENT)
+EVENT_TYPE(SSL_ENCYPTED_CLIENT_HELLO)
 
 // The specified number of bytes were sent on the socket.  Depending on the
 // source of the event, may be logged either once the data is sent, or when it
@@ -4113,3 +4116,10 @@
 //    "message": <Failure message>,
 // }
 EVENT_TYPE(WEBSOCKET_UPGRADE_FAILURE)
+
+// This event is logged when the WebSocket read buffer size is changed. It
+// contains the following parameters:
+// {
+//    "read_buffer_size_in_bytes": <New read buffer size in bytes>,
+// }
+EVENT_TYPE(WEBSOCKET_READ_BUFFER_SIZE_CHANGED)
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index 28dbb77..ec7d57e 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -109,6 +109,7 @@
                  SSLConnectionStatusToCipherSuite(ssl_info.connection_status));
   dict.SetIntKey("key_exchange_group", ssl_info.key_exchange_group);
   dict.SetIntKey("peer_signature_algorithm", ssl_info.peer_signature_algorithm);
+  dict.SetBoolKey("encrypted_client_hello", ssl_info.encrypted_client_hello);
 
   dict.SetStringKey("next_proto",
                     NextProtoToString(socket->GetNegotiatedProtocol()));
@@ -1851,8 +1852,14 @@
             return NetLogSSLMessageParams(!!is_write, buf, len, capture_mode);
           });
       break;
-    default:
-      return;
+    case SSL3_RT_CLIENT_HELLO_INNER:
+      DCHECK(is_write);
+      net_log_.AddEvent(NetLogEventType::SSL_ENCYPTED_CLIENT_HELLO,
+                        [&](NetLogCaptureMode capture_mode) {
+                          return NetLogSSLMessageParams(!!is_write, buf, len,
+                                                        capture_mode);
+                        });
+      break;
   }
 }
 
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index cedb1959..dc6763c 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -416,7 +416,7 @@
       std::make_unique<WebSocketBasicStream>(
           std::make_unique<WebSocketClientSocketHandleAdapter>(
               state_.ReleaseConnection()),
-          state_.read_buf(), sub_protocol_, extensions_);
+          state_.read_buf(), sub_protocol_, extensions_, net_log_);
   DCHECK(extension_params_.get());
   if (extension_params_->deflate_enabled) {
     return std::make_unique<WebSocketDeflateStream>(
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index c0e546b..263624b 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -105,6 +105,12 @@
   return static_cast<int>(total_size);
 }
 
+base::Value NetLogBufferSizeParam(int buffer_size) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetIntKey("read_buffer_size_in_bytes", buffer_size);
+  return dict;
+}
+
 }  // namespace
 
 WebSocketBasicStream::BufferSizeManager::BufferSizeManager() = default;
@@ -144,7 +150,8 @@
     std::unique_ptr<Adapter> connection,
     const scoped_refptr<GrowableIOBuffer>& http_read_buffer,
     const std::string& sub_protocol,
-    const std::string& extensions)
+    const std::string& extensions,
+    const NetLogWithSource& net_log)
     : read_buffer_(
           base::MakeRefCounted<IOBufferWithSize>(kSmallReadBufferSize)),
       target_read_buffer_size_(read_buffer_->size()),
@@ -152,6 +159,7 @@
       http_read_buffer_(http_read_buffer),
       sub_protocol_(sub_protocol),
       extensions_(extensions),
+      net_log_(net_log),
       generate_websocket_masking_key_(&GenerateWebSocketMaskingKey) {
   // http_read_buffer_ should not be set if it contains no data.
   if (http_read_buffer_.get() && http_read_buffer_->offset() == 0)
@@ -233,11 +241,12 @@
     const scoped_refptr<GrowableIOBuffer>& http_read_buffer,
     const std::string& sub_protocol,
     const std::string& extensions,
+    const NetLogWithSource& net_log,
     WebSocketMaskingKeyGeneratorFunction key_generator_function) {
   auto stream = std::make_unique<WebSocketBasicStream>(
       std::make_unique<WebSocketClientSocketHandleAdapter>(
           std::move(connection)),
-      http_read_buffer, sub_protocol, extensions);
+      http_read_buffer, sub_protocol, extensions, net_log);
   stream->generate_websocket_masking_key_ = key_generator_function;
   return stream;
 }
@@ -270,6 +279,9 @@
               ? kSmallReadBufferSize
               : kLargeReadBufferSize);
       buffer_size_ = buffer_size_manager_.buffer_size();
+      net_log_.AddEvent(
+          net::NetLogEventType::WEBSOCKET_READ_BUFFER_SIZE_CHANGED,
+          [&] { return NetLogBufferSizeParam(read_buffer_->size()); });
     }
     buffer_size_manager_.OnRead(base::TimeTicks::Now());
 
diff --git a/net/websockets/websocket_basic_stream.h b/net/websockets/websocket_basic_stream.h
index 8ed0035e..2327e58 100644
--- a/net/websockets/websocket_basic_stream.h
+++ b/net/websockets/websocket_basic_stream.h
@@ -14,6 +14,7 @@
 #include "base/time/time.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
+#include "net/log/net_log_with_source.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/websockets/websocket_frame_parser.h"
 #include "net/websockets/websocket_stream.h"
@@ -109,7 +110,8 @@
   WebSocketBasicStream(std::unique_ptr<Adapter> connection,
                        const scoped_refptr<GrowableIOBuffer>& http_read_buffer,
                        const std::string& sub_protocol,
-                       const std::string& extensions);
+                       const std::string& extensions,
+                       const NetLogWithSource& net_log);
 
   // The destructor has to make sure the connection is closed when we finish so
   // that it does not get returned to the pool.
@@ -137,6 +139,7 @@
       const scoped_refptr<GrowableIOBuffer>& http_read_buffer,
       const std::string& sub_protocol,
       const std::string& extensions,
+      const NetLogWithSource& net_log,
       WebSocketMaskingKeyGeneratorFunction key_generator_function);
 
  private:
@@ -238,6 +241,8 @@
   // The extensions negotiated with the remote server.
   const std::string extensions_;
 
+  NetLogWithSource net_log_;
+
   // This is used for adaptive read buffer size.
   BufferSizeManager buffer_size_manager_;
 
diff --git a/net/websockets/websocket_basic_stream_test.cc b/net/websockets/websocket_basic_stream_test.cc
index a0720e5..4a5ca33 100644
--- a/net/websockets/websocket_basic_stream_test.cc
+++ b/net/websockets/websocket_basic_stream_test.cc
@@ -170,7 +170,7 @@
                     base::span<const MockWrite> writes) {
     stream_ = WebSocketBasicStream::CreateWebSocketBasicStreamForTesting(
         MakeTransportSocket(reads, writes), http_read_buffer_, sub_protocol_,
-        extensions_, generator_);
+        extensions_, net_log_, generator_);
   }
 
   std::unique_ptr<SocketDataProvider> socket_data_;
@@ -182,6 +182,7 @@
   scoped_refptr<GrowableIOBuffer> http_read_buffer_;
   std::string sub_protocol_;
   std::string extensions_;
+  NetLogWithSource net_log_;
   WebSocketBasicStream::WebSocketMaskingKeyGeneratorFunction generator_;
   bool expect_all_io_to_complete_;
   std::unique_ptr<WebSocketBasicStream> stream_;
diff --git a/net/websockets/websocket_http2_handshake_stream.cc b/net/websockets/websocket_http2_handshake_stream.cc
index 07aa7d0..03fc2dc3 100644
--- a/net/websockets/websocket_http2_handshake_stream.cc
+++ b/net/websockets/websocket_http2_handshake_stream.cc
@@ -253,8 +253,9 @@
 
   stream_adapter_->DetachDelegate();
   std::unique_ptr<WebSocketStream> basic_stream =
-      std::make_unique<WebSocketBasicStream>(
-          std::move(stream_adapter_), nullptr, sub_protocol_, extensions_);
+      std::make_unique<WebSocketBasicStream>(std::move(stream_adapter_),
+                                             nullptr, sub_protocol_,
+                                             extensions_, net_log_);
 
   if (!extension_params_->deflate_enabled)
     return basic_stream;
diff --git a/remoting/host/mojom/webauthn_proxy.mojom b/remoting/host/mojom/webauthn_proxy.mojom
index a25a181..dcc74a7 100644
--- a/remoting/host/mojom/webauthn_proxy.mojom
+++ b/remoting/host/mojom/webauthn_proxy.mojom
@@ -4,11 +4,20 @@
 
 module remoting.mojom;
 
+// Struct that represents a DOMException, yielded by the remote request during a
+// Create or Get request.
+struct WebAuthnExceptionDetails {
+  // The `name` field of a DOMException.
+  string name;
+
+  // The `message` field of a DOMException.
+  string message;
+};
+
 // The response object for WebAuthnProxy.Create().
 union WebAuthnCreateResponse {
-  // The `name` property of the `DOMException`, if any, yielded by the remote
-  // request.
-  string error_name;
+  // The `DOMException`, if any, yielded by the remote request.
+  WebAuthnExceptionDetails error_details;
 
   // A string-serialized representation of the `PublicKeyCredential`
   // (https://w3c.github.io/webauthn/#publickeycredential), if any, yielded
diff --git a/remoting/host/webauthn/remote_webauthn_constants.cc b/remoting/host/webauthn/remote_webauthn_constants.cc
index 4f720d4..c6619322 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.cc
+++ b/remoting/host/webauthn/remote_webauthn_constants.cc
@@ -17,7 +17,9 @@
 const char kGetRemoteStateResponseIsRemotedKey[] = "isRemoted";
 const char kCancelResponseWasCanceledKey[] = "wasCanceled";
 const char kCreateRequestDataKey[] = "requestData";
-const char kCreateResponseErrorNameKey[] = "errorName";
 const char kCreateResponseDataKey[] = "responseData";
+const char kWebAuthnErrorKey[] = "error";
+const char kWebAuthnErrorNameKey[] = "name";
+const char kWebAuthnErrorMessageKey[] = "message";
 
 }  // namespace remoting
diff --git a/remoting/host/webauthn/remote_webauthn_constants.h b/remoting/host/webauthn/remote_webauthn_constants.h
index 63d79b00..bdaba464 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.h
+++ b/remoting/host/webauthn/remote_webauthn_constants.h
@@ -20,8 +20,10 @@
 extern const char kGetRemoteStateResponseIsRemotedKey[];
 extern const char kCancelResponseWasCanceledKey[];
 extern const char kCreateRequestDataKey[];
-extern const char kCreateResponseErrorNameKey[];
 extern const char kCreateResponseDataKey[];
+extern const char kWebAuthnErrorKey[];
+extern const char kWebAuthnErrorNameKey[];
+extern const char kWebAuthnErrorMessageKey[];
 
 }  // namespace remoting
 
diff --git a/remoting/host/webauthn/remote_webauthn_message_handler.cc b/remoting/host/webauthn/remote_webauthn_message_handler.cc
index a9a28bc..84cbc6b 100644
--- a/remoting/host/webauthn/remote_webauthn_message_handler.cc
+++ b/remoting/host/webauthn/remote_webauthn_message_handler.cc
@@ -17,6 +17,8 @@
 #include "remoting/proto/remote_webauthn.pb.h"
 #include "remoting/protocol/message_serialization.h"
 
+namespace remoting {
+
 namespace {
 
 template <typename CallbackType, typename... ResponseType>
@@ -32,9 +34,15 @@
   callback_map.erase(it);
 }
 
-}  // namespace
+mojom::WebAuthnExceptionDetailsPtr ProtobufErrorToMojoError(
+    const protocol::RemoteWebAuthn::ExceptionDetails& pb_error) {
+  auto mojo_error = mojom::WebAuthnExceptionDetails::New();
+  mojo_error->name = pb_error.name();
+  mojo_error->message = pb_error.message();
+  return mojo_error;
+}
 
-namespace remoting {
+}  // namespace
 
 RemoteWebAuthnMessageHandler::RemoteWebAuthnMessageHandler(
     const std::string& name,
@@ -210,9 +218,9 @@
 
   mojom::WebAuthnCreateResponsePtr mojo_response;
   switch (response.result_case()) {
-    case protocol::RemoteWebAuthn::CreateResponse::ResultCase::kErrorName:
-      mojo_response =
-          mojom::WebAuthnCreateResponse::NewErrorName(response.error_name());
+    case protocol::RemoteWebAuthn::CreateResponse::ResultCase::kError:
+      mojo_response = mojom::WebAuthnCreateResponse::NewErrorDetails(
+          ProtobufErrorToMojoError(response.error()));
       break;
     case protocol::RemoteWebAuthn::CreateResponse::ResultCase::kResponseJson:
       mojo_response = mojom::WebAuthnCreateResponse::NewResponseData(
@@ -246,9 +254,12 @@
 
   if (base::Contains(create_callbacks_, id)) {
     FindAndRunCallback(cancel_callbacks_, id, /* was_canceled= */ true);
+    auto mojo_error = mojom::WebAuthnExceptionDetails::New();
+    mojo_error->name = "AbortError";
+    mojo_error->message = "Request has been canceled by the host.";
     FindAndRunCallback(
         create_callbacks_, id,
-        mojom::WebAuthnCreateResponse::NewErrorName("AbortError"));
+        mojom::WebAuthnCreateResponse::NewErrorDetails(std::move(mojo_error)));
     RemoveRequestCancellerByMessageId(id);
     return;
   }
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
index c885174..6f7166f 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
@@ -23,6 +23,24 @@
 
 namespace remoting {
 
+namespace {
+
+base::Value CreateWebAuthnExceptionDetailsDict(const std::string& name,
+                                               const std::string& message) {
+  base::Value details(base::Value::Type::DICTIONARY);
+  details.SetStringKey(kWebAuthnErrorNameKey, name);
+  details.SetStringKey(kWebAuthnErrorMessageKey, message);
+  return details;
+}
+
+base::Value MojoErrorToErrorDict(
+    const mojom::WebAuthnExceptionDetailsPtr& mojo_error) {
+  return CreateWebAuthnExceptionDetailsDict(mojo_error->name,
+                                            mojo_error->message);
+}
+
+}  // namespace
+
 RemoteWebAuthnNativeMessagingHost::RemoteWebAuthnNativeMessagingHost(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner)
     : RemoteWebAuthnNativeMessagingHost(
@@ -119,13 +137,15 @@
   // Create request: {id: string, type: 'create', requestData: string}
   // Create response: {
   //   id: string, type: 'createResponse', responseData?: string,
-  //   errorName?: string}
+  //   error?: {name: string, message: string}}
 
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   if (!EnsureIpcConnection()) {
     // TODO(yuweih): See if this is the right error to use here.
-    response.SetStringKey(kCreateResponseErrorNameKey, "InvalidStateError");
+    response.SetKey(kWebAuthnErrorKey, CreateWebAuthnExceptionDetailsDict(
+                                           "InvalidStateError",
+                                           "Failed to connect to IPC server."));
     SendMessageToClient(std::move(response));
     return;
   }
@@ -135,8 +155,10 @@
 
   const base::Value* message_id = request.FindKey(kMessageId);
   if (!message_id) {
-    LOG(ERROR) << "Message ID not found in create request.";
-    response.SetStringKey(kCreateResponseErrorNameKey, "NotSupportedError");
+    response.SetKey(
+        kWebAuthnErrorKey,
+        CreateWebAuthnExceptionDetailsDict(
+            "NotSupportedError", "Message ID not found in create request."));
     SendMessageToClient(std::move(response));
     return;
   }
@@ -144,8 +166,10 @@
   const std::string* request_data =
       request.FindStringKey(kCreateRequestDataKey);
   if (!request_data) {
-    LOG(ERROR) << "Request data not found in create request.";
-    response.SetStringKey(kCreateResponseErrorNameKey, "NotSupportedError");
+    response.SetKey(
+        kWebAuthnErrorKey,
+        CreateWebAuthnExceptionDetailsDict(
+            "NotSupportedError", "Request data not found in create request."));
     SendMessageToClient(std::move(response));
     return;
   }
@@ -252,9 +276,10 @@
   // this case we just send back an empty create response.
   if (!remote_response.is_null()) {
     switch (remote_response->which()) {
-      case mojom::WebAuthnCreateResponse::Tag::kErrorName:
-        response.SetStringKey(kCreateResponseErrorNameKey,
-                              remote_response->get_error_name());
+      case mojom::WebAuthnCreateResponse::Tag::kErrorDetails:
+        response.SetKey(
+            kWebAuthnErrorKey,
+            MojoErrorToErrorDict(remote_response->get_error_details()));
         break;
       case mojom::WebAuthnCreateResponse::Tag::kResponseData:
         response.SetStringKey(kCreateResponseDataKey,
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
index 95a14df..b2451fad 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
@@ -274,7 +274,7 @@
 
   VerifyResponseMessage(response, kCreateMessageType);
   ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  ASSERT_NE(response.FindStringKey(kCreateResponseErrorNameKey), nullptr);
+  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
@@ -288,7 +288,7 @@
 
   VerifyResponseMessage(response, kCreateMessageType);
   ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  ASSERT_NE(response.FindStringKey(kCreateResponseErrorNameKey), nullptr);
+  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_EmptyResponse) {
@@ -304,14 +304,17 @@
 
   VerifyResponseMessage(response, kCreateMessageType);
   ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  ASSERT_EQ(response.FindStringKey(kCreateResponseErrorNameKey), nullptr);
+  ASSERT_EQ(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_ErrorResponse) {
   ExpectGetSessionServices();
   ExpectBindWebAuthnProxy();
+  auto mojo_error = mojom::WebAuthnExceptionDetails::New();
+  mojo_error->name = "NotSupportedError";
+  mojo_error->message = "Test error message";
   auto mojo_response =
-      mojom::WebAuthnCreateResponse::NewErrorName("NotSupportedError");
+      mojom::WebAuthnCreateResponse::NewErrorDetails(std::move(mojo_error));
   EXPECT_CALL(webauthn_proxy_, Create("fake", _, _))
       .WillOnce(base::test::RunOnceCallback<2>(std::move(mojo_response)));
   auto request = CreateRequestMessage(kCreateMessageType);
@@ -322,8 +325,12 @@
 
   VerifyResponseMessage(response, kCreateMessageType);
   ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  ASSERT_EQ(*response.FindStringKey(kCreateResponseErrorNameKey),
+  const auto* json_error = response.FindKey(kWebAuthnErrorKey);
+  ASSERT_NE(json_error, nullptr);
+  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorNameKey),
             "NotSupportedError");
+  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorMessageKey),
+            "Test error message");
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_DataResponse) {
@@ -341,7 +348,7 @@
 
   VerifyResponseMessage(response, kCreateMessageType);
   ASSERT_EQ(*response.FindStringKey(kCreateResponseDataKey), "fake response");
-  ASSERT_EQ(response.FindStringKey(kCreateResponseErrorNameKey), nullptr);
+  ASSERT_EQ(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
diff --git a/remoting/proto/remote_webauthn.proto b/remoting/proto/remote_webauthn.proto
index a7f460f0..9250421 100644
--- a/remoting/proto/remote_webauthn.proto
+++ b/remoting/proto/remote_webauthn.proto
@@ -12,6 +12,14 @@
 // channel.
 // Next ID: 8
 message RemoteWebAuthn {
+  // message that represents a DOMException, yielded by the remote request
+  // during a Create or Get request.
+  // Next ID: 3
+  message ExceptionDetails {
+    optional string name = 1;
+    optional string message = 2;
+  }
+
   // Requests the client to handle a call to
   // PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable().
   message IsUvpaaRequest {}
@@ -35,8 +43,8 @@
     // has yielded `null`, which is still a valid response according to the
     // spec.
     oneof result {
-      // The `name` property of the `DOMException`, if any.
-      string error_name = 1;
+      // The `DOMException`, if any, yielded by the remote request.
+      ExceptionDetails error = 1;
 
       // A JSON serialized representation of the `PublicKeyCredential`
       // (https://w3c.github.io/webauthn/#publickeycredential), if any.
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 69f2c3e..9ddb57d 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -247,6 +247,7 @@
     "//components/network_session_configurator/common",
     "//components/os_crypt",
     "//components/prefs",
+    "//components/url_matcher",
     "//components/web_package",
     "//components/webrtc:fake_ssl_socket",
     "//mojo/public/cpp/bindings",
diff --git a/services/network/DEPS b/services/network/DEPS
index d77488d7..2aea66c 100644
--- a/services/network/DEPS
+++ b/services/network/DEPS
@@ -9,6 +9,7 @@
   # store for networking-related data (Like which servers support QUIC), rather
   # than to store user preferences.
   "+components/prefs",
+  "+components/url_matcher",
   "+components/version_info",
   "+components/web_package",
   # FakeSSLClientSocket
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index f3cad27a..507b98d3 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -41,6 +41,8 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/pref_service_factory.h"
+#include "components/url_matcher/url_matcher.h"
+#include "components/url_matcher/url_util.h"
 #include "crypto/sha2.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "net/base/features.h"
@@ -122,6 +124,7 @@
 #include "services/network/url_request_context_builder_mojo.h"
 #include "services/network/web_transport.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
 
 #if BUILDFLAG(IS_CT_SUPPORTED)
 #include "components/certificate_transparency/chrome_ct_policy_enforcer.h"
@@ -2113,6 +2116,14 @@
   } else {
     http_auth_merged_preferences_.set_allowed_schemes(absl::nullopt);
   }
+
+  url_matcher_ = std::make_unique<url_matcher::URLMatcher>();
+  url_matcher::util::AddAllowFilters(url_matcher_.get(),
+                                     http_auth_dynamic_network_service_params
+                                         ->patterns_allowed_to_use_all_schemes);
+  http_auth_merged_preferences_.set_http_auth_scheme_filter(
+      base::BindRepeating(&NetworkContext::IsAllowedToUseAllHttpAuthSchemes,
+                          base::Unretained(this)));
 }
 
 URLRequestContextOwner NetworkContext::MakeURLRequestContext(
@@ -2784,6 +2795,12 @@
           network_service()->trust_token_key_commitments())));
 }
 
+bool NetworkContext::IsAllowedToUseAllHttpAuthSchemes(
+    const url::SchemeHostPort& scheme_host_port) {
+  DCHECK(url_matcher_);
+  return !url_matcher_->MatchURL(scheme_host_port.GetURL()).empty();
+}
+
 void NetworkContext::GetOriginPolicyManager(
     mojo::PendingReceiver<mojom::OriginPolicyManager> receiver) {
   origin_policy_manager_->AddReceiver(std::move(receiver));
diff --git a/services/network/network_context.h b/services/network/network_context.h
index c47c904..11474bd 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -99,6 +99,10 @@
 class DomainReliabilityMonitor;
 }  // namespace domain_reliability
 
+namespace url_matcher {
+class URLMatcher;
+}
+
 namespace network {
 class CertVerifierWithTrustAnchors;
 class CookieManager;
@@ -655,6 +659,9 @@
   void FinishConstructingTrustTokenStore(
       std::unique_ptr<SQLiteTrustTokenPersister> persister);
 
+  bool IsAllowedToUseAllHttpAuthSchemes(
+      const url::SchemeHostPort& scheme_host_port);
+
   const raw_ptr<NetworkService> network_service_;
 
   mojo::Remote<mojom::NetworkContextClient> client_;
@@ -860,6 +867,8 @@
            base::UniquePtrComparator>
       url_loader_factories_;
 
+  std::unique_ptr<url_matcher::URLMatcher> url_matcher_;
+
   base::WeakPtrFactory<NetworkContext> weak_factory_{this};
 };
 
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index 781b46e9..6b8285a 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -7376,6 +7376,61 @@
       Optional(mojom::DeleteStoredTrustTokensStatus::kSuccessTokensDeleted));
 }
 
+TEST_F(NetworkContextTest, HttpAuthUrlFilter) {
+  std::unique_ptr<NetworkContext> network_context =
+      CreateContextWithParams(CreateNetworkContextParamsForTesting());
+  const GURL kGoogle("https://www.google.com");
+  const GURL kGoogleSubdomain("https://subdomain.google.com");
+  const GURL kBlocked("https://www.blocked.com");
+  auto is_url_allowed_to_use_auth_schemes =
+      [&network_context](const GURL& url) {
+        return network_context->GetHttpAuthPreferences()
+            ->IsAllowedToUseAllHttpAuthSchemes(url::SchemeHostPort(url));
+      };
+
+  network::mojom::HttpAuthDynamicParamsPtr auth_dynamic_params =
+      network::mojom::HttpAuthDynamicParams::New();
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kBlocked));
+
+  auth_dynamic_params->patterns_allowed_to_use_all_schemes =
+      std::vector<std::string>{"subdomain.google.com"};
+  network_context->OnHttpAuthDynamicParamsChanged(auth_dynamic_params.get());
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(
+      GURL("https://subdomain.blocked.com")));
+
+  auth_dynamic_params->patterns_allowed_to_use_all_schemes =
+      std::vector<std::string>{};
+  network_context->OnHttpAuthDynamicParamsChanged(auth_dynamic_params.get());
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kBlocked));
+
+  auth_dynamic_params->patterns_allowed_to_use_all_schemes =
+      std::vector<std::string>{"google.com"};
+  network_context->OnHttpAuthDynamicParamsChanged(auth_dynamic_params.get());
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kBlocked));
+
+  auth_dynamic_params->patterns_allowed_to_use_all_schemes =
+      std::vector<std::string>{"https://google.com/path"};
+  network_context->OnHttpAuthDynamicParamsChanged(auth_dynamic_params.get());
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_FALSE(is_url_allowed_to_use_auth_schemes(kBlocked));
+
+  auth_dynamic_params->patterns_allowed_to_use_all_schemes =
+      std::vector<std::string>{"*"};
+  network_context->OnHttpAuthDynamicParamsChanged(auth_dynamic_params.get());
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogle));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kGoogleSubdomain));
+  EXPECT_TRUE(is_url_allowed_to_use_auth_schemes(kBlocked));
+}
+
 }  // namespace
 
 }  // namespace network
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 3180e11..b80ef8f 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -721,6 +721,11 @@
   }
 }
 
+void NetworkService::UpdateCtKnownPopularSCTs(
+    const std::vector<std::vector<uint8_t>>& sct_hashes) {
+  sct_auditing_cache_->set_popular_scts(std::move(sct_hashes));
+}
+
 void NetworkService::SetCtEnforcementEnabled(bool enabled) {
   DCHECK(base::FeatureList::IsEnabled(
       certificate_transparency::features::
diff --git a/services/network/network_service.h b/services/network/network_service.h
index 01609d0e..0a9ff954 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -187,6 +187,8 @@
                                 traffic_annotation) override;
   void UpdateCtLogList(std::vector<mojom::CTLogInfoPtr> log_list,
                        base::Time update_time) override;
+  void UpdateCtKnownPopularSCTs(
+      const std::vector<std::vector<uint8_t>>& sct_hashes) override;
   void SetCtEnforcementEnabled(bool enabled) override;
 #endif
 
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 486f5ac3..49c3ecb 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -154,20 +154,6 @@
   base::RunLoop().RunUntilIdle();
 }
 
-// Platforms where Negotiate can be used.
-#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
-// Returns the negotiate factory, if one exists, to query its configuration.
-net::HttpAuthHandlerNegotiate::Factory* GetNegotiateFactory(
-    NetworkContext* network_context) {
-  net::HttpAuthHandlerFactory* auth_factory =
-      network_context->url_request_context()->http_auth_handler_factory();
-  return reinterpret_cast<net::HttpAuthHandlerNegotiate::Factory*>(
-      reinterpret_cast<net::HttpAuthHandlerRegistryFactory*>(auth_factory)
-          ->GetSchemeFactory(net::kNegotiateAuthScheme));
-}
-
-#endif  // BUILDFLAG(USE_KERBEROS)
-
 TEST_F(NetworkServiceTest, AuthDefaultParams) {
   mojo::Remote<mojom::NetworkContext> network_context_remote;
   NetworkContext network_context(
@@ -180,15 +166,18 @@
 
   // These three factories should always be created by default.  Negotiate may
   // or may not be created, depending on other build flags.
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
+  EXPECT_TRUE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+  EXPECT_TRUE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kDigestAuthScheme));
+  EXPECT_TRUE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
 
 #if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
-  ASSERT_TRUE(GetNegotiateFactory(&network_context));
+  ASSERT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+      net::kNegotiateAuthScheme));
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_CHROMEOS_ASH)
-  EXPECT_EQ("",
-            GetNegotiateFactory(&network_context)->GetLibraryNameForTesting());
+  EXPECT_EQ("", auth_handler_factory->GetNegotiateLibraryNameForTesting());
 #endif
 #endif  // BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
 
@@ -217,15 +206,18 @@
           network_context.url_request_context()->http_auth_handler_factory());
   ASSERT_TRUE(auth_handler_factory);
 
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-  EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
-#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
   EXPECT_TRUE(
-      auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+  EXPECT_TRUE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kDigestAuthScheme));
+  EXPECT_TRUE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
+#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
+  EXPECT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+      net::kNegotiateAuthScheme));
 #else
-  EXPECT_FALSE(
-      auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+  EXPECT_FALSE(auth_handler_factory->IsSchemeAllowedForTesting(
+      net::kNegotiateAuthScheme));
 #endif
   {
     mojom::HttpAuthDynamicParamsPtr auth_params =
@@ -233,12 +225,14 @@
     auth_params->allowed_schemes = std::vector<std::string>{};
     service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
-    EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
     EXPECT_FALSE(
-        auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-    EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+    EXPECT_FALSE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kDigestAuthScheme));
     EXPECT_FALSE(
-        auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
+    EXPECT_FALSE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kNegotiateAuthScheme));
   }
   {
     mojom::HttpAuthDynamicParamsPtr auth_params =
@@ -247,26 +241,32 @@
         std::vector<std::string>{net::kDigestAuthScheme, net::kNtlmAuthScheme};
     service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
-    EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
-    EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-    EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
     EXPECT_FALSE(
-        auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+    EXPECT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kDigestAuthScheme));
+    EXPECT_TRUE(
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
+    EXPECT_FALSE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kNegotiateAuthScheme));
   }
   {
     mojom::HttpAuthDynamicParamsPtr auth_params =
         mojom::HttpAuthDynamicParams::New();
     service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
-    EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
-    EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-    EXPECT_TRUE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
-#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
     EXPECT_TRUE(
-        auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+    EXPECT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kDigestAuthScheme));
+    EXPECT_TRUE(
+        auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
+#if BUILDFLAG(USE_KERBEROS) && !BUILDFLAG(IS_ANDROID)
+    EXPECT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kNegotiateAuthScheme));
 #else
-    EXPECT_FALSE(
-        auth_handler_factory->GetSchemeFactory(net::kNegotiateAuthScheme));
+    EXPECT_FALSE(auth_handler_factory->IsSchemeAllowedForTesting(
+        net::kNegotiateAuthScheme));
 #endif
   }
 }
@@ -289,9 +289,12 @@
   auth_params->allowed_schemes = std::vector<std::string>{};
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
-  EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kBasicAuthScheme));
-  EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kDigestAuthScheme));
-  EXPECT_FALSE(auth_handler_factory->GetSchemeFactory(net::kNtlmAuthScheme));
+  EXPECT_FALSE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kBasicAuthScheme));
+  EXPECT_FALSE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kDigestAuthScheme));
+  EXPECT_FALSE(
+      auth_handler_factory->IsSchemeAllowedForTesting(net::kNtlmAuthScheme));
 }
 
 #if BUILDFLAG(USE_EXTERNAL_GSSAPI)
@@ -312,9 +315,13 @@
   NetworkContext network_context(
       service(), network_context_remote.BindNewPipeAndPassReceiver(),
       CreateContextParams());
-  ASSERT_TRUE(GetNegotiateFactory(&network_context));
+  net::HttpAuthHandlerRegistryFactory* auth_handler_factory =
+      reinterpret_cast<net::HttpAuthHandlerRegistryFactory*>(
+          network_context.url_request_context()->http_auth_handler_factory());
+  ASSERT_TRUE(auth_handler_factory->IsSchemeAllowedForTesting(
+      net::kNegotiateAuthScheme));
   EXPECT_EQ(kGssapiLibraryName,
-            GetNegotiateFactory(&network_context)->GetLibraryNameForTesting());
+            auth_handler_factory->GetNegotiateLibraryNameForTesting());
 }
 #endif  // BUILDFLAG(USE_EXTERNAL_GSSAPI)
 
diff --git a/services/network/public/cpp/client_hints.cc b/services/network/public/cpp/client_hints.cc
index 3354a511..f66c367 100644
--- a/services/network/public/cpp/client_hints.cc
+++ b/services/network/public/cpp/client_hints.cc
@@ -54,6 +54,7 @@
       {network::mojom::WebClientHintsType::kUAFullVersionList,
        "sec-ch-ua-full-version-list"},
       {network::mojom::WebClientHintsType::kFullUserAgent, "sec-ch-ua-full"},
+      {network::mojom::WebClientHintsType::kUAWoW64, "sec-ch-ua-wow64"},
   };
 }
 
diff --git a/services/network/public/cpp/cors/cors.cc b/services/network/public/cpp/cors/cors.cc
index 8d7ecd7..4a0b703 100644
--- a/services/network/public/cpp/cors/cors.cc
+++ b/services/network/public/cpp/cors/cors.cc
@@ -381,6 +381,7 @@
       // some period, once UA reduction rolls out.
       "sec-ch-ua-full",
 
+      "sec-ch-ua-wow64",
   });
 
   if (!base::Contains(safe_names, lower_name))
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 3380047..28b6eb0 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -60,6 +60,12 @@
   // List of allowed auth schemes. Unrecognized schemes are ignored.
   array<string>? allowed_schemes;
 
+  // List of origins patterns that are allowed the use of all the HTTP auth
+  // schemes recognized and supported by the browser regardless of
+  // `allowed_schemes`. The accepted format is documented at
+  // http://www.chromium.org/administrators/url-blocklist-filter-format.
+  array<string> patterns_allowed_to_use_all_schemes;
+
   // Comma / semi-colon delimited allowlist of server origins which the network
   // service may send the default credentials for NTLM or Negotiate
   // authentication.
@@ -324,6 +330,10 @@
   [EnableIf=is_ct_supported]
   UpdateCtLogList(array<CTLogInfo> log_list, mojo_base.mojom.Time update_time);
 
+  // Updates the list of popular SCTs queried during CT hashdance auditing.
+  [EnableIf=is_ct_supported]
+  UpdateCtKnownPopularSCTs(array<array<uint8>> sct_hashes);
+
   // Disables or enables CT Enforcement.
   [EnableIf=is_ct_supported]
   SetCtEnforcementEnabled(bool enabled);
diff --git a/services/network/public/mojom/web_client_hints_types.mojom b/services/network/public/mojom/web_client_hints_types.mojom
index 9d8c9064..5645b267 100644
--- a/services/network/public/mojom/web_client_hints_types.mojom
+++ b/services/network/public/mojom/web_client_hints_types.mojom
@@ -50,6 +50,7 @@
   // A client hint which, if set, signifies to the origin that the User-Agent
   // header contains the full user agent string.
   kFullUserAgent = 24,
+  kUAWoW64 = 25,
 
   // Warning: Before adding a new client hint, read the warning at the top.
 };
diff --git a/services/network/restricted_cookie_manager.cc b/services/network/restricted_cookie_manager.cc
index 89db2b08..38bd28c6 100644
--- a/services/network/restricted_cookie_manager.cc
+++ b/services/network/restricted_cookie_manager.cc
@@ -448,26 +448,31 @@
   CookieAccesses* cookie_accesses =
       GetCookieAccessesForURLAndSite(url, site_for_cookies);
 
-  // TODO(https://crbug.com/977040): Stop reporting accesses of cookies with
-  // warning reasons once samesite tightening up is rolled out.
-  for (const auto& cookie_and_access_result : excluded_cookies) {
-    if (!cookie_and_access_result.access_result.status.ShouldWarn() &&
-        !cookie_and_access_result.access_result.status.HasOnlyExclusionReason(
-            net::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES)) {
-      continue;
-    }
+  auto add_excluded = [&]() {
+    // TODO(https://crbug.com/977040): Stop reporting accesses of cookies with
+    // warning reasons once samesite tightening up is rolled out.
+    for (const auto& cookie_and_access_result : excluded_cookies) {
+      if (!cookie_and_access_result.access_result.status.ShouldWarn() &&
+          !cookie_and_access_result.access_result.status.HasOnlyExclusionReason(
+              net::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES)) {
+        continue;
+      }
 
-    // Skip sending a notification about this cookie access?
-    if (SkipAccessNotificationForCookieItem(cookie_accesses,
-                                            cookie_and_access_result)) {
-      continue;
-    }
+      // Skip sending a notification about this cookie access?
+      if (SkipAccessNotificationForCookieItem(cookie_accesses,
+                                              cookie_and_access_result)) {
+        continue;
+      }
 
-    on_cookies_accessed_result.push_back(
-        mojom::CookieOrLineWithAccessResult::New(
-            mojom::CookieOrLine::NewCookie(cookie_and_access_result.cookie),
-            cookie_and_access_result.access_result));
-  }
+      on_cookies_accessed_result.push_back(
+          mojom::CookieOrLineWithAccessResult::New(
+              mojom::CookieOrLine::NewCookie(cookie_and_access_result.cookie),
+              cookie_and_access_result.access_result));
+    }
+  };
+
+  if (!base::FeatureList::IsEnabled(features::kFasterSetCookie))
+    add_excluded();
 
   if (!maybe_included_cookies.empty())
     result.reserve(maybe_included_cookies.size());
@@ -495,29 +500,30 @@
       result.push_back(cookie_item);
     }
 
-    // Skip sending a notification about this cookie access?
-    if (SkipAccessNotificationForCookieItem(cookie_accesses, cookie_item)) {
-      continue;
+    if (!base::FeatureList::IsEnabled(features::kFasterSetCookie)) {
+      // Skip sending a notification about this cookie access?
+      if (SkipAccessNotificationForCookieItem(cookie_accesses, cookie_item)) {
+        continue;
+      }
+
+      on_cookies_accessed_result.push_back(
+          mojom::CookieOrLineWithAccessResult::New(
+              mojom::CookieOrLine::NewCookie(cookie), access_result));
     }
-
-    on_cookies_accessed_result.push_back(
-        mojom::CookieOrLineWithAccessResult::New(
-            mojom::CookieOrLine::NewCookie(cookie), access_result));
   }
 
-  if (cookie_observer_ && !on_cookies_accessed_result.empty()) {
-    cookie_observer_->OnCookiesAccessed(mojom::CookieAccessDetails::New(
-        mojom::CookieAccessDetails::Type::kRead, url, site_for_cookies,
-        std::move(on_cookies_accessed_result), absl::nullopt));
-  }
+  auto notify_observer = [&]() {
+    if (cookie_observer_ && !on_cookies_accessed_result.empty()) {
+      cookie_observer_->OnCookiesAccessed(mojom::CookieAccessDetails::New(
+          mojom::CookieAccessDetails::Type::kRead, url, site_for_cookies,
+          std::move(on_cookies_accessed_result), absl::nullopt));
+    }
+  };
 
-  if (maybe_included_cookies.empty()) {
-    DCHECK(result.empty());
-    std::move(callback).Run({});
-    return;
-  }
+  if (!base::FeatureList::IsEnabled(features::kFasterSetCookie))
+    notify_observer();
 
-  if (IsPartitionedCookiesEnabled()) {
+  if (!maybe_included_cookies.empty() && IsPartitionedCookiesEnabled()) {
     UMA_HISTOGRAM_COUNTS_100(
         "Net.RestrictedCookieManager.PartitionedCookiesInScript",
         base::ranges::count_if(result,
@@ -526,7 +532,28 @@
                                }));
   }
 
-  std::move(callback).Run(std::move(result));
+  std::move(callback).Run(
+      base::FeatureList::IsEnabled(features::kFasterSetCookie)
+          ? result
+          : std::move(result));
+
+  if (base::FeatureList::IsEnabled(features::kFasterSetCookie)) {
+    add_excluded();
+
+    for (auto& cookie : result) {
+      // Skip sending a notification about this cookie access?
+      if (SkipAccessNotificationForCookieItem(cookie_accesses, cookie)) {
+        continue;
+      }
+
+      on_cookies_accessed_result.push_back(
+          mojom::CookieOrLineWithAccessResult::New(
+              mojom::CookieOrLine::NewCookie(cookie.cookie),
+              cookie.access_result));
+    }
+
+    notify_observer();
+  }
 }
 
 void RestrictedCookieManager::SetCanonicalCookie(
diff --git a/services/network/restricted_cookie_manager_unittest.cc b/services/network/restricted_cookie_manager_unittest.cc
index fa934ea..678cae23 100644
--- a/services/network/restricted_cookie_manager_unittest.cc
+++ b/services/network/restricted_cookie_manager_unittest.cc
@@ -103,7 +103,8 @@
     }
   };
 
-  RecordingCookieObserver() = default;
+  RecordingCookieObserver() : run_loop_(std::make_unique<base::RunLoop>()) {}
+
   ~RecordingCookieObserver() override = default;
 
   std::vector<CookieOp>& recorded_activity() { return recorded_activity_; }
@@ -114,6 +115,11 @@
     return remote;
   }
 
+  void WaitForCallback() {
+    run_loop_->Run();
+    run_loop_ = std::make_unique<base::RunLoop>();
+  }
+
   void OnCookiesAccessed(mojom::CookieAccessDetailsPtr details) override {
     for (const auto& cookie_and_access_result : details->cookie_list) {
       CookieOp op;
@@ -124,6 +130,8 @@
       op.status = cookie_and_access_result->access_result.status;
       recorded_activity_.push_back(std::move(op));
     }
+
+    run_loop_->QuitClosure().Run();
   }
 
   void Clone(
@@ -134,6 +142,7 @@
  private:
   std::vector<CookieOp> recorded_activity_;
   mojo::ReceiverSet<mojom::CookieAccessObserver> receivers_;
+  std::unique_ptr<base::RunLoop> run_loop_;
 };
 
 // Synchronous proxies to a wrapped RestrictedCookieManager's methods.
@@ -379,6 +388,8 @@
     return recording_client_.recorded_activity();
   }
 
+  void WaitForCallback() { return recording_client_.WaitForCallback(); }
+
   const GURL kDefaultUrl{"https://example.com/"};
   const GURL kDefaultUrlWithPath{"https://example.com/test/"};
   const GURL kOtherUrl{"https://notexample.com/"};
@@ -692,6 +703,8 @@
             net::MatchesCookieNameValue("cookie-name", "cookie-value")));
   }
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(MatchesCookieOp(
@@ -719,6 +732,8 @@
         IsEmpty());
   }
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(
@@ -756,6 +771,8 @@
                                     kDefaultOrigin, std::move(options)),
         ElementsAre(net::MatchesCookieNameValue(kCookieName, kCookieValue)));
 
+    WaitForCallback();
+
     EXPECT_THAT(
         recorded_activity(),
         ElementsAre(MatchesCookieOp(
@@ -807,6 +824,8 @@
                                     kDefaultOrigin, std::move(options)),
         IsEmpty());
 
+    WaitForCallback();
+
     // A change in access result (allowed -> blocked) should generate a new
     // notification.
     EXPECT_EQ(recorded_activity().size(), 2ul);
@@ -825,6 +844,8 @@
                                     kDefaultOrigin, std::move(options)),
         ElementsAre(net::MatchesCookieNameValue(kCookieName, kNewCookieValue)));
 
+    WaitForCallback();
+
     // A change in access result (blocked -> allowed) should generate a new
     // notification.
     EXPECT_THAT(
@@ -868,6 +889,8 @@
         IsEmpty());
   }
 
+  WaitForCallback();
+
   EXPECT_THAT(recorded_activity(),
               ElementsAre(MatchesCookieOp(
                   mojom::CookieAccessDetails::Type::kRead,
@@ -893,7 +916,9 @@
                                     kDefaultOrigin, std::move(options)),
         ElementsAre(
             net::MatchesCookieNameValue("cookie-name", "cookie-value")));
+    WaitForCallback();
   }
+
   // Same Party. `party_context` contains fps site.
   service_->OverrideIsolationInfoForTesting(net::IsolationInfo::Create(
       net::IsolationInfo::RequestType::kOther, kDefaultOrigin, kDefaultOrigin,
@@ -910,6 +935,7 @@
                                     kDefaultOrigin, std::move(options)),
         ElementsAre(
             net::MatchesCookieNameValue("cookie-name", "cookie-value")));
+    WaitForCallback();
   }
   {
     // Should still be blocked when third-party cookie blocking is enabled.
@@ -923,6 +949,8 @@
                                     kDefaultOrigin, std::move(options)),
         IsEmpty());
 
+    WaitForCallback();
+
     // This checks that the cookie access is not double-reported due the
     // warning reason and EXCLUDE_USER_PREFERENCES.
     std::vector<net::CookieInclusionStatus::WarningReason> expected_warnings = {
@@ -930,6 +958,7 @@
         net::CookieInclusionStatus::
             WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS,
     };
+
     EXPECT_THAT(
         recorded_activity(),
         ElementsAre(
@@ -964,6 +993,8 @@
                                     kDefaultOrigin, std::move(options)),
         IsEmpty());
 
+    WaitForCallback();
+
     EXPECT_THAT(
         recorded_activity(),
         ElementsAre(
@@ -1095,6 +1126,8 @@
         *cookie, kDefaultUrl, net::SiteForCookies(), kDefaultOrigin));
   }
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(MatchesCookieOp(
@@ -1119,6 +1152,8 @@
         *cookie, kDefaultUrl, net::SiteForCookies(), kDefaultOrigin));
   }
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(
@@ -1142,6 +1177,8 @@
                                   kDefaultOrigin, std::move(options)),
       ElementsAre(net::MatchesCookieNameValue("A", "B")));
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(
@@ -1180,6 +1217,8 @@
   sync_service_->SetCookieFromString(kDefaultUrlWithPath, net::SiteForCookies(),
                                      kDefaultOrigin, "name=value;SameParty");
 
+  WaitForCallback();
+
   EXPECT_THAT(
       recorded_activity(),
       ElementsAre(MatchesCookieOp(
diff --git a/services/network/sct_auditing/sct_auditing_cache.h b/services/network/sct_auditing/sct_auditing_cache.h
index c5c3bc6..3c2d1fa7 100644
--- a/services/network/sct_auditing/sct_auditing_cache.h
+++ b/services/network/sct_auditing/sct_auditing_cache.h
@@ -75,6 +75,9 @@
   void set_enabled(bool enabled);
   void set_sampling_rate(double rate) { sampling_rate_ = rate; }
   void set_report_uri(const GURL& report_uri) { report_uri_ = report_uri; }
+  void set_popular_scts(std::vector<std::vector<uint8_t>> popular_scts) {
+    popular_scts_ = std::move(popular_scts);
+  }
   void set_traffic_annotation(
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
     traffic_annotation_ = traffic_annotation;
@@ -99,6 +102,10 @@
   // Tracks high-water-mark of `dedupe_cache_.size()`.
   size_t dedupe_cache_size_hwm_ = 0;
 
+  // A list of hashes for popular SCTs that should not be scheduled for auditing
+  // as an optimization for hashdance clients.
+  std::vector<std::vector<uint8_t>> popular_scts_;
+
   bool enabled_ = false;
   double sampling_rate_ = 0;
   GURL report_uri_;
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 65bdb6e..1407277 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -5017,7 +5017,8 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb"
+          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb",
+          "--gtest_filter=-org.chromium.android_webview.test.devui.HomeFragmentTest.testLongPressCopy*"
         ],
         "merge": {
           "args": [
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 9120b574..f0962df 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -11765,6 +11765,8 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter",
           "--timeout-scale=2.0"
         ],
+        "ci_only": true,
+        "experiment_percentage": 100,
         "merge": {
           "args": [
             "--bucket",
@@ -14539,6 +14541,76 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
+            "system_webview_shell_layout_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "device_os": null,
+              "device_type": null,
+              "machine_type": "n1-standard-4|e2-standard-4",
+              "os": "Ubuntu-16.04|Ubuntu-18.04",
+              "pool": "chromium.tests.avd"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android30",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_30_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "avd_generic_android30"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "system_webview_shell_layout_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
+      },
+      {
+        "args": [
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android30.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
             "ui_android_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -15028,7 +15100,6 @@
           "--avd-config=../../tools/android/avd/proto/generic_android30.textpb",
           "--gtest_filter=-org.chromium.weblayer.test.MediaCaptureTest.*"
         ],
-        "experiment_percentage": 100,
         "merge": {
           "args": [
             "--bucket",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index a68892bf..a62a331 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -1551,7 +1551,7 @@
   "linux-ash-chromium-generator-rel": {
     "additional_compile_targets": [
       "chromiumos_preflight",
-      "gen_linux_ash_chromium_cipd_yaml"
+      "test_ash_chrome_cipd_yaml"
     ]
   },
   "linux-cfm-rel": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index b17bbf0..6fded01d 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -90991,7 +90991,7 @@
           ],
           "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
+          "shards": 12
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index ab20cfc..aed0956 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -3761,7 +3761,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 40
+          "shards": 50
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/filters/fuchsia.unit_tests.filter b/testing/buildbot/filters/fuchsia.unit_tests.filter
index 5ee145e9..673ba21 100644
--- a/testing/buildbot/filters/fuchsia.unit_tests.filter
+++ b/testing/buildbot/filters/fuchsia.unit_tests.filter
@@ -1,77 +1,43 @@
 -All/PasswordManagerPorterStoreTest.Import/2
--Application*
--BoxChunkedUploaderTest.FailedToUploadPartThen*
--BoxChunkedUploaderTest.Has*
--BoxChunkedUploaderTest.Successful*
--BrowserCommandsTest.TabSearch*
--CastMediaNotificationItemTest.Media*
--ChromeContentVerifierTest.Case*
 -DevToolsFileWatcher*
 -DiagnosticsController*
 -DiagnosticsModelTest.Run*
--DialServiceImplTest.TestMultipleNetworkInterfaces
--DialServiceImplTest.TestSendMultipleRequests
--DiceWebSigninInterceptorForcedSeparationTest.ShouldEnforceEnterpriseProfileSeparationReauth
--DiceWebSigninInterceptorTest.DeclineCreation*
--DiceWebSigninInterceptorTest.ShouldShowEnterpriseBubble
+-DialServiceImplTest.TestMultiple*
+-DialServiceImplTest.TestSend*
 -EnterpriseHardwarePlatformAPITest.GetHardwarePlatformInfoAllowed
 -ExtensionInstalledBubbleModelTest.Extension*
--ExtensionMessageBubbleTest.Dev*
--ExtensionMessageBubbleTest.TestUninstall*
 -ExtensionServiceTest.InstallTheme
--ExtensionServiceTest.PackPunctuated*
 -ExtensionUserScriptLoaderTest.Component*
--ExtensionsMenuViewUnitTest.Context*
--FeaturePromoControllerViewsTest.CriticalPromoPreempts*
--FeaturePromoControllerViewsTest.PromoEndsWhen*
 -FileAnalysisRequestTest.Invalid*
--FileAnalysisRequestTest.Large*
 -LayoutProviderTest.Legacy*
--LocalCardMigrationBubbleControllerImplTest.FirstShow_BubbleNot*
--LocalCardMigrationBubbleControllerImplTest.Metrics_First*
--MediaStreamFocusDelegateTest.Set*
--NewBadgeLabelTest.Set*
--OfferNotificationBubbleControllerImplTest.Offer*
 -PermissionMessageCombinationsUnittest.USBSerial*
 -ProfilesState/IsGuestModeRequestedTest.Requested/0
 -ProfilesState/IsGuestModeRequestedTest.Requested/2
 -ProfilesState/IsGuestModeRequestedTest.Requested/4
 -RelaunchNotificationControllerPlatformImplTest.Synchronous*
 -ReportGenerator*
--SaveCardBubbleControllerImplTestWithoutStatusChip.Local*
--SaveCardBubbleLoggingTest.Metrics_CancelButton/0
--SaveCardBubbleLoggingTest.Metrics_CancelButton/10
--SaveCardBubbleLoggingTest.Metrics_Closed/0
--SaveCardBubbleLoggingTest.Metrics_Closed/10
--SaveCardBubbleLoggingTest.Metrics_LostFocus/0
--SaveCardBubbleLoggingTest.Metrics_SaveButton/1
--SaveCardBubbleLoggingTest.Metrics_SecurityLevel/10
--SaveUpdateAddressProfileBubbleControllerImplTest.Web*
--SiteEngagementServiceTest.Check*
--TabSearchPageHandlerTest.Open*
--TabSearchPageHandlerTest.TabsAnd*
 -TaskGroupTest.Shared*
 -TestAccountsUtilTest.GetAccountForPlatform*
--TestReadLaterPageHandlerTest.OpenURLOn*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_BG_S*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_ICON_*
--ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_T*
--ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_URL
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_TEXT_DIMMED
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_TEXT_S*
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_RESULTS_U*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_SECURITY_CHIP_DE*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_SECURITY_CHIP_S*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_OMNIBOX_TEXT_*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kDarkHighContrast_With_COLOR_TOOLBAR
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kDark_With_COLOR_B*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_BUBBLE_OUTLINE_*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_BG_S*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_ICON_*
--ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_T*
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_TEXT_DIMMED
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_TEXT_S*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_RESULTS_U*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_S*
 -ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_OMNIBOX_TEXT_*
--ThirdPartyMetricsObserverTest.NoThird*
--ThreadWatcherTestWith*
--TipMarqueeViewTest.ClickWhenForcedCollapsedCalls*
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_TAB_FOREGROUND_ACTIVE_FRAME_A*
+-ThemeProviderRedirectedEquivalenceTest.GetColor/kLightHighContrast_With_COLOR_TOOLBAR_T*
 -ToolbarActionViewUnitTest.Basic*
 -UDPSocketUnitTest.TestUDPMulticastJoin*
 -UDPSocketUnitTest.TestUDPMulticastRecv
--WebRtcRtpDumpWriterTest.WriteOver*
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 695531b..89f7f07 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -901,8 +901,8 @@
     "label": "//chrome/credential_provider/test:gcp_unittests",
     "type": "console_test_launcher",
   },
-  "gen_linux_ash_chromium_cipd_yaml": {
-    "label": "//chrome/test:gen_linux_ash_chromium_cipd_yaml",
+  "test_ash_chrome_cipd_yaml": {
+    "label": "//chrome/test:test_ash_chrome_cipd_yaml",
     "type": "additional_compile_target",
   },
   "gfx_unittests": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index b50ab1c..4689c54 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -545,14 +545,14 @@
     'modifications': {
       'CrWinAsan': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 40,
         },
       },
       'CrWinAsan(dll)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 40,
         },
@@ -564,7 +564,7 @@
       },
       'Linux ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 40,
           'quickrun_shards': 80
@@ -577,9 +577,9 @@
       },
       'Linux Chromium OS ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
-          'shards': 40,
+          'shards': 50,
         },
       },
       'Linux ChromiumOS MSan Tests': {
@@ -771,6 +771,11 @@
           '--coverage-continuous-mode=1',
         ],
       },
+      'mac-osxbeta-rel': {
+        'swarming': {
+          'shards': 12,
+        },
+      },
       'mac11-arm64-rel-tests': {
         'ci_only': False,  # https://crbug.com/1234525
         'args': [
@@ -783,7 +788,7 @@
       },
       'win-asan': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 40,
         },
@@ -926,6 +931,10 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter',
           '--timeout-scale=2.0',
         ],
+        # TODO(https://crbug.com/1285975) Remove experiment and enable on
+        # trybot once the device offline issue is resolved.
+        'ci_only': True,
+        'experiment_percentage': 100,
       },
       'android-12-x64-fyi-rel': {
         'args': [
@@ -1133,14 +1142,14 @@
     'modifications': {
       'Linux ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 5,
         },
       },
       'Linux Chromium OS ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 5,
         },
@@ -1452,7 +1461,7 @@
     'modifications': {
       'Linux ASan LSan Tests (1)': {
         # These are slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 2,
         },
@@ -1893,7 +1902,7 @@
         },
       },
       'Linux ASan LSan Tests (1)': {
-        # These are slow on the ASan trybot for some reason, crbug.com/794372
+        # These are slow on the ASan trybot for some reason, crbug.com/1257927
         'swarming': {
           'shards': 6,
           'quickrun_shards': 12,
@@ -1907,7 +1916,7 @@
         },
       },
       'Linux TSan Tests': {
-        # These are slow on the TSan bots for some reason, crbug.com/794372
+        # These are slow on the TSan bots for some reason, crbug.com/1257927
         'swarming': {
           'shards': 32, # Adjusted for testing, see https://crbug.com/1179567
         },
@@ -1930,7 +1939,7 @@
         'experiment_percentage': 100,
       },
       'ToTLinuxTSan': {
-        # These are slow on the TSan bots for some reason, crbug.com/794372
+        # These are slow on the TSan bots for some reason, crbug.com/1257927
         'swarming': {
           'shards': 6,
         },
@@ -2277,27 +2286,27 @@
   'net_unittests': {
     'modifications': {
       'CrWinAsan': {
-        # TODO(crbug.com/794372): net_unittests is slow under ASan.
+        # TODO(crbug.com/1257927): net_unittests is slow under ASan.
         'swarming': {
           'shards': 16,
         },
       },
       'CrWinAsan(dll)': {
-        # TODO(crbug.com/794372): net_unittests is slow under ASan.
+        # TODO(crbug.com/1257927): net_unittests is slow under ASan.
         'swarming': {
           'shards': 16,
         },
       },
       'Linux ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 16,
         },
       },
       'Linux Chromium OS ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 8,
         }
@@ -2321,7 +2330,7 @@
         },
       },
       'ToTLinuxASan': {
-        # TODO(crbug.com/794372): net_unittests is slow under ASan.
+        # TODO(crbug.com/1257927): net_unittests is slow under ASan.
         'swarming': {
           'shards': 16,
         },
@@ -2405,7 +2414,7 @@
         'experiment_percentage': 0,
       },
       'win-asan': {
-        # TODO(crbug.com/794372): net_unittests is slow under ASan.
+        # TODO(crbug.com/1257927): net_unittests is slow under ASan.
         'swarming': {
           'shards': 16,
         },
@@ -2936,11 +2945,6 @@
       },
     },
   },
-  'system_webview_shell_layout_test_apk': {
-    'remove_from': [
-      'android-11-x86-rel', # crbug.com/1165280
-    ],
-  },
   'system_webview_wpt': {
     'modifications': {
       'android-webview-pie-x86-wpt-fyi-rel': {
@@ -3116,14 +3120,14 @@
     'modifications': {
       'Linux ASan LSan Tests (1)': {
         # These are slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 4,
         },
       },
       'Linux Chromium OS ASan LSan Tests (1)': {
         # These are slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 2,
         },
@@ -3499,7 +3503,7 @@
     'modifications': {
       'Linux ASan LSan Tests (1)': {
         # These are very slow on the ASAN trybot for some reason.
-        # crbug.com/794372
+        # crbug.com/1257927
         'swarming': {
           'shards': 5,
         },
@@ -3606,8 +3610,6 @@
         'args': [
           '--gtest_filter=-org.chromium.weblayer.test.MediaCaptureTest.*',
         ],
-        # TODO(crbug.com/1137474): Remove after the test suite is green.
-        'experiment_percentage': 100,
       },
     },
   },
@@ -3697,6 +3699,12 @@
           '--gtest_filter=-org.chromium.net.NetworkChangeNotifierTest.testNetworkChangeNotifierJavaObservers',
         ],
       },
+      'android-12-x64-fyi-rel': {
+        'args': [
+          # crbug.com/1292197
+          '--gtest_filter=-org.chromium.android_webview.test.devui.HomeFragmentTest.testLongPressCopy*',
+        ],
+      },
       'android-marshmallow-x86-rel': {
         'swarming': {
           'shards': 9,
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 3e346f3..822d34eb 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1545,7 +1545,7 @@
       'linux-ash-chromium-generator-rel': {
         'additional_compile_targets': [
           'chromiumos_preflight',
-          'gen_linux_ash_chromium_cipd_yaml',
+          'test_ash_chrome_cipd_yaml',
         ],
       },
       'linux-cfm-rel': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 2890b9a..67f0576b 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1,21 +1,4 @@
 {
-    "AccountPoliciesLoadedWithoutSync": [
-        {
-            "platforms": [
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "AccountPoliciesLoadedWithoutSync",
-                    "enable_features": [
-                        "AccountPoliciesLoadedWithoutSync"
-                    ]
-                }
-            ]
-        }
-    ],
     "AccuracyTips": [
         {
             "platforms": [
@@ -280,12 +263,37 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_2022-01-18",
+                    "name": "Enabled_10000_2022-01-18",
                     "params": {
                         "save_card_message_use_followup_button_text": "false",
                         "save_card_message_use_gpay_icon": "true"
                     },
                     "enable_features": [
+                        "MessagesForAndroidInfrastructure",
+                        "MessagesForAndroidSaveCard"
+                    ]
+                },
+                {
+                    "name": "Enabled_15000_2022-01-18",
+                    "params": {
+                        "autodismiss_duration_ms_SaveCard": "15000",
+                        "save_card_message_use_followup_button_text": "false",
+                        "save_card_message_use_gpay_icon": "true"
+                    },
+                    "enable_features": [
+                        "MessagesForAndroidInfrastructure",
+                        "MessagesForAndroidSaveCard"
+                    ]
+                },
+                {
+                    "name": "Enabled_20000_2022-01-18",
+                    "params": {
+                        "autodismiss_duration_ms_SaveCard": "20000",
+                        "save_card_message_use_followup_button_text": "false",
+                        "save_card_message_use_gpay_icon": "true"
+                    },
+                    "enable_features": [
+                        "MessagesForAndroidInfrastructure",
                         "MessagesForAndroidSaveCard"
                     ]
                 }
@@ -451,21 +459,6 @@
             ]
         }
     ],
-    "ArcUseDalvikMemoryProfile": [
-        {
-            "platforms": [
-                "chromeos"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ArcUseDalvikMemoryProfile"
-                    ]
-                }
-            ]
-        }
-    ],
     "ArcVmBlockSize": [
         {
             "platforms": [
@@ -481,6 +474,21 @@
             ]
         }
     ],
+    "ArcVmDalvikMemoryProfile": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ArcUseDalvikMemoryProfile"
+                    ]
+                }
+            ]
+        }
+    ],
     "ArcVmMemorySize": [
         {
             "platforms": [
@@ -1106,6 +1114,25 @@
             ]
         }
     ],
+    "BackForwardCacheAppBanner": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "BackForwardCacheAppBanner"
+                    ]
+                }
+            ]
+        }
+    ],
     "BackForwardCacheMemoryControls": [
         {
             "platforms": [
@@ -1744,6 +1771,7 @@
                         "EarlyCodeCache",
                         "FontManagerEarlyInit",
                         "NavigationThreadingOptimizations",
+                        "OptimizeLookalikeUrlNavigationThrottle",
                         "URLLoaderSyncClient"
                     ]
                 }
@@ -1765,6 +1793,7 @@
                     "enable_features": [
                         "EarlyCodeCache",
                         "NavigationThreadingOptimizations",
+                        "OptimizeLookalikeUrlNavigationThrottle",
                         "URLLoaderSyncClient"
                     ]
                 }
@@ -2460,26 +2489,6 @@
             ]
         }
     ],
-    "DisableHttpDiskCache": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "DisableHttpDiskCache"
-                    ]
-                }
-            ]
-        }
-    ],
     "DiscardableMemoryExperiments": [
         {
             "platforms": [
@@ -3748,23 +3757,6 @@
             ]
         }
     ],
-    "ManagedSigninPopup": [
-        {
-            "platforms": [
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SyncConfirmationUpdatedText"
-                    ]
-                }
-            ]
-        }
-    ],
     "MediaFoundationD3D11VideoCapture": [
         {
             "platforms": [
@@ -4216,26 +4208,6 @@
             ]
         }
     ],
-    "OptimizeLookalikeUrlNavigationThrottle": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20211116",
-                    "enable_features": [
-                        "OptimizeLookalikeUrlNavigationThrottle"
-                    ]
-                }
-            ]
-        }
-    ],
     "OptimizeUpdateLoadInfo": [
         {
             "platforms": [
@@ -6169,6 +6141,44 @@
             ]
         }
     ],
+    "UiCompositorReleaseTileResourcesForHiddenLayers": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "UiCompositorReleaseTileResourcesForHiddenLayers"
+                    ]
+                }
+            ]
+        }
+    ],
+    "UiCompositorRequiredTilesOnly": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "UiCompositorRequiredTilesOnly"
+                    ]
+                }
+            ]
+        }
+    ],
     "UnifiedAutoplay": [
         {
             "platforms": [
diff --git a/third_party/android_deps/README.md b/third_party/android_deps/README.md
index b239e20b..cc892885 100644
--- a/third_party/android_deps/README.md
+++ b/third_party/android_deps/README.md
@@ -28,9 +28,22 @@
 1. Update `build.gradle` with the new dependency or the new versions.
 
 2. Run `fetch_all.py` to update your current workspace with the changes. This
-   will update, among other things, your top-level DEPS file.
+   will update, among other things, your top-level DEPS file. If this is a new
+   library, you can skip directly to step 5 since the next step is not going to
+   work for you.
 
-3. `git add` all the 3pp related changes and create a CL for review. Keep the
+3. Run `gclient sync` to make sure that cipd has access to the versions you are
+   trying to roll. This might fail with a cipd error failing to resolve a tag.
+
+4. If the previous step works, upload your cl and you are done, if not continue
+   with the steps.
+
+5. Add a `overrideLatest` property override to your package in
+   `ChromiumDepGraph.groovy` in the `PROPERTY_OVERRIDES` map, set it to `true`.
+
+6. Run `fetch_all.py` again.
+
+7. `git add` all the 3pp related changes and create a CL for review. Keep the
    `3pp/`, `.gradle`, `OWNERS`, `.groovy` changes in the CL and revert the other
    files. The other files should be committed in a follow up CL. Example git commands:
    * `git add third_party/android_deps{*.gradle,*.groovy,*3pp*,*OWNERS,*README.md}`
@@ -38,20 +51,24 @@
    * `git restore third_party/android_deps DEPS`
    * `git clean -id`
 
-4. Land the first CL in step 3 and wait for the corresponding 3pp packager to
-   create the new CIPD packages. The 3pp packager runs every 6 hours. You can
-   see the latest runs [here][3pp_bot]. See
+8. Land the first CL in the previous step and wait for the corresponding 3pp
+   packager to create the new CIPD packages. The 3pp packager runs every 6
+   hours.  You can see the latest runs [here][3pp_bot]. See
    [`//docs/cipd_and_3pp.md`][cipd_and_3pp_doc] for how it works. Anyone on the
    Clank build core team and any trooper can trigger the bot on demand for you.
 
-5. If your follow up CL takes more than a day please revert the original CL.
+9. If your follow up CL takes more than a day please revert the original CL.
    Once the bot uploads to cipd there is no need to keep the modified 3pp files.
    The bot runs 4 times a day. When you are ready to land the follow up CL, you
    can land everything together since the cipd packages have already been
    uploaded.
 
-6. Run `fetch_all.py` again. There should not be any 3pp related changes. Create
-   a commit.
+10. Remove your `overrideLatest` property override entry in
+    `ChromiumDepGraph.groovy` so that the 3pp bot goes back to downloading and
+    storing the latest versions of your package so that it is available when you
+    next try to roll.
+
+11. Run `fetch_all.py` again. Create a CL with the changes and land it.
 
    If the CL is doing more than upgrading existing packages or adding packages
    from the same source and license (e.g. gms) follow
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template b/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
index 3f26813..efd0c4a0 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
+++ b/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
@@ -8,28 +8,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = '${dependency.fileUrl}'
-_FILE_NAME = '${dependency.fileName}'
-_FILE_VERSION = '${dependency.version}'
+_REPO_URL = '${dependency.repoUrl}'
+_GROUP_NAME = '${dependency.group.replace('.', '/')}'
+_MODULE_NAME = '${dependency.name}'
+_FILE_EXT = '${dependency.extension}'
+_OVERRIDE_LATEST = <%= dependency.overrideLatest ? "'${dependency.version}'" : "None" %>
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
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 7659fc1..e97f61c 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
@@ -127,7 +127,8 @@
             description: 'Only contains necessary framework & Xerces2 classes',
             url: 'http://nekohtml.sourceforge.net/index.html',
             licenseUrl: 'https://www.apache.org/licenses/LICENSE-2.0.txt',
-            licenseName: 'Apache 2.0'),
+            licenseName: 'Apache 2.0',
+            overrideLatest: true),
         org_apache_ant_ant: new PropertyOverride(
             url: 'https://ant.apache.org/',
             licenseUrl: 'https://www.apache.org/licenses/LICENSE-2.0.txt',
@@ -434,12 +435,21 @@
 
         PROPERTY_OVERRIDES.each { id, fallbackProperties ->
             DependencyDescription dep = dependencies.get(id)
-            if (!dep) {
+            if (dep) {
+                // Null-check is required since isShipped is a boolean. This
+                // check must come after all the deps are resolved instead of in
+                // customizeDep, since otherwise it gets overwritten.
+                if (fallbackProperties?.isShipped != null) {
+                    dep.isShipped = fallbackProperties.isShipped
+                }
+                // if overrideLatest is truey, set it recursively on the dep and
+                // all its children. This makes it easier to manage since you do
+                // not have to set it on a whole set of old deps.
+                if (fallbackProperties?.overrideLatest) {
+                    recursivelyOverrideLatestVersion(dep)
+                }
+            } else {
                 logger.warn('PROPERTY_OVERRIDES has stale dep: ' + id)
-            // Null-check is required since isShipped is a boolean. This check must come after all the deps are
-            // resolved instead of in customizeDep, since otherwise it gets overwritten.
-            } else if (fallbackProperties?.isShipped != null) {
-                dep.isShipped = fallbackProperties.isShipped
             }
         }
     }
@@ -448,6 +458,14 @@
         return input.replaceAll('[:.-]', '_')
     }
 
+    private void recursivelyOverrideLatestVersion(DependencyDescription dep) {
+        dep.overrideLatest = true
+        dep.children.each { childID ->
+            DependencyDescription child = dependencies.get(childID)
+            recursivelyOverrideLatestVersion(child)
+        }
+    }
+
     private void collectDependenciesInternal(ResolvedDependency dependency, boolean recurse = true) {
         String id = makeModuleId(dependency.module)
         if (dependencies.containsKey(id)) {
@@ -521,9 +539,9 @@
 
     private DependencyDescription buildDepDescription(
             String id, ResolvedDependency dependency, ResolvedArtifact artifact, List<String> childModules) {
-        String pomUrl
+        String pomUrl, repoUrl
         GPathResult pomContent
-        (pomUrl, pomContent) = computePomFromArtifact(artifact)
+        (repoUrl, pomUrl, pomContent) = computePomFromArtifact(artifact)
 
         List<LicenseSpec> licenses = []
         if (!skipLicenses) {
@@ -552,6 +570,7 @@
                 directoryName: id.toLowerCase(),
                 fileName: artifact.file.name,
                 fileUrl: fileUrl,
+                repoUrl: repoUrl,
                 description: description,
                 url: pomContent.url?.text(),
                 displayName: displayName,
@@ -701,7 +720,7 @@
                 GPathResult content = new XmlSlurper(
                         false /* validating */, false /* namespaceAware */).parse(fileUrl)
                 logger.debug("Succeeded in resolving url $fileUrl")
-                return [fileUrl, content]
+                return [repoUrl, fileUrl, content]
             } catch (any) {
                 logger.debug("Failed in resolving url $fileUrl")
             }
@@ -730,6 +749,10 @@
         String group, name, version, extension, displayName, description, url
         List<LicenseSpec> licenses
         String fileName, fileUrl
+        // |repoUrl| is the url to the repo that hosts this dep's artifact
+        // (|fileUrl|). Basically |fileurl|.startswith(|repoUrl|). |url| is the
+        // project homepage as supplied by the developer.
+        String repoUrl
         // The local directory name to store the files like artifact, license file, 3pp subdirectory, and etc. Must be
         // lowercase since 3pp uses the directory name as part of the CIPD names. However CIPD does not allow uppercase
         // in names.
@@ -740,6 +763,10 @@
         ComponentIdentifier componentId
         List<String> children
         String cipdSuffix
+        // When set overrides the version downloaded by the 3pp fetch script to
+        // be, instead of the latest available, the resolved version by gradle
+        // in this run.
+        Boolean overrideLatest
 
     }
 
@@ -760,6 +787,9 @@
         Boolean exclude
         // Set to false to skip creation of BUILD.gn target.
         Boolean generateTarget
+        // Set to override the 3pp fetch script returing the latest version and
+        // instead forcibly return the version required by gradle.
+        Boolean overrideLatest
 
     }
 
diff --git a/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py b/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
index 87ab93f2..e35815e 100755
--- a/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/core/common/1.1.1/common-1.1.1.jar'
-_FILE_NAME = 'common-1.1.1.jar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/core'
+_MODULE_NAME = 'common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py b/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
index e075902..e7fce04 100755
--- a/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar'
-_FILE_NAME = 'runtime-1.1.1.aar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/core'
+_MODULE_NAME = 'runtime'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
index 89276bc..cb88e802 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common/1.1.1/common-1.1.1.jar'
-_FILE_NAME = 'common-1.1.1.jar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
index 752ecd5..8648ef03 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common-java8/1.1.1/common-java8-1.1.1.jar'
-_FILE_NAME = 'common-java8-1.1.1.jar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'common-java8'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
index 976c8f7..1529e2f 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata/1.1.1/livedata-1.1.1.aar'
-_FILE_NAME = 'livedata-1.1.1.aar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'livedata'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
index 3f8df0d4..66cee6dc 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata-core/1.1.1/livedata-core-1.1.1.aar'
-_FILE_NAME = 'livedata-core-1.1.1.aar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'livedata-core'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
index bfa73d6..a9a90dbbd 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/runtime/1.1.1/runtime-1.1.1.aar'
-_FILE_NAME = 'runtime-1.1.1.aar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'runtime'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
index bb1069ec..989e53b3 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/android/arch/lifecycle/viewmodel/1.1.1/viewmodel-1.1.1.aar'
-_FILE_NAME = 'viewmodel-1.1.1.aar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'android/arch/lifecycle'
+_MODULE_NAME = 'viewmodel'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent/3pp/fetch.py b/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent/3pp/fetch.py
index 4a81df8..e0cc93c 100755
--- a/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent/3pp/fetch.py
+++ b/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1.jar'
-_FILE_NAME = 'backport-util-concurrent-3.1.jar'
-_FILE_VERSION = '3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'backport-util-concurrent'
+_MODULE_NAME = 'backport-util-concurrent'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/classworlds_classworlds/3pp/fetch.py b/third_party/android_deps/libs/classworlds_classworlds/3pp/fetch.py
index 98da29e9..860ed49 100755
--- a/third_party/android_deps/libs/classworlds_classworlds/3pp/fetch.py
+++ b/third_party/android_deps/libs/classworlds_classworlds/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar'
-_FILE_NAME = 'classworlds-1.1-alpha-2.jar'
-_FILE_VERSION = '1.1-alpha-2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'classworlds'
+_MODULE_NAME = 'classworlds'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
index 3b17866..655289d 100755
--- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/animated-vector-drawable/28.0.0/animated-vector-drawable-28.0.0.aar'
-_FILE_NAME = 'animated-vector-drawable-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'animated-vector-drawable'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
index 477554b..75d4f7a 100755
--- a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/28.0.0/appcompat-v7-28.0.0.aar'
-_FILE_NAME = 'appcompat-v7-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'appcompat-v7'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
index 43aff28..f1c085e2 100755
--- a/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/asynclayoutinflater/28.0.0/asynclayoutinflater-28.0.0.aar'
-_FILE_NAME = 'asynclayoutinflater-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'asynclayoutinflater'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
index 4cd4d79..05f6066f 100755
--- a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/cardview-v7/28.0.0/cardview-v7-28.0.0.aar'
-_FILE_NAME = 'cardview-v7-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'cardview-v7'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
index e6e1334..7be80c6 100755
--- a/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/collections/28.0.0/collections-28.0.0.jar'
-_FILE_NAME = 'collections-28.0.0.jar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'collections'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
index f307459e..bde9d53 100755
--- a/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/coordinatorlayout/28.0.0/coordinatorlayout-28.0.0.aar'
-_FILE_NAME = 'coordinatorlayout-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'coordinatorlayout'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
index a802541..a09ed5d 100755
--- a/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/cursoradapter/28.0.0/cursoradapter-28.0.0.aar'
-_FILE_NAME = 'cursoradapter-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'cursoradapter'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
index 82a3be8..0bdece67 100755
--- a/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/customview/28.0.0/customview-28.0.0.aar'
-_FILE_NAME = 'customview-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'customview'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
index 7265a70..b5981ef 100755
--- a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/design/28.0.0/design-28.0.0.aar'
-_FILE_NAME = 'design-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'design'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
index 9ee3cfe..38330ec 100755
--- a/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/documentfile/28.0.0/documentfile-28.0.0.aar'
-_FILE_NAME = 'documentfile-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'documentfile'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
index 84cc57b9..f075200c 100755
--- a/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/drawerlayout/28.0.0/drawerlayout-28.0.0.aar'
-_FILE_NAME = 'drawerlayout-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'drawerlayout'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
index 6d781c6..db3e4d1 100755
--- a/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/interpolator/28.0.0/interpolator-28.0.0.aar'
-_FILE_NAME = 'interpolator-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'interpolator'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
index 76101ac..c579c31 100755
--- a/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/loader/28.0.0/loader-28.0.0.aar'
-_FILE_NAME = 'loader-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'loader'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
index 70a5d0e0..b7b28a85 100755
--- a/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/localbroadcastmanager/28.0.0/localbroadcastmanager-28.0.0.aar'
-_FILE_NAME = 'localbroadcastmanager-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'localbroadcastmanager'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
index e1138463..1372028c 100755
--- a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/multidex/1.0.0/multidex-1.0.0.aar'
-_FILE_NAME = 'multidex-1.0.0.aar'
-_FILE_VERSION = '1.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'multidex'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
index 8b300da..38449556 100755
--- a/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/print/28.0.0/print-28.0.0.aar'
-_FILE_NAME = 'print-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'print'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
index 070cb18..3ff9bbba 100755
--- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/recyclerview-v7/28.0.0/recyclerview-v7-28.0.0.aar'
-_FILE_NAME = 'recyclerview-v7-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'recyclerview-v7'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
index f5d0685..f363d0d 100755
--- a/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/slidingpanelayout/28.0.0/slidingpanelayout-28.0.0.aar'
-_FILE_NAME = 'slidingpanelayout-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'slidingpanelayout'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
index fc4089a..b9e80d1 100755
--- a/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar'
-_FILE_NAME = 'support-annotations-28.0.0.jar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
index 29f0564..a79c4fde 100755
--- a/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-compat/28.0.0/support-compat-28.0.0.aar'
-_FILE_NAME = 'support-compat-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-compat'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
index b02072d8..7c197b3f 100755
--- a/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui/28.0.0/support-core-ui-28.0.0.aar'
-_FILE_NAME = 'support-core-ui-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-core-ui'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
index b4ced96..1a98e99 100755
--- a/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-core-utils/28.0.0/support-core-utils-28.0.0.aar'
-_FILE_NAME = 'support-core-utils-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-core-utils'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
index a7d6a44..1e60b20cf 100755
--- a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-fragment/28.0.0/support-fragment-28.0.0.aar'
-_FILE_NAME = 'support-fragment-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-fragment'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
index a63e05f..6413a5d 100755
--- a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-media-compat/28.0.0/support-media-compat-28.0.0.aar'
-_FILE_NAME = 'support-media-compat-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-media-compat'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
index f1087e2..2204d66 100755
--- a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-v4/28.0.0/support-v4-28.0.0.aar'
-_FILE_NAME = 'support-v4-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-v4'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
index 89b7879..7565a17 100755
--- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/support-vector-drawable/28.0.0/support-vector-drawable-28.0.0.aar'
-_FILE_NAME = 'support-vector-drawable-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'support-vector-drawable'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
index 2d16658..726a73b6 100755
--- a/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/swiperefreshlayout/28.0.0/swiperefreshlayout-28.0.0.aar'
-_FILE_NAME = 'swiperefreshlayout-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'swiperefreshlayout'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
index 9896353..c8c779a 100755
--- a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/transition/28.0.0/transition-28.0.0.aar'
-_FILE_NAME = 'transition-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'transition'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
index 0c56c0b2..bedd381 100755
--- a/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/versionedparcelable/28.0.0/versionedparcelable-28.0.0.aar'
-_FILE_NAME = 'versionedparcelable-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'versionedparcelable'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
index 26f86f1..3a5bda12 100755
--- a/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/support/viewpager/28.0.0/viewpager-28.0.0.aar'
-_FILE_NAME = 'viewpager-28.0.0.aar'
-_FILE_VERSION = '28.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/support'
+_MODULE_NAME = 'viewpager'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
index 28e4f50..597a9574 100755
--- a/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/common/30.2.0-beta01/common-30.2.0-beta01.jar'
-_FILE_NAME = 'common-30.2.0-beta01.jar'
-_FILE_VERSION = '30.2.0-beta01'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/tools'
+_MODULE_NAME = 'common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
index 20341e72..d29b146 100755
--- a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/desugar_jdk_libs/1.1.1/desugar_jdk_libs-1.1.1.jar'
-_FILE_NAME = 'desugar_jdk_libs-1.1.1.jar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/tools'
+_MODULE_NAME = 'desugar_jdk_libs'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
index dd7f6f4b..57f8dc2a5 100755
--- a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/desugar_jdk_libs_configuration/1.1.1/desugar_jdk_libs_configuration-1.1.1.jar'
-_FILE_NAME = 'desugar_jdk_libs_configuration-1.1.1.jar'
-_FILE_VERSION = '1.1.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/tools'
+_MODULE_NAME = 'desugar_jdk_libs_configuration'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
index 423d22d..e9d635a 100755
--- a/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutlib-api/30.2.0-beta01/layoutlib-api-30.2.0-beta01.jar'
-_FILE_NAME = 'layoutlib-api-30.2.0-beta01.jar'
-_FILE_VERSION = '30.2.0-beta01'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/tools/layoutlib'
+_MODULE_NAME = 'layoutlib-api'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
index eb75821..8b066bb 100755
--- a/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/30.2.0-beta01/sdk-common-30.2.0-beta01.jar'
-_FILE_NAME = 'sdk-common-30.2.0-beta01.jar'
-_FILE_VERSION = '30.2.0-beta01'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/android/tools'
+_MODULE_NAME = 'sdk-common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py b/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
index d9446b4..b09e9b7a 100755
--- a/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.8/caffeine-2.8.8.jar'
-_FILE_NAME = 'caffeine-2.8.8.jar'
-_FILE_VERSION = '2.8.8'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/github/ben-manes/caffeine'
+_MODULE_NAME = 'caffeine'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py b/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
index f8f1a1c..a57341d47 100755
--- a/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/github/kevinstern/software-and-algorithms/1.0/software-and-algorithms-1.0.jar'
-_FILE_NAME = 'software-and-algorithms-1.0.jar'
-_FILE_VERSION = '1.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/github/kevinstern'
+_MODULE_NAME = 'software-and-algorithms'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
index e7f88cec..34b91b9 100755
--- a/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-api/2.2.1/transport-api-2.2.1.aar'
-_FILE_NAME = 'transport-api-2.2.1.aar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/datatransport'
+_MODULE_NAME = 'transport-api'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
index 471fa9ac..ba2999d 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-auth/17.0.0/play-services-auth-17.0.0.aar'
-_FILE_NAME = 'play-services-auth-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-auth'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
index 45eaca68..70cc982 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-auth-api-phone/17.5.0/play-services-auth-api-phone-17.5.0.aar'
-_FILE_NAME = 'play-services-auth-api-phone-17.5.0.aar'
-_FILE_VERSION = '17.5.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-auth-api-phone'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
index dc3c346..b7aacb7 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-auth-base/17.0.0/play-services-auth-base-17.0.0.aar'
-_FILE_NAME = 'play-services-auth-base-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-auth-base'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
index bf7842e..4d35b62 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-base/17.5.0/play-services-base-17.5.0.aar'
-_FILE_NAME = 'play-services-base-17.5.0.aar'
-_FILE_VERSION = '17.5.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-base'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
index 7a73efa..61ab3aa0 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-basement/17.5.0/play-services-basement-17.5.0.aar'
-_FILE_NAME = 'play-services-basement-17.5.0.aar'
-_FILE_VERSION = '17.5.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-basement'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
index e81d1b2..93cf2c2 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-cast/17.0.0/play-services-cast-17.0.0.aar'
-_FILE_NAME = 'play-services-cast-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-cast'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
index 734b84e..562f791 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-cast-framework/17.0.0/play-services-cast-framework-17.0.0.aar'
-_FILE_NAME = 'play-services-cast-framework-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-cast-framework'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
index 96374a44..337d61bf 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-clearcut/17.0.0/play-services-clearcut-17.0.0.aar'
-_FILE_NAME = 'play-services-clearcut-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-clearcut'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
index 82b9dd4..5ab8418 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-cloud-messaging/16.0.0/play-services-cloud-messaging-16.0.0.aar'
-_FILE_NAME = 'play-services-cloud-messaging-16.0.0.aar'
-_FILE_VERSION = '16.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-cloud-messaging'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
index c6047c0..326360b 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-fido/19.0.0-beta/play-services-fido-19.0.0-beta.aar'
-_FILE_NAME = 'play-services-fido-19.0.0-beta.aar'
-_FILE_VERSION = '19.0.0-beta'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-fido'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
index 12513d0..93c8876 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-flags/17.0.0/play-services-flags-17.0.0.aar'
-_FILE_NAME = 'play-services-flags-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-flags'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
index 97c1c51..225efbc 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-gcm/17.0.0/play-services-gcm-17.0.0.aar'
-_FILE_NAME = 'play-services-gcm-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-gcm'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
index 99fa7a7c..2793d188 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-iid/17.0.0/play-services-iid-17.0.0.aar'
-_FILE_NAME = 'play-services-iid-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-iid'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
index 23c6f1f2cb..31aa6e4 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-instantapps/17.0.0/play-services-instantapps-17.0.0.aar'
-_FILE_NAME = 'play-services-instantapps-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-instantapps'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
index ee4f89e..8553a97 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-location/17.0.0/play-services-location-17.0.0.aar'
-_FILE_NAME = 'play-services-location-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-location'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
index 23c0867..f2d09e4 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-phenotype/17.0.0/play-services-phenotype-17.0.0.aar'
-_FILE_NAME = 'play-services-phenotype-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-phenotype'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
index abf7a56..9477c4d 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-places-placereport/17.0.0/play-services-places-placereport-17.0.0.aar'
-_FILE_NAME = 'play-services-places-placereport-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-places-placereport'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
index c2fa4f8..282cae4 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar'
-_FILE_NAME = 'play-services-stats-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-stats'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
index 835604e5..de443fd4 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-tasks/17.2.0/play-services-tasks-17.2.0.aar'
-_FILE_NAME = 'play-services-tasks-17.2.0.aar'
-_FILE_VERSION = '17.2.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-tasks'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
index eb2318b..9ca4b4c 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-vision/18.0.0/play-services-vision-18.0.0.aar'
-_FILE_NAME = 'play-services-vision-18.0.0.aar'
-_FILE_VERSION = '18.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-vision'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
index 9b685ba..5e8bb4e 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-vision-common/18.0.0/play-services-vision-common-18.0.0.aar'
-_FILE_NAME = 'play-services-vision-common-18.0.0.aar'
-_FILE_VERSION = '18.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/gms'
+_MODULE_NAME = 'play-services-vision-common'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
index c1fe510..6bfadeee 100755
--- a/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.6.0-alpha01/material-1.6.0-alpha01.aar'
-_FILE_NAME = 'material-1.6.0-alpha01.aar'
-_FILE_VERSION = '1.6.0-alpha01'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/material'
+_MODULE_NAME = 'material'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
index a83b336..c3d820b 100755
--- a/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/android/play/core/1.10.0/core-1.10.0.aar'
-_FILE_NAME = 'core-1.10.0.aar'
-_FILE_VERSION = '1.10.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/android/play'
+_MODULE_NAME = 'core'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
index dfaebca..b6f741095 100755
--- a/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/auto/auto-common/1.1.2/auto-common-1.1.2.jar'
-_FILE_NAME = 'auto-common-1.1.2.jar'
-_FILE_VERSION = '1.1.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/auto'
+_MODULE_NAME = 'auto-common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
index 48da253..88a7ae40 100755
--- a/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/auto/service/auto-service/1.0-rc6/auto-service-1.0-rc6.jar'
-_FILE_NAME = 'auto-service-1.0-rc6.jar'
-_FILE_VERSION = '1.0-rc6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/auto/service'
+_MODULE_NAME = 'auto-service'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
index d99c835..9be340be 100755
--- a/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc6/auto-service-annotations-1.0-rc6.jar'
-_FILE_NAME = 'auto-service-annotations-1.0-rc6.jar'
-_FILE_VERSION = '1.0-rc6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/auto/service'
+_MODULE_NAME = 'auto-service-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
index 6cc6bfa..ab3e0583 100755
--- a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar'
-_FILE_NAME = 'auto-value-annotations-1.7.jar'
-_FILE_VERSION = '1.7'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/auto/value'
+_MODULE_NAME = 'auto-value-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
index 72c1c57e9..0e68d88 100755
--- a/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/code/findbugs/jFormatString/3.0.0/jFormatString-3.0.0.jar'
-_FILE_NAME = 'jFormatString-3.0.0.jar'
-_FILE_VERSION = '3.0.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/code/findbugs'
+_MODULE_NAME = 'jFormatString'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
index e078a087..87493b3 100755
--- a/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar'
-_FILE_NAME = 'jsr305-3.0.2.jar'
-_FILE_VERSION = '3.0.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/code/findbugs'
+_MODULE_NAME = 'jsr305'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
index 45ec04e..7f885c47 100755
--- a/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar'
-_FILE_NAME = 'gson-2.8.0.jar'
-_FILE_VERSION = '2.8.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/code/gson'
+_MODULE_NAME = 'gson'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
index afc9ede..a4b202f4 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/dagger/dagger/2.30/dagger-2.30.jar'
-_FILE_NAME = 'dagger-2.30.jar'
-_FILE_VERSION = '2.30'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/dagger'
+_MODULE_NAME = 'dagger'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
index 62a881ef..a63de0f 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/dagger/dagger-compiler/2.30/dagger-compiler-2.30.jar'
-_FILE_NAME = 'dagger-compiler-2.30.jar'
-_FILE_VERSION = '2.30'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/dagger'
+_MODULE_NAME = 'dagger-compiler'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
index ec3a6fc..fb35ba87 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/dagger/dagger-producers/2.30/dagger-producers-2.30.jar'
-_FILE_NAME = 'dagger-producers-2.30.jar'
-_FILE_VERSION = '2.30'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/dagger'
+_MODULE_NAME = 'dagger-producers'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
index 3db4441..2b79fc8 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/dagger/dagger-spi/2.30/dagger-spi-2.30.jar'
-_FILE_NAME = 'dagger-spi-2.30.jar'
-_FILE_VERSION = '2.30'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/dagger'
+_MODULE_NAME = 'dagger-spi'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
index 151bcb1..e3d8e17a 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotation/2.10.0/error_prone_annotation-2.10.0.jar'
-_FILE_NAME = 'error_prone_annotation-2.10.0.jar'
-_FILE_VERSION = '2.10.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'error_prone_annotation'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
index 9c6b7a1..5b037c3 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0.jar'
-_FILE_NAME = 'error_prone_annotations-2.10.0.jar'
-_FILE_VERSION = '2.10.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'error_prone_annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
index b2732bb..5cc5db8 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_check_api/2.10.0/error_prone_check_api-2.10.0.jar'
-_FILE_NAME = 'error_prone_check_api-2.10.0.jar'
-_FILE_VERSION = '2.10.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'error_prone_check_api'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
index a3b95776..90cf6b5 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_core/2.10.0/error_prone_core-2.10.0.jar'
-_FILE_NAME = 'error_prone_core-2.10.0.jar'
-_FILE_VERSION = '2.10.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'error_prone_core'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
index 6287024..5f6f58f 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_type_annotations/2.10.0/error_prone_type_annotations-2.10.0.jar'
-_FILE_NAME = 'error_prone_type_annotations-2.10.0.jar'
-_FILE_VERSION = '2.10.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'error_prone_type_annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
index 8282503..477e08d 100755
--- a/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar'
-_FILE_NAME = 'javac-9+181-r4173-1.jar'
-_FILE_VERSION = '9+181-r4173-1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'javac'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
index 5cb1f16..534b6946 100755
--- a/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar'
-_FILE_NAME = 'javac-shaded-9-dev-r4023-3.jar'
-_FILE_VERSION = '9-dev-r4023-3'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/errorprone'
+_MODULE_NAME = 'javac-shaded'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
index c51a9b5f..3e11e7d 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-annotations/16.0.0/firebase-annotations-16.0.0.jar'
-_FILE_NAME = 'firebase-annotations-16.0.0.jar'
-_FILE_VERSION = '16.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
index b3f1e74..72d44bb 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-common/19.5.0/firebase-common-19.5.0.aar'
-_FILE_NAME = 'firebase-common-19.5.0.aar'
-_FILE_VERSION = '19.5.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-common'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
index 811b0e4d..d30578fe 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-components/16.1.0/firebase-components-16.1.0.aar'
-_FILE_NAME = 'firebase-components-16.1.0.aar'
-_FILE_VERSION = '16.1.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-components'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
index caa3c63..a1d71120 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders/16.1.0/firebase-encoders-16.1.0.jar'
-_FILE_NAME = 'firebase-encoders-16.1.0.jar'
-_FILE_VERSION = '16.1.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-encoders'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
index 10fa270..60f2bf6 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders-json/17.1.0/firebase-encoders-json-17.1.0.aar'
-_FILE_NAME = 'firebase-encoders-json-17.1.0.aar'
-_FILE_VERSION = '17.1.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-encoders-json'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
index 78c7623..259daf6 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-iid/21.0.1/firebase-iid-21.0.1.aar'
-_FILE_NAME = 'firebase-iid-21.0.1.aar'
-_FILE_VERSION = '21.0.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-iid'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
index 8eb56a6..9745e4c 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar'
-_FILE_NAME = 'firebase-iid-interop-17.0.0.aar'
-_FILE_VERSION = '17.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-iid-interop'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
index 80188199..bb57727 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations/16.3.5/firebase-installations-16.3.5.aar'
-_FILE_NAME = 'firebase-installations-16.3.5.aar'
-_FILE_VERSION = '16.3.5'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-installations'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
index 9d2faf3..b5c666f 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations-interop/16.0.1/firebase-installations-interop-16.0.1.aar'
-_FILE_NAME = 'firebase-installations-interop-16.0.1.aar'
-_FILE_VERSION = '16.0.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-installations-interop'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
index 2a54991..bf6cb80 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar'
-_FILE_NAME = 'firebase-measurement-connector-18.0.0.aar'
-_FILE_VERSION = '18.0.0'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-measurement-connector'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
index 4836ebb..ab54301 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-messaging/21.0.1/firebase-messaging-21.0.1.aar'
-_FILE_NAME = 'firebase-messaging-21.0.1.aar'
-_FILE_VERSION = '21.0.1'
+_REPO_URL = 'https://dl.google.com/dl/android/maven2'
+_GROUP_NAME = 'com/google/firebase'
+_MODULE_NAME = 'firebase-messaging'
+_FILE_EXT = 'aar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py b/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
index 18383a02..3192da75 100755
--- a/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/flatbuffers/flatbuffers-java/2.0.3/flatbuffers-java-2.0.3.jar'
-_FILE_NAME = 'flatbuffers-java-2.0.3.jar'
-_FILE_VERSION = '2.0.3'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/flatbuffers'
+_MODULE_NAME = 'flatbuffers-java'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py b/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
index 57f88985..864d82e 100755
--- a/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar'
-_FILE_NAME = 'google-java-format-1.5.jar'
-_FILE_VERSION = '1.5'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/googlejavaformat'
+_MODULE_NAME = 'google-java-format'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
index 0cca111d..3ae2cf5 100755
--- a/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar'
-_FILE_NAME = 'failureaccess-1.0.1.jar'
-_FILE_VERSION = '1.0.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/guava'
+_MODULE_NAME = 'failureaccess'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
index 5f0a6ec..f58e180 100755
--- a/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0-jre/guava-31.0-jre.jar'
-_FILE_NAME = 'guava-31.0-jre.jar'
-_FILE_VERSION = '31.0-jre'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/guava'
+_MODULE_NAME = 'guava'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
index 80b3c366..f58e180 100755
--- a/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0-android/guava-31.0-android.jar'
-_FILE_NAME = 'guava-31.0-android.jar'
-_FILE_VERSION = '31.0-android'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/guava'
+_MODULE_NAME = 'guava'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
index 9e611d2..ef7586ed 100755
--- a/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/1.0/listenablefuture-1.0.jar'
-_FILE_NAME = 'listenablefuture-1.0.jar'
-_FILE_VERSION = '1.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/guava'
+_MODULE_NAME = 'listenablefuture'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
index 8d52fa7..e6f331a 100755
--- a/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar'
-_FILE_NAME = 'j2objc-annotations-1.3.jar'
-_FILE_VERSION = '1.3'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/j2objc'
+_MODULE_NAME = 'j2objc-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py b/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
index 14674395..f4b626c 100755
--- a/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.0/protobuf-java-3.4.0.jar'
-_FILE_NAME = 'protobuf-java-3.4.0.jar'
-_FILE_VERSION = '3.4.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/protobuf'
+_MODULE_NAME = 'protobuf-java'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py b/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
index b84ac3e..ee1b0a16 100755
--- a/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.19.3/protobuf-javalite-3.19.3.jar'
-_FILE_NAME = 'protobuf-javalite-3.19.3.jar'
-_FILE_VERSION = '3.19.3'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/google/protobuf'
+_MODULE_NAME = 'protobuf-javalite'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py b/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
index f9d8fa2d..5a310f7 100755
--- a/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/googlecode/java-diff-utils/diffutils/1.3.0/diffutils-1.3.0.jar'
-_FILE_NAME = 'diffutils-1.3.0.jar'
-_FILE_VERSION = '1.3.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/googlecode/java-diff-utils'
+_MODULE_NAME = 'diffutils'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py b/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
index 54c440c..94608f2 100755
--- a/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar'
-_FILE_NAME = 'javapoet-1.13.0.jar'
-_FILE_VERSION = '1.13.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/squareup'
+_MODULE_NAME = 'javapoet'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py b/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
index 36c03ae7..756c528 100755
--- a/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar'
-_FILE_NAME = 'javawriter-2.1.1.jar'
-_FILE_VERSION = '2.1.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'com/squareup'
+_MODULE_NAME = 'javawriter'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py b/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
index 812c24ac..04b210013 100755
--- a/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/io/github/java-diff-utils/java-diff-utils/4.0/java-diff-utils-4.0.jar'
-_FILE_NAME = 'java-diff-utils-4.0.jar'
-_FILE_VERSION = '4.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'io/github/java-diff-utils'
+_MODULE_NAME = 'java-diff-utils'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py b/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
index a725edc..b5d903a 100755
--- a/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar'
-_FILE_NAME = 'javax.annotation-api-1.3.2.jar'
-_FILE_VERSION = '1.3.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'javax/annotation'
+_MODULE_NAME = 'javax.annotation-api'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py b/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
index a077ec5..41b1866f 100755
--- a/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar'
-_FILE_NAME = 'jsr250-api-1.0.jar'
-_FILE_VERSION = '1.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'javax/annotation'
+_MODULE_NAME = 'jsr250-api'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py b/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
index bd597a67a..28e8aaa 100755
--- a/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar'
-_FILE_NAME = 'javax.inject-1.jar'
-_FILE_VERSION = '1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'javax/inject'
+_MODULE_NAME = 'javax.inject'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/nekohtml_nekohtml/3pp/fetch.py b/third_party/android_deps/libs/nekohtml_nekohtml/3pp/fetch.py
index 664c11d..61ce3df 100755
--- a/third_party/android_deps/libs/nekohtml_nekohtml/3pp/fetch.py
+++ b/third_party/android_deps/libs/nekohtml_nekohtml/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.jar'
-_FILE_NAME = 'nekohtml-1.9.6.2.jar'
-_FILE_VERSION = '1.9.6.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'nekohtml'
+_MODULE_NAME = 'nekohtml'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/nekohtml_xercesminimal/3pp/fetch.py b/third_party/android_deps/libs/nekohtml_xercesminimal/3pp/fetch.py
index d9c3392..1923a09f4 100755
--- a/third_party/android_deps/libs/nekohtml_xercesminimal/3pp/fetch.py
+++ b/third_party/android_deps/libs/nekohtml_xercesminimal/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal-1.9.6.2.jar'
-_FILE_NAME = 'xercesMinimal-1.9.6.2.jar'
-_FILE_VERSION = '1.9.6.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'nekohtml'
+_MODULE_NAME = 'xercesMinimal'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = '1.9.6.2'
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py b/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
index bb68221..af6ea1f 100755
--- a/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
+++ b/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/net/ltgt/gradle/incap/incap/0.2/incap-0.2.jar'
-_FILE_NAME = 'incap-0.2.jar'
-_FILE_VERSION = '0.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'net/ltgt/gradle/incap'
+_MODULE_NAME = 'incap'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
index e61b595..3d3d227c 100755
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
+++ b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar'
-_FILE_NAME = 'kxml2-2.3.0.jar'
-_FILE_VERSION = '2.3.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'net/sf/kxml'
+_MODULE_NAME = 'kxml2'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_ant_ant/3pp/fetch.py b/third_party/android_deps/libs/org_apache_ant_ant/3pp/fetch.py
index 79ef768..5eccd44e 100755
--- a/third_party/android_deps/libs/org_apache_ant_ant/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_ant_ant/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/ant/ant/1.8.0/ant-1.8.0.jar'
-_FILE_NAME = 'ant-1.8.0.jar'
-_FILE_VERSION = '1.8.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/ant'
+_MODULE_NAME = 'ant'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_ant_ant_launcher/3pp/fetch.py b/third_party/android_deps/libs/org_apache_ant_ant_launcher/3pp/fetch.py
index bcc2c51..51830c0c 100755
--- a/third_party/android_deps/libs/org_apache_ant_ant_launcher/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_ant_ant_launcher/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/ant/ant-launcher/1.8.0/ant-launcher-1.8.0.jar'
-_FILE_NAME = 'ant-launcher-1.8.0.jar'
-_FILE_VERSION = '1.8.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/ant'
+_MODULE_NAME = 'ant-launcher'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks/3pp/fetch.py
index 94fecea0..f0a1117 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-ant-tasks/2.1.3/maven-ant-tasks-2.1.3.jar'
-_FILE_NAME = 'maven-ant-tasks-2.1.3.jar'
-_FILE_VERSION = '2.1.3'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-ant-tasks'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_artifact/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_artifact/3pp/fetch.py
index 656d5117..04416ce 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_artifact/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_artifact/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.2.1/maven-artifact-2.2.1.jar'
-_FILE_NAME = 'maven-artifact-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-artifact'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager/3pp/fetch.py
index 4ea0bd7..01626d2 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.2.1/maven-artifact-manager-2.2.1.jar'
-_FILE_NAME = 'maven-artifact-manager-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-artifact-manager'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics/3pp/fetch.py
index 78d7a96..0856f98 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-error-diagnostics/2.2.1/maven-error-diagnostics-2.2.1.jar'
-_FILE_NAME = 'maven-error-diagnostics-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-error-diagnostics'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_model/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_model/3pp/fetch.py
index 715de46..1c7391c 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_model/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_model/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.2.1/maven-model-2.2.1.jar'
-_FILE_NAME = 'maven-model-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-model'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry/3pp/fetch.py
index 8774f0a..e7165d11 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-registry/2.2.1/maven-plugin-registry-2.2.1.jar'
-_FILE_NAME = 'maven-plugin-registry-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-plugin-registry'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_profile/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_profile/3pp/fetch.py
index 16349cae..8ab0f48a 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_profile/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_profile/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.2.1/maven-profile-2.2.1.jar'
-_FILE_NAME = 'maven-profile-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-profile'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_project/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_project/3pp/fetch.py
index eb16eb4..c484b81 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_project/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_project/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.2.1/maven-project-2.2.1.jar'
-_FILE_NAME = 'maven-project-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-project'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata/3pp/fetch.py
index a1c95c7..f0eed38 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.2.1/maven-repository-metadata-2.2.1.jar'
-_FILE_NAME = 'maven-repository-metadata-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-repository-metadata'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_maven_settings/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_maven_settings/3pp/fetch.py
index 04a52807..518aec4 100755
--- a/third_party/android_deps/libs/org_apache_maven_maven_settings/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_maven_settings/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/maven-settings/2.2.1/maven-settings-2.2.1.jar'
-_FILE_NAME = 'maven-settings-2.2.1.jar'
-_FILE_VERSION = '2.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven'
+_MODULE_NAME = 'maven-settings'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file/3pp/fetch.py
index ed364ad..bd58c14 100755
--- a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-file/1.0-beta-6/wagon-file-1.0-beta-6.jar'
-_FILE_NAME = 'wagon-file-1.0-beta-6.jar'
-_FILE_VERSION = '1.0-beta-6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven/wagon'
+_MODULE_NAME = 'wagon-file'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight/3pp/fetch.py
index e5d1d2c..9af9f71 100755
--- a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-lightweight/1.0-beta-6/wagon-http-lightweight-1.0-beta-6.jar'
-_FILE_NAME = 'wagon-http-lightweight-1.0-beta-6.jar'
-_FILE_VERSION = '1.0-beta-6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven/wagon'
+_MODULE_NAME = 'wagon-http-lightweight'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared/3pp/fetch.py
index b378d5f0..44555fa3 100755
--- a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-shared/1.0-beta-6/wagon-http-shared-1.0-beta-6.jar'
-_FILE_NAME = 'wagon-http-shared-1.0-beta-6.jar'
-_FILE_VERSION = '1.0-beta-6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven/wagon'
+_MODULE_NAME = 'wagon-http-shared'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api/3pp/fetch.py b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api/3pp/fetch.py
index 8512ed5..9baf741 100755
--- a/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-provider-api/1.0-beta-6/wagon-provider-api-1.0-beta-6.jar'
-_FILE_NAME = 'wagon-provider-api-1.0-beta-6.jar'
-_FILE_VERSION = '1.0-beta-6'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/apache/maven/wagon'
+_MODULE_NAME = 'wagon-provider-api'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py b/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
index edbfef88..7b294cc 100755
--- a/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar'
-_FILE_NAME = 'tagsoup-1.2.1.jar'
-_FILE_VERSION = '1.2.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ccil/cowan/tagsoup'
+_MODULE_NAME = 'tagsoup'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
index fada5dba..7cac6f2 100755
--- a/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar'
-_FILE_NAME = 'checker-compat-qual-2.5.5.jar'
-_FILE_VERSION = '2.5.5'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/checkerframework'
+_MODULE_NAME = 'checker-compat-qual'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
index 817e517..04a105e 100755
--- a/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar'
-_FILE_NAME = 'checker-qual-3.12.0.jar'
-_FILE_VERSION = '3.12.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/checkerframework'
+_MODULE_NAME = 'checker-qual'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
index 9e117f6..54607814 100755
--- a/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/checkerframework/dataflow-errorprone/3.15.0/dataflow-errorprone-3.15.0.jar'
-_FILE_NAME = 'dataflow-errorprone-3.15.0.jar'
-_FILE_VERSION = '3.15.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/checkerframework'
+_MODULE_NAME = 'dataflow-errorprone'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
index 7924222..d1a3aae 100755
--- a/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.17/animal-sniffer-annotations-1.17.jar'
-_FILE_NAME = 'animal-sniffer-annotations-1.17.jar'
-_FILE_VERSION = '1.17'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/codehaus/mojo'
+_MODULE_NAME = 'animal-sniffer-annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default/3pp/fetch.py b/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default/3pp/fetch.py
index 51526c2..60e27ce1 100755
--- a/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-9-stable-1/plexus-container-default-1.0-alpha-9-stable-1.jar'
-_FILE_NAME = 'plexus-container-default-1.0-alpha-9-stable-1.jar'
-_FILE_VERSION = '1.0-alpha-9-stable-1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/codehaus/plexus'
+_MODULE_NAME = 'plexus-container-default'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation/3pp/fetch.py b/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation/3pp/fetch.py
index 88094dc..89ca448 100755
--- a/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.11/plexus-interpolation-1.11.jar'
-_FILE_NAME = 'plexus-interpolation-1.11.jar'
-_FILE_VERSION = '1.11'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/codehaus/plexus'
+_MODULE_NAME = 'plexus-interpolation'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils/3pp/fetch.py b/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils/3pp/fetch.py
index a98bbe7..0f053f0b 100755
--- a/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.15/plexus-utils-1.5.15.jar'
-_FILE_NAME = 'plexus-utils-1.5.15.jar'
-_FILE_VERSION = '1.5.15'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/codehaus/plexus'
+_MODULE_NAME = 'plexus-utils'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py b/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
index a0a3f0e9..0dd5010 100755
--- a/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar'
-_FILE_NAME = 'org.eclipse.jgit-4.4.1.201607150455-r.jar'
-_FILE_VERSION = '4.4.1.201607150455-r'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/eclipse/jgit'
+_MODULE_NAME = 'org.eclipse.jgit'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
index a5c28e7e..e6134bc7 100755
--- a/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar'
-_FILE_NAME = 'annotations-13.0.jar'
-_FILE_VERSION = '13.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains'
+_MODULE_NAME = 'annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
index 1889ef6..87cc8c0a 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.6.10/kotlin-stdlib-1.6.10.jar'
-_FILE_NAME = 'kotlin-stdlib-1.6.10.jar'
-_FILE_VERSION = '1.6.10'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlin'
+_MODULE_NAME = 'kotlin-stdlib'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
index 8a814598..e163252 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.6.10/kotlin-stdlib-common-1.6.10.jar'
-_FILE_NAME = 'kotlin-stdlib-common-1.6.10.jar'
-_FILE_VERSION = '1.6.10'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlin'
+_MODULE_NAME = 'kotlin-stdlib-common'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
index ae18044..2f4d5b5 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5.0/kotlin-stdlib-jdk7-1.5.0.jar'
-_FILE_NAME = 'kotlin-stdlib-jdk7-1.5.0.jar'
-_FILE_VERSION = '1.5.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlin'
+_MODULE_NAME = 'kotlin-stdlib-jdk7'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
index 40d872e..c4ad4d9 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5.0/kotlin-stdlib-jdk8-1.5.0.jar'
-_FILE_NAME = 'kotlin-stdlib-jdk8-1.5.0.jar'
-_FILE_VERSION = '1.5.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlin'
+_MODULE_NAME = 'kotlin-stdlib-jdk8'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
index b18becdd..d12fbd8 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.5.0/kotlinx-coroutines-android-1.5.0.jar'
-_FILE_NAME = 'kotlinx-coroutines-android-1.5.0.jar'
-_FILE_VERSION = '1.5.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlinx'
+_MODULE_NAME = 'kotlinx-coroutines-android'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
index 27ef25d..f4a0e31 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.5.0/kotlinx-coroutines-core-jvm-1.5.0.jar'
-_FILE_NAME = 'kotlinx-coroutines-core-jvm-1.5.0.jar'
-_FILE_VERSION = '1.5.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlinx'
+_MODULE_NAME = 'kotlinx-coroutines-core-jvm'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
index 40434db6..373f94f 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar'
-_FILE_NAME = 'kotlinx-metadata-jvm-0.1.0.jar'
-_FILE_VERSION = '0.1.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/jetbrains/kotlinx'
+_MODULE_NAME = 'kotlinx-metadata-jvm'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
index d2660f2..31f3504 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar'
-_FILE_NAME = 'asm-7.0.jar'
-_FILE_VERSION = '7.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ow2/asm'
+_MODULE_NAME = 'asm'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
index 83238d88b..e7dd0723 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar'
-_FILE_NAME = 'asm-analysis-7.0.jar'
-_FILE_VERSION = '7.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ow2/asm'
+_MODULE_NAME = 'asm-analysis'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
index ad265e1..7f89973 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar'
-_FILE_NAME = 'asm-commons-7.0.jar'
-_FILE_VERSION = '7.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ow2/asm'
+_MODULE_NAME = 'asm-commons'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
index 5569efe0..49c79fe6 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar'
-_FILE_NAME = 'asm-tree-7.0.jar'
-_FILE_VERSION = '7.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ow2/asm'
+_MODULE_NAME = 'asm-tree'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
index 3dbaa0a8..9b5453d 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar'
-_FILE_NAME = 'asm-util-7.0.jar'
-_FILE_VERSION = '7.0'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/ow2/asm'
+_MODULE_NAME = 'asm-util'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py b/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
index d04ba95..782297ae 100755
--- a/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/pcollections/pcollections/2.1.2/pcollections-2.1.2.jar'
-_FILE_NAME = 'pcollections-2.1.2.jar'
-_FILE_VERSION = '2.1.2'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/pcollections'
+_MODULE_NAME = 'pcollections'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
index 036f76e1..bed367e 100755
--- a/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/annotations/4.3.1/annotations-4.3.1.jar'
-_FILE_NAME = 'annotations-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'annotations'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
index b6f5193..675f210 100755
--- a/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/junit/4.3.1/junit-4.3.1.jar'
-_FILE_NAME = 'junit-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'junit'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
index 100d93a0..27ce1b8 100755
--- a/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/pluginapi/4.3.1/pluginapi-4.3.1.jar'
-_FILE_NAME = 'pluginapi-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'pluginapi'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
index 77327e0..1fa65eb 100755
--- a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.3.1/plugins-maven-dependency-resolver-4.3.1.jar'
-_FILE_NAME = 'plugins-maven-dependency-resolver-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'plugins-maven-dependency-resolver'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
index abf3252..865e667 100755
--- a/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/resources/4.3.1/resources-4.3.1.jar'
-_FILE_NAME = 'resources-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'resources'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
index 4279183..4ba0550 100755
--- a/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/robolectric/4.3.1/robolectric-4.3.1.jar'
-_FILE_NAME = 'robolectric-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'robolectric'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
index eb71f43..0fb265b6 100755
--- a/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/sandbox/4.3.1/sandbox-4.3.1.jar'
-_FILE_NAME = 'sandbox-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'sandbox'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
index 6f5d401..8790cfe 100755
--- a/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/shadowapi/4.3.1/shadowapi-4.3.1.jar'
-_FILE_NAME = 'shadowapi-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'shadowapi'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
index 12fe4b97..f2e04da 100755
--- a/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/shadows-framework/4.3.1/shadows-framework-4.3.1.jar'
-_FILE_NAME = 'shadows-framework-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'shadows-framework'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
index a04263a77..6e63c6e 100755
--- a/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/shadows-playservices/4.3.1/shadows-playservices-4.3.1.jar'
-_FILE_NAME = 'shadows-playservices-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'shadows-playservices'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
index 712f5d4d..15a6e603 100755
--- a/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/utils/4.3.1/utils-4.3.1.jar'
-_FILE_NAME = 'utils-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'utils'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
index 32254e36..6d313030 100755
--- a/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
@@ -11,28 +11,44 @@
 import argparse
 import json
 import os
+import re
+import urllib2
 
-_FILE_URL = 'https://repo.maven.apache.org/maven2/org/robolectric/utils-reflector/4.3.1/utils-reflector-4.3.1.jar'
-_FILE_NAME = 'utils-reflector-4.3.1.jar'
-_FILE_VERSION = '4.3.1'
+_REPO_URL = 'https://repo.maven.apache.org/maven2'
+_GROUP_NAME = 'org/robolectric'
+_MODULE_NAME = 'utils-reflector'
+_FILE_EXT = 'jar'
+_OVERRIDE_LATEST = None
 
 
 def do_latest():
-    print(_FILE_VERSION)
+    if _OVERRIDE_LATEST is not None:
+        print(_OVERRIDE_LATEST)
+        return
+    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
+        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
+    metadata = urllib2.urlopen(maven_metadata_url).read()
+    # Do not parse xml with the python included parser since it is susceptible
+    # to maliciously crafted xmls. Only use regular expression parsing to be
+    # safe. RE should be enough to handle what we need to extract.
+    match = re.search('<latest>([^<]+)</latest>', metadata)
+    if match:
+        latest = match.group(1)
+    else:
+        # if no latest info was found just hope the versions are sorted and the
+        # last one is the latest (as is commonly the case).
+        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
+    print(latest)
 
 
 def get_download_url(version):
-    if _FILE_URL.endswith('.jar'):
-        ext = '.jar'
-    elif _FILE_URL.endswith('.aar'):
-        ext = '.aar'
-    else:
-        raise Exception('Unsupported extension for %s' % _FILE_URL)
+    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
+                                                    _MODULE_NAME, version,
+                                                    _FILE_EXT)
 
     partial_manifest = {
-        'url': [_FILE_URL],
-        'name': [_FILE_NAME],
-        'ext': ext,
+        'url': [file_url],
+        'ext': '.' + _FILE_EXT,
     }
     print(json.dumps(partial_manifest))
 
diff --git a/third_party/blink/common/client_hints/client_hints.cc b/third_party/blink/common/client_hints/client_hints.cc
index 53984514..09f8175 100644
--- a/third_party/blink/common/client_hints/client_hints.cc
+++ b/third_party/blink/common/client_hints/client_hints.cc
@@ -75,6 +75,8 @@
        mojom::PermissionsPolicyFeature::kClientHintUAFullVersionList},
       {network::mojom::WebClientHintsType::kFullUserAgent,
        mojom::PermissionsPolicyFeature::kClientHintUAFull},
+      {network::mojom::WebClientHintsType::kUAWoW64,
+       mojom::PermissionsPolicyFeature::kClientHintUAWoW64},
   };
 }
 
diff --git a/third_party/blink/common/client_hints/client_hints_unittest.cc b/third_party/blink/common/client_hints/client_hints_unittest.cc
index 35d7caf..171a887 100644
--- a/third_party/blink/common/client_hints/client_hints_unittest.cc
+++ b/third_party/blink/common/client_hints/client_hints_unittest.cc
@@ -33,7 +33,7 @@
           "sec-ch-prefers-color-scheme", "sec-ch-ua-bitness",
           "sec-ch-ua-reduced", "sec-ch-viewport-height", "sec-ch-device-memory",
           "sec-ch-dpr", "sec-ch-width", "sec-ch-viewport-width",
-          "sec-ch-ua-full-version-list", "sec-ch-ua-full"));
+          "sec-ch-ua-full-version-list", "sec-ch-ua-full", "sec-ch-ua-wow64"));
 }
 
 // Checks that the removed header list includes legacy headers but not the
@@ -53,6 +53,6 @@
           "sec-ch-ua-bitness", "sec-ch-ua-reduced", "sec-ch-viewport-height",
           "sec-ch-device-memory", "sec-ch-dpr", "sec-ch-width",
           "sec-ch-viewport-width", "sec-ch-ua-full-version-list",
-          "sec-ch-ua-full"));
+          "sec-ch-ua-full", "sec-ch-ua-wow64"));
 }
 }  // namespace blink
diff --git a/third_party/blink/common/client_hints/enabled_client_hints.cc b/third_party/blink/common/client_hints/enabled_client_hints.cc
index 3829830..30320cd 100644
--- a/third_party/blink/common/client_hints/enabled_client_hints.cc
+++ b/third_party/blink/common/client_hints/enabled_client_hints.cc
@@ -30,6 +30,7 @@
     case WebClientHintsType::kUAMobile:
     case WebClientHintsType::kUAFullVersion:
     case WebClientHintsType::kUABitness:
+    case WebClientHintsType::kUAWoW64:
       if (!base::FeatureList::IsEnabled(features::kUserAgentClientHint))
         return true;
       break;
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index bee9ac6..49e7122 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -13,6 +13,11 @@
 namespace blink {
 namespace features {
 
+// Apply lazy-loading to ad frames which have embeds likely impacting Core Web
+// Vitals.
+const base::Feature kAutomaticLazyFrameLoadingToAds{
+    "AutomaticLazyFrameLoadingToAds", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Apply lazy-loading to frames which have embeds likely impacting Core Web
 // Vitals.
 const base::Feature kAutomaticLazyFrameLoadingToEmbeds{
@@ -1205,7 +1210,7 @@
 const base::Feature kSystemColorChooser{"SystemColorChooser",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kNoForcedFrameUpdates{"NoForcedFrameUpdates",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kNoForcedFrameUpdatesForWebTests{
+    "NoForcedFrameUpdatesForWebTests", base::FEATURE_DISABLED_BY_DEFAULT};
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/common/user_agent/user_agent_metadata.cc b/third_party/blink/common/user_agent/user_agent_metadata.cc
index d60d102..e16a250 100644
--- a/third_party/blink/common/user_agent/user_agent_metadata.cc
+++ b/third_party/blink/common/user_agent/user_agent_metadata.cc
@@ -76,6 +76,7 @@
   out.WriteString(in->model);
   out.WriteBool(in->mobile);
   out.WriteString(in->bitness);
+  out.WriteBool(in->wow64);
   return std::string(reinterpret_cast<const char*>(out.data()), out.size());
 }
 
@@ -131,6 +132,8 @@
     return absl::nullopt;
   if (!in.ReadString(&out.bitness))
     return absl::nullopt;
+  if (!in.ReadBool(&out.wow64))
+    return absl::nullopt;
   return absl::make_optional(std::move(out));
 }
 
@@ -144,7 +147,7 @@
          a.full_version == b.full_version && a.platform == b.platform &&
          a.platform_version == b.platform_version &&
          a.architecture == b.architecture && a.model == b.model &&
-         a.mobile == b.mobile && a.bitness == b.bitness;
+         a.mobile == b.mobile && a.bitness == b.bitness && a.wow64 == b.wow64;
 }
 
 bool operator==(const UserAgentOverride& a, const UserAgentOverride& b) {
diff --git a/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc b/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc
index 43e396127..a9ca402 100644
--- a/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc
+++ b/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc
@@ -27,6 +27,7 @@
   to_encode.model = "unofficial";
   to_encode.mobile = false;
   to_encode.bitness = "8";
+  to_encode.wow64 = true;
   return to_encode;
 }
 
diff --git a/third_party/blink/common/user_agent/user_agent_mojom_traits.cc b/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
index 52d1f3ce..4190854 100644
--- a/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
+++ b/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
@@ -61,6 +61,7 @@
   if (!data.ReadBitness(&string))
     return false;
   out->bitness = string;
+  out->wow64 = data.wow64();
 
   return true;
 }
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 68d9510..32ffa12 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -452,6 +452,10 @@
     "//url",
   ]
 
+  if (is_mac) {
+    public_deps += [ "//ui/gfx" ]
+  }
+
   deps = [
     "//base:base",
     "//cc:cc",
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index d75bcaf..8e973db6 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -16,6 +16,7 @@
 namespace blink {
 namespace features {
 
+BLINK_COMMON_EXPORT extern const base::Feature kAutomaticLazyFrameLoadingToAds;
 BLINK_COMMON_EXPORT extern const base::Feature
     kAutomaticLazyFrameLoadingToEmbeds;
 BLINK_COMMON_EXPORT extern const base::Feature kBackForwardCacheDedicatedWorker;
@@ -599,7 +600,7 @@
 BLINK_COMMON_EXPORT extern const base::Feature kSystemColorChooser;
 
 // Disables forced frame updates for web tests. Used by web test runner only.
-BLINK_COMMON_EXPORT extern const base::Feature kNoForcedFrameUpdates;
+BLINK_COMMON_EXPORT extern const base::Feature kNoForcedFrameUpdatesForWebTests;
 
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/public/common/user_agent/user_agent_metadata.h b/third_party/blink/public/common/user_agent/user_agent_metadata.h
index 35b46aa..bb65f7f 100644
--- a/third_party/blink/public/common/user_agent/user_agent_metadata.h
+++ b/third_party/blink/public/common/user_agent/user_agent_metadata.h
@@ -63,6 +63,7 @@
   std::string model;
   bool mobile = false;
   std::string bitness;
+  bool wow64 = false;
 };
 
 // Used when customizing the sent User-Agent and Sec-CH-UA-* for
diff --git a/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h b/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
index 9c784be..d652df6f 100644
--- a/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
+++ b/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
@@ -72,6 +72,10 @@
     return data.bitness;
   }
 
+  static bool wow64(const ::blink::UserAgentMetadata& data) {
+    return data.wow64;
+  }
+
   static bool Read(blink::mojom::UserAgentMetadataDataView data,
                    ::blink::UserAgentMetadata* out);
 };
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index b5345d9..d8a3ff1 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -6881,6 +6881,7 @@
       ch-ua-full-version-list
       ch-ua-platform-version
       ch-ua-reduced
+      ch-ua-wow64
       ch-viewport-height
       ch-viewport-width
       ch-width
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 5c7b09ef..1e9892b 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -37,6 +37,7 @@
     "choosers/date_time_chooser.mojom",
     "choosers/file_chooser.mojom",
     "choosers/popup_menu.mojom",
+    "chromeos/system_extensions/hid/cros_hid.mojom",
     "chromeos/system_extensions/window_management/cros_window_management.mojom",
     "clipboard/clipboard.mojom",
     "close_watcher/close_listener.mojom",
diff --git a/third_party/blink/public/mojom/chromeos/system_extensions/hid/OWNERS b/third_party/blink/public/mojom/chromeos/system_extensions/hid/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/third_party/blink/public/mojom/chromeos/system_extensions/hid/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom b/third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom
new file mode 100644
index 0000000..f8594689
--- /dev/null
+++ b/third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom
@@ -0,0 +1,18 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module blink.mojom;
+
+import "services/device/public/mojom/hid.mojom";
+import "third_party/blink/public/mojom/hid/hid.mojom";
+
+// Chrome OS HID API for System Extensions.
+interface CrosHID {
+  // Access logical HID devices. No request dialog is shown. If |filters| is
+  // non-empty, return devices matching one or more of the filters. If
+  // |filters| is empty, return all connected devices. |devices| contains
+  // logical HID interfaces exposed by one or multiple physical devices.
+  AccessDevices(array<HidDeviceFilter> filters)
+    => (array<device.mojom.HidDeviceInfo> devices);
+};
diff --git a/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom b/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom
index 8cf94f3..ebab6d8 100644
--- a/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom
+++ b/third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom
@@ -192,6 +192,9 @@
   // UA reduction rolls out.
   kClientHintUAFull = 94,
 
+  // Client Hint for Sec-CH-UA-WoW64.
+  kClientHintUAWoW64 = 95,
+
   // Don't change assigned numbers of any item, and don't reuse removed slots.
   // Add new features at the end of the enum.
   // Also, run update_permissions_policy_enum.py in
diff --git a/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom b/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
index 19287b10..ab5433385 100644
--- a/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
+++ b/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
@@ -22,6 +22,7 @@
   string model;
   bool mobile;
   string bitness;
+  bool wow64;
 };
 
 // See UserAgentOverride in
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 1ea05d6..e64e193 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3469,6 +3469,7 @@
   kAbortSignalThrowIfAborted = 4148,
   kClientHintsUAFull = 4149,
   kPrivateNetworkAccessWithinWorker = 4150,
+  kClientHintsUAWoW64 = 4151,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/DEPS b/third_party/blink/public/web/DEPS
index 43456e2..8c090190 100644
--- a/third_party/blink/public/web/DEPS
+++ b/third_party/blink/public/web/DEPS
@@ -49,6 +49,7 @@
     "+ui/base/ime/ime_text_span.h",
     "+ui/display/mojom",
     "+ui/events/types",
+    "+ui/gfx/ca_layer_result.h",
     "+ui/gfx/geometry",
     "+ui/gfx/range/range.h",
     # Enforce to use mojom-shared.h in blink/public so that it can compile
diff --git a/third_party/blink/public/web/web_frame_widget.h b/third_party/blink/public/web/web_frame_widget.h
index 2245c633..3a19bdd 100644
--- a/third_party/blink/public/web/web_frame_widget.h
+++ b/third_party/blink/public/web/web_frame_widget.h
@@ -43,6 +43,7 @@
 #include "third_party/blink/public/platform/web_touch_action.h"
 #include "third_party/blink/public/web/web_widget.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
+#include "ui/gfx/ca_layer_result.h"
 
 namespace blink {
 
@@ -137,6 +138,11 @@
   virtual void NotifyPresentationTime(
       base::OnceCallback<void(base::TimeTicks)> callback) = 0;
 
+#if BUILDFLAG(IS_MAC)
+  virtual void NotifyCoreAnimationErrorCode(
+      base::OnceCallback<void(gfx::CALayerResult)> callback) = 0;
+#endif
+
   // Instructs devtools to pause loading of the frame as soon as it's shown
   // until explicit command from the devtools client.
   virtual void WaitForDebuggerWhenShown() = 0;
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 45f6662..75020c90 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -301,6 +301,10 @@
     "//v8",
   ]
 
+  if (is_mac) {
+    public_deps += [ "//ui/gfx" ]
+  }
+
   deps = [
     ":generated_settings_macros",
     "//build:chromeos_buildflags",
diff --git a/third_party/blink/renderer/core/OWNERS b/third_party/blink/renderer/core/OWNERS
index f260e1df2..be1e4c4 100644
--- a/third_party/blink/renderer/core/OWNERS
+++ b/third_party/blink/renderer/core/OWNERS
@@ -22,7 +22,6 @@
 drott@chromium.org
 # dtapuska reviews input-related changes
 dtapuska@chromium.org
-enne@chromium.org
 # flackr reviews animation, input-related and scrolling-related changes.
 flackr@chromium.org
 fmalita@chromium.org
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index b47bb47..1a9f8b9b 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -417,7 +417,8 @@
 CSSMathExpressionNode* CSSMathExpressionOperation::CreateComparisonFunction(
     Operands&& operands,
     CSSMathOperator op) {
-  DCHECK(op == CSSMathOperator::kMin || op == CSSMathOperator::kMax);
+  DCHECK(op == CSSMathOperator::kMin || op == CSSMathOperator::kMax ||
+         op == CSSMathOperator::kClamp);
   DCHECK(operands.size());
   bool is_first = true;
   CalculationCategory category;
@@ -603,6 +604,7 @@
     }
     case CSSMathOperator::kMin:
     case CSSMathOperator::kMax:
+    case CSSMathOperator::kClamp:
       return absl::nullopt;
     case CSSMathOperator::kInvalid:
       NOTREACHED();
@@ -667,6 +669,14 @@
       return CalculationExpressionOperationNode::CreateSimplified(
           std::move(operands), expression_operator);
     }
+    case CSSMathOperator::kClamp: {
+      Vector<scoped_refptr<const CalculationExpressionNode>> operands;
+      operands.ReserveCapacity(operands_.size());
+      for (const auto& operand : operands_)
+        operands.push_back(operand->ToCalculationExpression(conversion_data));
+      return CalculationExpressionOperationNode::CreateSimplified(
+          std::move(operands), CalculationOperator::kClamp);
+    }
     case CSSMathOperator::kInvalid:
       NOTREACHED();
       return nullptr;
@@ -756,6 +766,7 @@
           length_array, multiplier / operands_[1]->DoubleValue());
     case CSSMathOperator::kMin:
     case CSSMathOperator::kMax:
+    case CSSMathOperator::kClamp:
       // When comparison functions are involved, we can't resolve the expression
       // into a length array.
       return false;
@@ -815,12 +826,8 @@
       return result.ReleaseString();
     }
     case CSSMathOperator::kMin:
-    case CSSMathOperator::kMax: {
-      // TODO(pjh0718): Change clamp representation from max(min()) to single
-      // clamp() node and remove CSSTextAsClamp().
-      if (is_clamp_)
-        return CSSTextAsClamp();
-
+    case CSSMathOperator::kMax:
+    case CSSMathOperator::kClamp: {
       StringBuilder result;
       result.Append(ToString(operator_));
       result.Append('(');
@@ -839,31 +846,6 @@
   }
 }
 
-String CSSMathExpressionOperation::CSSTextAsClamp() const {
-  DCHECK(is_clamp_);
-  DCHECK_EQ(CSSMathOperator::kMax, operator_);
-  DCHECK_EQ(2u, operands_.size());
-  // TODO(pjh0718): Actually we should IsMinOrMax() check here,
-  // but currently it is not a virtual function and CSSTextAsClamp() will be
-  // removed anyway during changing clamp representation from max(min()) to
-  // single clamp() node.
-  DCHECK(operands_[1]->IsMathFunction());
-  const auto& nested = To<CSSMathExpressionOperation>(*operands_[1]);
-  DCHECK(!nested.is_clamp_);
-  DCHECK_EQ(CSSMathOperator::kMin, nested.operator_);
-  DCHECK_EQ(2u, nested.operands_.size());
-
-  StringBuilder result;
-  result.Append("clamp(");
-  result.Append(operands_[0]->CustomCSSText());
-  result.Append(", ");
-  result.Append(nested.operands_[0]->CustomCSSText());
-  result.Append(", ");
-  result.Append(nested.operands_[1]->CustomCSSText());
-  result.Append(")");
-  return result.ReleaseString();
-}
-
 bool CSSMathExpressionOperation::operator==(
     const CSSMathExpressionNode& exp) const {
   if (!exp.IsOperation())
@@ -884,7 +866,7 @@
 CSSPrimitiveValue::UnitType CSSMathExpressionOperation::ResolvedUnitType()
     const {
   // TODO(pjh0718): Merge this if statement into switch-case below.
-  if (IsMinOrMax()) {
+  if (IsMinOrMax() || IsClamp()) {
     if (category_ == kCalcNumber)
       return CSSPrimitiveValue::UnitType::kNumber;
 
@@ -992,6 +974,16 @@
         maximum = std::max(maximum, operand);
       return maximum;
     }
+    case CSSMathOperator::kClamp: {
+      DCHECK_EQ(operands.size(), 3u);
+      double min = operands[0];
+      double val = operands[1];
+      double max = operands[2];
+      // clamp(MIN, VAL, MAX) is identical to max(MIN, min(VAL, MAX))
+      // according to the spec,
+      // https://drafts.csswg.org/css-values-4/#funcdef-clamp.
+      return std::max(min, std::min(val, max));
+    }
     case CSSMathOperator::kInvalid:
       NOTREACHED();
       break;
@@ -1027,18 +1019,18 @@
       case CSSValueID::kWebkitCalc:
         return ParseCalc(tokens);
       case CSSValueID::kMin:
-        return ParseMinOrMax(tokens, CSSMathOperator::kMin, depth);
+        return ParseComparisonFunction(tokens, CSSMathOperator::kMin, depth);
       case CSSValueID::kMax:
-        return ParseMinOrMax(tokens, CSSMathOperator::kMax, depth);
+        return ParseComparisonFunction(tokens, CSSMathOperator::kMax, depth);
       case CSSValueID::kClamp:
-        return ParseClamp(tokens, depth);
+        return ParseComparisonFunction(tokens, CSSMathOperator::kClamp, depth);
       // TODO(crbug.com/1284199): Support other math functions.
       default:
         return nullptr;
     }
   }
 
-  // TODO(pjh0718) : Integrate ParseCalc and ParseMinOrMaxOrClamp to
+  // TODO(pjh0718) : Integrate ParseCalc and ParseComparisonFunction to
   // ParseMathFunction.
   CSSMathExpressionNode* ParseCalc(CSSParserTokenRange tokens) {
     tokens.ConsumeWhitespace();
@@ -1048,10 +1040,11 @@
     return result;
   }
 
-  CSSMathExpressionNode* ParseMinOrMax(CSSParserTokenRange tokens,
-                                       CSSMathOperator op,
-                                       int depth) {
-    DCHECK(op == CSSMathOperator::kMin || op == CSSMathOperator::kMax);
+  CSSMathExpressionNode* ParseComparisonFunction(CSSParserTokenRange tokens,
+                                                 CSSMathOperator op,
+                                                 int depth) {
+    DCHECK(op == CSSMathOperator::kMin || op == CSSMathOperator::kMax ||
+           op == CSSMathOperator::kClamp);
     if (tokens.AtEnd())
       return nullptr;
 
@@ -1074,51 +1067,13 @@
     if (operands.IsEmpty() || !tokens.AtEnd() || last_token_is_comma)
       return nullptr;
 
+    if (op == CSSMathOperator::kClamp && operands.size() != 3)
+      return nullptr;
+
     return CSSMathExpressionOperation::CreateComparisonFunction(
         std::move(operands), op);
   }
 
-  CSSMathExpressionNode* ParseClamp(CSSParserTokenRange tokens, int depth) {
-    if (tokens.AtEnd())
-      return nullptr;
-
-    CSSMathExpressionNode* min_operand = ParseValueExpression(tokens, depth);
-    if (!min_operand)
-      return nullptr;
-
-    if (!css_parsing_utils::ConsumeCommaIncludingWhitespace(tokens))
-      return nullptr;
-
-    CSSMathExpressionNode* val_operand = ParseValueExpression(tokens, depth);
-    if (!val_operand)
-      return nullptr;
-
-    if (!css_parsing_utils::ConsumeCommaIncludingWhitespace(tokens))
-      return nullptr;
-
-    CSSMathExpressionNode* max_operand = ParseValueExpression(tokens, depth);
-    if (!max_operand)
-      return nullptr;
-
-    if (!tokens.AtEnd())
-      return nullptr;
-
-    // clamp(MIN, VAL, MAX) is identical to max(MIN, min(VAL, MAX))
-
-    auto* nested = CSSMathExpressionOperation::CreateComparisonFunction(
-        {val_operand, max_operand}, CSSMathOperator::kMin);
-    if (!nested)
-      return nullptr;
-
-    auto* result = CSSMathExpressionOperation::CreateComparisonFunction(
-        {min_operand, nested}, CSSMathOperator::kMax);
-    if (!result)
-      return nullptr;
-
-    result->SetIsClamp();
-    return result;
-  }
-
  private:
   CSSMathExpressionNode* ParseValue(CSSParserTokenRange& tokens) {
     CSSParserToken token = tokens.ConsumeIncludingWhitespace();
@@ -1176,11 +1131,14 @@
       inner_range.ConsumeWhitespace();
       switch (function_id) {
         case CSSValueID::kMin:
-          return ParseMinOrMax(inner_range, CSSMathOperator::kMin, depth);
+          return ParseComparisonFunction(inner_range, CSSMathOperator::kMin,
+                                         depth);
         case CSSValueID::kMax:
-          return ParseMinOrMax(inner_range, CSSMathOperator::kMax, depth);
+          return ParseComparisonFunction(inner_range, CSSMathOperator::kMax,
+                                         depth);
         case CSSValueID::kClamp:
-          return ParseClamp(inner_range, depth);
+          return ParseComparisonFunction(inner_range, CSSMathOperator::kClamp,
+                                         depth);
         default:
           break;
       }
@@ -1376,7 +1334,15 @@
       return CSSMathExpressionOperation::CreateComparisonFunction(
           std::move(operands), op);
     }
-    default:
+    case CalculationOperator::kClamp: {
+      DCHECK_EQ(children.size(), 3u);
+      CSSMathExpressionOperation::Operands operands;
+      for (const auto& child : children)
+        operands.push_back(Create(*child));
+      return CSSMathExpressionOperation::CreateComparisonFunction(
+          std::move(operands), CSSMathOperator::kClamp);
+    }
+    case CalculationOperator::kInvalid:
       NOTREACHED();
       return nullptr;
   }
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.h b/third_party/blink/renderer/core/css/css_math_expression_node.h
index f51deaba..794a53f 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.h
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.h
@@ -78,10 +78,6 @@
 
   virtual bool IsMathFunction() const { return false; }
 
-  // TODO(pjh0718): Change clamp representation from max(min()) to single
-  // clamp() node and remove this clamp specific method.
-  virtual void SetIsClamp() = 0;
-
   virtual bool IsZero() const = 0;
 
   // Resolves the expression into one value *without doing any type conversion*.
@@ -173,10 +169,6 @@
 
   bool IsNumericLiteral() const final { return true; }
 
-  // TODO(pjh0718): Change clamp representation from max(min()) to single
-  // clamp() node and remove this clamp specific method.
-  void SetIsClamp() final {}
-
   bool IsZero() const final;
   String CustomCSSText() const final;
   scoped_refptr<const CalculationExpressionNode> ToCalculationExpression(
@@ -246,13 +238,11 @@
     return operator_ == CSSMathOperator::kMin ||
            operator_ == CSSMathOperator::kMax;
   }
+  bool IsClamp() const { return operator_ == CSSMathOperator::kClamp; }
 
   // TODO(crbug.com/1284199): Check other math functions too(clamp, etc).
-  bool IsMathFunction() const final { return IsMinOrMax(); }
+  bool IsMathFunction() const final { return IsMinOrMax() || IsClamp(); }
 
-  // TODO(pjh0718): Change clamp representation from max(min()) to single
-  // clamp() node and remove these clamp specific methods.
-  void SetIsClamp() final { is_clamp_ = true; }
   String CSSTextAsClamp() const;
 
   bool IsZero() const final;
@@ -298,9 +288,6 @@
 
   Operands operands_;
   const CSSMathOperator operator_;
-  // TODO(pjh0718): Change clamp representation from max(min()) to single
-  // clamp() node and remove this clamp specific member;
-  bool is_clamp_ = false;
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/css/css_math_operator.cc b/third_party/blink/renderer/core/css/css_math_operator.cc
index 4a58fe3..8580543 100644
--- a/third_party/blink/renderer/core/css/css_math_operator.cc
+++ b/third_party/blink/renderer/core/css/css_math_operator.cc
@@ -40,6 +40,8 @@
       return "min";
     case CSSMathOperator::kMax:
       return "max";
+    case CSSMathOperator::kClamp:
+      return "clamp";
     default:
       NOTREACHED();
       return String();
@@ -47,7 +49,8 @@
 }
 
 bool IsComparison(CSSMathOperator op) {
-  return op == CSSMathOperator::kMin || op == CSSMathOperator::kMax;
+  return op == CSSMathOperator::kMin || op == CSSMathOperator::kMax ||
+         op == CSSMathOperator::kClamp;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_math_operator.h b/third_party/blink/renderer/core/css/css_math_operator.h
index 9117113e..cab9018 100644
--- a/third_party/blink/renderer/core/css/css_math_operator.h
+++ b/third_party/blink/renderer/core/css/css_math_operator.h
@@ -18,6 +18,7 @@
   kDivide,
   kMin,
   kMax,
+  kClamp,
   kInvalid
 };
 
diff --git a/third_party/blink/renderer/core/css/cssom/css_numeric_value.cc b/third_party/blink/renderer/core/css/cssom/css_numeric_value.cc
index 6a42b7f..bab0bab0 100644
--- a/third_party/blink/renderer/core/css/cssom/css_numeric_value.cc
+++ b/third_party/blink/renderer/core/css/cssom/css_numeric_value.cc
@@ -136,13 +136,21 @@
   // When the node is a variadic operation, we return either a CSSMathMin or a
   // CSSMathMax.
   if (const auto& node = To<CSSMathExpressionOperation>(root);
-      (node.IsMinOrMax())) {
+      (node.IsMinOrMax() || node.IsClamp())) {
     for (const auto& operand : node.GetOperands())
       values.push_back(CalcToNumericValue(*operand));
     if (node.OperatorType() == CSSMathOperator::kMin)
       return CSSMathMin::Create(std::move(values));
     if (node.OperatorType() == CSSMathOperator::kMax)
       return CSSMathMax::Create(std::move(values));
+    DCHECK_EQ(CSSMathOperator::kClamp, node.OperatorType());
+    // TODO(pjh0718): Add CSSMathClamp according to
+    // https://drafts.css-houdini.org/css-typed-om-1/#cssmathclamp.
+    auto& min = values[0];
+    auto& val = values[1];
+    auto& max = values[2];
+    return CSSMathMax::Create(
+        {std::move(min), CSSMathMin::Create({std::move(val), std::move(max)})});
   }
 
   DCHECK_EQ(To<CSSMathExpressionOperation>(root).GetOperands().size(), 2u);
@@ -252,7 +260,7 @@
     case kPercentageToken:
     case kDimensionToken: {
       const auto token = range.ConsumeIncludingWhitespace();
-      if (!range.AtEnd())
+      if (!range.AtEnd() || !IsValidUnit(token.GetUnitType()))
         break;
       return CSSUnitValue::Create(token.NumericValue(), token.GetUnitType());
     }
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index 593482a..cc3292d 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -178,7 +178,8 @@
     length -= 4;
     unit = CSSPrimitiveValue::UnitType::kTurns;
   } else {
-    // Only valid for zero (we'll check that in the caller).
+    // For rotate: Only valid for zero (we'll check that in the caller).
+    // For hsl(): To be treated as angles (also done in the caller).
     unit = CSSPrimitiveValue::UnitType::kNumber;
   }
 
@@ -240,13 +241,10 @@
   }
 }
 
-// Returns the number of characters which form a valid double
-// and are terminated by the given terminator character
+// Returns the number of initial characters which form a valid double.
 template <typename CharacterType>
-static int CheckForValidDouble(const CharacterType* string,
-                               const CharacterType* end,
-                               const bool terminated_by_space,
-                               const char terminator) {
+static int FindLengthOfValidDouble(const CharacterType* string,
+                                   const CharacterType* end) {
   int length = static_cast<int>(end - string);
   if (length < 1)
     return 0;
@@ -254,17 +252,12 @@
   bool decimal_mark_seen = false;
   int processed_length = 0;
 
-  for (int i = 0; i < length; ++i) {
-    if (string[i] == terminator ||
-        (terminated_by_space && IsHTMLSpace<CharacterType>(string[i]))) {
-      processed_length = i;
-      break;
-    }
+  for (int i = 0; i < length; ++i, ++processed_length) {
     if (!IsASCIIDigit(string[i])) {
       if (!decimal_mark_seen && string[i] == '.')
         decimal_mark_seen = true;
       else
-        return 0;
+        break;
     }
   }
 
@@ -274,17 +267,32 @@
   return processed_length;
 }
 
-// Returns the number of characters consumed for parsing a valid double
-// terminated by the given terminator character
+// If also_accept_whitespace is true: Checks whether string[pos] is the given
+// character, _or_ an HTML space.
+// Otherwise: Checks whether string[pos] is the given character.
+// Returns false if pos is past the end of the string.
+template <typename CharacterType>
+static bool ContainsCharAtPos(const CharacterType* string,
+                              const CharacterType* end,
+                              int pos,
+                              char ch,
+                              bool also_accept_whitespace) {
+  DCHECK_GE(pos, 0);
+  if (pos >= static_cast<int>(end - string)) {
+    return false;
+  }
+  return string[pos] == ch ||
+         (also_accept_whitespace && IsHTMLSpace(string[pos]));
+}
+
+// Returns the number of characters consumed for parsing a valid double,
+// or 0 if the string did not start with a valid double.
 template <typename CharacterType>
 static int ParseDouble(const CharacterType* string,
                        const CharacterType* end,
-                       const char terminator,
-                       const bool terminated_by_space,
                        double& value) {
-  int length =
-      CheckForValidDouble(string, end, terminated_by_space, terminator);
-  if (!length)
+  int length = FindLengthOfValidDouble(string, end);
+  if (length == 0)
     return 0;
 
   int position = 0;
@@ -316,67 +324,136 @@
   return length;
 }
 
+// Parse a float and clamp it upwards to max_value. Optimized for having
+// no decimal part.
 template <typename CharacterType>
-static bool ParseColorNumberOrPercentage(const CharacterType*& string,
-                                         const CharacterType* end,
-                                         const char terminator,
-                                         bool& should_whitespace_terminate,
-                                         bool is_first_value,
-                                         CSSPrimitiveValue::UnitType& expect,
-                                         int& value) {
+static bool ParseFloatWithMaxValue(const CharacterType*& string,
+                                   const CharacterType* end,
+                                   int max_value,
+                                   double& value,
+                                   bool& negative) {
+  value = 0.0;
   const CharacterType* current = string;
-  double local_value = 0;
-  bool negative = false;
   while (current != end && IsHTMLSpace<CharacterType>(*current))
     current++;
   if (current != end && *current == '-') {
     negative = true;
     current++;
+  } else {
+    negative = false;
   }
   if (current == end || !IsASCIIDigit(*current))
     return false;
   while (current != end && IsASCIIDigit(*current)) {
-    double new_value = local_value * 10 + *current++ - '0';
-    if (new_value >= 255) {
-      // Clamp values at 255.
-      local_value = 255;
+    double new_value = value * 10 + *current++ - '0';
+    if (new_value >= max_value) {
+      // Clamp values at 255 or 100 (depending on the caller).
+      value = max_value;
       while (current != end && IsASCIIDigit(*current))
         ++current;
       break;
     }
-    local_value = new_value;
+    value = new_value;
   }
 
   if (current == end)
     return false;
 
-  if (expect == CSSPrimitiveValue::UnitType::kNumber && *current == '%')
-    return false;
-
   if (*current == '.') {
     // We already parsed the integral part, try to parse
     // the fraction part.
     double fractional = 0;
-    int num_characters_parsed =
-        ParseDouble(current, end, '%', false, fractional);
-    if (num_characters_parsed) {
-      // Number is a percent.
-      current += num_characters_parsed;
-      if (*current != '%')
-        return false;
-    } else {
-      // Number is a decimal.
-      num_characters_parsed =
-          ParseDouble(current, end, terminator, true, fractional);
-      if (!num_characters_parsed)
-        return false;
-      current += num_characters_parsed;
+    int num_characters_parsed = ParseDouble(current, end, fractional);
+    if (num_characters_parsed == 0) {
+      return false;
     }
-    local_value += fractional;
+    current += num_characters_parsed;
+    value += fractional;
   }
 
+  string = current;
+  return true;
+}
+
+namespace {
+
+enum TerminatorStatus {
+  // List elements are delimited with whitespace,
+  // e.g., rgb(10 20 30).
+  kMustWhitespaceTerminate,
+
+  // List elements are delimited with a given terminator,
+  // and any whitespace before it should be skipped over,
+  // e.g., rgb(10 , 20,30).
+  kMustCharacterTerminate,
+
+  // We are parsing the first element, so we could do either
+  // variant -- and when it's an in/out argument, we set it
+  // to one of the other values.
+  kCouldWhitespaceTerminate,
+};
+
+}  // namespace
+
+template <typename CharacterType>
+static bool SkipToTerminator(const CharacterType*& string,
+                             const CharacterType* end,
+                             const char terminator,
+                             TerminatorStatus& terminator_status) {
+  const CharacterType* current = string;
+
+  while (current != end && IsHTMLSpace<CharacterType>(*current))
+    current++;
+
+  switch (terminator_status) {
+    case kCouldWhitespaceTerminate:
+      if (current != end && *current == terminator) {
+        terminator_status = kMustCharacterTerminate;
+        ++current;
+        break;
+      }
+      terminator_status = kMustWhitespaceTerminate;
+      [[fallthrough]];
+    case kMustWhitespaceTerminate:
+      // We must have skipped over at least one space before finding
+      // something else (or the end).
+      if (current == string) {
+        return false;
+      }
+      break;
+    case kMustCharacterTerminate:
+      // We must have stopped at the given terminator character.
+      if (current == end || *current != terminator) {
+        return false;
+      }
+      ++current;  // Skip over the terminator.
+      break;
+  }
+
+  string = current;
+  return true;
+}
+
+template <typename CharacterType>
+static bool ParseColorNumberOrPercentage(const CharacterType*& string,
+                                         const CharacterType* end,
+                                         const char terminator,
+                                         TerminatorStatus& terminator_status,
+                                         CSSPrimitiveValue::UnitType& expect,
+                                         int& value) {
+  const CharacterType* current = string;
+  double local_value;
+  bool negative = false;
+  if (!ParseFloatWithMaxValue<CharacterType>(current, end, 255, local_value,
+                                             negative))
+    return false;
+  if (current == end)
+    return false;
+
   if (expect == CSSPrimitiveValue::UnitType::kPercentage && *current != '%')
     return false;
+  if (expect == CSSPrimitiveValue::UnitType::kNumber && *current == '%')
+    return false;
 
   if (*current == '%') {
     expect = CSSPrimitiveValue::UnitType::kPercentage;
@@ -389,22 +466,8 @@
     expect = CSSPrimitiveValue::UnitType::kNumber;
   }
 
-  while (current != end && IsHTMLSpace<CharacterType>(*current))
-    current++;
-
-  if (current == end || *current != terminator) {
-    if (!should_whitespace_terminate ||
-        !IsHTMLSpace<CharacterType>(*(current - 1))) {
-      return false;
-    }
-  } else if (should_whitespace_terminate && is_first_value) {
-    should_whitespace_terminate = false;
-  } else if (should_whitespace_terminate) {
+  if (!SkipToTerminator(current, end, terminator, terminator_status))
     return false;
-  }
-
-  if (!should_whitespace_terminate)
-    current++;
 
   // Clamp negative values at zero.
   value = negative ? 0 : static_cast<int>(round(local_value));
@@ -412,6 +475,38 @@
   return true;
 }
 
+// Parses a percentage (including the % sign), clamps it and converts it to
+// 0.0..1.0.
+template <typename CharacterType>
+static bool ParsePercentage(const CharacterType*& string,
+                            const CharacterType* end,
+                            const char terminator,
+                            TerminatorStatus& terminator_status,
+                            double& value) {
+  const CharacterType* current = string;
+  bool negative = false;
+  if (!ParseFloatWithMaxValue<CharacterType>(current, end, 100, value,
+                                             negative)) {
+    return false;
+  }
+
+  if (*current != '%')
+    return false;
+
+  ++current;
+  if (negative) {
+    value = 0.0;
+  } else {
+    value = std::min(value * 0.01, 1.0);
+  }
+
+  if (!SkipToTerminator(current, end, terminator, terminator_status))
+    return false;
+
+  string = current;
+  return true;
+}
+
 template <typename CharacterType>
 static inline bool IsTenthAlpha(const CharacterType* string,
                                 const wtf_size_t length) {
@@ -452,7 +547,9 @@
     return false;
 
   if (string[0] != '0' && string[0] != '1' && string[0] != '.') {
-    if (CheckForValidDouble(string, end, false, terminator)) {
+    int length = FindLengthOfValidDouble(string, end);
+    if (length > 0 && ContainsCharAtPos(string, end, length, terminator,
+                                        /*also_accept_whitespace=*/false)) {
       value = negative ? 0 : 255;
       string = end;
       return true;
@@ -477,8 +574,11 @@
   }
 
   double alpha = 0;
-  if (!ParseDouble(string, end, terminator, false, alpha))
+  int dbl_length = ParseDouble(string, end, alpha);
+  if (dbl_length == 0 || !ContainsCharAtPos(string, end, dbl_length, terminator,
+                                            /*also_accept_whitespace=*/false)) {
     return false;
+  }
   value = negative ? 0 : static_cast<int>(round(std::min(alpha, 1.0) * 255.0));
   string = end;
   return true;
@@ -498,12 +598,23 @@
 }
 
 template <typename CharacterType>
+static inline bool MightBeHSLOrHSLA(const CharacterType* characters,
+                                    unsigned length) {
+  if (length < 5)
+    return false;
+  return IsASCIIAlphaCaselessEqual(characters[0], 'h') &&
+         IsASCIIAlphaCaselessEqual(characters[1], 's') &&
+         IsASCIIAlphaCaselessEqual(characters[2], 'l') &&
+         (characters[3] == '(' ||
+          (IsASCIIAlphaCaselessEqual(characters[3], 'a') &&
+           characters[4] == '('));
+}
+
+template <typename CharacterType>
 static bool FastParseColorInternal(RGBA32& rgb,
                                    const CharacterType* characters,
                                    unsigned length,
                                    bool quirks_mode) {
-  CSSPrimitiveValue::UnitType expect = CSSPrimitiveValue::UnitType::kUnknown;
-
   if (length >= 4 && characters[0] == '#')
     return Color::ParseHexColor(characters + 1, length - 1, rgb);
 
@@ -512,7 +623,7 @@
       return true;
   }
 
-  // rgb() and rgba() have the same syntax
+  // rgb() and rgba() have the same syntax.
   if (MightBeRGBOrRGBA(characters, length)) {
     int length_to_add = IsASCIIAlphaCaselessEqual(characters[3], 'a') ? 5 : 4;
     const CharacterType* current = characters + length_to_add;
@@ -522,35 +633,35 @@
     int blue;
     int alpha;
     bool should_have_alpha = false;
-    bool should_whitespace_terminate = true;
-    bool no_whitespace_check = false;
 
-    if (!ParseColorNumberOrPercentage(current, end, ',',
-                                      should_whitespace_terminate,
-                                      true /* is_first_value */, expect, red))
+    TerminatorStatus terminator_status = kCouldWhitespaceTerminate;
+    CSSPrimitiveValue::UnitType expect = CSSPrimitiveValue::UnitType::kUnknown;
+    if (!ParseColorNumberOrPercentage(current, end, ',', terminator_status,
+                                      expect, red)) {
       return false;
-    if (!ParseColorNumberOrPercentage(
-            current, end, ',', should_whitespace_terminate,
-            false /* is_first_value */, expect, green))
+    }
+    if (!ParseColorNumberOrPercentage(current, end, ',', terminator_status,
+                                      expect, green)) {
       return false;
+    }
+
+    TerminatorStatus no_whitespace_check = kMustCharacterTerminate;
     if (!ParseColorNumberOrPercentage(current, end, ',', no_whitespace_check,
-                                      false /* is_first_value */, expect,
-                                      blue)) {
-      // Might have slash as separator
+                                      expect, blue)) {
+      // Might have slash as separator.
       if (ParseColorNumberOrPercentage(current, end, '/', no_whitespace_check,
-                                       false /* is_first_value */, expect,
-                                       blue)) {
-        if (!should_whitespace_terminate)
+                                       expect, blue)) {
+        if (terminator_status != kMustWhitespaceTerminate)
           return false;
         should_have_alpha = true;
       }
-      // Might not have alpha
+      // Might not have alpha.
       else if (!ParseColorNumberOrPercentage(
-                   current, end, ')', no_whitespace_check,
-                   false /* is_first_value */, expect, blue))
+                   current, end, ')', no_whitespace_check, expect, blue)) {
         return false;
+      }
     } else {
-      if (should_whitespace_terminate)
+      if (terminator_status != kMustCharacterTerminate)
         return false;
       should_have_alpha = true;
     }
@@ -558,8 +669,6 @@
     if (should_have_alpha) {
       if (!ParseAlphaValue(current, end, ')', alpha))
         return false;
-      if (current != end)
-        return false;
       rgb = MakeRGBA(red, green, blue, alpha);
     } else {
       if (current != end)
@@ -569,6 +678,112 @@
     return true;
   }
 
+  // hsl() and hsla() also have the same syntax:
+  // https://www.w3.org/TR/css-color-4/#the-hsl-notation
+  // Also for legacy reasons, an hsla() function also exists, with an identical
+  // grammar and behavior to hsl().
+
+  if (MightBeHSLOrHSLA(characters, length)) {
+    int length_to_add = IsASCIIAlphaCaselessEqual(characters[3], 'a') ? 5 : 4;
+    const CharacterType* current = characters + length_to_add;
+    const CharacterType* end = characters + length;
+    bool should_have_alpha = false;
+
+    // Skip any whitespace before the hue.
+    while (current != end && IsHTMLSpace(*current))
+      current++;
+
+    // Find the end of the hue. This isn't optimal, but allows us to reuse
+    // ParseAngle() cleanly.
+    const CharacterType* hue_end = current;
+    while (hue_end != end && !IsHTMLSpace(*hue_end) && *hue_end != ',')
+      hue_end++;
+
+    CSSPrimitiveValue::UnitType hue_unit = CSSPrimitiveValue::UnitType::kNumber;
+    double hue;
+    if (!ParseSimpleAngle(current, static_cast<unsigned>(hue_end - current),
+                          hue_unit, hue)) {
+      return false;
+    }
+
+    // We need to convert the hue to the 0..6 scale that MakeRGBAFromHSLA()
+    // expects.
+    switch (hue_unit) {
+      case CSSPrimitiveValue::UnitType::kNumber:
+      case CSSPrimitiveValue::UnitType::kDegrees:
+        // Unitless numbers are to be treated as degrees.
+        hue *= (6.0 / 360.0);
+        break;
+      case CSSPrimitiveValue::UnitType::kRadians:
+        hue = Rad2deg(hue) * (6.0 / 360.0);
+        break;
+      case CSSPrimitiveValue::UnitType::kGradians:
+        hue = Grad2deg(hue) * (6.0 / 360.0);
+        break;
+      case CSSPrimitiveValue::UnitType::kTurns:
+        hue *= 6.0;
+        break;
+      default:
+        NOTREACHED();
+        return false;
+    }
+
+    // Deal with wraparound so that we end up in 0..6,
+    // roughly analogous to the code in ParseHSLParameters().
+    // Taking these branches should be rare.
+    if (hue < 0.0) {
+      hue = fmod(hue, 6.0) + 6.0;
+    } else if (hue > 6.0) {
+      hue = fmod(hue, 6.0);
+    }
+
+    current = hue_end;
+
+    TerminatorStatus terminator_status = kCouldWhitespaceTerminate;
+    if (!SkipToTerminator(current, end, ',', terminator_status))
+      return false;
+
+    // Saturation and lightness must always be percentages.
+    double saturation;
+    if (!ParsePercentage(current, end, ',', terminator_status, saturation))
+      return false;
+
+    TerminatorStatus no_whitespace_check = kMustCharacterTerminate;
+
+    double lightness;
+    if (!ParsePercentage(current, end, ',', no_whitespace_check, lightness)) {
+      // Might have slash as separator.
+      if (ParsePercentage(current, end, '/', no_whitespace_check, lightness)) {
+        if (terminator_status != kMustWhitespaceTerminate)
+          return false;
+        should_have_alpha = true;
+      }
+      // Might not have alpha.
+      else if (!ParsePercentage(current, end, ')', no_whitespace_check,
+                                lightness)) {
+        return false;
+      }
+    } else {
+      if (terminator_status != kMustCharacterTerminate)
+        return false;
+      should_have_alpha = true;
+    }
+
+    if (should_have_alpha) {
+      int alpha;
+      if (!ParseAlphaValue(current, end, ')', alpha))
+        return false;
+      if (current != end)
+        return false;
+      rgb = MakeRGBAFromHSLA(hue, saturation, lightness, alpha * (1.0 / 255.0));
+    } else {
+      if (current != end)
+        return false;
+      rgb = MakeRGBAFromHSLA(hue, saturation, lightness, 1.0);
+    }
+    return true;
+  }
+
   return false;
 }
 
@@ -590,7 +805,7 @@
   bool quirks_mode = IsQuirksModeBehavior(parser_mode) &&
                      ColorPropertyAllowsQuirkyColor(property_id);
 
-  // Fast path for hex colors and rgb()/rgba() colors
+  // Fast path for hex colors and rgb()/rgba()/hsl()/hsla() colors.
   bool parse_result =
       WTF::VisitCharacters(string, [&](const auto* chars, unsigned length) {
         return FastParseColorInternal(color, chars, length, quirks_mode);
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
index 6530151..dde37e8 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
@@ -175,7 +175,7 @@
 TEST(CSSParserFastPathsTest, ParseColorWithLargeAlpha) {
   CSSValue* value = CSSParserFastPaths::ParseColor("rgba(0,0,0,1893205797.13)",
                                                    kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 }
@@ -183,27 +183,27 @@
 TEST(CSSParserFastPathsTest, ParseColorWithNewSyntax) {
   CSSValue* value =
       CSSParserFastPaths::ParseColor("rgba(0 0 0)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgba(0 0 0 / 1)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgba(0, 0, 0, 1)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("RGBA(0 0 0 / 1)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("RGB(0 0 0 / 1)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
@@ -224,29 +224,148 @@
 TEST(CSSParserFastPathsTest, ParseColorWithDecimal) {
   CSSValue* value = CSSParserFastPaths::ParseColor("rgba(0.0, 0.0, 0.0, 1.0)",
                                                    kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value =
       CSSParserFastPaths::ParseColor("rgb(0.0, 0.0, 0.0)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value =
       CSSParserFastPaths::ParseColor("rgb(0.0 , 0.0,0.0)", kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColor>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgb(254.5, 254.5, 254.5)",
                                          kHTMLStandardMode);
-  EXPECT_NE(nullptr, value);
+  ASSERT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
   EXPECT_EQ(Color::kWhite, To<cssvalue::CSSColor>(*value).Value());
 }
 
+TEST(CSSParserFastPathsTest, ParseHSL) {
+  CSSValue* value =
+      CSSParserFastPaths::ParseColor("hsl(90deg, 50%, 25%)", kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(64, 96, 32)", value->CssText());
+
+  // Implicit “deg” angle.
+  value =
+      CSSParserFastPaths::ParseColor("hsl(180, 50%, 50%)", kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(64, 191, 191)", value->CssText());
+
+  // turn.
+  value = CSSParserFastPaths::ParseColor("hsl(0.25turn, 25%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(128, 159, 96)", value->CssText());
+
+  // rad.
+  value = CSSParserFastPaths::ParseColor("hsl(1.0rad, 50%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(191, 186, 64)", value->CssText());
+
+  // Wraparound.
+  value = CSSParserFastPaths::ParseColor("hsl(450deg, 50%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(128, 191, 64)", value->CssText());
+
+  // Lots of wraparound.
+  value = CSSParserFastPaths::ParseColor("hsl(4050deg, 50%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(128, 191, 64)", value->CssText());
+
+  // Negative wraparound.
+  value = CSSParserFastPaths::ParseColor("hsl(-270deg, 50%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(128, 191, 64)", value->CssText());
+
+  // Saturation clamping.
+  value = CSSParserFastPaths::ParseColor("hsl(45deg, 150%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(255, 191, 0)", value->CssText());
+
+  // Lightness clamping to negative.
+  value = CSSParserFastPaths::ParseColor("hsl(45deg, 150%, -1000%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(0, 0, 0)", value->CssText());
+
+  // Writing hsla() without alpha.
+  value = CSSParserFastPaths::ParseColor("hsla(45deg, 150%, 50%)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(255, 191, 0)", value->CssText());
+}
+
+TEST(CSSParserFastPathsTest, ParseHSLWithAlpha) {
+  // With alpha, using hsl().
+  CSSValue* value = CSSParserFastPaths::ParseColor("hsl(30 , 1%,75%, 0.5)",
+                                                   kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgba(192, 191, 191, 0.5)", value->CssText());
+
+  // With alpha, using hsla().
+  value = CSSParserFastPaths::ParseColor("hsla(30 , 1%,75%, 0.5)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgba(192, 191, 191, 0.5)", value->CssText());
+
+  // With alpha, using space-separated syntax.
+  value = CSSParserFastPaths::ParseColor("hsla(30 1% 75% / 0.1)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgba(192, 191, 191, 0.1)", value->CssText());
+
+  // Clamp alpha.
+  value = CSSParserFastPaths::ParseColor("hsla(30 1% 75% / 1.2)",
+                                         kHTMLStandardMode);
+  ASSERT_NE(nullptr, value);
+  EXPECT_TRUE(value->IsColorValue());
+  EXPECT_EQ("rgb(192, 191, 191)", value->CssText());
+}
+
+TEST(CSSParserFastPathsTest, ParseHSLInvalid) {
+  // Invalid unit.
+  EXPECT_EQ(nullptr, CSSParserFastPaths::ParseColor("hsl(20dag, 50%, 20%)",
+                                                    kHTMLStandardMode));
+
+  // Mix of new and old space syntax.
+  EXPECT_EQ(nullptr, CSSParserFastPaths::ParseColor("hsl(0.2, 50%, 20% 0.3)",
+                                                    kHTMLStandardMode));
+  EXPECT_EQ(nullptr, CSSParserFastPaths::ParseColor("hsl(0.2, 50%, 20% / 0.3)",
+                                                    kHTMLStandardMode));
+  EXPECT_EQ(nullptr, CSSParserFastPaths::ParseColor("hsl(0.2 50% 20%, 0.3)",
+                                                    kHTMLStandardMode));
+
+  // Junk after percentage.
+  EXPECT_EQ(nullptr, CSSParserFastPaths::ParseColor(
+                         "hsl(0.2, 50% foo, 20% 0.3)", kHTMLStandardMode));
+}
+
 TEST(CSSParserFastPathsTest, IsValidKeywordPropertyAndValueOverflowClip) {
   {
     ScopedOverflowClipForTest overflow_clip_feature_enabler(false);
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc
index bc1dbfef..fba2c0f9 100644
--- a/third_party/blink/renderer/core/css/style_engine_test.cc
+++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -5368,6 +5368,26 @@
   UpdateAllLifecyclePhases();
   EXPECT_TRUE(IsUseCounted(WebFeature::kCSSComparisonFunctions));
   ClearUseCounter(WebFeature::kCSSComparisonFunctions);
+
+  GetDocument().body()->setInnerHTML(R"HTML(
+    <style>
+      div { width: calc(clamp(10px, 20px, 30px)); }
+    </style>
+    <div></div>
+  )HTML");
+  UpdateAllLifecyclePhases();
+  EXPECT_TRUE(IsUseCounted(WebFeature::kCSSComparisonFunctions));
+  ClearUseCounter(WebFeature::kCSSComparisonFunctions);
+
+  GetDocument().body()->setInnerHTML(R"HTML(
+    <style>
+      div { width: calc(clamp(10px, 20%, 20px + 30%)); }
+    </style>
+    <div></div>
+  )HTML");
+  UpdateAllLifecyclePhases();
+  EXPECT_TRUE(IsUseCounted(WebFeature::kCSSComparisonFunctions));
+  ClearUseCounter(WebFeature::kCSSComparisonFunctions);
 }
 
 TEST_F(StyleEngineTest, MathDepthOverflow) {
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index f4743df..b95a437 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -2854,14 +2854,15 @@
 
 void WebViewImpl::Show(const LocalFrameToken& opener_frame_token,
                        NavigationPolicy policy,
-                       const gfx::Rect& rect,
+                       const gfx::Rect& requested_rect,
+                       const gfx::Rect& adjusted_rect,
                        bool opened_by_user_gesture) {
   // This is only called on local main frames.
   DCHECK(local_main_frame_host_remote_);
   DCHECK(web_widget_);
-  web_widget_->SetPendingWindowRect(rect);
+  web_widget_->SetPendingWindowRect(adjusted_rect);
   local_main_frame_host_remote_->ShowCreatedWindow(
-      opener_frame_token, NavigationPolicyToDisposition(policy), rect,
+      opener_frame_token, NavigationPolicyToDisposition(policy), requested_rect,
       opened_by_user_gesture,
       WTF::Bind(&WebViewImpl::DidShowCreatedWindow, WTF::Unretained(this)));
 
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 25f9a9f..7796b77c 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -556,7 +556,8 @@
   // Shows a previously created WebView (via window.open()).
   void Show(const LocalFrameToken& opener_frame_token,
             NavigationPolicy policy,
-            const gfx::Rect& rect,
+            const gfx::Rect& requested_rect,
+            const gfx::Rect& adjusted_rect,
             bool opened_by_user_gesture);
 
   // Send the window rect to the browser and call `ack_callback` when the
diff --git a/third_party/blink/renderer/core/frame/DEPS b/third_party/blink/renderer/core/frame/DEPS
index dfc67852..bd7e611e 100644
--- a/third_party/blink/renderer/core/frame/DEPS
+++ b/third_party/blink/renderer/core/frame/DEPS
@@ -62,6 +62,7 @@
   "web_frame_widget_impl\.h": [
     "+services/viz/public/mojom/hit_test/input_target_client.mojom-blink.h",
     "+ui/base/mojom/ui_base_types.mojom-shared.h",
+    "+ui/gfx/ca_layer_result.h",
   ],
   "web_frame_test\.cc": [
     "+ui/base/mojom/ui_base_types.mojom-shared.h",
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 6db5f3f..60630f03 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1737,7 +1737,7 @@
   window_rect.Offset(x, y);
   // Security check (the spec talks about UniversalBrowserWrite to disable this
   // check...)
-  page->GetChromeClient().SetWindowRectWithAdjustment(window_rect, *frame);
+  page->GetChromeClient().SetWindowRect(window_rect, *frame);
 }
 
 void LocalDOMWindow::moveTo(int x, int y) const {
@@ -1753,7 +1753,7 @@
   window_rect.set_origin(gfx::Point(x, y));
   // Security check (the spec talks about UniversalBrowserWrite to disable this
   // check...)
-  page->GetChromeClient().SetWindowRectWithAdjustment(window_rect, *frame);
+  page->GetChromeClient().SetWindowRect(window_rect, *frame);
 }
 
 void LocalDOMWindow::resizeBy(int x, int y) const {
@@ -1768,7 +1768,7 @@
   gfx::Rect fr = page->GetChromeClient().RootWindowRect(*frame);
   gfx::Size dest(fr.width() + x, fr.height() + y);
   gfx::Rect update(fr.origin(), dest);
-  page->GetChromeClient().SetWindowRectWithAdjustment(update, *frame);
+  page->GetChromeClient().SetWindowRect(update, *frame);
 }
 
 void LocalDOMWindow::resizeTo(int width, int height) const {
@@ -1783,7 +1783,7 @@
   gfx::Rect fr = page->GetChromeClient().RootWindowRect(*frame);
   gfx::Size dest = gfx::Size(width, height);
   gfx::Rect update(fr.origin(), dest);
-  page->GetChromeClient().SetWindowRectWithAdjustment(update, *frame);
+  page->GetChromeClient().SetWindowRect(update, *frame);
 }
 
 int LocalDOMWindow::requestAnimationFrame(V8FrameRequestCallback* callback) {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index f443bd9..37765e3 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -1026,8 +1026,17 @@
 
   Member<FragmentAnchor> fragment_anchor_;
 
+  // Scrollable areas which either:
+  //  - are user-scrollable, visible to hit testing, and do in fact overflow, or
+  //  - overflow in the block flow direction (needed for LayoutFromRootObject()
+  //    to get scroll anchoring right).
+  // TODO(abotella): According to skobes, every usage of scrollable_areas_ other
+  // than LayoutFromRootObject() can be switched to use user_scrollable_areas_.
+  // If so, scrollable_areas_ should probably be renamed and used only for areas
+  // which overflow in the block flow direction.
   Member<ScrollableAreaSet> scrollable_areas_;
   Member<ScrollableAreaSet> animating_scrollable_areas_;
+  // Scrollable areas which are user-scrollable, whether they overflow or not.
   Member<ScrollableAreaSet> user_scrollable_areas_;
   Member<ObjectSet> viewport_constrained_objects_;
   // Number of entries in viewport_constrained_objects_ that are sticky.
diff --git a/third_party/blink/renderer/core/frame/navigator_ua.cc b/third_party/blink/renderer/core/frame/navigator_ua.cc
index c4443fa..e1661a44 100644
--- a/third_party/blink/renderer/core/frame/navigator_ua.cc
+++ b/third_party/blink/renderer/core/frame/navigator_ua.cc
@@ -30,6 +30,7 @@
   ua_data->SetUAFullVersion(String::FromUTF8(metadata.full_version));
   ua_data->SetBitness(String::FromUTF8(metadata.bitness));
   ua_data->SetFullVersionList(metadata.brand_full_version_list);
+  ua_data->SetWoW64(metadata.wow64);
 
   MaybeRecordMetrics(*ua_data);
 
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.cc b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
index 4d63553..41bb5dd 100644
--- a/third_party/blink/renderer/core/frame/navigator_ua_data.cc
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
@@ -104,6 +104,10 @@
   bitness_ = bitness;
 }
 
+void NavigatorUAData::SetWoW64(bool wow64) {
+  is_wow64_ = wow64;
+}
+
 bool NavigatorUAData::mobile() const {
   if (GetExecutionContext()) {
     return is_mobile_;
@@ -176,6 +180,10 @@
                         execution_context);
     } else if (hint == "fullVersionList") {
       values->setFullVersionList(full_version_list_);
+    } else if (hint == "wow64") {
+      values->setWow64(is_wow64_);
+      MaybeRecordMetric(record_identifiability, hint, is_wow64_ ? "?1" : "?0",
+                        execution_context);
     }
   }
 
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.h b/third_party/blink/renderer/core/frame/navigator_ua_data.h
index 20860ba..0e7bb9a 100644
--- a/third_party/blink/renderer/core/frame/navigator_ua_data.h
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.h
@@ -36,6 +36,7 @@
   void SetModel(const String& model);
   void SetUAFullVersion(const String& uaFullVersion);
   void SetBitness(const String& bitness);
+  void SetWoW64(bool wow64);
 
   // IDL implementation
   const HeapVector<Member<NavigatorUABrandVersion>>& brands() const;
@@ -57,6 +58,7 @@
   String model_;
   String ua_full_version_;
   String bitness_;
+  bool is_wow64_ = false;
 
   void AddBrandVersion(const String& brand, const String& version);
   void AddBrandFullVersion(const String& brand, const String& version);
diff --git a/third_party/blink/renderer/core/frame/ua_data_values.idl b/third_party/blink/renderer/core/frame/ua_data_values.idl
index 5707047..63d565a 100644
--- a/third_party/blink/renderer/core/frame/ua_data_values.idl
+++ b/third_party/blink/renderer/core/frame/ua_data_values.idl
@@ -14,4 +14,5 @@
   DOMString uaFullVersion;
   DOMString bitness;
   sequence<NavigatorUABrandVersion> fullVersionList;
+  boolean wow64;
 };
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 0b5eb64..1c14d32 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -145,6 +145,12 @@
   STATIC_ONLY(CrossThreadCopier);
 };
 
+template <>
+struct CrossThreadCopier<base::OnceCallback<void(gfx::CALayerResult)>>
+    : public CrossThreadCopierByValuePassThrough<
+          base::OnceCallback<void(gfx::CALayerResult)>> {
+  STATIC_ONLY(CrossThreadCopier);
+};
 }  // namespace WTF
 
 namespace blink {
@@ -2848,10 +2854,14 @@
   ReportTimeSwapPromise(
       base::OnceCallback<void(base::TimeTicks)> swap_time_callback,
       base::OnceCallback<void(base::TimeTicks)> presentation_time_callback,
+      base::OnceCallback<void(gfx::CALayerResult)>
+          core_animation_error_code_callback,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       WebFrameWidgetImpl* widget)
       : swap_time_callback_(std::move(swap_time_callback)),
         presentation_time_callback_(std::move(presentation_time_callback)),
+        core_animation_error_code_callback_(
+            std::move(core_animation_error_code_callback)),
         task_runner_(std::move(task_runner)),
         widget_(widget) {}
 
@@ -2876,13 +2886,15 @@
         CrossThreadBindOnce(
             &RunCallbackAfterSwap, widget_, base::TimeTicks::Now(),
             std::move(swap_time_callback_),
-            std::move(presentation_time_callback_), frame_token_));
+            std::move(presentation_time_callback_),
+            std::move(core_animation_error_code_callback_), frame_token_));
   }
 
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
     ReportSwapAndPresentationFailureOnTaskRunner(
         task_runner_, std::move(swap_time_callback_),
-        std::move(presentation_time_callback_), base::TimeTicks::Now());
+        std::move(presentation_time_callback_),
+        std::move(core_animation_error_code_callback_), base::TimeTicks::Now());
     return DidNotSwapAction::BREAK_PROMISE;
   }
 
@@ -2894,6 +2906,8 @@
       base::TimeTicks swap_time,
       base::OnceCallback<void(base::TimeTicks)> swap_time_callback,
       base::OnceCallback<void(base::TimeTicks)> presentation_time_callback,
+      base::OnceCallback<void(gfx::CALayerResult)>
+          core_animation_error_code_callback,
       int frame_token) {
     // If the widget was collected or the widget wasn't collected yet, but
     // it was closed don't schedule a presentation callback.
@@ -2903,9 +2917,18 @@
           WTF::Bind(&RunCallbackAfterPresentation,
                     std::move(presentation_time_callback), swap_time));
       ReportTime(std::move(swap_time_callback), swap_time);
+
+#if BUILDFLAG(IS_MAC)
+      if (core_animation_error_code_callback) {
+        widget->widget_base_->AddCoreAnimationErrorCodeCallback(
+            frame_token, std::move(core_animation_error_code_callback));
+      }
+#endif
     } else {
       ReportTime(std::move(swap_time_callback), swap_time);
       ReportTime(std::move(presentation_time_callback), swap_time);
+      ReportErrorCode(std::move(core_animation_error_code_callback),
+                      gfx::kCALayerUnknownNoWidget);
     }
   }
 
@@ -2933,11 +2956,19 @@
     if (callback)
       std::move(callback).Run(time);
   }
+  static void ReportErrorCode(
+      base::OnceCallback<void(gfx::CALayerResult)> callback,
+      gfx::CALayerResult error_code) {
+    if (callback)
+      std::move(callback).Run(error_code);
+  }
 
   static void ReportSwapAndPresentationFailureOnTaskRunner(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       base::OnceCallback<void(base::TimeTicks)> swap_time_callback,
       base::OnceCallback<void(base::TimeTicks)> presentation_time_callback,
+      base::OnceCallback<void(gfx::CALayerResult)>
+          core_animation_error_code_callback,
       base::TimeTicks failure_time) {
     if (!task_runner->BelongsToCurrentThread()) {
       PostCrossThreadTask(
@@ -2945,16 +2976,21 @@
           CrossThreadBindOnce(&ReportSwapAndPresentationFailureOnTaskRunner,
                               task_runner, std::move(swap_time_callback),
                               std::move(presentation_time_callback),
+                              std::move(core_animation_error_code_callback),
                               failure_time));
       return;
     }
 
     ReportTime(std::move(swap_time_callback), failure_time);
     ReportTime(std::move(presentation_time_callback), failure_time);
+    ReportErrorCode(std::move(core_animation_error_code_callback),
+                    gfx::kCALayerUnknownDidNotSwap);
   }
 
   base::OnceCallback<void(base::TimeTicks)> swap_time_callback_;
   base::OnceCallback<void(base::TimeTicks)> presentation_time_callback_;
+  base::OnceCallback<void(gfx::CALayerResult)>
+      core_animation_error_code_callback_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   CrossThreadWeakPersistent<WebFrameWidgetImpl> widget_;
   uint32_t frame_token_ = 0;
@@ -2964,29 +3000,44 @@
     base::OnceCallback<void(base::TimeTicks)> swap_callback,
     base::OnceCallback<void(base::TimeTicks)> presentation_callback) {
   NotifySwapAndPresentationTime(std::move(swap_callback),
-                                std::move(presentation_callback));
+                                std::move(presentation_callback),
+                                base::NullCallback());
 }
 
 void WebFrameWidgetImpl::NotifyPresentationTimeInBlink(
     base::OnceCallback<void(base::TimeTicks)> presentation_callback) {
   NotifySwapAndPresentationTime(base::NullCallback(),
-                                std::move(presentation_callback));
+                                std::move(presentation_callback),
+                                base::NullCallback());
 }
 
 void WebFrameWidgetImpl::NotifyPresentationTime(
     base::OnceCallback<void(base::TimeTicks)> presentation_callback) {
   NotifySwapAndPresentationTime(base::NullCallback(),
-                                std::move(presentation_callback));
+                                std::move(presentation_callback),
+                                base::NullCallback());
 }
 
+#if BUILDFLAG(IS_MAC)
+void WebFrameWidgetImpl::NotifyCoreAnimationErrorCode(
+    base::OnceCallback<void(gfx::CALayerResult)>
+        core_animation_error_code_callback) {
+  NotifySwapAndPresentationTime(base::NullCallback(), base::NullCallback(),
+                                std::move(core_animation_error_code_callback));
+}
+#endif
+
 void WebFrameWidgetImpl::NotifySwapAndPresentationTime(
     base::OnceCallback<void(base::TimeTicks)> swap_time_callback,
-    base::OnceCallback<void(base::TimeTicks)> presentation_time_callback) {
+    base::OnceCallback<void(base::TimeTicks)> presentation_time_callback,
+    base::OnceCallback<void(gfx::CALayerResult)>
+        core_animation_error_code_callback) {
   if (!View()->does_composite())
     return;
   widget_base_->LayerTreeHost()->QueueSwapPromise(
       std::make_unique<ReportTimeSwapPromise>(
           std::move(swap_time_callback), std::move(presentation_time_callback),
+          std::move(core_animation_error_code_callback),
           widget_base_->LayerTreeHost()
               ->GetTaskRunnerProvider()
               ->MainThreadTaskRunner(),
@@ -4244,19 +4295,20 @@
     plugin->ImeFinishComposingTextForPlugin(keep_selection);
 }
 
-void WebFrameWidgetImpl::SetWindowRect(const gfx::Rect& window_rect) {
+void WebFrameWidgetImpl::SetWindowRect(const gfx::Rect& requested_rect,
+                                       const gfx::Rect& adjusted_rect) {
   DCHECK(ForMainFrame());
   if (SynchronousResizeModeForTestingEnabled()) {
     // This is a web-test-only path. At one point, it was planned to be
     // removed. See https://crbug.com/309760.
-    SetWindowRectSynchronously(window_rect);
+    SetWindowRectSynchronously(adjusted_rect);
     return;
   }
 
-  SetPendingWindowRect(window_rect);
+  SetPendingWindowRect(adjusted_rect);
   View()->SendWindowRectToMainFrameHost(
-      window_rect, WTF::Bind(&WebFrameWidgetImpl::AckPendingWindowRect,
-                             WrapWeakPersistent(this)));
+      requested_rect, WTF::Bind(&WebFrameWidgetImpl::AckPendingWindowRect,
+                                WrapWeakPersistent(this)));
 }
 
 void WebFrameWidgetImpl::SetWindowRectSynchronouslyForTesting(
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index 6efc0aa..a717e2c 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -73,6 +73,7 @@
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
 #include "ui/base/mojom/ui_base_types.mojom-shared.h"
+#include "ui/gfx/ca_layer_result.h"
 
 namespace gfx {
 class Point;
@@ -313,6 +314,10 @@
       mojom::blink::ViewportIntersectionStatePtr intersection_state);
   void NotifyPresentationTime(
       base::OnceCallback<void(base::TimeTicks)> callback) override;
+#if BUILDFLAG(IS_MAC)
+  void NotifyCoreAnimationErrorCode(
+      base::OnceCallback<void(gfx::CALayerResult)> callback) override;
+#endif
   scheduler::WebRenderWidgetSchedulingState* RendererWidgetSchedulingState()
       override;
   void WaitForDebuggerWhenShown() override;
@@ -511,7 +516,8 @@
   // pixels).
   gfx::Size DIPsToCeiledBlinkSpace(const gfx::Size& size);
 
-  void SetWindowRect(const gfx::Rect& window_rect);
+  void SetWindowRect(const gfx::Rect& requested_rect,
+                     const gfx::Rect& adjusted_rect);
   void SetWindowRectSynchronouslyForTesting(const gfx::Rect& new_window_rect);
 
   void UpdateTooltipUnderCursor(const String& tooltip_text, TextDirection dir);
@@ -636,7 +642,9 @@
 
   void NotifySwapAndPresentationTime(
       base::OnceCallback<void(base::TimeTicks)> swap_callback,
-      base::OnceCallback<void(base::TimeTicks)> presentation_callback);
+      base::OnceCallback<void(base::TimeTicks)> presentation_callback,
+      base::OnceCallback<void(gfx::CALayerResult)>
+          core_animation_error_code_callback);
 
   // WidgetBaseClient overrides.
   void BeginCommitCompositorFrame() override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
index f8f5337..990e9afb 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
@@ -296,6 +296,10 @@
   return true;
 }
 
+void HTMLFormControlElementWithState::ResetImpl() {
+  user_has_edited_the_field_ = false;
+}
+
 int HTMLFormControlElementWithState::DefaultTabIndex() const {
   return 0;
 }
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
index dc8687b6..5833de4 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
@@ -64,6 +64,8 @@
   void FinishParsingChildren() override;
   bool IsFormControlElementWithState() const final;
 
+  void ResetImpl() override;
+
  private:
   int DefaultTabIndex() const override;
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 6f1943d3..98c9d6c 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -1015,6 +1015,7 @@
 
   setChecked(FastHasAttribute(html_names::kCheckedAttr));
   dirty_checkedness_ = false;
+  HTMLFormControlElementWithState::ResetImpl();
 }
 
 bool HTMLInputElement::IsTextField() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index 4418541a..bc074387 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1029,6 +1029,7 @@
   ResetToDefaultSelection();
   select_type_->UpdateTextStyleAndContent();
   SetNeedsValidityCheck();
+  HTMLFormControlElementWithState::ResetImpl();
 }
 
 bool HTMLSelectElement::PopupIsVisible() const {
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 4fb0a2f..e1036d1 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -591,7 +591,7 @@
     lazy_load_frame_observer_->StartTrackingVisibilityMetrics();
 
   if (ShouldLazilyLoadFrame(GetDocument(), loading_lazy_set) ||
-      IsLazyLoadableUrl(url)) {
+      IsLazyLoadableUrl(url) || IsLazyLoadableAd()) {
     lazy_load_frame_observer_->DeferLoadUntilNearViewport(request,
                                                           frame_load_type);
     return true;
@@ -776,6 +776,15 @@
   return content_frame_->IsAdSubframe();
 }
 
+bool HTMLFrameOwnerElement::IsLazyLoadableAd() const {
+  if (!base::FeatureList::IsEnabled(
+          features::kAutomaticLazyFrameLoadingToAds)) {
+    return false;
+  }
+
+  return IsAdRelated();
+}
+
 mojom::blink::ColorScheme HTMLFrameOwnerElement::GetColorScheme() const {
   if (const auto* style = GetComputedStyle())
     return style->UsedColorScheme();
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.h b/third_party/blink/renderer/core/html/html_frame_owner_element.h
index 7d14b83..a9bbc5a 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.h
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.h
@@ -193,6 +193,7 @@
   void SetIsSwappingFrames(bool is_swapping) override {
     is_swapping_frames_ = is_swapping;
   }
+  bool IsLazyLoadableAd() const;
 
   // Check if the frame should be lazy-loaded and apply when conditions are
   // passed. Return true when lazy-load is applied.
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index c75f06a..fe5af27ac 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -444,11 +444,6 @@
 
 }  // anonymous namespace
 
-// TODO(https://crbug.com/752720): Remove this once C++17 is adopted (and hence,
-// `inline constexpr` is supported).
-constexpr double HTMLMediaElement::kMinPlaybackRate;
-constexpr double HTMLMediaElement::kMaxPlaybackRate;
-
 // static
 MIMETypeRegistry::SupportsType HTMLMediaElement::GetSupportsType(
     const ContentType& content_type) {
diff --git a/third_party/blink/renderer/core/layout/layout_video.cc b/third_party/blink/renderer/core/layout/layout_video.cc
index 94f33933..6a7b3d9 100644
--- a/third_party/blink/renderer/core/layout/layout_video.cc
+++ b/third_party/blink/renderer/core/layout/layout_video.cc
@@ -222,6 +222,9 @@
 
 CompositingReasons LayoutVideo::AdditionalCompositingReasons() const {
   NOT_DESTROYED();
+  if (!RuntimeEnabledFeatures::CompositeVideoElementEnabled())
+    return CompositingReason::kNone;
+
   auto* element = To<HTMLMediaElement>(GetNode());
   if (element->IsFullscreen() && element->UsesOverlayFullscreenVideo())
     return CompositingReason::kVideo;
diff --git a/third_party/blink/renderer/core/layout/layout_video.h b/third_party/blink/renderer/core/layout/layout_video.h
index 745bfe4..0f3c437c 100644
--- a/third_party/blink/renderer/core/layout/layout_video.h
+++ b/third_party/blink/renderer/core/layout/layout_video.h
@@ -83,7 +83,7 @@
 
   bool CanHaveAdditionalCompositingReasons() const override {
     NOT_DESTROYED();
-    return true;
+    return RuntimeEnabledFeatures::CompositeVideoElementEnabled();
   }
   CompositingReasons AdditionalCompositingReasons() const override;
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index 3780576..b38d844 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -733,8 +733,10 @@
         // If this is the initial column balancing pass, attempt to make the
         // column block-size at least as large as the tallest piece of
         // monolithic content and/or block with break-inside:avoid.
-        PropagateUnbreakableBlockSize(fragment.BlockSize(),
-                                      fragmentainer_block_offset, builder);
+        LayoutUnit block_size = BlockSizeForFragmentation(
+            layout_result, space.GetWritingDirection());
+        PropagateUnbreakableBlockSize(block_size, fragmentainer_block_offset,
+                                      builder);
       }
     }
     // We only care about soft breaks if we have a fragmentainer block-size.
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.cc b/third_party/blink/renderer/core/loader/base_fetch_context.cc
index 539bc71..6070214 100644
--- a/third_party/blink/renderer/core/loader/base_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.cc
@@ -441,6 +441,17 @@
 
     if (ShouldSendClientHint(
             ClientHintsMode::kStandard, policy, resource_origin, is_1p_origin,
+            network::mojom::blink::WebClientHintsType::kUAWoW64,
+            hints_preferences)) {
+      request.SetHttpHeaderField(
+          network::GetClientHintToNameMap()
+              .at(network::mojom::blink::WebClientHintsType::kUAWoW64)
+              .c_str(),
+          SerializeBoolHeader(ua->wow64));
+    }
+
+    if (ShouldSendClientHint(
+            ClientHintsMode::kStandard, policy, resource_origin, is_1p_origin,
             network::mojom::blink::WebClientHintsType::kUAReduced,
             hints_preferences)) {
       // If the UA-Reduced client hint should be sent according to the hints
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 7633115..b7afd65 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -860,6 +860,11 @@
     history_item_->SetAppHistoryKey(old_item->GetAppHistoryKey());
   }
 
+  // The AppHistory id corresponds to a "session history entry", and so should
+  // be carried over across reloads.
+  if (IsReloadLoadType(load_type))
+    history_item_->SetAppHistoryId(old_item->GetAppHistoryId());
+
   // AppHistory's state is stickier than the legacy History state. It always
   // propagates by default to a same-document navigation.
   if (navigation_type == HistoryNavigationType::kFragment ||
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h
index 094de359..8a08a07 100644
--- a/third_party/blink/renderer/core/loader/empty_clients.h
+++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -99,10 +99,11 @@
   void DidFocusPage() override {}
   bool CanTakeFocus(mojom::blink::FocusType) override { return false; }
   void TakeFocus(mojom::blink::FocusType) override {}
-  void Show(const blink::LocalFrameToken& opener_frame_token,
+  void Show(LocalFrame& frame,
+            LocalFrame& opener_frame,
             NavigationPolicy navigation_policy,
             const gfx::Rect& initial_rect,
-            bool user_gesture) override {}
+            bool consumed_user_gesture) override {}
   void DidOverscroll(const gfx::Vector2dF&,
                      const gfx::Vector2dF&,
                      const gfx::PointF&,
diff --git a/third_party/blink/renderer/core/loader/frame_client_hints_preferences_context.cc b/third_party/blink/renderer/core/loader/frame_client_hints_preferences_context.cc
index c29b202..02da650 100644
--- a/third_party/blink/renderer/core/loader/frame_client_hints_preferences_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_client_hints_preferences_context.cc
@@ -70,6 +70,8 @@
        WebFeature::kClientHintsUAFullVersionList},
       {network::mojom::WebClientHintsType::kFullUserAgent,
        WebFeature::kClientHintsUAFull},
+      {network::mojom::WebClientHintsType::kUAWoW64,
+       WebFeature::kClientHintsUAWoW64},
   };
 }
 
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
index 9428302..dd2675b9 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h"
 
+#include <cmath>
+
 #include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h"
 #include "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom-blink.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
@@ -29,7 +31,7 @@
 
 namespace blink {
 
-static constexpr int kSmallFontThreshold = 9;
+static constexpr int kSmallFontThresholdInDips = 9;
 static constexpr int kTimeBudgetExceeded = -2;
 
 // Values of maximum-scale smaller than this threshold will be considered to
@@ -506,7 +508,7 @@
     double actual_font_size =
         style.FontSize() * initial_scale / viewport_scalar;
     double area = text->PhysicalAreaSize();
-    if (actual_font_size < kSmallFontThreshold)
+    if (std::round(actual_font_size) < kSmallFontThresholdInDips)
       text_area_sizes_.small_font_area += area;
 
     text_area_sizes_.total_text_area += area;
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
index 486403dbb..86c0566 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -79,6 +79,15 @@
     helper->Resize(gfx::Size(kDeviceWidth, kDeviceHeight));
     helper->GetWebView()->GetPage()->SetDefaultPageScaleLimits(kMinimumZoom,
                                                                kMaximumZoom);
+    // Model Chrome text auto-sizing more accurately.
+    helper->GetWebView()->GetPage()->GetSettings().SetTextAutosizingEnabled(
+        true);
+    helper->GetWebView()
+        ->GetPage()
+        ->GetSettings()
+        .SetShrinksViewportContentToFit(true);
+    helper->GetWebView()->GetPage()->GetSettings().SetViewportStyle(
+        mojom::blink::ViewportStyle::kMobile);
     return helper;
   }
 
@@ -553,6 +562,46 @@
   EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 100);
 }
 
+// This test shows that text will grow with text-size-adjust: auto in a
+// fixed-width table.
+TEST_F(MobileFriendlinessCheckerTest, FixedWidthTableTextSizeAdjustAuto) {
+  MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"(
+<html>
+  <body>
+    <table width="800">
+      <tr><td style="font-size: 12px; text-size-adjust: auto">
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+      </td></tr>
+    </table>
+  </body>
+</html>
+)");
+  EXPECT_EQ(actual_mf.small_text_ratio, 0);
+}
+
+// This test shows that text remains small with text-size-adjust: none in a
+// fixed-width table.
+TEST_F(MobileFriendlinessCheckerTest, FixedWidthTableTextSizeAdjustNone) {
+  MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"(
+<html>
+  <body>
+    <table width="800">
+      <tr><td style="font-size: 12px; text-size-adjust: none">
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+        blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+      </td></tr>
+    </table>
+  </body>
+</html>
+)");
+  EXPECT_EQ(actual_mf.small_text_ratio, 100);
+}
+
 TEST_F(MobileFriendlinessCheckerTest, TextNarrow) {
   MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"(
 <html>
diff --git a/third_party/blink/renderer/core/page/chrome_client.cc b/third_party/blink/renderer/core/page/chrome_client.cc
index 04ac076..2262b03d 100644
--- a/third_party/blink/renderer/core/page/chrome_client.cc
+++ b/third_party/blink/renderer/core/page/chrome_client.cc
@@ -53,77 +53,6 @@
   CoreInitializer::GetInstance().InstallSupplements(frame);
 }
 
-gfx::Rect ChromeClient::CalculateWindowRectWithAdjustment(
-    const gfx::Rect& pending_rect,
-    LocalFrame& frame,
-    LocalFrame& requesting_frame) {
-  gfx::Rect screen = GetScreenInfo(frame).available_rect;
-  gfx::Rect window = pending_rect;
-
-  gfx::Size minimum_size = MinimumWindowSize();
-  gfx::Size size_for_constraining_move = minimum_size;
-  // Let size 0 pass through, since that indicates default size, not minimum
-  // size.
-  if (window.width()) {
-    int width = std::max(minimum_size.width(), window.width());
-    // If the Window Placement experiment is enabled, the window could be placed
-    // on another screen, and so it should not be limited by the current screen.
-    // This relies on the embedder clamping bounds to the target screen for now.
-    // TODO(http://crbug.com/897300): Implement multi-screen clamping in Blink.
-    if (!RuntimeEnabledFeatures::WindowPlacementEnabled(
-            requesting_frame.DomWindow())) {
-      width = std::min(width, screen.width());
-    }
-    window.set_width(width);
-    size_for_constraining_move.set_width(window.width());
-  }
-  if (window.height()) {
-    int height = std::max(minimum_size.height(), window.height());
-    // If the Window Placement experiment is enabled, the window could be placed
-    // on another screen, and so it should not be limited by the current screen.
-    // This relies on the embedder clamping bounds to the target screen for now.
-    // TODO(http://crbug.com/897300): Implement multi-screen clamping in Blink.
-    if (!RuntimeEnabledFeatures::WindowPlacementEnabled(
-            requesting_frame.DomWindow())) {
-      height = std::min(height, screen.height());
-    }
-    window.set_height(height);
-    size_for_constraining_move.set_height(window.height());
-  }
-
-  // If the Window Placement experiment is enabled, the window could be placed
-  // on another screen, and so it should not be limited by the current screen.
-  // This relies on the embedder clamping bounds to the target screen for now.
-  // TODO(http://crbug.com/897300): Implement multi-screen clamping in Blink.
-  if (!RuntimeEnabledFeatures::WindowPlacementEnabled(
-          requesting_frame.DomWindow())) {
-    // Constrain the window position within the valid screen area.
-    window.set_x(std::max(
-        screen.x(),
-        std::min(window.x(),
-                 screen.right() - size_for_constraining_move.width())));
-    window.set_y(std::max(
-        screen.y(),
-        std::min(window.y(),
-                 screen.bottom() - size_for_constraining_move.height())));
-  }
-
-  // Coarsely measure whether coordinates may be requesting another screen.
-  if (!screen.Contains(window)) {
-    UseCounter::Count(frame.DomWindow(),
-                      WebFeature::kDOMWindowSetWindowRectCrossScreen);
-  }
-
-  return window;
-}
-
-void ChromeClient::SetWindowRectWithAdjustment(const gfx::Rect& pending_rect,
-                                               LocalFrame& frame) {
-  gfx::Rect rect =
-      CalculateWindowRectWithAdjustment(pending_rect, frame, frame);
-  SetWindowRect(rect, frame);
-}
-
 bool ChromeClient::CanOpenUIElementIfDuringPageDismissal(
     Frame& main_frame,
     UIElementType ui_element_type,
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h
index a3c4dd0a..fb070ab 100644
--- a/third_party/blink/renderer/core/page/chrome_client.h
+++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -134,6 +134,8 @@
 
   virtual void ChromeDestroyed() = 0;
 
+  virtual void SetWindowRect(const gfx::Rect&, LocalFrame&) = 0;
+
   // For non-composited WebViews that exist to contribute to a "parent" WebView
   // painting. This informs the client of the area that needs to be redrawn.
   virtual void InvalidateContainer() = 0;
@@ -148,20 +150,6 @@
   virtual void ScheduleAnimation(const LocalFrameView*,
                                  base::TimeDelta delay) = 0;
 
-  // Adjusts |pending_rect| for the minimum window size and |frame|'s screen
-  // and returns the adjusted value.
-  // Cross-screen window placements are passed on without same-screen clamping
-  // if the |requesting_frame| (i.e. the opener or |frame| itself) has
-  // experimental window placement features enabled. The browser will check
-  // permissions before actually supporting cross-screen placement requests.
-  gfx::Rect CalculateWindowRectWithAdjustment(const gfx::Rect& pending_rect,
-                                              LocalFrame& frame,
-                                              LocalFrame& requesting_frame);
-
-  // Calls CalculateWindowRectWithAdjustment, then SetWindowRect.
-  void SetWindowRectWithAdjustment(const gfx::Rect& pending_rect,
-                                   LocalFrame& frame);
-
   // Tells the browser that another page has accessed the DOM of the initial
   // empty document of a main frame.
   virtual void DidAccessInitialMainDocument() = 0;
@@ -236,7 +224,8 @@
   // shown. Under some circumstances CreateWindow's implementation may return a
   // previously shown page. Calling this method should still work and the
   // browser will discard the unnecessary show request.
-  virtual void Show(const blink::LocalFrameToken& opener_frame_token,
+  virtual void Show(LocalFrame& frame,
+                    LocalFrame& opener_frame,
                     NavigationPolicy navigation_policy,
                     const gfx::Rect& initial_rect,
                     bool consumed_user_gesture) = 0;
@@ -560,7 +549,6 @@
   ChromeClient() = default;
 
   virtual void ShowMouseOverURL(const HitTestResult&) = 0;
-  virtual void SetWindowRect(const gfx::Rect&, LocalFrame&) = 0;
   virtual bool OpenBeforeUnloadConfirmPanelDelegate(LocalFrame*,
                                                     bool is_reload) = 0;
   virtual bool OpenJavaScriptAlertDelegate(LocalFrame*, const String&) = 0;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index c442ddf..c594988d 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -198,10 +198,22 @@
   web_view_ = nullptr;
 }
 
-void ChromeClientImpl::SetWindowRect(const gfx::Rect& r, LocalFrame& frame) {
+void ChromeClientImpl::SetWindowRect(const gfx::Rect& requested_rect,
+                                     LocalFrame& frame) {
   DCHECK(web_view_);
   DCHECK_EQ(&frame, web_view_->MainFrameImpl()->GetFrame());
-  web_view_->MainFrameViewWidget()->SetWindowRect(r);
+  const gfx::Rect adjusted_rect =
+      CalculateWindowRectWithAdjustment(requested_rect, frame);
+  // Request the unadjusted rect if the browser may honor cross-screen bounds.
+  // Permission state is not readily available, so adjusted bounds are clamped
+  // to the same-screen, to retain legacy behavior of synchronous pending values
+  // and to avoid exposing other screen details to frames without permission.
+  // TODO(crbug.com/897300): Use permission state for better sync estimates or
+  // store unadjusted pending window rects if that will not break many sites.
+  const bool request_unadjusted_rect =
+      RuntimeEnabledFeatures::WindowPlacementEnabled(frame.DomWindow());
+  web_view_->MainFrameViewWidget()->SetWindowRect(
+      request_unadjusted_rect ? requested_rect : adjusted_rect, adjusted_rect);
 }
 
 gfx::Rect ChromeClientImpl::RootWindowRect(LocalFrame& frame) {
@@ -325,13 +337,25 @@
       overscroll_behavior);
 }
 
-void ChromeClientImpl::Show(const blink::LocalFrameToken& opener_frame_token,
+void ChromeClientImpl::Show(LocalFrame& frame,
+                            LocalFrame& opener_frame,
                             NavigationPolicy navigation_policy,
                             const gfx::Rect& initial_rect,
                             bool user_gesture) {
   DCHECK(web_view_);
-  web_view_->Show(opener_frame_token, navigation_policy, initial_rect,
-                  user_gesture);
+  const gfx::Rect adjusted_rect =
+      CalculateWindowRectWithAdjustment(initial_rect, frame);
+  // Request the unadjusted rect if the browser may honor cross-screen bounds.
+  // Permission state is not readily available, so adjusted bounds are clamped
+  // to the same-screen, to retain legacy behavior of synchronous pending values
+  // and to avoid exposing other screen details to frames without permission.
+  // TODO(crbug.com/897300): Use permission state for better sync estimates or
+  // store unadjusted pending window rects if that will not break many sites.
+  const bool request_unadjusted_rect =
+      RuntimeEnabledFeatures::WindowPlacementEnabled(opener_frame.DomWindow());
+  web_view_->Show(opener_frame.GetLocalFrameToken(), navigation_policy,
+                  request_unadjusted_rect ? initial_rect : adjusted_rect,
+                  adjusted_rect, user_gesture);
 }
 
 bool ChromeClientImpl::ShouldReportDetailedMessageForSourceAndSeverity(
@@ -1282,4 +1306,46 @@
   }
 }
 
+gfx::Rect ChromeClientImpl::CalculateWindowRectWithAdjustment(
+    const gfx::Rect& pending_rect,
+    LocalFrame& frame) {
+  gfx::Rect screen = GetScreenInfo(frame).available_rect;
+  gfx::Rect window = pending_rect;
+
+  gfx::Size minimum_size = MinimumWindowSize();
+  gfx::Size size_for_constraining_move = minimum_size;
+  // Let size 0 pass through, since that indicates default size, not minimum
+  // size.
+  if (window.width()) {
+    int width = std::max(minimum_size.width(), window.width());
+    width = std::min(width, screen.width());
+    window.set_width(width);
+    size_for_constraining_move.set_width(window.width());
+  }
+  if (window.height()) {
+    int height = std::max(minimum_size.height(), window.height());
+    height = std::min(height, screen.height());
+    window.set_height(height);
+    size_for_constraining_move.set_height(window.height());
+  }
+
+  // Constrain the window position within the valid screen area.
+  window.set_x(
+      std::max(screen.x(),
+               std::min(window.x(),
+                        screen.right() - size_for_constraining_move.width())));
+  window.set_y(std::max(
+      screen.y(),
+      std::min(window.y(),
+               screen.bottom() - size_for_constraining_move.height())));
+
+  // Coarsely measure whether coordinates may be requesting another screen.
+  if (!screen.Contains(window)) {
+    UseCounter::Count(frame.DomWindow(),
+                      WebFeature::kDOMWindowSetWindowRectCrossScreen);
+  }
+
+  return window;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h
index 92ae9f0a..7e5a85b2 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.h
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -92,7 +92,8 @@
                              network::mojom::blink::WebSandboxFlags,
                              const SessionStorageNamespaceId&,
                              bool& consumed_user_gesture) override;
-  void Show(const blink::LocalFrameToken& opener_frame_token,
+  void Show(LocalFrame& frame,
+            LocalFrame& opener_frame,
             NavigationPolicy navigation_policy,
             const gfx::Rect& initial_rect,
             bool user_gesture) override;
@@ -306,6 +307,16 @@
   // returns nullable.
   WebAutofillClient* AutofillClientFromFrame(LocalFrame*);
 
+  // Returns a copy of |pending_rect|, adjusted for minimum window size and
+  // available screen area constraints. This is used to synchronously estimate,
+  // or preemptively apply, anticipated browser- or OS-imposed constraints.
+  // Note: This applies legacy same-screen constraints; use un-adjusted values
+  // if permission-gated cross-screen window placement requests may be honored.
+  // TODO(crbug.com/897300): Use permission state for better sync estimates or
+  // store unadjusted pending window rects if that will not break many sites.
+  gfx::Rect CalculateWindowRectWithAdjustment(const gfx::Rect& pending_rect,
+                                              LocalFrame& frame);
+
   WebViewImpl* web_view_;  // Weak pointer.
   HeapHashSet<WeakMember<PopupOpeningObserver>> popup_opening_observers_;
   Vector<scoped_refptr<FileChooser>> file_chooser_queue_;
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc
index 63eb376..13d1a67 100644
--- a/third_party/blink/renderer/core/page/create_window.cc
+++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -377,10 +377,8 @@
   if (features.height_set)
     window_rect.set_height(features.height);
 
-  gfx::Rect rect = page->GetChromeClient().CalculateWindowRectWithAdjustment(
-      window_rect, frame, opener_frame);
-  page->GetChromeClient().Show(opener_frame.GetLocalFrameToken(),
-                               request.GetNavigationPolicy(), rect,
+  page->GetChromeClient().Show(frame, opener_frame,
+                               request.GetNavigationPolicy(), window_rect,
                                consumed_user_gesture);
   MaybeLogWindowOpen(opener_frame);
   return &frame;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index 379bb7d..3a55bba5 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -164,16 +164,6 @@
 
   GetLayoutBox()->GetDocument().GetSnapCoordinator().AddSnapContainer(
       *GetLayoutBox());
-
-  LocalFrame* frame = GetLayoutBox()->GetFrame();
-  if (!frame)
-    return;
-
-  LocalFrameView* frame_view = frame->View();
-  if (!frame_view)
-    return;
-
-  frame_view->AddScrollableArea(this);
 }
 
 PaintLayerScrollableArea::~PaintLayerScrollableArea() {
@@ -206,6 +196,7 @@
   if (LocalFrame* frame = GetLayoutBox()->GetFrame()) {
     if (LocalFrameView* frame_view = frame->View()) {
       frame_view->RemoveScrollableArea(this);
+      frame_view->RemoveUserScrollableArea(this);
       frame_view->RemoveAnimatingScrollableArea(this);
     }
   }
@@ -2318,6 +2309,10 @@
       ((HasHorizontalOverflow() && GetLayoutBox()->ScrollsOverflowX()) ||
        (HasVerticalOverflow() && GetLayoutBox()->ScrollsOverflowY()));
 
+  bool overflows_in_block_direction = GetLayoutBox()->IsHorizontalWritingMode()
+                                          ? HasVerticalOverflow()
+                                          : HasHorizontalOverflow();
+
   bool is_visible_to_hit_test =
       GetLayoutBox()->StyleRef().VisibleToHitTesting();
   bool did_scroll_overflow = scrolls_overflow_;
@@ -2331,6 +2326,14 @@
   }
 
   scrolls_overflow_ = has_overflow && is_visible_to_hit_test;
+
+  if (scrolls_overflow_ || overflows_in_block_direction) {
+    DCHECK(CanHaveOverflowScrollbars(*GetLayoutBox()));
+    frame_view->AddScrollableArea(this);
+  } else {
+    frame_view->RemoveScrollableArea(this);
+  }
+
   if (did_scroll_overflow == ScrollsOverflow())
     return;
 
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
index 5879529..32bbab4 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -441,11 +441,9 @@
       const PhysicalRect&,
       const mojom::blink::ScrollIntoViewParamsPtr&) override;
 
-  // Returns true if scrollable area is in the FrameView's collection of
-  // scrollable areas. This can only happen if we're scrollable, visible to hit
-  // test, and do in fact overflow. This means that 'overflow: hidden' or
-  // 'pointer-events: none' layers never get added to the FrameView's
-  // collection.
+  // Returns true if the scrollable area is user-scrollable, visible to hit
+  // testing, and it does in fact overflow. This means this method will return
+  // false for 'overflow: hidden' and 'pointer-events: none'.
   bool ScrollsOverflow() const { return scrolls_overflow_; }
 
   // Rectangle encompassing the scroll corner and resizer rect.
diff --git a/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5 b/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5
index c13ed4c..4e302c5d 100644
--- a/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5
+++ b/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5
@@ -142,6 +142,10 @@
       permissions_policy_name: "ch-ua-platform-version",
     },
     {
+      name: "ClientHintUAWoW64",
+      permissions_policy_name: "ch-ua-wow64",
+    },
+    {
       name: "ClientHintUAReduced",
       permissions_policy_name: "ch-ua-reduced",
       depends_on: ["UserAgentReduction"],
diff --git a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc
index c6e9435..b3caefd5 100644
--- a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc
@@ -225,7 +225,8 @@
   if (!LayerTreeHost()->IsVisible())
     return;
 
-  if (base::FeatureList::IsEnabled(blink::features::kNoForcedFrameUpdates) &&
+  if (base::FeatureList::IsEnabled(
+          blink::features::kNoForcedFrameUpdatesForWebTests) &&
       LayerTreeHost()->MainFrameUpdatesAreDeferred()) {
     return;
   }
diff --git a/third_party/blink/renderer/extensions/chromeos/chromeos.cc b/third_party/blink/renderer/extensions/chromeos/chromeos.cc
index 245c2066..d25d30a6 100644
--- a/third_party/blink/renderer/extensions/chromeos/chromeos.cc
+++ b/third_party/blink/renderer/extensions/chromeos/chromeos.cc
@@ -13,7 +13,7 @@
 ChromeOS::ChromeOS(ExecutionContext* execution_context)
     : window_management_(
           MakeGarbageCollected<CrosWindowManagement>(execution_context)),
-      hid_(MakeGarbageCollected<CrosHID>()) {}
+      hid_(MakeGarbageCollected<CrosHID>(execution_context)) {}
 
 CrosWindowManagement* ChromeOS::windowManagement() {
   return window_management_;
diff --git a/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/DEPS b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/DEPS
new file mode 100644
index 0000000..60bba96
--- /dev/null
+++ b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+    "+services/device/public/mojom/hid.mojom-blink.h",
+    "+services/device/public/mojom/hid.mojom-blink-forward.h",
+]
\ No newline at end of file
diff --git a/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.cc b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.cc
index 4e748e37c..3065348 100644
--- a/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.cc
+++ b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.cc
@@ -4,22 +4,140 @@
 
 #include "third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.h"
 
-#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom-blink.h"
+#include "third_party/blink/public/mojom/hid/hid.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_hid_device_filter.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_hid_device_request_options.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/modules/hid/hid_device.h"
 
 namespace blink {
 
+namespace {
+
+void OnAccessDevicesResponse(
+    ScriptPromiseResolver* resolver,
+    WTF::Vector<device::mojom::blink::HidDeviceInfoPtr> device_infos) {
+  HeapVector<Member<HIDDevice>> devices;
+  // TODO(b/214330822) Implement new HIDDevice constructor to work with HID
+  // System Extension.
+
+  resolver->Resolve(devices);
+}
+
+void RejectWithTypeError(const String& message,
+                         ScriptPromiseResolver* resolver) {
+  ScriptState::Scope scope(resolver->GetScriptState());
+  v8::Isolate* isolate = resolver->GetScriptState()->GetIsolate();
+  resolver->Reject(V8ThrowException::CreateTypeError(isolate, message));
+}
+
+// Converts a HID device |filter| into the equivalent Mojo type and returns it.
+// If the filter is invalid, nullptr is returned and |resolver| rejects the
+// promise with a TypeError.
+mojom::blink::HidDeviceFilterPtr ConvertDeviceFilter(
+    const HIDDeviceFilter& filter,
+    ScriptPromiseResolver* resolver) {
+  // TODO(b/216239205): Reuse ConvertDeviceFilter and CheckDeviceFilterValidity
+  // from ::blink::HID after refactoring with
+  // https://chromium-review.googlesource.com/c/chromium/src/+/3411959.
+
+  if (!filter.hasVendorId() && !filter.hasProductId() &&
+      !filter.hasUsagePage() && !filter.hasUsage()) {
+    RejectWithTypeError("A filter must provide a property to filter by.",
+                        resolver);
+    return nullptr;
+  }
+
+  if (filter.hasProductId() && !filter.hasVendorId()) {
+    RejectWithTypeError(
+        "A filter containing a productId must also contain a vendorId.",
+        resolver);
+    return nullptr;
+  }
+
+  if (filter.hasUsage() && !filter.hasUsagePage()) {
+    RejectWithTypeError(
+        "A filter containing a usage must also contain a usagePage.", resolver);
+    return nullptr;
+  }
+
+  auto mojo_filter = mojom::blink::HidDeviceFilter::New();
+  if (filter.hasVendorId()) {
+    if (filter.hasProductId()) {
+      mojo_filter->device_ids =
+          mojom::blink::DeviceIdFilter::NewVendorAndProduct(
+              mojom::blink::VendorAndProduct::New(filter.vendorId(),
+                                                  filter.productId()));
+    } else {
+      mojo_filter->device_ids =
+          mojom::blink::DeviceIdFilter::NewVendor(filter.vendorId());
+    }
+  }
+  if (filter.hasUsagePage()) {
+    if (filter.hasUsage()) {
+      mojo_filter->usage = mojom::blink::UsageFilter::NewUsageAndPage(
+          device::mojom::blink::HidUsageAndPage::New(filter.usage(),
+                                                     filter.usagePage()));
+    } else {
+      mojo_filter->usage =
+          mojom::blink::UsageFilter::NewPage(filter.usagePage());
+    }
+  }
+  return mojo_filter;
+}
+
+}  // namespace
+
+CrosHID::CrosHID(ExecutionContext* execution_context)
+    : ExecutionContextClient(execution_context), cros_hid_(execution_context) {}
+
 void CrosHID::Trace(Visitor* visitor) const {
+  visitor->Trace(cros_hid_);
+  ExecutionContextClient::Trace(visitor);
   ScriptWrappable::Trace(visitor);
 }
 
+mojom::blink::CrosHID* CrosHID::GetCrosHIDOrNull() {
+  auto* execution_context = GetExecutionContext();
+  if (!execution_context) {
+    return nullptr;
+  }
+
+  if (!cros_hid_.is_bound()) {
+    auto receiver = cros_hid_.BindNewPipeAndPassReceiver(
+        execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI));
+    execution_context->GetBrowserInterfaceBroker().GetInterface(
+        std::move(receiver));
+  }
+  return cros_hid_.get();
+}
+
 ScriptPromise CrosHID::requestDevice(ScriptState* script_state,
                                      const HIDDeviceRequestOptions* options) {
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  // TODO(b/214330353): Implement this method via a Mojo pipe.
-  resolver->Reject("Not implemented");
+  auto* cros_hid = GetCrosHIDOrNull();
+
+  if (cros_hid) {
+    Vector<mojom::blink::HidDeviceFilterPtr> mojo_filters;
+    if (options->hasFilters()) {
+      mojo_filters.ReserveCapacity(options->filters().size());
+      for (const auto& filter : options->filters()) {
+        auto mojo_filter = ConvertDeviceFilter(*filter, resolver);
+        if (!mojo_filter)
+          return resolver->Promise();
+        mojo_filters.push_back(std::move(mojo_filter));
+      }
+      DCHECK_EQ(options->filters().size(), mojo_filters.size());
+
+      cros_hid->AccessDevices(
+          std::move(mojo_filters),
+          WTF::Bind(&OnAccessDevicesResponse, WrapPersistent(resolver)));
+    }
+  }
+
   return resolver->Promise();
 }
 
diff --git a/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.h b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.h
index dbd72b7..40356696 100644
--- a/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.h
+++ b/third_party/blink/renderer/extensions/chromeos/system_extensions/hid/cros_hid.h
@@ -5,23 +5,34 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_EXTENSIONS_CHROMEOS_SYSTEM_EXTENSIONS_HID_CROS_HID_H_
 #define THIRD_PARTY_BLINK_RENDERER_EXTENSIONS_CHROMEOS_SYSTEM_EXTENSIONS_HID_CROS_HID_H_
 
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/chromeos/system_extensions/hid/cros_hid.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
 
 namespace blink {
 
 class HIDDeviceRequestOptions;
 
-class CrosHID : public ScriptWrappable {
+class CrosHID : public ScriptWrappable, public ExecutionContextClient {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  explicit CrosHID(ExecutionContext* execution_context);
+
+  void Trace(Visitor*) const override;
+
   ScriptPromise requestDevice(ScriptState* script_state,
                               const HIDDeviceRequestOptions*);
 
-  CrosHID() = default;
+ private:
+  // Returns the remote for communication with the browser's HID
+  // implementation. May return null in error cases.
+  mojom::blink::CrosHID* GetCrosHIDOrNull();
 
-  void Trace(Visitor*) const override;
+  HeapMojoRemote<mojom::blink::CrosHID> cros_hid_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 6410329..74a7db0 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1149,7 +1149,7 @@
 
   if (is_visible || is_focusable) {
     // If the author applied the ARIA "textbox" role on something that is not
-    // (currently) editable, this may be a read-only rich-text object. Or it
+    // (currently) editable, this may be read-only rich-text object. Or it
     // might just be bad authoring. Either way, we want to expose its
     // descendants, especially the interactive ones which might gain focus.
     bool is_non_atomic_textfield_root = IsARIATextField();
@@ -1915,12 +1915,16 @@
   SerializeSparseAttributes(node_data);
 
   if (Element* element = GetElement()) {
-    // Do not send the value attribute for non-atomic text fields in order to
-    // improve the performance of the cross-process communication with the
-    // browser process, and since it can be easily computed in that process.
-    TruncateAndAddStringAttribute(node_data,
-                                  ax::mojom::blink::StringAttribute::kValue,
-                                  GetValueForControl());
+    String value_text = SlowGetValueForControlIncludingContentEditable();
+    if (value_text.IsEmpty() && !IsRangeValueSupported()) {
+      // TODO(nektar) Once contenteditable values are computed on the browser
+      // side, only expose this when value text is non-empty.
+      node_data->AddStringAttribute(ax::mojom::blink::StringAttribute::kValue,
+                                    std::string());
+    } else {
+      TruncateAndAddStringAttribute(
+          node_data, ax::mojom::blink::StringAttribute::kValue, value_text);
+    }
 
     if (IsAtomicTextField()) {
       // Selection offsets are only used for plain text controls, (input of a
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.h
index ef53922..ebbdf840a 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.h
@@ -91,19 +91,20 @@
 
   explicit Path2D(ExecutionContext* context) : context_(context) {
     identifiability_study_helper_.SetExecutionContext(context);
+    path_.SetIsVolatile(false);
   }
   Path2D(ExecutionContext* context, const Path& path)
       : CanvasPath(path), context_(context) {
     identifiability_study_helper_.SetExecutionContext(context);
+    path_.SetIsVolatile(false);
   }
   Path2D(ExecutionContext* context, Path2D* path)
-      : CanvasPath(path->GetPath()), context_(context) {
-    identifiability_study_helper_.SetExecutionContext(context);
-  }
+      : Path2D(context, path->GetPath()) {}
   Path2D(ExecutionContext* context, const String& path_data)
       : context_(context) {
     identifiability_study_helper_.SetExecutionContext(context);
     BuildPathFromString(path_data, path_);
+    path_.SetIsVolatile(false);
   }
 
   Path2D(const Path2D&) = delete;
diff --git a/third_party/blink/renderer/platform/audio/audio_destination.cc b/third_party/blink/renderer/platform/audio/audio_destination.cc
index 4f07caa..1b5ac42 100644
--- a/third_party/blink/renderer/platform/audio/audio_destination.cc
+++ b/third_party/blink/renderer/platform/audio/audio_destination.cc
@@ -32,6 +32,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/metrics/histogram.h"
 #include "base/metrics/histogram_functions.h"
 #include "media/base/audio_bus.h"
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
@@ -174,7 +175,6 @@
     // the most common ratios to be the set 0.5, 44100/48000, and 48000/44100.
     // Other values are possible but seem unlikely.
     base::UmaHistogramSparse("WebAudio.AudioContextOptions.sampleRateRatio",
-
                              static_cast<int32_t>(100 * scale_factor + 0.5));
   }
 }
@@ -194,6 +194,18 @@
   CHECK_EQ(destination_data.size(), number_of_output_channels_);
   CHECK_EQ(number_of_frames, callback_buffer_size_);
 
+  if (!is_latency_metric_collected_ && delay != 0.0) {
+    // With the advanced distribution profile for a Bluetooth device
+    // (potentially devices with the largest latency), the known latency is
+    // around 100 ~ 150ms. Using a "linear" histogram where all buckets are
+    // exactly the same size (2ms).
+    base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
+        "WebAudio.AudioDestination.HardwareOutputLatency",
+        0, 200, 100, base::HistogramBase::kUmaTargetedHistogramFlag);
+    histogram->Add(static_cast<int32_t>(delay * 1000));
+    is_latency_metric_collected_ = true;
+  }
+
   // Note that this method is called by AudioDeviceThread. If FIFO is not ready,
   // or the requested render size is greater than FIFO size return here.
   // (crbug.com/692423)
diff --git a/third_party/blink/renderer/platform/audio/audio_destination.h b/third_party/blink/renderer/platform/audio/audio_destination.h
index c2a6d2a..5eaff65 100644
--- a/third_party/blink/renderer/platform/audio/audio_destination.h
+++ b/third_party/blink/renderer/platform/audio/audio_destination.h
@@ -196,6 +196,9 @@
   // Modified only on the main thread, so it can be read without holding a lock
   // there.
   DeviceState device_state_;
+
+  // Collect the device latency matric only from the initial callback.
+  bool is_latency_metric_collected_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/geometry/calculation_expression_node.cc b/third_party/blink/renderer/platform/geometry/calculation_expression_node.cc
index ecacc87..1a06514 100644
--- a/third_party/blink/renderer/platform/geometry/calculation_expression_node.cc
+++ b/third_party/blink/renderer/platform/geometry/calculation_expression_node.cc
@@ -144,7 +144,35 @@
       return base::MakeRefCounted<CalculationExpressionOperationNode>(
           std::move(children), op);
     }
-    default:
+    case CalculationOperator::kClamp: {
+      DCHECK_EQ(children.size(), 3u);
+      Vector<float> operand_pixels;
+      operand_pixels.ReserveCapacity(children.size());
+      bool can_simplify = true;
+      for (auto& child : children) {
+        const auto* pixels_and_percent =
+            DynamicTo<CalculationExpressionPixelsAndPercentNode>(*child);
+        if (!pixels_and_percent || pixels_and_percent->Percent()) {
+          can_simplify = false;
+          break;
+        }
+        operand_pixels.push_back(pixels_and_percent->Pixels());
+      }
+      if (can_simplify) {
+        float min_px = operand_pixels[0];
+        float val_px = operand_pixels[1];
+        float max_px = operand_pixels[2];
+        // clamp(MIN, VAL, MAX) is identical to max(MIN, min(VAL, MAX))
+        // according to the spec,
+        // https://drafts.csswg.org/css-values-4/#funcdef-clamp.
+        float clamped_px = std::max(min_px, std::min(val_px, max_px));
+        return base::MakeRefCounted<CalculationExpressionPixelsAndPercentNode>(
+            PixelsAndPercent(clamped_px, 0));
+      }
+      return base::MakeRefCounted<CalculationExpressionOperationNode>(
+          std::move(children), op);
+    }
+    case CalculationOperator::kInvalid:
       NOTREACHED();
       return nullptr;
   }
@@ -184,7 +212,15 @@
         maximum = std::max(maximum, child->Evaluate(max_value));
       return maximum;
     }
-    default:
+    case CalculationOperator::kClamp: {
+      DCHECK(!children_.IsEmpty());
+      float min = children_[0]->Evaluate(max_value);
+      float val = children_[1]->Evaluate(max_value);
+      float max = children_[2]->Evaluate(max_value);
+      // clamp(MIN, VAL, MAX) is identical to max(MIN, min(VAL, MAX))
+      return std::max(min, std::min(val, max));
+    }
+    case CalculationOperator::kInvalid:
       break;
       // TODO(crbug.com/1284199): Support other math functions.
   }
@@ -219,7 +255,8 @@
           Children({pixels_and_percent->Zoom(factor), number}), operator_);
     }
     case CalculationOperator::kMin:
-    case CalculationOperator::kMax: {
+    case CalculationOperator::kMax:
+    case CalculationOperator::kClamp: {
       DCHECK(children_.size());
       Vector<scoped_refptr<const CalculationExpressionNode>> cloned_operands;
       cloned_operands.ReserveCapacity(children_.size());
@@ -227,7 +264,7 @@
         cloned_operands.push_back(child->Zoom(factor));
       return CreateSimplified(std::move(cloned_operands), operator_);
     }
-    default:
+    case CalculationOperator::kInvalid:
       NOTREACHED();
       return nullptr;
   }
@@ -267,7 +304,8 @@
       return ResultType::kNumber;
     }
     case CalculationOperator::kMin:
-    case CalculationOperator::kMax: {
+    case CalculationOperator::kMax:
+    case CalculationOperator::kClamp: {
       DCHECK(children_.size());
       auto first_child_type = children_.front()->ResolvedResultType();
       for (const auto& child : children_) {
@@ -277,7 +315,7 @@
 
       return first_child_type;
     }
-    default:
+    case CalculationOperator::kInvalid:
       NOTREACHED();
       return result_type_;
   }
diff --git a/third_party/blink/renderer/platform/geometry/calculation_expression_node.h b/third_party/blink/renderer/platform/geometry/calculation_expression_node.h
index 79b78be..6fc38a05 100644
--- a/third_party/blink/renderer/platform/geometry/calculation_expression_node.h
+++ b/third_party/blink/renderer/platform/geometry/calculation_expression_node.h
@@ -18,6 +18,7 @@
   kMultiply,  // Division is converted to multiplication and use this value too.
   kMin,
   kMax,
+  kClamp,
   kInvalid
 };
 
diff --git a/third_party/blink/renderer/platform/geometry/length_test.cc b/third_party/blink/renderer/platform/geometry/length_test.cc
index e78050d..f7892df 100644
--- a/third_party/blink/renderer/platform/geometry/length_test.cc
+++ b/third_party/blink/renderer/platform/geometry/length_test.cc
@@ -17,6 +17,7 @@
 const PixelsAndPercent thirty_px(30, 0);
 const PixelsAndPercent ten_percent(0, 10);
 const PixelsAndPercent twenty_percent(0, 20);
+const PixelsAndPercent thirty_percent(0, 30);
 const PixelsAndPercent twenty_px_ten_percent(20, 10);
 
 }  // namespace
@@ -62,6 +63,11 @@
         std::move(operands), CalculationOperator::kMax);
   }
 
+  Pointer Clamp(Vector<Pointer>&& operands) {
+    return base::MakeRefCounted<CalculationExpressionOperationNode>(
+        std::move(operands), CalculationOperator::kClamp);
+  }
+
   Length CreateLength(Pointer expression) {
     return Length(CalculationValue::CreateSimplified(std::move(expression),
                                                      Length::ValueRange::kAll));
@@ -244,6 +250,76 @@
   }
 }
 
+TEST_F(LengthTest, EvaluateClamp) {
+  // clamp(10px, 20px, 30px)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
+               PixelsAndPercent(thirty_px)}));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(50));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
+  }
+  // clamp(20px, 10px, 30px)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(twenty_px), PixelsAndPercent(ten_px),
+               PixelsAndPercent(thirty_px)}));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(50));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(150));
+  }
+  // clamp(30px, 10px, 20px)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(thirty_px), PixelsAndPercent(ten_px),
+               PixelsAndPercent(twenty_px)}));
+    EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(50));
+    EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(100));
+    EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
+  }
+
+  // clamp(10%, 20%, 30%)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(ten_percent), PixelsAndPercent(twenty_percent),
+               PixelsAndPercent(thirty_percent)}));
+    EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
+    EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
+  }
+
+  // clamp(20%, 10%, 30%)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(twenty_percent), PixelsAndPercent(ten_percent),
+               PixelsAndPercent(thirty_percent)}));
+    EXPECT_EQ(10.0f, length.GetCalculationValue().Evaluate(50));
+    EXPECT_EQ(20.0f, length.GetCalculationValue().Evaluate(100));
+    EXPECT_EQ(30.0f, length.GetCalculationValue().Evaluate(150));
+  }
+
+  // clamp(30%, 10%, 20%)
+  {
+    Length length = CreateLength(
+        Clamp({PixelsAndPercent(thirty_percent), PixelsAndPercent(ten_percent),
+               PixelsAndPercent(twenty_percent)}));
+    EXPECT_EQ(45.0f, length.GetCalculationValue().Evaluate(150));
+    EXPECT_EQ(90.0f, length.GetCalculationValue().Evaluate(300));
+    EXPECT_EQ(135.0f, length.GetCalculationValue().Evaluate(450));
+  }
+
+  // clamp(20px + 10%, 20%, 30%)
+  {
+    Length length = CreateLength(Clamp({PixelsAndPercent(twenty_px_ten_percent),
+                                        PixelsAndPercent(twenty_percent),
+                                        PixelsAndPercent(thirty_percent)}));
+    EXPECT_EQ(35.0f, length.GetCalculationValue().Evaluate(150));
+    EXPECT_EQ(60.0f, length.GetCalculationValue().Evaluate(300));
+    EXPECT_EQ(90.0f, length.GetCalculationValue().Evaluate(450));
+  }
+}
+
 TEST_F(LengthTest, BlendExpressions) {
   // From: min(10px, 20%)
   // To: max(20px, 10%)
@@ -356,7 +432,7 @@
   EXPECT_EQ(60.0f, result_for_simplified);
 }
 
-TEST_F(LengthTest, ZoomToOperator) {
+TEST_F(LengthTest, ZoomToOperation) {
   // Add 10px + 20px
   {
     Length original = CreateLength(
@@ -404,6 +480,16 @@
     auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
     EXPECT_EQ(60.0f, result.pixels);
   }
+
+  // clamp(10px, 20px, 30px) with zoom by 2
+  {
+    Length original = CreateLength(
+        Clamp({PixelsAndPercent(ten_px), PixelsAndPercent(twenty_px),
+               PixelsAndPercent(thirty_px)}));
+    Length zoomed = original.Zoom(2);
+    auto result = zoomed.GetCalculationValue().GetPixelsAndPercent();
+    EXPECT_EQ(40.0f, result.pixels);
+  }
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 8e11040..44aa0316 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -450,6 +450,13 @@
       status: "stable"
     },
     {
+      // Compositing of video element is no longer necessary after launch of
+      // CompositeAfterPaint. This feature is to keep the old behavior for A/B
+      // testing. Will disable and remove.
+      name: "CompositeVideoElement",
+      status: "stable",
+    },
+    {
       name: "ComputedAccessibilityInfo",
       status: "experimental",
     },
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
index b2936301..a6f9999 100644
--- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
+++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
@@ -328,6 +328,17 @@
       std::move(callback).Run(feedback.timestamp);
     presentation_callbacks_.erase(front);
   }
+
+#if BUILDFLAG(IS_MAC)
+  while (!core_animation_error_code_callbacks_.empty()) {
+    const auto& front = core_animation_error_code_callbacks_.begin();
+    if (viz::FrameTokenGT(front->first, frame_token))
+      break;
+    for (auto& callback : front->second)
+      std::move(callback).Run(feedback.ca_layer_error_code);
+    core_animation_error_code_callbacks_.erase(front);
+  }
+#endif
 }
 
 void LayerTreeView::RecordStartOfFrameMetrics() {
@@ -404,9 +415,27 @@
 void LayerTreeView::AddPresentationCallback(
     uint32_t frame_token,
     base::OnceCallback<void(base::TimeTicks)> callback) {
+  AddCallback(frame_token, std::move(callback), presentation_callbacks_);
+}
+
+#if BUILDFLAG(IS_MAC)
+void LayerTreeView::AddCoreAnimationErrorCodeCallback(
+    uint32_t frame_token,
+    base::OnceCallback<void(gfx::CALayerResult)> callback) {
+  AddCallback(frame_token, std::move(callback),
+              core_animation_error_code_callbacks_);
+}
+#endif
+
+template <typename Callback>
+void LayerTreeView::AddCallback(
+    uint32_t frame_token,
+    Callback callback,
+    base::circular_deque<std::pair<uint32_t, std::vector<Callback>>>&
+        callbacks) {
   DCHECK(delegate_);
-  if (!presentation_callbacks_.empty()) {
-    auto& previous = presentation_callbacks_.back();
+  if (!callbacks.empty()) {
+    auto& previous = callbacks.back();
     uint32_t previous_frame_token = previous.first;
     if (previous_frame_token == frame_token) {
       previous.second.push_back(std::move(callback));
@@ -415,10 +444,10 @@
     }
     DCHECK(viz::FrameTokenGT(frame_token, previous_frame_token));
   }
-  std::vector<base::OnceCallback<void(base::TimeTicks)>> callbacks;
-  callbacks.push_back(std::move(callback));
-  presentation_callbacks_.emplace_back(frame_token, std::move(callbacks));
-  DCHECK_LE(presentation_callbacks_.size(),
+  std::vector<Callback> new_callbacks;
+  new_callbacks.push_back(std::move(callback));
+  callbacks.emplace_back(frame_token, std::move(new_callbacks));
+  DCHECK_LE(callbacks.size(),
             cc::PresentationTimeCallbackBuffer::kMaxBufferSize);
 }
 
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
index ddd785f00..a85f928 100644
--- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
+++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
@@ -18,6 +18,7 @@
 #include "cc/trees/paint_holding_reason.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/widget/compositing/layer_tree_view_delegate.h"
+#include "ui/gfx/ca_layer_result.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace cc {
@@ -123,6 +124,12 @@
       uint32_t frame_token,
       base::OnceCallback<void(base::TimeTicks)> callback);
 
+#if BUILDFLAG(IS_MAC)
+  void AddCoreAnimationErrorCodeCallback(
+      uint32_t frame_token,
+      base::OnceCallback<void(gfx::CALayerResult)> callback);
+#endif
+
   cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
   const cc::LayerTreeHost* layer_tree_host() const {
     return layer_tree_host_.get();
@@ -137,6 +144,13 @@
       std::unique_ptr<cc::RenderFrameMetadataObserver>
           render_frame_metadata_observer);
 
+  template <typename Callback>
+  void AddCallback(
+      uint32_t frame_token,
+      Callback callback,
+      base::circular_deque<std::pair<uint32_t, std::vector<Callback>>>&
+          callbacks);
+
   scheduler::WebThreadScheduler* const web_main_thread_scheduler_;
   const std::unique_ptr<cc::AnimationHost> animation_host_;
   std::unique_ptr<cc::RasterDarkModeFilter> dark_mode_filter_;
@@ -157,6 +171,13 @@
                 std::vector<base::OnceCallback<void(base::TimeTicks)>>>>
       presentation_callbacks_;
 
+#if BUILDFLAG(IS_MAC)
+  base::circular_deque<std::pair<
+      uint32_t,
+      std::vector<base::OnceCallback<void(gfx::CALayerResult error_code)>>>>
+      core_animation_error_code_callbacks_;
+#endif
+
   base::WeakPtrFactory<LayerTreeView> weak_factory_{this};
 };
 
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 537ed0b4..1b12df2 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -835,6 +835,15 @@
   layer_tree_view_->AddPresentationCallback(frame_token, std::move(callback));
 }
 
+#if BUILDFLAG(IS_MAC)
+void WidgetBase::AddCoreAnimationErrorCodeCallback(
+    uint32_t frame_token,
+    base::OnceCallback<void(gfx::CALayerResult)> callback) {
+  layer_tree_view_->AddCoreAnimationErrorCodeCallback(frame_token,
+                                                      std::move(callback));
+}
+#endif
+
 void WidgetBase::SetCursor(const ui::Cursor& cursor) {
   if (input_handler_.DidChangeCursor(cursor)) {
     widget_host_->SetCursor(cursor);
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h
index bf6f8f2..23069c8 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.h
+++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -27,6 +27,7 @@
 #include "third_party/blink/renderer/platform/widget/input/widget_base_input_handler.h"
 #include "ui/base/ime/text_input_mode.h"
 #include "ui/base/ime/text_input_type.h"
+#include "ui/gfx/ca_layer_result.h"
 
 namespace cc {
 class AnimationHost;
@@ -110,6 +111,12 @@
       uint32_t frame_token,
       base::OnceCallback<void(base::TimeTicks)> callback);
 
+#if BUILDFLAG(IS_MAC)
+  void AddCoreAnimationErrorCodeCallback(
+      uint32_t frame_token,
+      base::OnceCallback<void(gfx::CALayerResult)> callback);
+#endif
+
   // mojom::blink::Widget overrides:
   void ForceRedraw(mojom::blink::Widget::ForceRedrawCallback callback) override;
   void GetWidgetInputHandler(
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index c1bc7dc..3bce535 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -379,6 +379,11 @@
             # Range type.
             'gfx::Range',
 
+            # Mac CALayer result (error code)
+            'gfx::CALayerResult',
+            'gfx::kCALayerUnknownDidNotSwap',
+            'gfx::kCALayerUnknownNoWidget',
+
             # Wrapper of SkRegion used in Chromium.
             'cc::Region',
 
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 097f5ca..12dc8e1 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -363,6 +363,7 @@
 crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-012.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-013.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-014.html [ Failure ]
+crbug.com/829028 external/wpt/css/css-multicol/multicol-fill-balance-021.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-007.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-008.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-multicol/multicol-nested-009.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 1519512..24ac169 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -2014,5 +2014,5 @@
 # The following tests never pass in the default Blink test runner due to forced
 # frame updates, but still pass in the full browser. They are only run in the
 # no-forced-frame-updates virtual test suite.
-external/wpt/html/dom/render-blocking-mechanism/* [ Skip ]
-virtual/no-forced-frame-updates/external/wpt/html/dom/render-blocking-mechanism/* [ Pass ]
+external/wpt/html/dom/render-blocking/* [ Skip ]
+virtual/no-forced-frame-updates/external/wpt/html/dom/render-blocking/* [ Pass ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 72d3a8f..fcebc9a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3176,7 +3176,6 @@
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-flexbox/flexbox_flow-column-wrap.html [ Crash Failure ]
 
 # ====== New tests from wpt-importer added here ======
-crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-014.https.html [ Failure ]
 crbug.com/626703 [ Mac11-arm64 ] virtual/web-bluetooth-new-permissions-backend/wpt_internal/bluetooth/requestDevice/filter-does-not-match.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/hid.https.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-content/quotes-030.html [ Failure ]
@@ -3200,12 +3199,6 @@
 crbug.com/626703 external/wpt/css/css-text/hyphens/hyphens-vertical-004.html [ Failure ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/svg/geometry/reftests/circle-002.svg [ Failure ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/webaudio/the-audio-api/the-mediastreamaudiosourcenode-interface/mediastreamaudiosourcenode-routing.html [ Timeout ]
-crbug.com/626703 [ Linux ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
-crbug.com/626703 [ Mac ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
-crbug.com/626703 [ Win7 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
-crbug.com/626703 [ Linux ] virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
-crbug.com/626703 [ Mac ] virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
-crbug.com/626703 [ Win7 ] virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/embedder-require-corp.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] virtual/prerender/external/wpt/speculation-rules/prerender/cache-storage.https.html [ Skip Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/prerender/external/wpt/speculation-rules/prerender/fetch-blob.html [ Skip Timeout ]
 crbug.com/626703 [ Mac11 ] virtual/prerender/external/wpt/speculation-rules/prerender/fetch-blob.html [ Skip Timeout ]
@@ -3426,7 +3419,6 @@
 crbug.com/626703 [ Mac10.15 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/CaretPosition-001.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-animations/computed-style-animation-parsing.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-backgrounds/background-repeat/background-repeat-space.xht [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/v8-off-thread-finalization/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/046.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/v8-off-thread-finalization/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/049.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/v8-off-thread-finalization/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/139.html [ Timeout ]
@@ -7585,6 +7577,7 @@
 crbug.com/1286944 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/hidpi/canvas-transform.https.html [ Failure Pass ]
 crbug.com/1286944 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/parse-input-arguments-011.https.html [ Failure Pass ]
 crbug.com/1286944 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-invalidation-001.https.html [ Failure Pass ]
+crbug.com/1286944 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-014.https.html [ Failure Pass ]
 
 # Sheriff 2022-01-17
 crbug.com/1287928 external/wpt/webrtc/RTCPeerConnection-perfect-negotiation-stress-glare.https.html [ Skip ]
@@ -7650,3 +7643,9 @@
 
 # Now flaky due to a timing issue, but so far only on Windows 7.
 crbug.com/1292296 [ Win7 ] http/tests/inspector-protocol/accessibility/accessibility-getRootNode.js [ Failure Pass ]
+
+# Sheriff 2022-02-01
+# Flaky test on Mac
+crbug.com/1292843 [ Mac ] external/wpt/css/css-transforms/animation/perspective-origin-interpolation.html [ Failure Pass ]
+crbug.com/1292844 [ Mac ] external/wpt/css/css-writing-modes/alt-display-vertical-001-manual.html [ Failure Pass ]
+crbug.com/1292852 [ Mac ] external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 5d40d49..7184165 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1010,6 +1010,11 @@
     ]
   },
   {
+    "prefix": "automatic-lazy-frame-loading-ads",
+    "bases": [],
+    "args": ["--enable-features=AutomaticLazyFrameLoadingToAds"]
+  },
+  {
     "prefix": "initially-invisible-images-lcp",
     "bases": ["external/wpt/largest-contentful-paint/initially-invisible-images.html"],
     "args": [ "--enable-features=IncludeInitiallyInvisibleImagesInLCP"]
@@ -1079,7 +1084,7 @@
   },
   {
     "prefix": "no-forced-frame-updates",
-    "bases": ["external/wpt/html/dom/render-blocking-mechanism"],
-    "args": ["--enable-features=NoForcedFrameUpdates"]
+    "bases": ["external/wpt/html/dom/render-blocking"],
+    "args": ["--enable-features=NoForcedFrameUpdatesForWebTests"]
   }
 ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index 207f4ab..7e660d2 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: 4af2663c2435f7d06ee79f05b2450f5d97e193ce
+Version: 9c338218c44d4c52f0affc32025fd847b7985f92
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 3402e3c5..57e19b21 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
@@ -2385,6 +2385,13 @@
        {}
       ]
      ],
+     "inserttext-at-start-with-different-style.html": [
+      "ddd19aafd4ca004f42919056a91899c0a29615d8",
+      [
+       null,
+       {}
+      ]
+     ],
      "insertunorderedlist-in-empty-inline-editing-host.html": [
       "74b0993322eda076a13023c96261840eadd53339",
       [
@@ -146204,6 +146211,19 @@
      ]
     },
     "css-scroll-anchoring": {
+     "nested-overflow-subtree-layout-vertical.html": [
+      "5b176a2042e7607f740e94faa445ec301c8e88d8",
+      [
+       null,
+       [
+        [
+         "/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "nested-overflow-subtree-layout.html": [
       "e7696016bb31fde98a57cd8ef2b3f78551350d40",
       [
@@ -230386,7 +230406,7 @@
       []
      ],
      "echo-ua-client-hints-received.py": [
-      "ea295ab210ab793e03e7c311578f958a59dd12c0",
+      "124932276f2bd32fce0dd52113b948427b8d99a5",
       []
      ],
      "expect-client-hints-headers-iframe.py": [
@@ -263157,6 +263177,10 @@
       "003cb9b68a15dae2c4888e2d988834fdd92793e6",
       []
      ],
+     "nested-overflow-subtree-layout-vertical-ref.html": [
+      "0026f2f888c08510b2c83309bfa3d17edd8c9817",
+      []
+     ],
      "support": {
       "flexbox-scrolling-vertical-rl.html": [
        "1a2d02d5c71d7026c783e5215452ee7333308658",
@@ -290751,7 +290775,7 @@
       "a5f7b3fd0a08e60729192a62902a9e9f07805821",
       []
      ],
-     "render-blocking-mechanism": {
+     "render-blocking": {
       "support": {
        "target-red.css": [
         "a387acd4ecb17a0a0419fb5b3c90a1f0b2f1b0ea",
@@ -297522,7 +297546,7 @@
         []
        ],
        "dialog-focus-shadow-expected.txt": [
-        "bee1f6e980eec04820ab9e260b5acd5164993045",
+        "9981d126149c0a1a6889ce699cf00176eab3ab64",
         []
        ],
        "dialog-focusing-steps-disconnected-expected.txt": [
@@ -310024,8 +310048,12 @@
      "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      []
     ],
+    "frameset-timing.html": [
+     "1a6facbfc4d623ceca06ef742add339a5b007545",
+     []
+    ],
     "iframe-sequence-of-events-expected.txt": [
-     "4999c6179224dc8b36a017406fba85efae225e5d",
+     "d9e92b21b17a8040755cfe7893ee2a88dc8d5709",
      []
     ],
     "initiator-type": {
@@ -310173,6 +310201,14 @@
       "2ee92b2a5511c0d43359e0db7ee3b64ae5f9115c",
       []
      ],
+     "frame-timing.js": [
+      "e0c364e9b2c3e264dea10a0d6d19b0cdee01919d",
+      []
+     ],
+     "frameset-timing-frame.html": [
+      "e260f575268e6cab7e30a7126002ab7504699de9",
+      []
+     ],
      "green-frame.html": [
       "9613240ae38789a104d77d56f890ff62420934b0",
       []
@@ -338650,6 +338686,20 @@
        {}
       ]
      ],
+     "navigate-from-initial-about-blank-src.html": [
+      "83cd77678a544f7356a283911aa17931a1e40350",
+      [
+       null,
+       {}
+      ]
+     ],
+     "navigate-from-initial-about-blank.html": [
+      "fd163ddf8ceb26ae705dc0be254e4921fedf6880",
+      [
+       null,
+       {}
+      ]
+     ],
      "navigate-history-state-replace.html": [
       "b4b9559fb56cb782941210eefbaef379afdb7e5a",
       [
@@ -347169,7 +347219,7 @@
      ]
     ],
     "sec-ch-quotes.https.html": [
-     "6a15b07276abec365acaa46ee26773bad4d0f08e",
+     "9d822df2d80110a1c150764d4cd44127dcd9d155",
      [
       null,
       {}
@@ -379269,7 +379319,7 @@
         ]
        ],
        "parse.tentative.html": [
-        "9b9f2f601ae5e796abe6f34b1ea0cc6930fd373a",
+        "382c81390369dd2660a1609c5fa26611fc80b544",
         [
          null,
          {}
@@ -447260,7 +447310,7 @@
        }
       ]
      ],
-     "render-blocking-mechanism": {
+     "render-blocking": {
       "parser-inserted-style-element.tentative.html": [
        "9a358aa4938e762b31b43fb38381a763c2222c33",
        [
@@ -455510,7 +455560,7 @@
         ]
        ],
        "cloning-steps.html": [
-        "52cd57705e4b998e1f7a002206f923a2ee801b84",
+        "fe468509e843f6880ac77575fb1915321b22c1a0",
         [
          null,
          {}
@@ -456848,15 +456898,15 @@
          {}
         ]
        ],
-       "dialog-focus-shadow-delegatesfocus.html": [
-        "0263e5632f9156dcadfb3bfd836fa7c8feb33ff3",
+       "dialog-focus-shadow-double-nested.html": [
+        "2cd63eb796b38f6a272aeb9eff13e5974705236b",
         [
          null,
          {}
         ]
        ],
        "dialog-focus-shadow.html": [
-        "7f52189d9ff19248ffefdf73a2a801ceefc4f448",
+        "9cdad92d80f575f5aa57d9dee11830e23ff3b012",
         [
          null,
          {}
@@ -495686,7 +495736,7 @@
      ]
     ],
     "iframe-sequence-of-events.html": [
-     "9013800721a96f8f2fbeb52e71408257e627f323",
+     "5f99a5cab2de6b1f813dbcd09232ac679ca308b1",
      [
       null,
       {}
@@ -531789,6 +531839,13 @@
       }
      ]
     ],
+    "recvonly-transceiver-can-become-sendrecv.https.html": [
+     "30bbec4f9f185d48ed69481de85bea86baff5a89",
+     [
+      null,
+      {}
+     ]
+    ],
     "simplecall-no-ssrcs.https.html": [
      "f2e20846234bb4703d23c876f468994dcd74be30",
      [
diff --git a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-cross-document.html b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-cross-document.html
similarity index 89%
rename from third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-cross-document.html
rename to third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-cross-document.html
index a581c010..9fbb733 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-cross-document.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-cross-document.html
@@ -11,5 +11,5 @@
     // this window's appHistory.
     assert_equals(appHistory.entries().length, 1);
   });
-}, "AppHistoryEntry.key behavior on cross-document back navigation");
+}, "AppHistoryEntry's key and id on cross-document back navigation");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-same-document.html b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-same-document.html
similarity index 92%
rename from third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-same-document.html
rename to third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-same-document.html
index e3eeb15..94319c3 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-back-same-document.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-back-same-document.html
@@ -20,5 +20,5 @@
     assert_equals(appHistory.current.index, 0);
   });
   history.back();
-}, "AppHistoryEntry.key behavior on same-document back navigation");
+}, "AppHistoryEntry's key and id on same-document back navigation");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-reload.html b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-reload.html
similarity index 81%
rename from third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-reload.html
rename to third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-reload.html
index 8770f16..6604270 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-reload.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-reload.html
@@ -10,9 +10,9 @@
     i.contentWindow.location.reload();
     i.onload = t.step_func_done(() => {
       assert_equals(key, i.contentWindow.appHistory.current.key);
-      assert_not_equals(id, i.contentWindow.appHistory.current.id);
+      assert_equals(id, i.contentWindow.appHistory.current.id);
       assert_equals(appHistory.entries().length, 1);
     });
   });
-}, "AppHistoryEntry.key behavior after location.reload()");
+}, "AppHistoryEntry's key and id after location.reload()");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace-cross-origin.html b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace-cross-origin.html
similarity index 91%
rename from third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace-cross-origin.html
rename to third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace-cross-origin.html
index dabe55e..b49c601d 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace-cross-origin.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace-cross-origin.html
@@ -13,5 +13,5 @@
     cross_origin_url.hostname = get_host_info().REMOTE_HOST;
     i.contentWindow.location.replace(cross_origin_url.href);
   });
-}, "AppHistoryEntry.key behavior after location.replace()");
+}, "AppHistoryEntry's key and id after location.replace()");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace.html b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace.html
similarity index 91%
rename from third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace.html
rename to third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace.html
index 4c5060da4..9d245b1 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-navigate-location-replace.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/app-history-entry/key-id-location-replace.html
@@ -14,5 +14,5 @@
       assert_equals(appHistory.entries().length, 1);
     });
   });
-}, "AppHistoryEntry.key behavior after location.replace()");
+}, "AppHistoryEntry's key and id after location.replace()");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html
index 314c05f..412655f6 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-info.html
@@ -32,7 +32,7 @@
         assert_true(onnavigate_called);
         assert_equals(i.contentWindow.location.href, start_url);
         assert_equals(i.contentWindow.appHistory.current.key, start_key);
-        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.id, start_id);
         assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
         assert_not_equals(i.contentWindow.appHistory.current.getState(), start_state);
         assert_equals(i.contentWindow.appHistory.entries().length, 2);
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html
index 0451b39..e4f7bd62 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-no-args.html
@@ -31,7 +31,7 @@
         assert_true(onnavigate_called);
         assert_equals(i.contentWindow.location.href, start_url);
         assert_equals(i.contentWindow.appHistory.current.key, start_key);
-        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.id, start_id);
         assert_equals(i.contentWindow.appHistory.current.getState().key, "value");
         assert_not_equals(i.contentWindow.appHistory.current.getState(), start_state);
         assert_equals(i.contentWindow.appHistory.entries().length, 2);
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html
index 897f10b3..0811f3d 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-and-info.html
@@ -30,7 +30,7 @@
         assert_true(onnavigate_called);
         assert_equals(i.contentWindow.location.href, start_url);
         assert_equals(i.contentWindow.appHistory.current.key, start_key);
-        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.id, start_id);
         assert_equals(i.contentWindow.appHistory.current.getState().key2, "value2", "current.getState() after teh reload");
         assert_not_equals(i.contentWindow.appHistory.current.getState(), navState2);
       }));
diff --git a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html
index 165a330..47b336b 100644
--- a/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html
+++ b/third_party/blink/web_tests/external/wpt/app-history/navigate/reload-state-undefined.html
@@ -29,7 +29,7 @@
         assert_true(onnavigate_called);
         assert_equals(i.contentWindow.location.href, start_url);
         assert_equals(i.contentWindow.appHistory.current.key, start_key);
-        assert_not_equals(i.contentWindow.appHistory.current.id, start_id);
+        assert_equals(i.contentWindow.appHistory.current.id, start_id);
         assert_equals(i.contentWindow.appHistory.current.getState().key, "value", "destination.getState()");
         assert_not_equals(i.contentWindow.appHistory.current.getState(), navState);
       }));
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/resources/echo-ua-client-hints-received.py b/third_party/blink/web_tests/external/wpt/client-hints/resources/echo-ua-client-hints-received.py
index ea295ab..1249322 100644
--- a/third_party/blink/web_tests/external/wpt/client-hints/resources/echo-ua-client-hints-received.py
+++ b/third_party/blink/web_tests/external/wpt/client-hints/resources/echo-ua-client-hints-received.py
@@ -16,6 +16,7 @@
         b"sec-ch-ua-model",
         b"sec-ch-ua-full-version",
         b"sec-ch-ua-full-version-list",
+        b"sec-ch-ua-wow64",
     ]
 
     request_client_hints = {i: request.headers.get(i) for i in client_hint_headers}
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-quotes.https.html b/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-quotes.https.html
index 6a15b0727..9d822df 100644
--- a/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-quotes.https.html
+++ b/third_party/blink/web_tests/external/wpt/client-hints/sec-ch-quotes.https.html
@@ -27,6 +27,7 @@
     "sec-ch-ua-full-version",
     "sec-ch-prefers-color-scheme",
     "sec-ch-ua-full-version-list",
+    "sec-ch-ua-wow64",
   ];
   const boolean_client_hint_headers = [
     "sec-ch-mobile",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-fill-balance-021.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-fill-balance-021.html
new file mode 100644
index 0000000..d366e0f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/multicol-fill-balance-021.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#cf">
+<div id="mc" style="columns:4; line-height:0;">
+  <ruby>
+    <div style="display:inline-block; width:10px; height:50px;"></div>
+    <rt>
+      <div style="display:inline-block; width:10px; height:50px;"></div>
+    </rt>
+  </ruby>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(()=> {
+    assert_equals(mc.offsetHeight, 100);
+  }, "Ruby text should affect column height");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical-ref.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical-ref.html
new file mode 100644
index 0000000..0026f2f8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+  <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+  <link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+  <link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/">
+  <script src="/common/reftest-wait.js"></script>
+</head>
+<style>
+#outer {
+  overflow: hidden;
+  width: 500px;
+  height: 500px;
+  writing-mode: vertical-rl;
+}
+#inner {
+  overflow: auto;
+  position: relative;
+  width: 2000px;
+  height: 500px;
+}
+p {
+  font: 48pt monospace;
+}
+</style>
+</head>
+<body>
+<div id="outer">
+  <div id="inner">
+    <p>Anchor</p>
+  </div>
+</div>
+<script>
+const outer = document.querySelector("#outer");
+const inner = document.querySelector("#inner");
+
+onload = () => {
+  requestAnimationFrame(() => {
+    requestAnimationFrame(() => {
+      outer.scrollTo(-70, 0);
+      takeScreenshot();
+    });
+  });
+};
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical.html
new file mode 100644
index 0000000..5b176a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-vertical.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+  <title>Test that subtree layout with nested overflow preserves scroll anchoring in vertical mode.</title>
+  <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+  <link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+  <link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/">
+  <link rel="match" href="nested-overflow-subtree-layout-vertical-ref.html">
+  <script src="/common/reftest-wait.js"></script>
+</head>
+<style>
+#outer {
+  overflow: hidden;
+  width: 500px;
+  height: 500px;
+  writing-mode: vertical-rl;
+}
+#inner {
+  overflow: auto;
+  position: relative;
+  width: 2000px;
+  height: 500px;
+}
+p {
+  font: 48pt monospace;
+}
+</style>
+</head>
+<body>
+<div id="outer">
+  <div id="inner">
+    <p>Anchor</p>
+  </div>
+</div>
+<script>
+const outer = document.querySelector("#outer");
+const inner = document.querySelector("#inner");
+
+onload = () => {
+  requestAnimationFrame(() => {
+    requestAnimationFrame(() => {
+      outer.scrollTo(-70, 0);
+      requestAnimationFrame(() => {
+          const elem = document.createElement("p");
+          elem.textContent = "FAIL";
+          inner.insertBefore(elem, inner.firstChild);
+          takeScreenshot();
+      });
+    });
+  });
+};
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/parse.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/parse.tentative.html
index 9b9f2f6..382c813 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/parse.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/numeric-objects/parse.tentative.html
@@ -24,6 +24,10 @@
 }, 'Parsing a calc with incompatible units throws a SyntaxError');
 
 test(() => {
+  assert_throws_dom("SyntaxError", () => CSSNumericValue.parse('1xyz'));
+}, 'Parsing a <dimension-token> with invalid units throws a SyntaxError');
+
+test(() => {
   assert_style_value_equals(new CSSUnitValue(1, 'px'), CSSNumericValue.parse(' 1px  '));
 }, 'Parsing ignores surrounding spaces');
 
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-at-start-with-different-style.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-at-start-with-different-style.html
new file mode 100644
index 0000000..ddd19aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-at-start-with-different-style.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+<meta charset="utf-8">
+<head>
+<script>
+function go() {
+  a.show();
+  document.execCommand("bold", false);
+  b.style.setProperty("font", "0px/43%");
+  document.execCommand("insertText", false, "a");
+}
+</script>
+</head>
+<body onload=go()>
+<ul contenteditable="true">
+<li id="b" style="font-weight: bolder">a</li>
+<dialog id="a" tabindex="0">a</dialog>
+</ul>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/parser-inserted-style-element.tentative.html b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-style-element.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/parser-inserted-style-element.tentative.html
rename to third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-style-element.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/parser-inserted-stylesheet-link.tentative.html b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-stylesheet-link.tentative.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/parser-inserted-stylesheet-link.tentative.html
rename to third_party/blink/web_tests/external/wpt/html/dom/render-blocking/parser-inserted-stylesheet-link.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/support/target-red.css b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/target-red.css
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/support/target-red.css
rename to third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/target-red.css
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/support/test-render-blocking.js b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/dom/render-blocking-mechanism/support/test-render-blocking.js
rename to third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/cloning-steps.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/cloning-steps.html
index 52cd577..fe46850 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/cloning-steps.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/cloning-steps.html
@@ -35,6 +35,15 @@
   test(function() {
     var input = document.createElement("input");
     input.setAttribute("type", inputType);
+    input.indeterminate = true;
+
+    var copy = input.cloneNode();
+    assert_equals(copy.indeterminate, true);
+  }, `input[type=${inputType}] element's indeterminateness should be cloned`);
+
+  test(function() {
+    var input = document.createElement("input");
+    input.setAttribute("type", inputType);
     input.checked = true;
 
     var copy = input.cloneNode();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-delegatesfocus.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-double-nested.html
similarity index 92%
rename from third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-delegatesfocus.html
rename to third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-double-nested.html
index 0263e563..2cd63eb7 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-delegatesfocus.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-double-nested.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<title>dialog focusing delegation with autofocus plus delegatesFocus inside the dialog</title>
+<title>dialog focusing delegation: with two nested shadow trees</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <body>
 
 <dialog>
-  <template class="turn-into-shadow-tree">
+  <template class="turn-into-shadow-tree delegates-focus">
     <button disabled>Non-focusable</button>
     <template class="turn-into-shadow-tree delegates-focus">
       <button tabindex="-1">Focusable</button>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
index bee1f6e..9981d12 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
@@ -1,13 +1,56 @@
 This is a testharness.js-based test.
-PASS show: When autofocus is not present, the first focusable shadow-including descendant must be focused
-PASS showModal: When autofocus is not present, the first focusable shadow-including descendant must be focused
-FAIL show: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
-FAIL showModal: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
-FAIL show: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
-FAIL showModal: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
-FAIL show: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
-FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
-FAIL show: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
-FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: No autofocus, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div></div>
+FAIL showModal: No autofocus, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div></div>
+PASS show: No autofocus, no delegatesFocus, sibling before
+PASS showModal: No autofocus, no delegatesFocus, sibling before
+FAIL show: No autofocus, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: No autofocus, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+PASS show: No autofocus, yes delegatesFocus, no siblings
+PASS showModal: No autofocus, yes delegatesFocus, no siblings
+PASS show: No autofocus, yes delegatesFocus, sibling before
+PASS showModal: No autofocus, yes delegatesFocus, sibling before
+PASS show: No autofocus, yes delegatesFocus, sibling after
+PASS showModal: No autofocus, yes delegatesFocus, sibling after
+PASS show: Autofocus before, no delegatesFocus
+PASS showModal: Autofocus before, no delegatesFocus
+PASS show: Autofocus before, yes delegatesFocus
+PASS showModal: Autofocus before, yes delegatesFocus
+PASS show: Autofocus after, no delegatesFocus
+PASS showModal: Autofocus after, no delegatesFocus
+PASS show: Autofocus after, yes delegatesFocus
+PASS showModal: Autofocus after, yes delegatesFocus
+PASS show: Autofocus on shadow host, yes delegatesFocus, no siblings
+PASS showModal: Autofocus on shadow host, yes delegatesFocus, no siblings
+FAIL show: Autofocus on shadow host, yes delegatesFocus, sibling before assert_equals: expected Element node <div autofocus=""></div> but got Element node <button tabindex="-1">Focusable</button>
+FAIL showModal: Autofocus on shadow host, yes delegatesFocus, sibling before assert_equals: expected Element node <div autofocus=""></div> but got Element node <button tabindex="-1">Focusable</button>
+PASS show: Autofocus on shadow host, yes delegatesFocus, sibling after
+PASS showModal: Autofocus on shadow host, yes delegatesFocus, sibling after
+FAIL show: Autofocus on shadow host, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div autofocus=""></div>
+FAIL showModal: Autofocus on shadow host, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div autofocus=""></div>
+PASS show: Autofocus on shadow host, no delegatesFocus, sibling before
+PASS showModal: Autofocus on shadow host, no delegatesFocus, sibling before
+FAIL show: Autofocus on shadow host, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div autofocus=""></div>
+FAIL showModal: Autofocus on shadow host, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div autofocus=""></div>
+PASS show: Autofocus inside shadow tree, yes delegatesFocus, no siblings
+PASS showModal: Autofocus inside shadow tree, yes delegatesFocus, no siblings
+FAIL show: Autofocus inside shadow tree, yes delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, yes delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, yes delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, yes delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow.html
index 7f52189d..9cdad92 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow.html
@@ -1,47 +1,204 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
+<title>dialog focus delegation</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <body>
 
-<dialog data-description="When autofocus is not present, the first focusable shadow-including descendant must be focused">
-  <template class="turn-into-shadow-tree">
-    <button disabled>Non-focusable</button>
-    <button tabindex="-1" class="focus-me">Focusable</button>
-    <button disabled>Non-focusable</button>
-  </template>
-</dialog>
+<!--
+  We focus this one between each test, to ensure that for non-modal dialogs,
+  if there is no focus delegate, it stays focused (instead of causing focus to reset to the body).
+-->
+<button tabindex="-1" id="focus-between-tests">Focus between tests</button>
 
-<dialog data-description="autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements">
-  <button disabled>Non-focusable</button>
+<dialog data-description="No autofocus, no delegatesFocus, no siblings">
   <template class="turn-into-shadow-tree">
+    <button disabled>Non-focusable</button>
     <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
   </template>
-  <button tabindex="-1" autofocus>Focusable</button>
 </dialog>
 
-<dialog data-description="autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree">
+<dialog data-description="No autofocus, no delegatesFocus, sibling before">
+  <button tabindex="-1" class="focus-me">Focusable</button>
   <template class="turn-into-shadow-tree">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="No autofocus, no delegatesFocus, sibling after">
+  <template class="turn-into-shadow-tree">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1" class="focus-me">Focusable</button>
+</dialog>
+
+<dialog data-description="No autofocus, yes delegatesFocus, no siblings">
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button disabled>Non-focusable</button>
     <button tabindex="-1" class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="No autofocus, yes delegatesFocus, sibling before">
+  <button tabindex="-1" class="focus-me">Focusable</button>
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="No autofocus, yes delegatesFocus, sibling after">
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1" class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus before, no delegatesFocus">
+  <button tabindex="-1" autofocus class="focus-me">Focusable</button>
+  <template class="turn-into-shadow-tree">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus before, yes delegatesFocus">
+  <button tabindex="-1" autofocus class="focus-me">Focusable</button>
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus after, no delegatesFocus">
+  <template class="turn-into-shadow-tree">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1" autofocus class="focus-me">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus after, yes delegatesFocus">
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1" autofocus class="focus-me">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, yes delegatesFocus, no siblings">
+  <template class="turn-into-shadow-tree delegates-focus autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1" class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, yes delegatesFocus, sibling before">
+  <button tabindex="-1">Focusable</button>
+  <template class="turn-into-shadow-tree delegates-focus autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1" class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, yes delegatesFocus, sibling after">
+  <template class="turn-into-shadow-tree delegates-focus autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1" class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, no delegatesFocus, no siblings">
+  <template class="turn-into-shadow-tree autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, no delegatesFocus, sibling before">
+  <button tabindex="-1" class="focus-me">Focusable</button>
+  <template class="turn-into-shadow-tree autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus on shadow host, no delegatesFocus, sibling after">
+  <template class="turn-into-shadow-tree autofocus">
+    <button disabled>Non-focusable</button>
+    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1" class="focus-me">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus inside shadow tree, yes delegatesFocus, no siblings">
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button tabindex="-1">Focusable</button>
+    <button tabindex="-1" autofocus class="focus-me">Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus inside shadow tree, yes delegatesFocus, sibling before">
+  <button tabindex="-1" class="focus-me">Focusable</button>
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button tabindex="-1">Focusable</button>
     <button tabindex="-1" autofocus>Focusable</button>
-    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
   </template>
 </dialog>
 
-<dialog data-description="autofocus inside a shadow tree must be ignored: focusable element before the shadow tree">
+<dialog data-description="Autofocus inside shadow tree, yes delegatesFocus, sibling after">
+  <template class="turn-into-shadow-tree delegates-focus">
+    <button tabindex="-1">Focusable</button>
+    <button tabindex="-1" autofocus>Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+  <button tabindex="-1" class="focus-me">Focusable</button>
+</dialog>
+
+<dialog data-description="Autofocus inside shadow tree, no delegatesFocus, no siblings">
+  <template class="turn-into-shadow-tree">
+    <button tabindex="-1">Focusable</button>
+    <button tabindex="-1" autofocus>Focusable</button>
+    <button disabled>Non-focusable</button>
+  </template>
+</dialog>
+
+<dialog data-description="Autofocus inside shadow tree, no delegatesFocus, sibling before">
   <button tabindex="-1" class="focus-me">Focusable</button>
   <template class="turn-into-shadow-tree">
     <button tabindex="-1">Focusable</button>
     <button tabindex="-1" autofocus>Focusable</button>
-    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
   </template>
 </dialog>
 
-<dialog data-description="autofocus inside a shadow tree must be ignored: focusable element after the shadow tree">
+<dialog data-description="Autofocus inside shadow tree, no delegatesFocus, sibling after">
   <template class="turn-into-shadow-tree">
     <button tabindex="-1">Focusable</button>
     <button tabindex="-1" autofocus>Focusable</button>
-    <button tabindex="-1">Focusable</button>
+    <button disabled>Non-focusable</button>
   </template>
   <button tabindex="-1" class="focus-me">Focusable</button>
 </dialog>
@@ -49,14 +206,19 @@
 <script>
 for (const template of document.querySelectorAll(".turn-into-shadow-tree")) {
   const div = document.createElement("div");
-  div.attachShadow({ mode: "open" });
+  div.attachShadow({ mode: "open", delegatesFocus: template.classList.contains("delegates-focus")  });
+  div.autofocus = template.classList.contains("autofocus");
   div.shadowRoot.append(template.content);
   template.replaceWith(div);
 }
 
+const focusBetweenTests = document.querySelector("#focus-between-tests");
+
 for (const dialog of document.querySelectorAll("dialog")) {
   for (const method of ["show", "showModal"]) {
     test(t => {
+      focusBetweenTests.focus();
+
       dialog[method]();
       t.add_cleanup(() => dialog.close());
 
@@ -66,10 +228,17 @@
       } else {
         const shadowHost = dialog.querySelector("div");
         const expectedFocusInsideShadowTree = shadowHost.shadowRoot.querySelector(".focus-me");
-        assert_not_equals(expectedFocusInsideShadowTree, "Precondition check: the test was set up to expect a focused element, either outside the shadow tree or inside");
-
-        assert_equals(document.activeElement, shadowHost);
-        assert_equals(shadowHost.shadowRoot.activeElement, expectedFocusInsideShadowTree);
+        if (expectedFocusInsideShadowTree) {
+          assert_equals(document.activeElement, shadowHost);
+          assert_equals(shadowHost.shadowRoot.activeElement, expectedFocusInsideShadowTree);
+        } else {
+          // There is no focus delegate. Expected result depends on show() vs. showModal().
+          if (method === "show") {
+            assert_equals(document.activeElement, focusBetweenTests);
+          } else {
+            assert_equals(document.activeElement, document.body);
+          }
+        }
       }
     }, `${method}: ${dialog.dataset.description}`);
   }
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/frameset-timing.html b/third_party/blink/web_tests/external/wpt/resource-timing/frameset-timing.html
new file mode 100644
index 0000000..1a6facbf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/frameset-timing.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test the sequence of events when reporting timing for frames.</title>
+<frameset>
+  <frame src="resources/frameset-timing-frame.html" />
+</frameset>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt b/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
index 4999c61..d9e92b21 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-PASS An iframe should report its RT entry when the response is done and before it is completely loaded
-FAIL An iframe should report separate RT entries if src changed assert_equals: expected 2 but got 1
+PASS A iframe should report its RT entry when the response is done and before it is completely loaded
+FAIL A iframe should report separate RT entries if its src changed from the outside assert_equals: expected 2 but got 1
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events.html b/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events.html
index 9013800..5f99a5c 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events.html
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/iframe-sequence-of-events.html
@@ -1,49 +1,12 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<title>Test the sequence of events when reporting image timing.</title>
+<title>Test the sequence of events when reporting iframe timing.</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="resources/frame-timing.js"></script>
 <body>
 <script>
-  promise_test(async t => {
-    const delay = 500;
-    const iframe = document.createElement('iframe');
-    t.add_cleanup(() => iframe.remove());
-    await new Promise(resolve => {
-      iframe.addEventListener('load', resolve);
-      iframe.src = `resources/iframe-with-delay.sub.html?delay=${delay}`;
-      document.body.appendChild(iframe);
-    });
-
-    const entries = performance.getEntriesByName(iframe.src);
-    const navigationEntry = iframe.contentWindow.performance.getEntriesByType('navigation')[0];
-    assert_equals(entries.length, 1);
-    assert_greater_than(performance.now(), entries[0].responseEnd + delay);
-    const domContentLoadedEventAbsoluteTime = navigationEntry.domContentLoadedEventStart + iframe.contentWindow.performance.timeOrigin;
-    const iframeResponseEndAbsoluteTime = entries[0].responseEnd + performance.timeOrigin;
-    assert_greater_than(domContentLoadedEventAbsoluteTime, iframeResponseEndAbsoluteTime);
-  }, "An iframe should report its RT entry when the response is done and before it is completely loaded");
-
-  promise_test(async t => {
-    const iframe = document.createElement('iframe');
-    t.add_cleanup(() => iframe.remove());
-    await new Promise(resolve => {
-      const done = () => {
-        resolve();
-        iframe.removeEventListener('load', done);
-      }
-      iframe.addEventListener('load', done);
-      iframe.src = 'resources/green.html?1';
-      document.body.appendChild(iframe);
-    });
-
-    await new Promise(resolve => {
-      iframe.addEventListener('load', resolve);
-      iframe.src = 'resources/green.html?2';
-    });
-
-    const entries = performance.getEntries().filter(e => e.name.includes('green.html'));
-    assert_equals(entries.length, 2);
-  }, "An iframe should report separate RT entries if src changed");
-
-  </script>
+  test_frame_timing_before_load_event('iframe');
+  test_frame_timing_change_src('iframe');
+</script>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/frame-timing.js b/third_party/blink/web_tests/external/wpt/resource-timing/resources/frame-timing.js
new file mode 100644
index 0000000..e0c364e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/frame-timing.js
@@ -0,0 +1,48 @@
+function test_frame_timing_before_load_event(type) {
+    promise_test(async t => {
+        const {document, performance} = type === 'frame' ? window.parent : window;
+        const delay = 500;
+        const frame = document.createElement(type);
+        t.add_cleanup(() => frame.remove());
+        await new Promise(resolve => {
+            frame.addEventListener('load', resolve);
+            frame.src = `resources/iframe-with-delay.sub.html?delay=${delay}`;
+            (type === 'frame' ? document.querySelector('frameset') : document.body).appendChild(frame);
+        });
+
+        const entries = performance.getEntriesByName(frame.src);
+        const navigationEntry = frame.contentWindow.performance.getEntriesByType('navigation')[0];
+        assert_equals(entries.length, 1);
+        assert_equals(entries[0].initiatorType, type);
+        assert_greater_than(performance.now(), entries[0].responseEnd + delay);
+        const domContentLoadedEventAbsoluteTime = navigationEntry.domContentLoadedEventStart + frame.contentWindow.performance.timeOrigin;
+        const frameResponseEndAbsoluteTime = entries[0].responseEnd + performance.timeOrigin;
+        assert_greater_than(domContentLoadedEventAbsoluteTime, frameResponseEndAbsoluteTime);
+    }, `A ${type} should report its RT entry when the response is done and before it is completely loaded`);
+}
+
+
+function test_frame_timing_change_src(type) {
+    promise_test(async t => {
+        const {document, performance} = type === 'frame' ? window.parent : window;
+        const frame = document.createElement(type);
+        t.add_cleanup(() => frame.remove());
+        await new Promise(resolve => {
+          const done = () => {
+            resolve();
+            frame.removeEventListener('load', done);
+          }
+          frame.addEventListener('load', done);
+          frame.src = 'resources/green.html?1';
+            (type === 'frame' ? document.querySelector('frameset') : document.body).appendChild(frame);
+        });
+
+        await new Promise(resolve => {
+          frame.addEventListener('load', resolve);
+          frame.src = 'resources/green.html?2';
+        });
+
+        const entries = performance.getEntries().filter(e => e.name.includes('green.html'));
+        assert_equals(entries.length, 2);
+      }, `A ${type} should report separate RT entries if its src changed from the outside`);
+}
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/frameset-timing-frame.html b/third_party/blink/web_tests/external/wpt/resource-timing/resources/frameset-timing-frame.html
new file mode 100644
index 0000000..e260f575
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/frameset-timing-frame.html
@@ -0,0 +1,8 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./frame-timing.js"></script>
+
+<script>
+  test_frame_timing_before_load_event('frame');
+  test_frame_timing_change_src('frame');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/window-move.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/window-move.html
index 02013a6d..9b2a7f9a 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/window-move.html
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/window-move.html
@@ -23,7 +23,7 @@
 if (!isPrerendering) {
   // Ensure that the primary page can move this window.
   tryRun(() => {
-    const expectedPosition = {x: window.screenX + 1, y: window.screenY + 1};
+    const expectedPosition = {x: screen.availLeft + 1, y: screen.availTop + 1};
     window.moveTo(expectedPosition.x, expectedPosition.y);
     assert_equals(window.screenX, expectedPosition.x, 'x position for primary');
     assert_equals(window.screenY, expectedPosition.y, 'y position for primary');
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open-manual.tentative.https.html
index 5214a48..f6e61e1 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open-manual.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open-manual.tentative.https.html
@@ -33,6 +33,24 @@
   popups.forEach(p => p.close());
 });
 
+function checkPopupPlacement(popup, x, y, allowSameScreenClamping) {
+  // Window.screenX|Y may be zero, if the user agent wishes to hide information
+  // about the screen of the output device. They also may incorrectly reflect
+  // the origin of content viewport; in that case, estimate window coordinates
+  // by subtracing estimated frame insets (top-heavy, horizontally centered).
+  // Synchronous estimated placements may be clamped to the current screen.
+  const error = 10;
+  const dX = popup.screenX - x - (popup.outerWidth - popup.innerWidth) / 2;
+  const dY = popup.screenY - y - (popup.outerHeight - popup.innerHeight);
+
+  assert_true(!popup.screenX || popup.screenX == x || Math.abs(dX) <= error ||
+              (allowSameScreenClamping && popup.screenX > screen.availLeft &&
+               popup.screenX < screen.availLeft + screen.availWidth));
+  assert_true(!popup.screenY || popup.screenY == y || Math.abs(dY) <= error ||
+              (allowSameScreenClamping && popup.screenY > screen.availTop &&
+               popup.screenY < screen.availTop + screen.availHeight));
+}
+
 async function testPopupOnScreen(popupTest, screen) {
   // Show a popup child window on the associated screen.
   const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150;
@@ -50,35 +68,24 @@
   log(`<div style='margin-left: 40px'>Initial bounds:
          (${popup.screenX}, ${popup.screenY})
        </div>`);
-  assert_equals(popup.screenX, left);
-  assert_equals(popup.screenY, top);
+  // Allow synchronous estimated placements to be clamped to the current screen.
+  checkPopupPlacement(popup, left, top, true);
   popup.initialScreenX = popup.screenX;
   popup.initialScreenY = popup.screenY;
 
-  // Wait for asynchronous window creation and clamped placement before checking
-  // resolved window.screenX|Y values. In practice, window.screenX|Y may change
-  // even after waiting for Window.onload and Window.requestAnimationFrame().
-  const eventWatcher = new EventWatcher(popupTest, popup, ['load']);
-  await eventWatcher.wait_for('load');
-  await new Promise(window.requestAnimationFrame);
-  await new Promise(resolve => {
-    step_timeout(resolve, 300);
-  });
+  // Await document.visibilitychange to check resolved Window.screenX|Y values
+  // after asynchronous window creation and clamped placement has occurred.
+  const visibilitychangeWatcher =
+      new EventWatcher(popupTest, popup.document, ['visibilitychange']);
+  await visibilitychangeWatcher.wait_for('visibilitychange');
   popup.document.write(`Expected: (${left}, ${top}) <br> \
        Initial: (${popup.initialScreenX}, ${popup.initialScreenY}) <br> \
        Resolved: (${popup.screenX}, ${popup.screenY}) `);
   log(`<div style='margin-left: 40px'>Resolved bounds:
          (${popup.screenX}, ${popup.screenY})
        </div>`);
-  // Window.screenX|Y may be zero, if the user agent wishes to hide information
-  // about the screen of the output device. They also may incorrectly reflect
-  // the origin of content viewport; in that case, estimate window coordinates
-  // by subtracing estimated frame insets (top-heavy, horizontally centered).
-  const error = 10;
-  const dX = popup.screenX - left - (popup.outerWidth - popup.innerWidth) / 2;
-  const dY = popup.screenY - top - (popup.outerHeight - popup.innerHeight);
-  assert_true(!popup.screenX || popup.screenX == left || Math.abs(dX) <= error);
-  assert_true(!popup.screenY || popup.screenY == top || Math.abs(dY) <= error);
+  // Do not allow resolved placements to be clamped to the current screen.
+  checkPopupPlacement(popup, left, top, false);
 }
 
 promise_test(async setUpTest => {
diff --git a/third_party/blink/web_tests/fast/dom/Window/window-moveto-popup-expected.txt b/third_party/blink/web_tests/fast/dom/Window/window-moveto-popup-expected.txt
index 2be07a7a..90a308d 100644
--- a/third_party/blink/web_tests/fast/dom/Window/window-moveto-popup-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/window-moveto-popup-expected.txt
@@ -1,2 +1,2 @@
-Window right edge exceeds screen right edge? (stable should be false): true
-Window bottom edge exceeds screen bottom edge? (stable should be false): true
+Window right edge exceeds screen right edge? (stable should be false): false
+Window bottom edge exceeds screen bottom edge? (stable should be false): false
diff --git a/third_party/blink/web_tests/fast/dom/Window/window-resize-expected.txt b/third_party/blink/web_tests/fast/dom/Window/window-resize-expected.txt
index cccaf5d3..462122c 100644
--- a/third_party/blink/web_tests/fast/dom/Window/window-resize-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/window-resize-expected.txt
@@ -8,7 +8,7 @@
 
 
 Testing - resizeTo: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
+PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - resizeTo: Too Small
@@ -16,15 +16,15 @@
 
 
 Testing - resizeTo: Full Screen Out of Bounds
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenY == screen.availTop is true
+PASS window.outerHeight == screen.availHeight is true
+PASS window.screenX == screen.availLeft is true
 PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - resizeTo: Not Full Screen Out of Bounds
-FAIL window.outerHeight + window.screenY - screen.availTop == screen.availHeight should be true. Was false.
-FAIL window.outerWidth + window.screenX - screen.availLeft == screen.availWidth should be true. Was false.
+PASS window.outerHeight + window.screenY - screen.availTop == screen.availHeight is true
+PASS window.outerWidth + window.screenX - screen.availLeft == screen.availWidth is true
 
 
 window.resizeBy Tests
@@ -35,24 +35,24 @@
 
 
 Testing - resizeBy: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
+PASS window.outerWidth == screen.availWidth is true
 
 
 window.moveTo Tests
 
 
 Testing - moveTo: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenY == screen.availTop is true
+PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveTo: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
+PASS window.screenY == screen.availTop is true
 PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveTo: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
+PASS window.screenY == screen.availTop is true
 PASS window.outerWidth == screen.availWidth is true
 
 
@@ -62,23 +62,23 @@
 
 
 Testing - moveTo: Bottom Right
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
 PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - moveTo: Bottom
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
 PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveTo: Bottom Left
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
+PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveTo: Left
 PASS window.screenY == screen.availTop is true
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenX == screen.availLeft is true
 
 
 window.moveBy Tests
@@ -100,41 +100,41 @@
 
 
 Testing - moveBy: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenY == screen.availTop is true
+PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveBy: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenY == screen.availTop is true
+PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveBy: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
+PASS window.screenY == screen.availTop is true
 PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - moveBy: Right
-FAIL window.screenY == screen.availTop should be true. Was false.
+PASS window.screenY == screen.availTop is true
 PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - moveBy: Bottom Right
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
 PASS window.outerWidth == screen.availWidth is true
 
 
 Testing - moveBy: Bottom
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
 
 
 Testing - moveBy: Bottom Left
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.outerHeight == screen.availHeight is true
+PASS window.screenX == screen.availLeft is true
 
 
 Testing - moveBy: Left
-FAIL window.screenX == screen.availLeft should be true. Was false.
+PASS window.screenX == screen.availLeft is true
 
 
 PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/platform/linux/fast/dom/Window/window-resize-expected.txt b/third_party/blink/web_tests/platform/linux/fast/dom/Window/window-resize-expected.txt
deleted file mode 100644
index 857ae308..0000000
--- a/third_party/blink/web_tests/platform/linux/fast/dom/Window/window-resize-expected.txt
+++ /dev/null
@@ -1,143 +0,0 @@
-This test makes sure that we have similar behavior as other browsers when resizing and moving a window outside of the screen. This test will fail in some dimensions when run manually because of inconsistencies of when the window can and cannot go behind the doc.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-
-window.resizeTo Tests
-
-
-Testing - resizeTo: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
-
-
-Testing - resizeTo: Too Small
-PASS window.outerWidth == 100 is true
-
-
-Testing - resizeTo: Full Screen Out of Bounds
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerHeight == screen.availHeight is true
-FAIL window.screenX == screen.availLeft should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - resizeTo: Not Full Screen Out of Bounds
-FAIL window.outerHeight + window.screenY - screen.availTop == screen.availHeight should be true. Was false.
-FAIL window.outerWidth + window.screenX - screen.availLeft == screen.availWidth should be true. Was false.
-
-
-window.resizeBy Tests
-
-
-Testing - resizeBy: Too Small
-PASS window.outerWidth == 100 is true
-
-
-Testing - resizeBy: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
-
-
-window.moveTo Tests
-
-
-Testing - moveTo: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveTo: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.screenX == screen.availLeft is true
-
-
-Testing - moveTo: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Right
-PASS window.screenY == screen.availTop is true
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Bottom Right
-PASS window.outerHeight == screen.availHeight is true
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Bottom
-PASS window.outerHeight == screen.availHeight is true
-PASS window.screenX == screen.availLeft is true
-
-
-Testing - moveTo: Bottom Left
-PASS window.outerHeight == screen.availHeight is true
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveTo: Left
-PASS window.screenY == screen.availTop is true
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-window.moveBy Tests
-
-
-Testing - moveBy: Zero Zero
-PASS window.screenX == previousScreenX is true
-PASS window.screenY == previousScreenY is true
-
-
-Testing - moveBy: One Zero
-PASS window.screenX == previousScreenX + 1 is true
-PASS window.screenY == previousScreenY is true
-
-
-Testing - moveBy: Zero One
-PASS window.screenX == previousScreenX is true
-PASS window.screenY == previousScreenY + 1 is true
-
-
-Testing - moveBy: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Bottom Right
-PASS window.outerHeight == screen.availHeight is true
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Bottom
-PASS window.outerHeight == screen.availHeight is true
-
-
-Testing - moveBy: Bottom Left
-PASS window.outerHeight == screen.availHeight is true
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Left
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub-expected.txt
new file mode 100644
index 0000000..2d43bdfc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = Uncaught TypeError: callback is not a function
+FAIL allow attr timing test same origin assert_equals: expected "NotAllowedError" but got "timeout"
+PASS allow attr timing test diff origin
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
new file mode 100644
index 0000000..bee1f6e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS show: When autofocus is not present, the first focusable shadow-including descendant must be focused
+PASS showModal: When autofocus is not present, the first focusable shadow-including descendant must be focused
+FAIL show: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL showModal: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL show: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL showModal: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL show: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
new file mode 100644
index 0000000..4999c61
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS An iframe should report its RT entry when the response is done and before it is completely loaded
+FAIL An iframe should report separate RT entries if src changed assert_equals: expected 2 but got 1
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
new file mode 100644
index 0000000..bee1f6e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS show: When autofocus is not present, the first focusable shadow-including descendant must be focused
+PASS showModal: When autofocus is not present, the first focusable shadow-including descendant must be focused
+FAIL show: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL showModal: autofocus outside a shadow tree must take precedence over earlier in-shadow-tree focusable elements assert_equals: expected Element node <div></div> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL show: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL showModal: autofocus inside a shadow tree must be ignored: no focusable elements outside the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <button tabindex="-1" autofocus="">Focusable</button>
+FAIL show: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element before the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: autofocus inside a shadow tree must be ignored: focusable element after the shadow tree assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
new file mode 100644
index 0000000..4999c61
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS An iframe should report its RT entry when the response is done and before it is completely loaded
+FAIL An iframe should report separate RT entries if src changed assert_equals: expected 2 but got 1
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/fast/dom/Window/window-resize-expected.txt b/third_party/blink/web_tests/platform/mac/fast/dom/Window/window-resize-expected.txt
deleted file mode 100644
index c5efdb0..0000000
--- a/third_party/blink/web_tests/platform/mac/fast/dom/Window/window-resize-expected.txt
+++ /dev/null
@@ -1,143 +0,0 @@
-This test makes sure that we have similar behavior as other browsers when resizing and moving a window outside of the screen. This test will fail in some dimensions when run manually because of inconsistencies of when the window can and cannot go behind the doc.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-
-window.resizeTo Tests
-
-
-Testing - resizeTo: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
-
-
-Testing - resizeTo: Too Small
-PASS window.outerWidth == 100 is true
-
-
-Testing - resizeTo: Full Screen Out of Bounds
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - resizeTo: Not Full Screen Out of Bounds
-FAIL window.outerHeight + window.screenY - screen.availTop == screen.availHeight should be true. Was false.
-FAIL window.outerWidth + window.screenX - screen.availLeft == screen.availWidth should be true. Was false.
-
-
-window.resizeBy Tests
-
-
-Testing - resizeBy: Too Small
-PASS window.outerWidth == 100 is true
-
-
-Testing - resizeBy: Too Big
-FAIL window.outerWidth == screen.availWidth should be true. Was false.
-
-
-window.moveTo Tests
-
-
-Testing - moveTo: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveTo: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.screenX == screen.availLeft is true
-
-
-Testing - moveTo: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Bottom Right
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveTo: Bottom
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-PASS window.screenX == screen.availLeft is true
-
-
-Testing - moveTo: Bottom Left
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveTo: Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-window.moveBy Tests
-
-
-Testing - moveBy: Zero Zero
-PASS window.screenX == previousScreenX is true
-PASS window.screenY == previousScreenY is true
-
-
-Testing - moveBy: One Zero
-PASS window.screenX == previousScreenX + 1 is true
-PASS window.screenY == previousScreenY is true
-
-
-Testing - moveBy: Zero One
-PASS window.screenX == previousScreenX is true
-PASS window.screenY == previousScreenY + 1 is true
-
-
-Testing - moveBy: Top Left
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Top
-FAIL window.screenY == screen.availTop should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Top Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Right
-FAIL window.screenY == screen.availTop should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Bottom Right
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-PASS window.outerWidth == screen.availWidth is true
-
-
-Testing - moveBy: Bottom
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-
-
-Testing - moveBy: Bottom Left
-FAIL window.outerHeight == screen.availHeight should be true. Was false.
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-Testing - moveBy: Left
-FAIL window.screenX == screen.availLeft should be true. Was false.
-
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/README.md b/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/README.md
new file mode 100644
index 0000000..9e1974e
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/README.md
@@ -0,0 +1,4 @@
+This virtual suite runs automatic lazy frame loading tests. When the flag
+`AutomaticLazyFrameLoadingToAds` is enabled, third party frames which urls are matched by [subresource_filter](https://chromium.googlesource.com/chromium/src.git/+/main/components/subresource_filter/README.md) is lazily loaded automatically.
+
+Bug: crbug.com/1265343
diff --git a/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/http/tests/subresource_filter/frame-lazyload.html b/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/http/tests/subresource_filter/frame-lazyload.html
new file mode 100644
index 0000000..b672a70
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/automatic-lazy-frame-loading-ads/http/tests/subresource_filter/frame-lazyload.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+
+<title>Makes sure that the ad iframe loading are defered</title>
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<script src="../../../../../http/tests/resources/get-host-info.js"></script>
+
+<body>
+  <div id="atf_div"></div>
+  <div style="height:1000vh;"></div>
+  <div id="btf_div"></div>
+
+  <script>
+    window.addEventListener('DOMContentLoaded', () => {
+      const waitUntilIdle = () => {
+        return new Promise(resolve => {
+          window.requestIdleCallback(() => resolve());
+        });
+      };
+      const loaded_ids = [];
+      const appendAdFrame = (id, elm) => {
+        const frame = document.createElement('iframe');
+        frame.width = 300;
+        frame.height = 300;
+        frame.id = id;
+
+        elm.appendChild(frame);
+        internals.setIsAdSubframe(frame);
+
+        // Simulate 3P domain
+        const third_pary_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+        frame.src = `${third_pary_origin}/resources/dummy.html`;
+
+        frame.onload = () => {
+          loaded_ids.push(id)
+        };
+      };
+      const isElementLoaded = (id) => loaded_ids.includes(id);
+      const waitForElementLoad = (id) => {
+        return new Promise((resolve, reject) => {
+          const elm = document.getElementById(id)
+          if (isElementLoaded(id)) {
+            resolve(true);
+          } else {
+            elm.addEventListener('load', () => {
+              resolve(true);
+            });
+          }
+        });
+      };
+
+      promise_test(async t => {
+        const atf = document.querySelector('#atf_div');
+        const btf = document.querySelector('#btf_div');
+        appendAdFrame('atf', atf);
+        appendAdFrame('btf', btf);
+
+        let result;
+        result = await waitForElementLoad('atf');
+        assert_true(result, 'iframe above the fold is successfully loaded');
+        // To detect the frame src is not loaded, wait until idle
+        result = await waitUntilIdle().then(() => isElementLoaded('btf'));
+        assert_false(result, "iframe below the fold is not loaded on navigation");
+
+        // Then scroll to below the fold.
+        btf.scrollIntoView();
+
+        // If viewport is close to the frame, then start loading.
+        result = await waitForElementLoad("btf");
+        assert_true(result, "iframe below the fold is loaded when close to the element");
+      }, "Ad frame lazy loading");
+    })
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt b/third_party/blink/web_tests/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
new file mode 100644
index 0000000..9981d12
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-focus-shadow-expected.txt
@@ -0,0 +1,56 @@
+This is a testharness.js-based test.
+FAIL show: No autofocus, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div></div>
+FAIL showModal: No autofocus, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div></div>
+PASS show: No autofocus, no delegatesFocus, sibling before
+PASS showModal: No autofocus, no delegatesFocus, sibling before
+FAIL show: No autofocus, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: No autofocus, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+PASS show: No autofocus, yes delegatesFocus, no siblings
+PASS showModal: No autofocus, yes delegatesFocus, no siblings
+PASS show: No autofocus, yes delegatesFocus, sibling before
+PASS showModal: No autofocus, yes delegatesFocus, sibling before
+PASS show: No autofocus, yes delegatesFocus, sibling after
+PASS showModal: No autofocus, yes delegatesFocus, sibling after
+PASS show: Autofocus before, no delegatesFocus
+PASS showModal: Autofocus before, no delegatesFocus
+PASS show: Autofocus before, yes delegatesFocus
+PASS showModal: Autofocus before, yes delegatesFocus
+PASS show: Autofocus after, no delegatesFocus
+PASS showModal: Autofocus after, no delegatesFocus
+PASS show: Autofocus after, yes delegatesFocus
+PASS showModal: Autofocus after, yes delegatesFocus
+PASS show: Autofocus on shadow host, yes delegatesFocus, no siblings
+PASS showModal: Autofocus on shadow host, yes delegatesFocus, no siblings
+FAIL show: Autofocus on shadow host, yes delegatesFocus, sibling before assert_equals: expected Element node <div autofocus=""></div> but got Element node <button tabindex="-1">Focusable</button>
+FAIL showModal: Autofocus on shadow host, yes delegatesFocus, sibling before assert_equals: expected Element node <div autofocus=""></div> but got Element node <button tabindex="-1">Focusable</button>
+PASS show: Autofocus on shadow host, yes delegatesFocus, sibling after
+PASS showModal: Autofocus on shadow host, yes delegatesFocus, sibling after
+FAIL show: Autofocus on shadow host, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div autofocus=""></div>
+FAIL showModal: Autofocus on shadow host, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div autofocus=""></div>
+PASS show: Autofocus on shadow host, no delegatesFocus, sibling before
+PASS showModal: Autofocus on shadow host, no delegatesFocus, sibling before
+FAIL show: Autofocus on shadow host, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div autofocus=""></div>
+FAIL showModal: Autofocus on shadow host, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div autofocus=""></div>
+PASS show: Autofocus inside shadow tree, yes delegatesFocus, no siblings
+PASS showModal: Autofocus inside shadow tree, yes delegatesFocus, no siblings
+FAIL show: Autofocus inside shadow tree, yes delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, yes delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, yes delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, yes delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, no siblings assert_equals: expected Element node <button tabindex="-1" id="focus-between-tests">Focus betw... but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, no siblings assert_equals: expected Element node <body>
+
+<!--
+  We focus this one between each test, to en... but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, sibling before assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL show: Autofocus inside shadow tree, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+FAIL showModal: Autofocus inside shadow tree, no delegatesFocus, sibling after assert_equals: expected Element node <button tabindex="-1" class="focus-me">Focusable</button> but got Element node <div></div>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/no-forced-frame-updates/README.md b/third_party/blink/web_tests/virtual/no-forced-frame-updates/README.md
index c286d2a..905b694 100644
--- a/third_party/blink/web_tests/virtual/no-forced-frame-updates/README.md
+++ b/third_party/blink/web_tests/virtual/no-forced-frame-updates/README.md
@@ -1,5 +1,5 @@
-This suite runs WPT tests under `html/dom/render-blocking/mechanism` with
-`--enable-features=NoForcedFrameUpdates`.
+This suite runs WPT tests under `html/dom/render-blocking` with
+`--enable-features=NoForcedFrameUpdatesForWebTests`.
 
 TODO(crbug.com/1271296): Remove this virtual test suite when WPT runner is
 enabled on CQ.
diff --git a/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
new file mode 100644
index 0000000..d9e92b21
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/plz-dedicated-worker/external/wpt/resource-timing/iframe-sequence-of-events-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS A iframe should report its RT entry when the response is done and before it is completely loaded
+FAIL A iframe should report separate RT entries if its src changed from the outside assert_equals: expected 2 but got 1
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/window-moveto-popup-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/window-moveto-popup-expected.txt
deleted file mode 100644
index 90a308d..0000000
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/window-moveto-popup-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Window right edge exceeds screen right edge? (stable should be false): false
-Window bottom edge exceeds screen bottom edge? (stable should be false): false
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
index 5f1fc20..964439b6 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
@@ -20,6 +20,7 @@
 ch-ua-model
 ch-ua-platform
 ch-ua-platform-version
+ch-ua-wow64
 ch-viewport-width
 ch-width
 clipboard-read
diff --git a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
index c8ba8e9f..669d2d9 100644
--- a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
+++ b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
@@ -22,6 +22,7 @@
 ch-ua-model
 ch-ua-platform
 ch-ua-platform-version
+ch-ua-wow64
 ch-viewport-height
 ch-viewport-width
 ch-width
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html
index 029fcc82..9432d0c 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/embedder-require-corp.https.html
@@ -1,14 +1,16 @@
 <!DOCTYPE html>
+<meta name="timeout" content="long">
 <title>Test COEP properties set for a Fenced Frame Tree</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
 <script src="/common/utils.js"></script>
 <script src="resources/utils.js"></script>
 <script src="resources/embedder-policy.js"></script>
 
 <body>
 <script>
-promise_test(async () => {
+promise_test(async (t) => {
   const uuid = token();
   const frame = setupTest("coep:require-corp", uuid);
   const result = await nextValueFromServer(uuid);
@@ -17,10 +19,21 @@
 
 promise_test(async (t) => {
   const uuid = token();
-  t.step_timeout(() => t.done(), 3000);
+  t.step_timeout(() => t.done(), 1000);
   const frame = setupTest("no coep", uuid);
   const result = await nextValueFromServer(uuid);
   assert_unreached("embedded page should not be loaded.");
 }, "Create fencedframe without COEP header");
+
+promise_test(async (t) => {
+  const uuid = token();
+  // Make sure a different site is used.
+  hostname = get_host_info().REMOTE_HOST;
+  t.step_timeout(() => t.done(), 1000);
+  const frame = setupTest("coep:require-corp", uuid, hostname=hostname);
+  const result = await nextValueFromServer(uuid);
+  assert_unreached("embedded page should not be loaded.");
+}, "Create fencedframe with a cross site COEP:require-corp and CORP:same-orign");
+</script>
 </script>
 </body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embedder-policy.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embedder-policy.js
index 9929b522..8c96afaf 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embedder-policy.js
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/embedder-policy.js
@@ -1,4 +1,5 @@
 // This file should be loaded alongside with utils.js.
+//
 // This file is loaded by:
 // - embedder-no-coep.https.html
 // - embedder-require-corp.https.html
@@ -15,11 +16,12 @@
 }
 
 // Setup a fenced frame for embedder-* WPTs.
-async function setupTest(test_type, uuid) {
+async function setupTest(test_type, uuid, hostname='') {
   let headers = ["Supports-Loading-Mode,fenced-frame"];
   switch (test_type) {
     case "coep:require-corp":
       headers.push("cross-origin-embedder-policy,require-corp");
+      headers.push("cross-origin-resource-policy,same-origin");
       break;
     case "no coep":
       break;
@@ -27,7 +29,11 @@
       assert_unreachable("unknown test_type:" + test_type);
       break;
   }
-  const header_pipe = generateHeader(headers);
-  const url = generateURL('resources/embeddee.html?pipe=' + header_pipe, [uuid]);
+  const tmp_url = new URL('resources/embeddee.html', location.href);
+  if (hostname) {
+    tmp_url.hostname = hostname;
+  }
+  tmp_url.searchParams.append("pipe", generateHeader(headers));
+  const url = generateURL(tmp_url.toString(), [uuid]);
   return attachFencedFrame(url);
 }
diff --git a/third_party/eigen3/README.chromium b/third_party/eigen3/README.chromium
index b6f2b19..ee8bf86 100644
--- a/third_party/eigen3/README.chromium
+++ b/third_party/eigen3/README.chromium
@@ -1,8 +1,8 @@
 Name: Eigen
 Short Name: eigen3
 URL: http://eigen.tuxfamily.org/
-Version: a30ecb7221a46824b85cad5f9016efe6e5871d69
-Date: 2022/01/25
+Version: 7db0ac977acf276fb0817cfb89e490cdbae0ab56
+Date: 2022/01/31
 License: MPL 2
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 5cde715..3eeb323 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-11-1-84-gfa226478b
-Revision: fa226478b1dc846ba86eb364c524fb3f4c3bcd0d
+Version: VER-2-11-1-91-g946e1353e
+Revision: 946e1353eaa34872d0b138a13820fc03a782c545
 CPEPrefix: cpe:/a:freetype:freetype:2.11.1
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium
index 80b7cdd4..25c18f2c 100644
--- a/third_party/tflite/README.chromium
+++ b/third_party/tflite/README.chromium
@@ -1,8 +1,8 @@
 Name: TensorFlow Lite
 Short Name: tflite
 URL: https://github.com/tensorflow/tensorflow
-Version: e8d09964ddf7d87041a9f9732be7645ea257dac9
-Date: 2022/01/25
+Version: d570144d42b17065ea1c222e9ea38fa1810bee21
+Date: 2022/01/31
 License: Apache 2.0
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/updater/.gitignore b/third_party/updater/.gitignore
index 9b31450..3d24ad2 100644
--- a/third_party/updater/.gitignore
+++ b/third_party/updater/.gitignore
@@ -1,4 +1,7 @@
+/chromium_mac_amd64/updater/
+/chromium_mac_arm64/updater/
+/chromium_win_x86/UpdaterSetup_test.exe
+/chromium_win_x86_64/UpdaterSetup_test.exe
+
 # EdgeUpdater app
 /EdgeUpdater.app
-/chromium_mac_amd64/updater/
-/chromium_mac_arm64/updater/
\ No newline at end of file
diff --git a/third_party/wayland-protocols/unstable/touchpad-haptics/touchpad-haptics-unstable-v1.xml b/third_party/wayland-protocols/unstable/touchpad-haptics/touchpad-haptics-unstable-v1.xml
index 3fc7ca2..5290bed 100644
--- a/third_party/wayland-protocols/unstable/touchpad-haptics/touchpad-haptics-unstable-v1.xml
+++ b/third_party/wayland-protocols/unstable/touchpad-haptics/touchpad-haptics-unstable-v1.xml
@@ -24,7 +24,7 @@
     DEALINGS IN THE SOFTWARE.
   </copyright>
 
-  <interface name="zcr_touchpad_haptics_v1" version="2">
+  <interface name="zcr_touchpad_haptics_v1" version="1">
     <description summary="Allows to play haptic feedback effects on touchpad">
       Allows to play haptic feedback effects on touchpad.
 
@@ -81,14 +81,6 @@
       <arg name="strength" type="int"/>
     </request>
 
-    <!-- Version 2 additions -->
-
-    <request name="request_activation_state" since="2">
-      <description summary="ask to send whether touchpad haptics activated or not">
-	Ask the server to send an event for the current activation state.
-      </description>
-    </request>
-
   </interface>
 
 </protocol>
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py
index 8cc6358..3ee108fa 100755
--- a/tools/clang/scripts/package.py
+++ b/tools/clang/scripts/package.py
@@ -555,8 +555,9 @@
   PackageInArchive(clang_tidy_dir, clang_tidy_dir + '.tgz')
   MaybeUpload(args.upload, clang_tidy_dir + '.tgz', gcs_platform)
 
-  # Zip up clang-libs for users who opt into it. We want the clang
-  # headers as well as the static libraries.
+  # Zip up clang-libs for users who opt into it. We want Clang and LLVM headers
+  # and libs, as well as a couple binaries. The LLVM parts are needed by the
+  # Rust build.
   clang_libs_dir = 'clang-libs-' + stamp
   shutil.rmtree(clang_libs_dir, ignore_errors=True)
   os.makedirs(os.path.join(clang_libs_dir, 'include'))
@@ -565,6 +566,24 @@
   # unless we see it's needed, and we can document why.
   shutil.copytree(os.path.join(LLVM_DIR, 'clang', 'include', 'clang'),
                   os.path.join(clang_libs_dir, 'include', 'clang'))
+
+  # Copy LLVM includes. The llvm source and build directory includes must be
+  # merged. llvm-c for C bindings is also included.
+  shutil.copytree(os.path.join(LLVM_DIR, 'llvm', 'include', 'llvm'),
+                  os.path.join(clang_libs_dir, 'include', 'llvm'))
+  shutil.copytree(os.path.join(LLVM_DIR, 'llvm', 'include', 'llvm-c'),
+                  os.path.join(clang_libs_dir, 'include', 'llvm-c'))
+  shutil.copytree(os.path.join(LLVM_RELEASE_DIR, 'include', 'llvm'),
+                  os.path.join(clang_libs_dir, 'include', 'llvm'),
+                  dirs_exist_ok=True)
+
+  # Copy llvm-config and FileCheck which the Rust build needs
+  os.makedirs(os.path.join(clang_libs_dir, 'bin'))
+  shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'llvm-config' + exe_ext),
+              os.path.join(clang_libs_dir, 'bin'))
+  shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'FileCheck' + exe_ext),
+              os.path.join(clang_libs_dir, 'bin'))
+
   os.makedirs(os.path.join(clang_libs_dir, 'lib'))
   if sys.platform == 'win32':
     clang_libs_want = [
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 6a6a077..e97b689 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -36,7 +36,7 @@
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
 CLANG_REVISION = 'llvmorg-14-init-17086-g38e16e1c'
-CLANG_SUB_REVISION = 3
+CLANG_SUB_REVISION = 4
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '14.0.0'
@@ -290,7 +290,7 @@
   return 0
 
 
-def main():
+def GetDefaultHostOs():
   _PLATFORM_HOST_OS_MAP = {
       'darwin': 'mac',
       'cygwin': 'win',
@@ -300,7 +300,10 @@
   default_host_os = _PLATFORM_HOST_OS_MAP.get(sys.platform, sys.platform)
   if default_host_os == 'mac' and platform.machine() == 'arm64':
     default_host_os = 'mac-arm64'
+  return default_host_os
 
+
+def main():
   parser = argparse.ArgumentParser(description='Update clang.')
   parser.add_argument('--output-dir',
                       help='Where to extract the package.')
@@ -308,9 +311,9 @@
                       help='What package to update (default: clang)',
                       default='clang')
   parser.add_argument('--host-os',
-                      help='Which host OS to download for (default: %s)' %
-                      default_host_os,
-                      default=default_host_os,
+                      help=('Which host OS to download for '
+                            '(default: %(default)s)'),
+                      default=GetDefaultHostOs(),
                       choices=('linux', 'mac', 'mac-arm64', 'win'))
   parser.add_argument('--print-revision', action='store_true',
                       help='Print current clang revision and exit.')
diff --git a/tools/make-gtest-filter.py b/tools/make-gtest-filter.py
deleted file mode 100755
index 4a6b3206..0000000
--- a/tools/make-gtest-filter.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Reads lines from files or stdin and identifies C++ tests.
-
-Outputs a filter that can be used with --gtest_filter to run only the tests
-identified.
-
-Usage:
-
-Outputs filter for all test fixtures in a directory. --class-only avoids an
-overly long filter string.
-> cat components/mycomp/**test.cc | make-gtest-filter.py --class-only
-
-Outputs filter for all tests in a file.
-> make-gtest-filter.py ./myfile_unittest.cc
-
-Outputs filter for only test at line 123
-> make-gtest-filter.py --line=123 ./myfile_unittest.cc
-"""
-
-from __future__ import print_function
-
-import argparse
-import fileinput
-import re
-import sys
-
-parser = argparse.ArgumentParser()
-parser.add_argument('--line', type=int)
-parser.add_argument('--class-only', action='store_true')
-args, left = parser.parse_known_args()
-file_input = fileinput.input(left)
-
-if args.line:
-  # If --line is used, restrict text to a few lines around the requested
-  # line.
-  requested_line = args.line
-  selected_lines = []
-  for line in file_input:
-    if (fileinput.lineno() >= requested_line and
-        fileinput.lineno() <= requested_line + 1):
-      selected_lines.append(line)
-  txt = ''.join(selected_lines)
-else:
-  txt = ''.join(list(file_input))
-
-# This regex is not exhaustive, and should be updated as needed.
-rx = re.compile(
-    r'^(?:TYPED_)?(?:IN_PROC_BROWSER_)?TEST(_F|_P)?\(\s*(\w+)\s*,\s*(\w+)\s*\)',
-    flags=re.DOTALL | re.M)
-tests = []
-for m in rx.finditer(txt):
-  tests.append(m.group(2) + '.' + m.group(3))
-
-# Note: Test names have the following structures:
-#  * FixtureName.TestName
-#  * InstantiationName/FixtureName.TestName/##
-# Since this script doesn't parse instantiations, we generate filters to match
-# either regular tests or instantiated tests.
-if args.class_only:
-  fixtures = set([t.split('.')[0] for t in tests])
-  test_filters = [c + '.*' for c in fixtures]
-  instantiation_filters = ['*/' + c + '.*/*' for c in fixtures]
-  print(':'.join(test_filters + instantiation_filters))
-else:
-  instantiations = ['*/' + c + '/*' for c in tests]
-  print(':'.join(tests + instantiations))
diff --git a/tools/make_gtest_filter.py b/tools/make_gtest_filter.py
new file mode 100755
index 0000000..a244488
--- /dev/null
+++ b/tools/make_gtest_filter.py
@@ -0,0 +1,268 @@
+#!/usr/bin/env python
+# Copyright (c) 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Reads lines from files or stdin and identifies C++ tests.
+
+Outputs a filter that can be used with --gtest_filter or a filter file to
+run only the tests identified.
+
+Usage:
+
+Outputs filter for all test fixtures in a directory. --class-only avoids an
+overly long filter string.
+$ cat components/mycomp/**test.cc | make-gtest-filter.py --class-only
+
+Outputs filter for all tests in a file.
+$ make-gtest-filter.py ./myfile_unittest.cc
+
+Outputs filter for only test at line 123
+$ make-gtest-filter.py --line=123 ./myfile_unittest.cc
+
+Formats output as a GTest filter file.
+$ make-gtest-filter.py ./myfile_unittest.cc --as-filter-file
+
+Use a JSON failure summary as the input.
+$ make-gtest-filter.py summary.json --from-failure-summary
+
+Elide the filter list using wildcards when possible.
+$ make-gtest-filter.py summary.json --from-failure-summary --wildcard-compress
+"""
+
+from __future__ import print_function
+
+import argparse
+import collections
+import fileinput
+import json
+import re
+import sys
+
+
+class TrieNode:
+  def __init__(self):
+    # The number of strings which terminated on or underneath this node.
+    self.num_strings = 0
+
+    # The prefix subtries which follow |this|, keyed by their next character.
+    self.children = {}
+
+
+def PascalCaseSplit(input_string):
+  current_term = []
+  prev_char = ''
+
+  for current_char in input_string:
+    is_boundary = prev_char != '' and \
+                  ((current_char.isupper() and prev_char.islower()) or \
+                   (current_char.isalpha() != prev_char.isalpha()) or \
+                   (current_char.isalnum() != prev_char.isalnum()))
+    prev_char = current_char
+
+    if is_boundary:
+      yield ''.join(current_term)
+      current_term = []
+
+    current_term.append(current_char)
+
+  if len(current_term) > 0:
+    yield ''.join(current_term)
+
+
+def TrieInsert(trie, value):
+  """Inserts the characters of 'value' into a trie, with every edge representing
+  a single character. An empty child set indicates end-of-string."""
+
+  for term in PascalCaseSplit(value):
+    trie.num_strings = trie.num_strings + 1
+    if term in trie.children:
+      trie = trie.children[term]
+    else:
+      subtrie = TrieNode()
+      trie.children[term] = subtrie
+      trie = subtrie
+
+  trie.num_strings = trie.num_strings + 1
+
+
+def ComputeWildcardsFromTrie(trie, min_depth, min_cases):
+  """Computes a list of wildcarded test case names from a trie using a depth
+  first traversal."""
+
+  WILDCARD = '*'
+
+  # Stack of values to process, initialized with the root node.
+  # The first item of the tuple is the substring represented by the traversal so
+  # far.
+  # The second item of the tuple is the TrieNode itself.
+  # The third item is the depth of the traversal so far.
+  to_process = [('', trie, 0)]
+
+  while len(to_process) > 0:
+    cur_prefix, cur_trie, cur_depth = to_process.pop()
+    assert (cur_trie.num_strings != 0)
+
+    if len(cur_trie.children) == 0:
+      # No more children == we're at the end of a string.
+      yield cur_prefix
+
+    elif (cur_depth == min_depth) and \
+         cur_trie.num_strings > min_cases:
+      # Trim traversal of this path if the path is deep enough and there
+      # are enough entries to warrant elision.
+      yield cur_prefix + WILDCARD
+
+    else:
+      # Traverse all children of this node.
+      for term, subtrie in cur_trie.children.items():
+        to_process.append((cur_prefix + term, subtrie, cur_depth + 1))
+
+
+def CompressWithWildcards(test_list, min_depth, min_cases):
+  """Given a list of SUITE.CASE names, generates an exclusion list using
+  wildcards to reduce redundancy.
+  For example:
+    Foo.TestOne
+    Foo.TestTwo
+  becomes:
+    Foo.Test*"""
+
+  suite_tries = {}
+
+  # First build up a trie based representations of all test case names,
+  # partitioned per-suite.
+  for case in test_list:
+    suite_name, test = case.split('.')
+    if not suite_name in suite_tries:
+      suite_tries[suite_name] = TrieNode()
+    TrieInsert(suite_tries[suite_name], test)
+
+  output = []
+  # Go through the suites' tries and generate wildcarded representations
+  # of the cases.
+  for suite in suite_tries.items():
+    suite_name, cases_trie = suite
+    for case_wildcard in ComputeWildcardsFromTrie(cases_trie, min_depth, \
+            min_cases):
+      output.append("{}.{}".format(suite_name, case_wildcard))
+
+  output.sort()
+  return output
+
+
+def GetFailedTestsFromTestLauncherSummary(summary):
+  failures = set()
+  for iteration in summary['per_iteration_data']:
+    for case_name, results in iteration.items():
+      for result in results:
+        if result['status'] == 'FAILURE':
+          failures.add(case_name)
+  return list(failures)
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '--input-format',
+      choices=['swarming_summary', 'test_launcher_summary', 'test_file'],
+      default='test_file')
+  parser.add_argument('--output-format',
+                      choices=['file', 'args'],
+                      default='args')
+  parser.add_argument('--wildcard-compress', action='store_true')
+  parser.add_argument(
+      '--wildcard-min-depth',
+      default=1,
+      help="Minimum number of terms in a case before a wildcard may be " +
+      "used, so that prefixes are not excessively broad.")
+  parser.add_argument(
+      '--wildcard-min-cases',
+      default=3,
+      help="Minimum number of cases in a filter before folding into a " +
+      "wildcard, so as to not create wildcards needlessly for small "
+      "numbers of similarly named test failures.")
+  parser.add_argument('--line', type=int)
+  parser.add_argument('--class-only', action='store_true')
+  parser.add_argument(
+      '--as-exclusions',
+      action='store_true',
+      help='Generate exclusion rules for test cases, instead of inclusions.')
+  args, left = parser.parse_known_args()
+
+  test_filters = []
+  if args.input_format == 'swarming_summary':
+    # Decode the JSON files separately and combine their contents.
+    test_filters = []
+    for json_file in left:
+      test_filters.extend(json.loads('\n'.join(open(json_file, 'r'))))
+
+    if args.wildcard_compress:
+      test_filters = CompressWithWildcards(test_filters,
+                                           args.wildcard_min_depth,
+                                           args.wildcard_min_cases)
+
+  elif args.input_format == 'test_launcher_summary':
+    # Decode the JSON files separately and combine their contents.
+    test_filters = []
+    for json_file in left:
+      test_filters.extend(
+          GetFailedTestsFromTestLauncherSummary(
+              json.loads('\n'.join(open(json_file, 'r')))))
+
+    if args.wildcard_compress:
+      test_filters = CompressWithWildcards(test_filters,
+                                           args.wildcard_min_depth,
+                                           args.wildcard_min_cases)
+
+  else:
+    file_input = fileinput.input(left)
+    if args.line:
+      # If --line is used, restrict text to a few lines around the requested
+      # line.
+      requested_line = args.line
+      selected_lines = []
+      for line in file_input:
+        if (fileinput.lineno() >= requested_line
+            and fileinput.lineno() <= requested_line + 1):
+          selected_lines.append(line)
+      txt = ''.join(selected_lines)
+    else:
+      txt = ''.join(list(file_input))
+
+    # This regex is not exhaustive, and should be updated as needed.
+    rx = re.compile(
+        r'^(?:TYPED_)?(?:IN_PROC_BROWSER_)?TEST(_F|_P)?\(\s*(\w+)\s*' + \
+            r',\s*(\w+)\s*\)',
+        flags=re.DOTALL | re.M)
+    tests = []
+    for m in rx.finditer(txt):
+      tests.append(m.group(2) + '.' + m.group(3))
+
+    # Note: Test names have the following structures:
+    #  * FixtureName.TestName
+    #  * InstantiationName/FixtureName.TestName/##
+    # Since this script doesn't parse instantiations, we generate filters to
+    # match either regular tests or instantiated tests.
+    if args.wildcard_compress:
+      test_filters = CompressWithWildcards(tests, args.wildcard_min_depth,
+                                           args.wildcard_min_cases)
+    elif args.class_only:
+      fixtures = set([t.split('.')[0] for t in tests])
+      test_filters = [c + '.*' for c in fixtures] + \
+          ['*/' + c + '.*/*' for c in fixtures]
+    else:
+      test_filters = ['*/' + c + '/*' for c in tests]
+
+  if args.as_exclusions:
+    test_filters = ['-' + x for x in test_filters]
+
+  if args.output_format == 'file':
+    print('\n'.join(test_filters))
+  else:
+    print(':'.join(test_filters))
+
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/make_gtest_filter_test.py b/tools/make_gtest_filter_test.py
new file mode 100755
index 0000000..6bb52fdc
--- /dev/null
+++ b/tools/make_gtest_filter_test.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from make_gtest_filter import PascalCaseSplit, CompressWithWildcards
+
+
+class Foo(unittest.TestCase):
+  def testSplit(self):
+    self.assertEqual(list(PascalCaseSplit('testTerm')), ['test', 'Term'])
+    self.assertEqual(list(PascalCaseSplit('TestTerm')), ['Test', 'Term'])
+    self.assertEqual(list(PascalCaseSplit('TestTerm80')),
+                     ['Test', 'Term', '80'])
+    self.assertEqual(list(PascalCaseSplit('TestTerm80Foo')),
+                     ['Test', 'Term', '80', 'Foo'])
+    self.assertEqual(list(PascalCaseSplit('TestTerm80/Foo')),
+                     ['Test', 'Term', '80', '/', 'Foo'])
+
+  def testDepth(self):
+    melons = ['A.DoomMelonFooBar', 'A.DoomMelonFooBaz']
+    self.assertEqual(list(CompressWithWildcards(melons, 1, 0)), ['A.Doom*'])
+    self.assertEqual(list(CompressWithWildcards(melons, 2, 0)),
+                     ['A.DoomMelon*'])
+    self.assertEqual(list(CompressWithWildcards(melons, 3, 0)),
+                     ['A.DoomMelonFoo*'])
+    self.assertEqual(list(CompressWithWildcards(melons, 4, 0)),
+                     ['A.DoomMelonFooBar', 'A.DoomMelonFooBaz'])
+
+  def testDontWildcardAcrossSuites(self):
+    self.assertEqual(list(CompressWithWildcards(['A.X', 'B.X'], 1, 0)),
+                     ['A.X', 'B.X'])
+
+  def testCaseNumBoundaryBeforeWildcard(self):
+    fruit = ['A.DoomMelonFooBar', 'A.DoomMelonFooBaz', 'A.DoomBanana']
+    self.assertEqual(list(CompressWithWildcards(fruit, 2, 0)),
+                     ['A.DoomBanana', 'A.DoomMelon*'])
+    self.assertEqual(list(CompressWithWildcards(fruit, 2, 1)),
+                     ['A.DoomBanana', 'A.DoomMelon*'])
+    self.assertEqual(list(CompressWithWildcards(fruit, 2, 2)),
+                     ['A.DoomBanana', 'A.DoomMelonFooBar', 'A.DoomMelonFooBaz'])
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7f012ece..be06c75 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11402,6 +11402,8 @@
   <int value="31" label="Has copy requests"/>
   <int value="32" label="Overlay disabled"/>
   <int value="33" label="Video capture enabled"/>
+  <int value="34" label="Did not swap (Not for histogram)"/>
+  <int value="35" label="No widget (Not for histogram)"/>
 </enum>
 
 <enum name="CalendarEventFetchApiError">
@@ -11433,6 +11435,14 @@
   <int value="1002" label="DRIVE_RESPONSE_TOO_LARGE"/>
 </enum>
 
+<enum name="CalendarEventSource">
+  <int value="0" label="Invalid Event"/>
+  <int value="1" label="Tap"/>
+  <int value="2" label="Mouse Click"/>
+  <int value="3" label="Accelerator"/>
+  <int value="4" label="Stylus"/>
+</enum>
+
 <enum name="CameraPrivacySwitchEvent">
   <int value="0" label="Camera privacy switch toggled on"/>
   <int value="1" label="Camera privacy switch toggled off"/>
@@ -28450,6 +28460,7 @@
       label="ExemptDomainFileTypePairsFromFileTypeDownloadWarnings"/>
   <int value="948" label="FirstPartySetsEnabled"/>
   <int value="949" label="UserAgentForceMajorVersionToMinorPosition"/>
+  <int value="950" label="AllHttpAuthSchemesAllowedForOrigins"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -36973,6 +36984,7 @@
   <int value="4148" label="AbortSignalThrowIfAborted"/>
   <int value="4149" label="ClientHintsUAFull"/>
   <int value="4150" label="PrivateNetworkAccessWithinWorker"/>
+  <int value="4151" label="ClientHintsUAWoW64"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -37087,6 +37099,7 @@
   <int value="92" label="JoinAdInterestGroup"/>
   <int value="93" label="ClientHintUAFullVersionList"/>
   <int value="94" label="ClientHintUAFull"/>
+  <int value="95" label="ClientHintUAWoW64"/>
 </enum>
 
 <enum name="FeaturePolicyImageCompressionFormat">
@@ -38535,6 +38548,17 @@
   <int value="2" label="Selection menu"/>
 </enum>
 
+<enum name="FileManagerRecentFilterType">
+  <summary>
+    The filter type for Recent view, the types here should be in sync with the
+    enumFileType from chrome/browser/chromeos/fileapi/recent_source.h.
+  </summary>
+  <int value="0" label="All"/>
+  <int value="1" label="Audio"/>
+  <int value="2" label="Images"/>
+  <int value="3" label="Videos"/>
+</enum>
+
 <enum name="FileManagerRootType">
   <int value="0" label="DOWNLOADS"/>
   <int value="1" label="ARCHIVE"/>
@@ -43464,6 +43488,8 @@
   <int value="1" label="Metadata"/>
   <int value="2" label="Component Hint"/>
   <int value="3" label="Fetched Hint"/>
+  <int value="4" label="Prediction Model"/>
+  <int value="5" label="[Deprecated] Host Model Features"/>
 </enum>
 
 <enum name="HistogramActivityReport">
@@ -51029,6 +51055,7 @@
   <int value="-2071515296" label="allow-sync-xhr-in-page-dismissal"/>
   <int value="-2071202821" label="CopyLinkToText:enabled"/>
   <int value="-2068490665" label="PasswordChange:enabled"/>
+  <int value="-2067596114" label="WebAuthenticationCableDisco:enabled"/>
   <int value="-2067166422" label="enable-slimming-paint-v2"/>
   <int value="-2066541315" label="Mus:enabled"/>
   <int value="-2064164557" label="DownloadsForeground:disabled"/>
@@ -51051,6 +51078,7 @@
       label="PasswordsAccountStorageRevisedOptInFlow:enabled"/>
   <int value="-2054612904" label="BuiltInModuleInfra:enabled"/>
   <int value="-2053860791" label="XGEOVisibleNetworks:enabled"/>
+  <int value="-2053062676" label="EnableNeuralPalmAdaptiveHold:enabled"/>
   <int value="-2048927838" label="AutoplayWhitelistSettings:enabled"/>
   <int value="-2048732429" label="enable-alternative-services"/>
   <int value="-2048679945" label="NTPOfflinePageDownloadSuggestions:disabled"/>
@@ -51984,6 +52012,7 @@
   <int value="-1416184931" label="TranslateRankerEnforcement:enabled"/>
   <int value="-1415244717" label="CrostiniVirtualKeyboardSupport:disabled"/>
   <int value="-1414531531" label="NtpModulesRedesignedLayout:disabled"/>
+  <int value="-1414517775" label="EnableNeuralPalmRejectionModelV2:disabled"/>
   <int value="-1412230070" label="query-tiles-instant-background-task"/>
   <int value="-1411980923" label="LinkCapturingUiUpdate:enabled"/>
   <int value="-1411733990" label="OmniboxDedupeGoogleDriveURLs:disabled"/>
@@ -52671,6 +52700,8 @@
   <int value="-946366838" label="MetricsSettingsAndroid:enabled"/>
   <int value="-945806012" label="DownloadsUi:enabled"/>
   <int value="-943304570" label="PaintHolding:enabled"/>
+  <int value="-943223021"
+      label="FeatureNotificationGuideSkipCheckForLowEngagedUsers:disabled"/>
   <int value="-939676447" label="CrostiniResetLxdDb:enabled"/>
   <int value="-938178614" label="enable-suggestions-with-substring-match"/>
   <int value="-937430451" label="IntensiveWakeUpThrottling:disabled"/>
@@ -53974,6 +54005,7 @@
   <int value="21055794" label="OpenXR:enabled"/>
   <int value="21641175" label="OptimizeEarlyNavigation:disabled"/>
   <int value="22142588" label="OptimizationGuidePushNotifications:disabled"/>
+  <int value="22202990" label="LacrosOnly:disabled"/>
   <int value="23121136" label="MobileIdentityConsistencyVar:enabled"/>
   <int value="23556595" label="MarkHttpAs:enabled"/>
   <int value="24332306" label="ButtonARCNetworkDiagnostics:disabled"/>
@@ -54007,6 +54039,8 @@
   <int value="43951968" label="DesktopPWAsCustomTabUI:enabled"/>
   <int value="44088203" label="ExpensiveBackgroundTimerThrottling:enabled"/>
   <int value="44240181" label="SharingQRCodeGenerator:disabled"/>
+  <int value="46334141"
+      label="FeatureNotificationGuideSkipCheckForLowEngagedUsers:enabled"/>
   <int value="48159177" label="reduced-referrer-granularity"/>
   <int value="50643563" label="MBIMode:enabled"/>
   <int value="51793504" label="protect-sync-credential-on-reauth:disabled"/>
@@ -54643,6 +54677,7 @@
   <int value="510814146" label="OfflineBookmarks:enabled"/>
   <int value="511179195" label="ShoppingAssist:disabled"/>
   <int value="511392922" label="SharedClipboardReceiver:enabled"/>
+  <int value="512143128" label="LacrosOnly:enabled"/>
   <int value="512508240" label="WebViewExtraHeadersSameDomainOnly:disabled"/>
   <int value="513258875" label="WinrtSensorsImplementation:disabled"/>
   <int value="513356954" label="InstantTethering:disabled"/>
@@ -54660,6 +54695,8 @@
   <int value="520738365" label="OmniboxPedalsBatch2NonEnglish:enabled"/>
   <int value="520982116" label="BuiltInModuleAll:enabled"/>
   <int value="529235584" label="PhoneHub:enabled"/>
+  <int value="529665808"
+      label="AutofillEnableVirtualCardManagementInDesktopSettingsPage:disabled"/>
   <int value="530828403" label="AllowStartingServiceManagerOnly:disabled"/>
   <int value="533064367" label="WebRtcHideLocalIpsWithMdns:disabled"/>
   <int value="533115840"
@@ -55936,6 +55973,7 @@
   <int value="1444066555" label="MessagesForAndroidSyncError:disabled"/>
   <int value="1444719196"
       label="CellularBypassESimInstallationConnectivityCheck:enabled"/>
+  <int value="1445037029" label="EnableNeuralPalmRejectionModelV2:enabled"/>
   <int value="1446066818" label="WebRtcAnalogAgcClippingControl:enabled"/>
   <int value="1446349255" label="ArcEnableUsap:disabled"/>
   <int value="1446946673" label="DesktopRestructuredLanguageSettings:disabled"/>
@@ -56151,6 +56189,7 @@
   <int value="1612446645" label="enable-weak-memorycache"/>
   <int value="1612871297" label="WebPayments:disabled"/>
   <int value="1612974229" label="allow-insecure-localhost"/>
+  <int value="1613179749" label="WebAuthenticationCableDisco:disabled"/>
   <int value="1613738524" label="ForceAppLanguagePrompt:enabled"/>
   <int value="1614309501" label="DataSaverLiteModeRebranding:enabled"/>
   <int value="1614596813" label="CloseButtonsInactiveTabs:disabled"/>
@@ -56275,6 +56314,8 @@
   <int value="1699290689" label="CssSelectorFragmentAnchor:enabled"/>
   <int value="1700117535" label="MediaFeedsBackgroundFetching:disabled"/>
   <int value="1700394127" label="OverlayScrollbar:disabled"/>
+  <int value="1701295056"
+      label="AutofillEnableVirtualCardManagementInDesktopSettingsPage:enabled"/>
   <int value="1701972870" label="NTPSnippetsIncreasedVisibility:enabled"/>
   <int value="1702090999" label="ClearOldBrowsingData:disabled"/>
   <int value="1702985369"
@@ -56455,6 +56496,7 @@
   <int value="1824931483"
       label="EnableHistoryFaviconsGoogleServerQuery:disabled"/>
   <int value="1825369164" label="EnableNewBadgeOnMenuItems:disabled"/>
+  <int value="1825812252" label="EnableNeuralPalmAdaptiveHold:disabled"/>
   <int value="1825940786" label="ChromeHomePromo:disabled"/>
   <int value="1827369558" label="AndroidPayIntegrationV1:disabled"/>
   <int value="1828660283" label="enable-webfonts-intervention-trigger"/>
@@ -71726,7 +71768,7 @@
   </int>
   <int value="8" label="Prefetch Not Eligible: Host Is IP Address">
     The url was not eligible to be prefetched because its host was an IP
-    address.
+    address. (Deprecated M100)
   </int>
   <int value="9" label="Prefetch Not Eligible: Non-Default Storage Partition">
     The url was not eligible to be prefetched because it uses a non-default
@@ -71809,6 +71851,11 @@
     The url was prefetched and was redirected; however, redirects were disabled,
     so the prefetch failed.
   </int>
+  <int value="36" label="Prefetch Not Eligible: Host Is Non Unique">
+    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
+    registry-controlled) but the prefetch was to be proxied.
+  </int>
 </enum>
 
 <enum name="PrefetchRedirect">
@@ -76907,6 +76954,7 @@
   <int value="114" label="IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT"/>
   <int value="115" label="IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH"/>
   <int value="116" label="IDC_CONTENT_CONTEXT_WEB_REGION_SEARCH"/>
+  <int value="117" label="IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT"/>
 </enum>
 
 <enum name="ReopenTabPromoStepAtDismissal">
@@ -93335,6 +93383,18 @@
   <int value="3" label="Transferred WebContents"/>
 </enum>
 
+<enum name="WebFeedPageInformationRequestReason">
+  <int value="0" label="User Requested Follow">
+    The user requested to Follow the current web page.
+  </int>
+  <int value="1" label="Follow Recommendation">
+    A Follow recommendation is being considered the current web page.
+  </int>
+  <int value="2" label="Menu Item Presentation">
+    The Follow menu item state needs to reflect the current web page.
+  </int>
+</enum>
+
 <enum name="WebFeedPostFollowDialogPresentation">
   <int value="0"
       label="Available - Post-follow dialog for an available web feed"/>
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
index 2fbcf6d5..24f179644 100644
--- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
+++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -34,6 +34,7 @@
 iclelland@chromium.org
 ioanap@chromium.org
 jihanli@chromium.org
+joenotcharles@google.com
 johnidel@chromium.org
 jonross@chromium.org
 jorgelo@chromium.org
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index df0fcb8..183fd58 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -319,7 +319,7 @@
 </histogram>
 
 <histogram name="Accessibility.ChromeVox.PerformGestureType"
-    enum="ChromeVoxGestureType" expires_after="2022-02-06">
+    enum="ChromeVoxGestureType" expires_after="2023-02-06">
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index a3d2da83..c50f280 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -504,6 +504,33 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Calendar.ShowSource.{ViewShowSource}"
+    enum="CalendarEventSource" expires_after="2022-11-10">
+  <owner>newcomer@google.com</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>
+    Recorded when the calendar view is shown from the {ViewShowSource}.
+  </summary>
+  <token key="ViewShowSource">
+    <variant name="Accelerator" summary="accelerator"/>
+    <variant name="DateView" summary="date view in quick settings"/>
+    <variant name="TimeView" summary="time view in the status area"/>
+  </token>
+</histogram>
+
+<histogram name="Ash.Calendar.{CalendarChildView}.Activated"
+    enum="CalendarEventSource" expires_after="2022-11-10">
+  <owner>newcomer@google.com</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>Recorded when the {CalendarChildView} is activated.</summary>
+  <token key="CalendarChildView">
+    <variant name="DateCell" summary="date cell"/>
+    <variant name="EventListItem" summary="event list item"/>
+    <variant name="MonthDownArrowButton" summary="month down arrow"/>
+    <variant name="MonthUpArrowButton" summary="month up arrow"/>
+  </token>
+</histogram>
+
 <histogram name="Ash.CaptureModeController.BarButtons.{TabletOrClamshell}"
     enum="CaptureModeBarButtonType" expires_after="2022-09-29">
   <owner>afakhry@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 119863f..640ab65a 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -367,7 +367,7 @@
   </summary>
 </histogram>
 
-<histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds3"
+<histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds3{Phase}"
     units="janks" expires_after="2022-09-05">
 <!-- on probation: expected to graduate as a go/chrome-browser-guiding-metrics -->
 
@@ -388,12 +388,16 @@
     in that it doesn't start recording until the first 30 seconds window *after*
     the main message loop first reached idle. This avoids considering all tasks
     queued during startup as janky and makes for a more accurate ongoing jank
-    metric.
+    metric. {Phase}
   </summary>
+  <token key="Phase">
+    <variant name=""/>
+    <variant name=".Initial" summary="The first interval after OnFirstIdle()."/>
+    <variant name=".Periodic" summary="All intervals but .Initial"/>
+  </token>
 </histogram>
 
-<histogram
-    name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds{JankyIntervalsPerThirtySeconds}"
+<histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds{Phase}"
     units="janks" expires_after="never">
 <!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) -->
 
@@ -422,16 +426,15 @@
     It only measures jankiness as individual tasks taking a long time to run.
     Given that it's a long-standing bug, this metric will not be modified. We
     are testing a new metric
-    Browser.Responsiveness.JankyIntervalsPerThirtySeconds2 that correctly
+    Browser.Responsiveness.JankyIntervalsPerThirtySeconds3 that correctly
     accounts for queueing time. See
     https://groups.google.com/a/google.com/forum/#!topic/chrome-scheduler/X32gKl6fW2A
     for more details.
 
     This histogram is of special interest to the chrome-analysis-team@. Do not
-    change its semantics or retire it without talking to them first.
-    {JankyIntervalsPerThirtySeconds}
+    change its semantics or retire it without talking to them first. {Phase}
   </summary>
-  <token key="JankyIntervalsPerThirtySeconds">
+  <token key="Phase">
     <variant name=""/>
     <variant name=".Initial"
         summary="The first 30 seconds interval after the message loop starts."/>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index f187d4d..db211af 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -777,6 +777,29 @@
   </token>
 </histogram>
 
+<histogram name="ChromeOS.FirmwareUpdateUi.{Source}.{Severity}UpdateCount"
+    units="updates" expires_after="2023-01-01">
+  <owner>jimmyxgong@chromium.org</owner>
+  <owner>zentaro@chromium.org</owner>
+  <owner>cros-peripherals@google.com</owner>
+  <summary>
+    Records the total number of {Severity} firmware updates found for all of the
+    peripherals currently connected. The histogram is emitted once we've
+    received the list of updates (if any) for all peripherals. OnStartup is
+    recorded when a user first logs in and OnRefresh is recorded for any
+    subsequent request. The cases in which a subsequent request will be made are
+    when the Firmware Update SWA is launched, when an install is completed, and
+    when we detect that a device has been added or removed.
+  </summary>
+  <token key="Source">
+    <variant name="OnRefresh"/>
+    <variant name="OnStartup"/>
+  </token>
+  <token key="Severity">
+    <variant name="Critical"/>
+  </token>
+</histogram>
+
 <histogram name="ChromeOS.Gaia.Message.{GaiaAuthFlow}.{MessageName}"
     enum="BooleanReceived" expires_after="2022-06-01">
   <owner>rsorokin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 2030bcce..2bc62ee9 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -1261,6 +1261,17 @@
   </summary>
 </histogram>
 
+<histogram name="ContentSuggestions.Feed.WebFeed.PageInformationRequested"
+    enum="WebFeedPageInformationRequestReason" expires_after="2023-03-01">
+  <owner>carlosk@chromium.org</owner>
+  <owner>harringtond@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <summary>
+    Records the reason why the web feeds system is requesting information from
+    the renderer process about a loaded web page.
+  </summary>
+</histogram>
+
 <histogram name="ContentSuggestions.Feed.WebFeed.PostFollowDialog.Show"
     enum="WebFeedPostFollowDialogPresentation" expires_after="2023-03-01">
   <owner>harringtond@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index bdb5a3d..a1888eb 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -174,7 +174,7 @@
 </histogram>
 
 <histogram name="Cookie.ExpirationDuration400DaysGT" units="days"
-    expires_after="M101">
+    expires_after="M104">
   <owner>arichiv@chromium.org</owner>
   <owner>bingler@chromium.org</owner>
   <summary>
@@ -184,7 +184,7 @@
 </histogram>
 
 <histogram name="Cookie.ExpirationDuration400DaysLTE" units="days"
-    expires_after="2022-07-11">
+    expires_after="M104">
   <owner>arichiv@chromium.org</owner>
   <owner>bingler@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index 43202d6..80fcda6 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -1355,15 +1355,15 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.ForceInstalledAndBlackListed" units="count"
+<histogram name="Extensions.ForceInstalledAndBlockListed" units="count"
     expires_after="2022-06-12">
   <owner>swapnilgupta@google.com</owner>
   <owner>burunduk@chromium.org</owner>
   <owner>managed-devices@google.com</owner>
   <summary>
     Number of enterprise policy forced extensions that are blacklisted and thus
-    not loaded after 5 minutes if at least one of policy forced extensions is
-    not yet enabled.
+    not loaded 5 minutes after profile creation if at least one of policy forced
+    extensions is not yet enabled.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 1ff83336..dfe3566 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -48,6 +48,10 @@
   <variant name="IPH_AutoDarkUserEducationMessageOptIn"
       summary="message educating users about enabling auto dark web contents
                feature globally"/>
+  <variant name="IPH_AutofillVirtualCardSuggestion"
+      summary="message shown along with the virtual card suggestion option in
+               the Autofill dropdown to educate users virtual cards come with
+               better security"/>
   <variant name="IPH_BadgedReadingList" summary="badged reading list"/>
   <variant name="IPH_Bookmark" summary="bookmark"/>
   <variant name="IPH_BottomToolbarTip" summary="bottom toolbar"/>
@@ -142,8 +146,6 @@
       summary="payments autofill suggestions"/>
   <variant name="IPH_KeyboardAccessoryPaymentOffer"
       summary="payments autofill suggestions that have an offer"/>
-  <variant name="IPH_KeyboardAccessoryPaymentVirtualCard"
-      summary="payment autofill suggestions that are virtual cards"/>
   <variant name="IPH_LiveCaption" summary="Live Caption"/>
   <variant name="IPH_LongPressToolbarTip" summary="LongPress toolbar"/>
   <variant name="IPH_MicToolbar" summary="the mic button in the toolbar"/>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index 106b435..e797fe6 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -472,6 +472,15 @@
   <summary>How quick view was opened.</summary>
 </histogram>
 
+<histogram name="FileBrowser.Recent.FilterByType"
+    enum="FileManagerRecentFilterType" expires_after="2022-07-20">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
+  <summary>
+    This is recorded when different filter buttons in Recent view are clicked.
+  </summary>
+</histogram>
+
 <histogram name="FileBrowser.Recent.LoadArcMedia" units="ms"
     expires_after="2022-04-10">
   <owner>simmonsjosh@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index cd9737e..4e7c072 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -457,7 +457,7 @@
 </histogram>
 
 <histogram name="History.Clusters.Backend.ClusterSize.{ClusterStatistic}"
-    units="number visits" expires_after="M101">
+    units="number visits" expires_after="M106">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-memories@google.com</owner>
   <summary>
@@ -560,7 +560,7 @@
 
 <histogram
     name="History.Clusters.Backend.NumKeywordsPerCluster.{KeywordStatistic}"
-    units="number keywords" expires_after="M101">
+    units="number keywords" expires_after="M106">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-memories@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/OWNERS b/tools/metrics/histograms/metadata/memory/OWNERS
index 0130c020..ad8af7cd 100644
--- a/tools/metrics/histograms/metadata/memory/OWNERS
+++ b/tools/metrics/histograms/metadata/memory/OWNERS
@@ -3,3 +3,6 @@
 # Prefer sending CLs to the owners listed below.
 # Use chromium-metrics-reviews@google.com as a backup.
 lizeb@chromium.org
+
+# For HeapProfiling.* histograms:
+joenotcharles@google.com
\ No newline at end of file
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index 174688f..484540bc 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -22,6 +22,110 @@
 
 <histograms>
 
+<histogram name="HeapProfiling.AndroidStackUnwinder"
+    enum="AndroidStackUnwinder" expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The stack unwinder implementation used by the SamplingHeapProfiler. Emitted
+    on Android devices only each time the profiler is started, which happens at
+    Chrome launch when HeapProfiling.InProcess.Enabled is true.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.InProcess.Enabled" enum="BooleanEnabled"
+    expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    One metric is emitted on every Chrome launch, recording whether the
+    in-process heap profiler is enabled in the browser process for this Chrome
+    session.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.InProcess.SamplesPerSnapshot" units="samples"
+    expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The number of samples in a heap snapshot. Emitted once per snapshot when the
+    in-process heap profiler is enabled.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.InProcess.SnapshotInterval" units="ms"
+    expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The time until the next heap snapshot is scheduled. Emitted once per
+    snapshot when the in-process heap profiler is enabled.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.ProfiledProcess.Type"
+    enum="HeapProfilingProcessType" expires_after="2021-12-12">
+  <owner>erikchen@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    One metric is emitted every 24-hours after Chrome is launched for every
+    process that is being profiled. The timer is reset if Chrome exits.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.ProfilingMode" enum="HeapProfilingMode"
+    expires_after="2021-02-25">
+  <owner>erikchen@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    One metric is emitted every 24-hours after Chrome is launched for every
+    Chrome instance that is using out of process heap profiling. The timer is
+    reset if Chrome exits.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.RecordTrace.Success" enum="BooleanSuccess"
+    expires_after="2021-02-25">
+  <owner>erikchen@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The metric is emitted each time Chrome attempts to record a memory-infra
+    trace to upload an out-of-process heap-profiling memory dump.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.SamplingInterval" units="bytes"
+    expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The mean number of bytes between samples used by the SamplingHeapProfiler.
+    Emitted each time the profiler is started, which happens at Chrome launch
+    when HeapProfiling.InProcess.Enabled is true.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.UploadTrace.Size" units="bytes"
+    expires_after="2021-02-25">
+  <owner>erikchen@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The metric is emitted each time Chrome uploads a trace. It reflects the
+    uncompressed size of the trace.
+  </summary>
+</histogram>
+
+<histogram name="HeapProfiling.UploadTrace.Success" enum="BooleanSuccess"
+    expires_after="2021-02-25">
+  <owner>erikchen@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The metric is emitted each time Chrome uploads a trace. It reflects whether
+    the upload was successful.
+  </summary>
+</histogram>
+
 <histogram name="Memory.AudioService.PrivateMemoryFootprint" units="MB"
     expires_after="2023-01-10">
   <owner>marinaciocea@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index a5983e7..aa6a0e1 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -882,6 +882,18 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Omnibox.SuggestionUsed.Search.NavigationToLargestContentfulPaint2"
+    units="ms" expires_after="2022-07-11">
+  <owner>asamidoi@chromium.org</owner>
+  <owner>chrome-prerendering@google.com</owner>
+  <owner>chrome-omnibox-team@google.com</owner>
+  <summary>
+    Measures the time from navigation start to largest contentful paint. Only
+    recorded for a search query suggestion selected from the omnibox.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.SuggestionUsed.SelectedTabMatch"
     enum="BooleanSelected" expires_after="2022-06-05">
   <owner>gangwu@chromium.org</owner>
@@ -934,6 +946,18 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Omnibox.SuggestionUsed.URL.NavigationToLargestContentfulPaint2"
+    units="ms" expires_after="2022-07-11">
+  <owner>asamidoi@chromium.org</owner>
+  <owner>chrome-prerendering@google.com</owner>
+  <owner>chrome-omnibox-team@google.com</owner>
+  <summary>
+    Measures the time from navigation start to largest contentful paint. Only
+    recorded for a URL suggestion selected from the omnibox.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.SuggestRequest.Failure.GoogleResponseTime" units="ms"
     expires_after="2022-07-11">
   <owner>mpearson@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 720030f..53840d5 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -177,7 +177,10 @@
 </histogram>
 
 <histogram name="OptimizationGuide.ClearHostModelFeatures.StoreAvailable"
-    units="BooleanAvailable" expires_after="M106">
+    units="BooleanAvailable" expires_after="2022-01-28">
+  <obsolete>
+    Deprecated as of 2022-01-28.
+  </obsolete>
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -758,7 +761,10 @@
 </histogram>
 
 <histogram name="OptimizationGuide.PredictionManager.HostModelFeaturesMapSize"
-    units="total host count" expires_after="M106">
+    units="total host count" expires_after="2022-01-28">
+  <obsolete>
+    Deprecated as of 2022-01-28.
+  </obsolete>
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -879,7 +885,10 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelStore.HostModelFeaturesLoadMetadataResult"
-    enum="BooleanLoaded" expires_after="M106">
+    enum="BooleanLoaded" expires_after="2022-01-28">
+  <obsolete>
+    Deprecated as of 2022-01-28.
+  </obsolete>
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 87c04471..7ce1bec 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -6293,110 +6293,6 @@
   </summary>
 </histogram>
 
-<histogram name="HeapProfiling.AndroidStackUnwinder"
-    enum="AndroidStackUnwinder" expires_after="2022-12-02">
-  <owner>joenotcharles@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The stack unwinder implementation used by the SamplingHeapProfiler. Emitted
-    on Android devices only each time the profiler is started, which happens at
-    Chrome launch when HeapProfiling.InProcess.Enabled is true.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.InProcess.Enabled" enum="BooleanEnabled"
-    expires_after="2022-12-02">
-  <owner>joenotcharles@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    One metric is emitted on every Chrome launch, recording whether the
-    in-process heap profiler is enabled in the browser process for this Chrome
-    session.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.InProcess.SamplesPerSnapshot" units="samples"
-    expires_after="2022-12-02">
-  <owner>joenotcharles@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The number of samples in a heap snapshot. Emitted once per snapshot when the
-    in-process heap profiler is enabled.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.InProcess.SnapshotInterval" units="ms"
-    expires_after="2022-12-02">
-  <owner>joenotcharles@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The time until the next heap snapshot is scheduled. Emitted once per
-    snapshot when the in-process heap profiler is enabled.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.ProfiledProcess.Type"
-    enum="HeapProfilingProcessType" expires_after="2021-12-12">
-  <owner>erikchen@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    One metric is emitted every 24-hours after Chrome is launched for every
-    process that is being profiled. The timer is reset if Chrome exits.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.ProfilingMode" enum="HeapProfilingMode"
-    expires_after="2021-02-25">
-  <owner>erikchen@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    One metric is emitted every 24-hours after Chrome is launched for every
-    Chrome instance that is using out of process heap profiling. The timer is
-    reset if Chrome exits.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.RecordTrace.Success" enum="BooleanSuccess"
-    expires_after="2021-02-25">
-  <owner>erikchen@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The metric is emitted each time Chrome attempts to record a memory-infra
-    trace to upload an out-of-process heap-profiling memory dump.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.SamplingInterval" units="bytes"
-    expires_after="2022-12-02">
-  <owner>joenotcharles@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The mean number of bytes between samples used by the SamplingHeapProfiler.
-    Emitted each time the profiler is started, which happens at Chrome launch
-    when HeapProfiling.InProcess.Enabled is true.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.UploadTrace.Size" units="bytes"
-    expires_after="2021-02-25">
-  <owner>erikchen@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The metric is emitted each time Chrome uploads a trace. It reflects the
-    uncompressed size of the trace.
-  </summary>
-</histogram>
-
-<histogram name="HeapProfiling.UploadTrace.Success" enum="BooleanSuccess"
-    expires_after="2021-02-25">
-  <owner>erikchen@chromium.org</owner>
-  <owner>chrome-memory@google.com</owner>
-  <summary>
-    The metric is emitted each time Chrome uploads a trace. It reflects whether
-    the upload was successful.
-  </summary>
-</histogram>
-
 <histogram name="HIDDetection.OOBEDevicesDetectedOnContinuePressed"
     enum="HIDContinueScenarioType" expires_after="M94">
   <obsolete>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index 62f1807..48808df 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -367,7 +367,7 @@
 </histogram>
 
 <histogram name="Printing.PrintServers.ServersToQuery" units="servers"
-    expires_after="2021-10-25">
+    expires_after="2022-12-31">
   <owner>pawliczek@chromium.org</owner>
   <owner>skau@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index c575dae..687e753 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -703,7 +703,7 @@
 </histogram>
 
 <histogram name="V8.GC.TimeToCollectionOnBackground" units="microseconds"
-    expires_after="2022-07-03">
+    expires_after="M109">
   <owner>dinfuehr@chromium.org</owner>
   <owner>v8-memory-sheriffs@google.com</owner>
   <summary>
@@ -720,7 +720,7 @@
 </histogram>
 
 <histogram name="V8.GC.TimeToSafepoint" units="microseconds"
-    expires_after="2022-02-06">
+    expires_after="M109">
   <owner>dinfuehr@chromium.org</owner>
   <owner>v8-memory-sheriffs@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_audio/histograms.xml b/tools/metrics/histograms/metadata/web_audio/histograms.xml
index 33f70a4..56568726 100644
--- a/tools/metrics/histograms/metadata/web_audio/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_audio/histograms.xml
@@ -150,6 +150,17 @@
   </summary>
 </histogram>
 
+<histogram name="WebAudio.AudioDestination.HardwareOutputLatency" units="ms"
+    expires_after="2022-06-30">
+  <owner>hongchan@chromium.org</owner>
+  <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
+  <summary>
+    The latency reported from the audio hardware. This number can be dynamic at
+    runtime but the metric is collected only once at the first platform audio
+    callback after an AudioContext is created.
+  </summary>
+</histogram>
+
 <histogram name="WebAudio.Autoplay" enum="WebAudioAutoplayStatus"
     expires_after="2022-06-30">
   <owner>hongchan@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 4d18a2e..8ae6682 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "510fd16408eeb190167d3d31fd3892b0d1bbe113",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/ef9994d1a23dc40e5c98eb8a9892ec7e4cd40dbb/trace_processor_shell.exe"
+            "hash": "e80e1aa7d07b753c468c2d7a730f5b9948a8b96c",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/045b467fafaa5b085a8d86a3a23c0585347814ea/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
-            "hash": "1a047502829fa247e82b88e0cb71751b89bd5c4c",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/ef9994d1a23dc40e5c98eb8a9892ec7e4cd40dbb/trace_processor_shell"
+            "hash": "1f298d105f2b7ac6bc376cfb74430f839ca6d625",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/00b152a26effb7ba2ec1f2d1fdace9116ea470e4/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
             "remote_path": "perfetto_binaries/trace_processor_shell/mac_arm64/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell"
         },
         "linux": {
-            "hash": "e09ed42dc1cd01c6c2f3fe03c5cdefa8ba665ae2",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/045b467fafaa5b085a8d86a3a23c0585347814ea/trace_processor_shell"
+            "hash": "9ed307b2d52a0af8d2e30ff51e34cdcd1a224f26",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/00b152a26effb7ba2ec1f2d1fdace9116ea470e4/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/rust/build.py b/tools/rust/build.py
index ab4d313..a1c7d8fe 100755
--- a/tools/rust/build.py
+++ b/tools/rust/build.py
@@ -39,12 +39,14 @@
 import string
 import subprocess
 
+from pathlib import Path
+
 # Get variables and helpers from Clang update script
 sys.path.append(
     os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'clang',
                  'scripts'))
 from update import (CHROMIUM_DIR, CLANG_REVISION, CLANG_SUB_REVISION,
-                    LLVM_BUILD_DIR, RmTree)
+                    LLVM_BUILD_DIR, GetDefaultHostOs, RmTree, UpdatePackage)
 
 # Trunk on 1/26/2021
 RUST_REVISION = 'a7f3757'
@@ -175,8 +177,15 @@
   parser.add_argument('--skip-install',
                       action='store_true',
                       help='do not install to RUST_TOOLCHAIN_OUT_DIR')
+  parser.add_argument(
+      '--fetch-llvm-libs',
+      action='store_true',
+      help='fetch Clang/LLVM libs and extract into LLVM_BUILD_DIR')
   args = parser.parse_args()
 
+  if args.fetch_llvm_libs:
+    UpdatePackage('clang-libs', GetDefaultHostOs())
+
   if not args.skip_checkout:
     CheckoutRust(RUST_REVISION, RUST_SRC_DIR)
 
diff --git a/ui/accessibility/ax_computed_node_data.cc b/ui/accessibility/ax_computed_node_data.cc
index cbb3f6f..e175016 100644
--- a/ui/accessibility/ax_computed_node_data.cc
+++ b/ui/accessibility/ax_computed_node_data.cc
@@ -100,10 +100,6 @@
                "'GetOrComputeAttributeUTF8`";
         return GetOrComputeTextContentWithParagraphBreaksUTF8();
       }
-      // If an atomic text field has no value attribute sent from the renderer,
-      // then it means that it is empty, since we do not compute the values of
-      // such controls on the browser. The same for all other controls, other
-      // than non-atomic text fields.
       return base::EmptyString();
     default:
       // This is a special case: for performance reasons do not use
@@ -114,25 +110,7 @@
 
 std::u16string AXComputedNodeData::GetOrComputeAttributeUTF16(
     const ax::mojom::StringAttribute attribute) const {
-  if (owner_->data().HasStringAttribute(attribute))
-    return owner_->data().GetString16Attribute(attribute);
-
-  switch (attribute) {
-    case ax::mojom::StringAttribute::kValue:
-      if (owner_->data().IsNonAtomicTextField()) {
-        DCHECK(HasOrCanComputeAttribute(attribute))
-            << "Code in `HasOrCanComputeAttribute` should be in sync with "
-               "'GetOrComputeAttributeUTF16`";
-        return GetOrComputeTextContentWithParagraphBreaksUTF16();
-      }
-      // If an atomic text field has no value attribute sent from the renderer,
-      // then it means that it is empty, since we do not compute the values of
-      // such controls on the browser. The same for all other controls, other
-      // than non-atomic text fields.
-      return std::u16string();
-    default:
-      return std::u16string();
-  }
+  return base::UTF8ToUTF16(GetOrComputeAttributeUTF8(attribute));
 }
 
 const std::vector<int32_t>& AXComputedNodeData::GetOrComputeAttribute(
@@ -187,8 +165,7 @@
     auto range =
         AXRange<AXPosition<AXNodePosition, AXNode>>::RangeOfContents(*owner_);
     text_content_with_paragraph_breaks_utf8_ = base::UTF16ToUTF8(
-        range.GetText(AXTextConcatenationBehavior::kWithParagraphBreaks,
-                      AXEmbeddedObjectBehavior::kSuppressCharacter));
+        range.GetText(AXTextConcatenationBehavior::kWithParagraphBreaks));
   }
   return *text_content_with_paragraph_breaks_utf8_;
 }
@@ -202,8 +179,7 @@
     auto range =
         AXRange<AXPosition<AXNodePosition, AXNode>>::RangeOfContents(*owner_);
     text_content_with_paragraph_breaks_utf16_ =
-        range.GetText(AXTextConcatenationBehavior::kWithParagraphBreaks,
-                      AXEmbeddedObjectBehavior::kSuppressCharacter);
+        range.GetText(AXTextConcatenationBehavior::kWithParagraphBreaks);
   }
   return *text_content_with_paragraph_breaks_utf16_;
 }
diff --git a/ui/accessibility/ax_computed_node_data_unittest.cc b/ui/accessibility/ax_computed_node_data_unittest.cc
index 5a5a60d..a337e28 100644
--- a/ui/accessibility/ax_computed_node_data_unittest.cc
+++ b/ui/accessibility/ax_computed_node_data_unittest.cc
@@ -264,7 +264,7 @@
       ax::mojom::IntListAttribute::kLabelledbyIds));
 }
 
-TEST_F(AXComputedNodeDataTest, GetOrComputeAttribute) {
+TEST_F(AXComputedNodeDataTest, DISABLED_GetOrComputeAttribute) {
   // Embedded object behavior is dependant on platform. We manually set it to a
   // specific value so that test results are consistent across platforms.
   testing::ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
@@ -446,7 +446,7 @@
               SizeIs(0));
 }
 
-TEST_F(AXComputedNodeDataTest, GetOrComputeTextContent) {
+TEST_F(AXComputedNodeDataTest, DISABLED_GetOrComputeTextContent) {
   // Embedded object behavior is dependant on platform. We manually set it to a
   // specific value so that test results are consistent across platforms.
   testing::ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index 7b124e902..ea9f7459 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -480,7 +480,13 @@
         FireLiveRegionEvents(node);
       }
 
-      FireValueInTextFieldChangedEventIfNecessary(tree, node);
+      // If it's a change to static text, and it's in an editable text field,
+      // fire an event on the editable root.
+      if (node->IsText()) {
+        AXNode* text_field = node->GetTextFieldAncestor();
+        if (text_field)
+          AddEvent(text_field, Event::EDITABLE_TEXT_CHANGED);
+      }
       break;
     case ax::mojom::StringAttribute::kPlaceholder:
       AddEvent(node, Event::PLACEHOLDER_CHANGED);
@@ -772,9 +778,7 @@
 }
 
 void AXEventGenerator::OnNodeWillBeDeleted(AXTree* tree, AXNode* node) {
-  DCHECK_EQ(tree_, tree);
   live_region_tracker_->OnNodeWillBeDeleted(*node);
-  FireValueInTextFieldChangedEventIfNecessary(tree, node);
 
   // TODO(accessibility): This should also handle firing MENU_POPUP_END when a
   // node with the menu role is removed. The issue to be solved is that after we
@@ -784,6 +788,8 @@
   // firing the event from BrowserAccessibilityManager. Adding the ability to
   // fire generated events immediately should make it possible to fire
   // MENU_POPUP_END here.
+  DCHECK_EQ(tree_, tree);
+  tree_events_.erase(node->id());
 }
 
 void AXEventGenerator::OnSubtreeWillBeDeleted(AXTree* tree, AXNode* node) {
@@ -799,11 +805,6 @@
   DCHECK_EQ(tree_, tree);
 }
 
-void AXEventGenerator::OnNodeDeleted(AXTree* tree, AXNodeID node_id) {
-  DCHECK_EQ(tree_, tree);
-  tree_events_.erase(node_id);
-}
-
 void AXEventGenerator::OnNodeReparented(AXTree* tree, AXNode* node) {
   DCHECK_EQ(tree_, tree);
   AddEvent(node, Event::PARENT_CHANGED);
@@ -811,7 +812,6 @@
 
 void AXEventGenerator::OnNodeCreated(AXTree* tree, AXNode* node) {
   DCHECK_EQ(tree_, tree);
-  FireValueInTextFieldChangedEventIfNecessary(tree, node);
   if (node->GetRole() == ax::mojom::Role::kMenu &&
       !node->IsInvisibleOrIgnored()) {
     AddEvent(node, Event::MENU_POPUP_START);
@@ -856,6 +856,7 @@
     if (change.type == SUBTREE_CREATED) {
       AddEvent(change.node, Event::SUBTREE_CREATED);
     } else if (change.type != NODE_CREATED) {
+      FireValueInTextFieldChangedEvent(tree, change.node);
       FireRelationSourceEvents(tree, change.node);
       continue;
     }
@@ -933,19 +934,13 @@
   active_descendant_changed_.clear();
 }
 
-void AXEventGenerator::FireValueInTextFieldChangedEventIfNecessary(
-    AXTree* tree,
-    AXNode* target_node) {
-  // Text is only found on leaf nodes, so the text in a text field would change
-  // if any of the leaf nodes in it have changed their names.
-  if (!target_node->IsLeaf())
+void AXEventGenerator::FireValueInTextFieldChangedEvent(AXTree* tree,
+                                                        AXNode* target_node) {
+  if (!target_node->IsText())
     return;
-
   AXNode* text_field_ancestor = target_node->GetTextFieldAncestor();
-  if (!text_field_ancestor || text_field_ancestor == target_node)
+  if (!text_field_ancestor)
     return;
-
-  AddEvent(text_field_ancestor, Event::EDITABLE_TEXT_CHANGED);
   AddEvent(text_field_ancestor, Event::VALUE_IN_TEXT_FIELD_CHANGED);
 }
 
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h
index dc81e0c..75f9ef5 100644
--- a/ui/accessibility/ax_event_generator.h
+++ b/ui/accessibility/ax_event_generator.h
@@ -299,7 +299,6 @@
   void OnSubtreeWillBeDeleted(AXTree* tree, AXNode* node) override;
   void OnNodeWillBeReparented(AXTree* tree, AXNode* node) override;
   void OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) override;
-  void OnNodeDeleted(AXTree* tree, AXNodeID node_id) override;
   void OnNodeReparented(AXTree* tree, AXNode* node) override;
   void OnNodeCreated(AXTree* tree, AXNode* node) override;
   void OnAtomicUpdateFinished(AXTree* tree,
@@ -318,11 +317,7 @@
 
   void FireLiveRegionEvents(AXNode* node);
   void FireActiveDescendantEvents();
-  // If the given target node is inside a text field and the node's modification
-  // could affect the field's value, generates an `VALUE_IN_TEXT_FIELD_CHANGED`
-  // on the text field that contains the node.
-  void FireValueInTextFieldChangedEventIfNecessary(AXTree* tree,
-                                                   AXNode* target_node);
+  void FireValueInTextFieldChangedEvent(AXTree* tree, AXNode* target_node);
   void FireRelationSourceEvents(AXTree* tree, AXNode* target_node);
   bool ShouldFireLoadEvents(AXNode* node);
 
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc
index 6548c9f..443d33a 100644
--- a/ui/accessibility/ax_node.cc
+++ b/ui/accessibility/ax_node.cc
@@ -1730,8 +1730,7 @@
       // maps. Therefore, do not truncate descendants except in the case where
       // ARIA role=img or role=image because that's how we want to treat
       // ARIA-based images.
-      const std::string role =
-          GetStringAttribute(ax::mojom::StringAttribute::kRole);
+      std::string role = GetStringAttribute(ax::mojom::StringAttribute::kRole);
       return role == "img" || role == "image";
     }
     case ax::mojom::Role::kDocCover:
@@ -1880,11 +1879,10 @@
   // ancestor, its immediate descendant can have Role::kGenericContainer without
   // State::kEditable. Same with inline text boxes and placeholder text.
   // TODO(nektar): Fix all such inconsistencies in Blink.
-  //
-  // Also, ARIA text and search boxes may not have the contenteditable attribute
-  // set, but they should still be treated the same as all other text fields.
-  // (See `AXNodeData::IsAtomicTextField()` for more details.)
-  for (AXNode* ancestor = const_cast<AXNode*>(this); ancestor;
+  for (AXNode* ancestor = const_cast<AXNode*>(this);
+       ancestor && (ancestor->HasState(ax::mojom::State::kEditable) ||
+                    ancestor->GetRole() == ax::mojom::Role::kGenericContainer ||
+                    ancestor->IsText());
        ancestor = ancestor->GetUnignoredParent()) {
     if (ancestor->data().IsTextField())
       return ancestor;
diff --git a/ui/accessibility/ax_node_unittest.cc b/ui/accessibility/ax_node_unittest.cc
index 9f16e29..1104f33 100644
--- a/ui/accessibility/ax_node_unittest.cc
+++ b/ui/accessibility/ax_node_unittest.cc
@@ -12,7 +12,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
-#include "ui/accessibility/ax_position.h"
 #include "ui/accessibility/ax_tree.h"
 #include "ui/accessibility/ax_tree_data.h"
 #include "ui/accessibility/ax_tree_id.h"
@@ -30,7 +29,7 @@
 
 }  // namespace
 
-using ::testing::ElementsAre;
+using testing::ElementsAre;
 
 TEST(AXNodeTest, TreeWalking) {
   // ++kRootWebArea
@@ -394,15 +393,11 @@
   EXPECT_EQ(root_node_1, root_node_2->GetUnignoredParentCrossingTreeBoundary());
 }
 
-TEST(AXNodeTest, GetValueForControlTextField) {
-  testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
-      AXEmbeddedObjectBehavior::kSuppressCharacter);
-
+TEST(AXNodeTest, DISABLED_GetValueForControlTextField) {
   // kRootWebArea
   // ++kTextField (contenteditable)
   // ++++kGenericContainer
   // ++++++kStaticText "Line 1"
-  // ++++++kImage
   // ++++++kLineBreak '\n'
   // ++++++kStaticText "Line 2"
 
@@ -414,12 +409,10 @@
   rich_text_field_text_container.id = 3;
   AXNodeData rich_text_field_line_1;
   rich_text_field_line_1.id = 4;
-  AXNodeData rich_text_field_image;
-  rich_text_field_image.id = 5;
   AXNodeData rich_text_field_line_break;
-  rich_text_field_line_break.id = 6;
+  rich_text_field_line_break.id = 5;
   AXNodeData rich_text_field_line_2;
-  rich_text_field_line_2.id = 7;
+  rich_text_field_line_2.id = 6;
 
   root.role = ax::mojom::Role::kRootWebArea;
   root.child_ids = {rich_text_field.id};
@@ -436,20 +429,15 @@
   rich_text_field_text_container.AddState(ax::mojom::State::kIgnored);
   rich_text_field_text_container.AddState(ax::mojom::State::kEditable);
   rich_text_field_text_container.AddState(ax::mojom::State::kRichlyEditable);
-  rich_text_field_text_container.child_ids = {
-      rich_text_field_line_1.id, rich_text_field_image.id,
-      rich_text_field_line_break.id, rich_text_field_line_2.id};
+  rich_text_field_text_container.child_ids = {rich_text_field_line_1.id,
+                                              rich_text_field_line_break.id,
+                                              rich_text_field_line_2.id};
 
   rich_text_field_line_1.role = ax::mojom::Role::kStaticText;
   rich_text_field_line_1.AddState(ax::mojom::State::kEditable);
   rich_text_field_line_1.AddState(ax::mojom::State::kRichlyEditable);
   rich_text_field_line_1.SetName("Line 1");
 
-  rich_text_field_image.role = ax::mojom::Role::kImage;
-  rich_text_field_image.AddState(ax::mojom::State::kEditable);
-  rich_text_field_image.AddState(ax::mojom::State::kRichlyEditable);
-  rich_text_field_image.SetName(AXNode::kEmbeddedObjectCharacterUTF8);
-
   rich_text_field_line_break.role = ax::mojom::Role::kLineBreak;
   rich_text_field_line_break.AddState(ax::mojom::State::kEditable);
   rich_text_field_line_break.AddState(ax::mojom::State::kRichlyEditable);
@@ -468,7 +456,6 @@
                   rich_text_field,
                   rich_text_field_text_container,
                   rich_text_field_line_1,
-                  rich_text_field_image,
                   rich_text_field_line_break,
                   rich_text_field_line_2};
 
@@ -479,9 +466,7 @@
     const AXNode* text_field_node =
         manager.GetTree()->GetFromId(rich_text_field.id);
     ASSERT_NE(nullptr, text_field_node);
-    // In the accessibility tree's text representation, there is an implicit
-    // line break before every embedded object, such as an image.
-    EXPECT_EQ("Line 1\n\nLine 2", text_field_node->GetValueForControl());
+    EXPECT_EQ("Line 1\nLine 2", text_field_node->GetValueForControl());
   }
 
   // Only rich text fields should have their value attribute automatically
@@ -507,7 +492,7 @@
       ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
 
   // A node's data should override any computed node data.
-  rich_text_field.SetValue("Line 1\nLine 2");
+  rich_text_field.SetValue("Other value");
   AXTreeUpdate update_3;
   update_3.nodes = {rich_text_field};
 
@@ -517,7 +502,7 @@
     const AXNode* text_field_node =
         manager.GetTree()->GetFromId(rich_text_field.id);
     ASSERT_NE(nullptr, text_field_node);
-    EXPECT_EQ("Line 1\nLine 2", text_field_node->GetValueForControl());
+    EXPECT_EQ("Other value", text_field_node->GetValueForControl());
   }
 }
 
diff --git a/ui/accessibility/extensions/animation/popup.js b/ui/accessibility/extensions/animation/popup.js
index a15d277..5413bf4e 100644
--- a/ui/accessibility/extensions/animation/popup.js
+++ b/ui/accessibility/extensions/animation/popup.js
@@ -4,8 +4,8 @@
 
 function animationPolicyChanged() {
   if (this.checked) {
-    var type = this.id;
-    var setting = this.value;
+    const type = this.id;
+    const setting = this.value;
     console.log('set policy '+': '+setting);
     chrome.accessibilityFeatures.animationPolicy.set(
         {'value': setting}, function (callback) {});
@@ -17,10 +17,10 @@
 }
 
 function init() {
-  var i18nElements = document.querySelectorAll('*[i18n-content]');
-  for (var i = 0; i < i18nElements.length; i++) {
-    var elem = i18nElements[i];
-    var msg = elem.getAttribute('i18n-content');
+  const i18nElements = document.querySelectorAll('*[i18n-content]');
+  for (let i = 0; i < i18nElements.length; i++) {
+    const elem = i18nElements[i];
+    const msg = elem.getAttribute('i18n-content');
     elem.innerHTML = chrome.i18n.getMessage(msg);
   }
 
@@ -28,15 +28,15 @@
   chrome.accessibilityFeatures.animationPolicy.get(
         {'incognito': false}, function (policy) {
                   console.log('get policy '+': '+policy.value);
-      var selects = document.querySelectorAll('input');
-      for (var i = 0; i < selects.length; i++) {
+      const selects = document.querySelectorAll('input');
+      for (let i = 0; i < selects.length; i++) {
         if (selects[i].value == policy.value)
           selects[i].checked = true;
       }
     });
 
-  var selects = document.querySelectorAll('input');
-  for (var i = 0; i < selects.length; i++) {
+  const selects = document.querySelectorAll('input');
+  for (let i = 0; i < selects.length; i++) {
     selects[i].addEventListener('change', animationPolicyChanged);
   }
 }
diff --git a/ui/accessibility/extensions/colorenhancer/src/background.js b/ui/accessibility/extensions/colorenhancer/src/background.js
index 9d22be1..227ce6ab 100644
--- a/ui/accessibility/extensions/colorenhancer/src/background.js
+++ b/ui/accessibility/extensions/colorenhancer/src/background.js
@@ -34,9 +34,8 @@
    * Adds filter script and css to all existing tabs.
    *
    * TODO(wnwen): Verify content scripts are not being injected multiple times.
-   * @private
    */
-  injectContentScripts_() {
+  injectContentScripts() {
     this.forEachTab_(tab => chrome.scripting.executeScript({
       target: {tabId: tab.id},
       files: ['src/common.js', 'src/matrix.js', 'src/cvd.js'],
@@ -85,7 +84,6 @@
    * @private
    */
   init_() {
-    this.injectContentScripts_();
     this.updateTabs_();
 
     chrome.runtime.onMessage.addListener(
@@ -105,3 +103,5 @@
 }
 
 const background = new Background();
+self.addEventListener(
+    'install', background.injectContentScripts.bind(background));
diff --git a/ui/accessibility/extensions/colorenhancer/src/common.js b/ui/accessibility/extensions/colorenhancer/src/common.js
index 38925a9..ba22e3c 100644
--- a/ui/accessibility/extensions/colorenhancer/src/common.js
+++ b/ui/accessibility/extensions/colorenhancer/src/common.js
@@ -5,6 +5,13 @@
 // TODO(wnwen): Move most of these functions to their own page rather than
 //     common, which should be shared with content script.
 
+/** @enum {string} */
+const CvdType = {
+  PROTANOMALY: "PROTANOMALY",
+  DEUTERANOMALY: "DEUTERANOMALY",
+  TRITANOMALY: "TRITANOMALY",
+};
+
 /**
  * TODO(wnwen): Remove this and use actual web API.
  */
diff --git a/ui/accessibility/extensions/colorenhancer/src/cvd.js b/ui/accessibility/extensions/colorenhancer/src/cvd.js
index d058744..e13b3067 100644
--- a/ui/accessibility/extensions/colorenhancer/src/cvd.js
+++ b/ui/accessibility/extensions/colorenhancer/src/cvd.js
@@ -2,18 +2,29 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+class CVD {
+  constructor() {
+    /** @private {number} */
+    this.curDelta = 0;
+    /** @private {number} */
+    this.curSeverity = 0;
+    /** @private {!CvdType} */
+    this.curType = CvdType.PROTANOMALY;
+    /** @private {boolean} */
+    this.curSimulate = false;
+    /** @private {boolean} */
+    this.curEnable = false;
+    /** @private {number} */
+    this.curFilter = 0;
 
-/**
- * Global exports.  Used by popup to show effect of filter during setup.
- */
-(function(exports) {
-  let curDelta = 0;
-  let curSeverity = 0;
-  let curType = 'PROTANOMALY';
-  let curSimulate = false;
-  let curEnable = false;
-  let curFilter = 0;
-  const cssContent = `
+    this.init_();
+  }
+
+  /**
+   * @const {string}
+   * @private
+   */
+  static cssContent_ = `
 html[cvd="0"] {
   -webkit-filter: url('#cvd_extension_0');
 }
@@ -22,23 +33,29 @@
 }
 `;
 
-  /** @const {string} */
-  const SVG_DEFAULT_MATRIX =
-    '1 0 0 0 0 ' +
-    '0 1 0 0 0 ' +
-    '0 0 1 0 0 ' +
-    '0 0 0 1 0';
+  /**
+   * @const {string}
+   * @private
+   */
+  static SVG_DEFAULT_MATRIX_ = '1 0 0 0 0 ' +
+      '0 1 0 0 0 ' +
+      '0 0 1 0 0 ' +
+      '0 0 0 1 0';
 
-  const svgContent = `
+  /**
+   * @const {string}
+   * @private
+   */
+  static svgContent_ = `
 <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
   <defs>
     <filter x="0" y="0" width="99999" height="99999" id="cvd_extension_0">
       <feColorMatrix id="cvd_matrix_0" type="matrix" values="
-          ${SVG_DEFAULT_MATRIX}"/>
+          ${CVD.SVG_DEFAULT_MATRIX_}"/>
     </filter>
     <filter x="0" y="0" width="99999" height="99999" id="cvd_extension_1">
       <feColorMatrix id="cvd_matrix_1" type="matrix" values="
-          ${SVG_DEFAULT_MATRIX}"/>
+          ${CVD.SVG_DEFAULT_MATRIX_}"/>
     </filter>
   </defs>
 </svg>
@@ -53,46 +70,38 @@
    *     http://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/Machado_Oliveira_Fernandes_CVD_Vis2009_final.pdf
    *
    * @enum {string}
+   * @private
    */
-  const cvdSimulationParams = {
+  static simulationParams_ = {
     PROTANOMALY: [
-      [0.4720, -1.2946, 0.9857],
-      [-0.6128, 1.6326, 0.0187],
-      [0.1407, -0.3380, -0.0044],
-      [-0.1420, 0.2488, 0.0044],
-      [0.1872, -0.3908, 0.9942],
-      [-0.0451, 0.1420, 0.0013],
-      [0.0222, -0.0253, -0.0004],
-      [-0.0290, -0.0201, 0.0006],
+      [0.4720, -1.2946, 0.9857], [-0.6128, 1.6326, 0.0187],
+      [0.1407, -0.3380, -0.0044], [-0.1420, 0.2488, 0.0044],
+      [0.1872, -0.3908, 0.9942], [-0.0451, 0.1420, 0.0013],
+      [0.0222, -0.0253, -0.0004], [-0.0290, -0.0201, 0.0006],
       [0.0068, 0.0454, 0.9990]
     ],
     DEUTERANOMALY: [
-      [0.5442, -1.1454, 0.9818],
-      [-0.7091, 1.5287, 0.0238],
-      [0.1650, -0.3833, -0.0055],
-      [-0.1664, 0.4368, 0.0056],
-      [0.2178, -0.5327, 0.9927],
-      [-0.0514, 0.0958, 0.0017],
-      [0.0180, -0.0288, -0.0006],
-      [-0.0232, -0.0649, 0.0007],
+      [0.5442, -1.1454, 0.9818], [-0.7091, 1.5287, 0.0238],
+      [0.1650, -0.3833, -0.0055], [-0.1664, 0.4368, 0.0056],
+      [0.2178, -0.5327, 0.9927], [-0.0514, 0.0958, 0.0017],
+      [0.0180, -0.0288, -0.0006], [-0.0232, -0.0649, 0.0007],
       [0.0052, 0.0360, 0.9998]
     ],
     TRITANOMALY: [
-      [0.4275, -0.0181, 0.9307],
-      [-0.2454, 0.0013, 0.0827],
-      [-0.1821, 0.0168, -0.0134],
-      [-0.1280, 0.0047, 0.0202],
-      [0.0233, -0.0398, 0.9728],
-      [0.1048, 0.0352, 0.0070],
-      [-0.0156, 0.0061, 0.0071],
-      [0.3841, 0.2947, 0.0151],
+      [0.4275, -0.0181, 0.9307], [-0.2454, 0.0013, 0.0827],
+      [-0.1821, 0.0168, -0.0134], [-0.1280, 0.0047, 0.0202],
+      [0.0233, -0.0398, 0.9728], [0.1048, 0.0352, 0.0070],
+      [-0.0156, 0.0061, 0.0071], [0.3841, 0.2947, 0.0151],
       [-0.3685, -0.3008, 0.9778]
     ]
   };
 
-
-  // TODO(mustaq): This should be nuked, see getCvdCorrectionMatrix().
-  const cvdCorrectionParams = {
+  /**
+   * TODO(mustaq): This should be nuked, see this.getCvdCorrectionMatrix_().
+   * @const {Object<string, {addendum: Matrix3x3, delta_factor: Matrix3x3}>}
+   * @private
+   */
+  static correctionParams_ = {
     PROTANOMALY: {
       addendum: Matrix3x3.fromData(
           [[0.0, 0.0, 0.0], [0.7, 1.0, 0.0], [0.7, 0.0, 1.0]]),
@@ -113,67 +122,77 @@
     }
   };
 
+  /**
+   * @const {string}
+   * @private
+   */
+  static STYLE_ID_ = 'cvd_style';
+
+  /**
+   * @const {string}
+   * @private
+   */
+  static WRAP_ID_ = 'cvd_extension_svg_filter';
 
   // =======  CVD matrix builders =======
 
   /**
    * Returns a 3x3 matrix for simulating the given type of CVD with the given
    * severity.
-   * @param {string} cvdType Type of CVD, either "PROTANOMALY" or
-   *     "DEUTERANOMALY" or "TRITANOMALY".
+   * @param {CvdType} cvdType Type of CVD, either PROTANOMALY or
+   *     DEUTERANOMALY or TRITANOMALY.
    * @param {number} severity A real number in [0,1] denoting severity.
    * @return {!Matrix3x3}
+   * @private
    */
-  function getCvdSimulationMatrix(cvdType, severity) {
-    const cvdSimulationParam = cvdSimulationParams[cvdType];
-    const severity_squared = severity * severity;
-
+  getCvdSimulationMatrix_(cvdType, severity) {
     const calculateElementValue = (i, j) => {
+      const cvdSimulationParam = CVD.simulationParams_[cvdType];
+      const severity_squared = severity * severity;
       const paramRow = i*3+j;
       return cvdSimulationParam[paramRow][0] * severity_squared
            + cvdSimulationParam[paramRow][1] * severity
            + cvdSimulationParam[paramRow][2];
-    };
+    }
     return Matrix3x3.fromElementwiseConstruction(calculateElementValue);
   }
 
-
   /**
    * Returns a 3x3 matrix for correcting the given type of CVD using the given
    * color adjustment.
-   * @param {string} cvdType Type of CVD, either "PROTANOMALY" or
-   *     "DEUTERANOMALY" or "TRITANOMALY".
+   * @param {CvdType} cvdType Type of CVD, either PROTANOMALY or
+   *     DEUTERANOMALY or TRITANOMALY.
    * @param {number} delta A real number in [0,1] denoting color adjustment.
    * @return {!Matrix3x3}
+   * @private
    */
-  function getCvdCorrectionMatrix(cvdType, delta) {
-    cvdCorrectionParam = cvdCorrectionParams[cvdType];
+  getCvdCorrectionMatrix_(cvdType, delta) {
+    const cvdCorrectionParam = CVD.correctionParams_[cvdType];
     // TODO(mustaq): Perhaps nuke full-matrix operations after experiment.
     return cvdCorrectionParam['addendum'].add(
         cvdCorrectionParam['delta_factor'].scale(delta));
   }
 
-
   /**
    * Returns the 3x3 matrix to be used for the given settings.
-   * @param {string} cvdType Type of CVD, either "PROTANOMALY" or
-   *     "DEUTERANOMALY" or "TRITANOMALY".
+   * @param {CvdType} cvdType Type of CVD, either PROTANOMALY or
+   *     DEUTERANOMALY or TRITANOMALY.
    * @param {number} severity A real number in [0,1] denoting severity.
    * @param {number} delta A real number in [0,1] denoting color adjustment.
    * @param {boolean} simulate Whether to simulate the CVD type.
    * @param {boolean} enable Whether to enable color filtering.
    * @return {!Matrix3x3}
+   * @private
    */
-  function getEffectiveCvdMatrix(
-      cvdType, severity, delta, simulate, enable) {
+  getEffectiveCvdMatrix_(cvdType, severity, delta, simulate, enable) {
     if (!enable) {
       return Matrix3x3.IDENTITY;
     }
 
-    let effectiveMatrix = getCvdSimulationMatrix(cvdType, severity);
+    let effectiveMatrix = this.getCvdSimulationMatrix_(cvdType, severity);
 
     if (!simulate) {
-      const cvdCorrectionMatrix = getCvdCorrectionMatrix(cvdType, delta);
+      const cvdCorrectionMatrix = this.getCvdCorrectionMatrix_(cvdType, delta);
       const tmpProduct = cvdCorrectionMatrix.multiply(effectiveMatrix);
 
       effectiveMatrix =
@@ -183,31 +202,28 @@
     return effectiveMatrix;
   }
 
-
   // ======= Page linker =======
 
-  const STYLE_ID = 'cvd_style';
-  const WRAP_ID = 'cvd_extension_svg_filter';
-
   /**
    * Checks for required elements, adding if missing.
+   * @private
    */
-  function addElements() {
-    let style = document.getElementById(STYLE_ID);
+  addElements_() {
+    let style = document.getElementById(CVD.STYLE_ID_);
     if (!style) {
       style = document.createElement('style');
-      style.id = STYLE_ID;
+      style.id = CVD.STYLE_ID_;
       style.setAttribute('type', 'text/css');
-      style.innerHTML = cssContent;
+      style.innerHTML = CVD.cssContent_;
       document.head.appendChild(style);
     }
 
-    let wrap = document.getElementById(WRAP_ID);
+    let wrap = document.getElementById(CVD.WRAP_ID_);
     if (!wrap) {
       wrap = document.createElement('span');
-      wrap.id = WRAP_ID;
+      wrap.id = CVD.WRAP_ID_;
       wrap.setAttribute('hidden', '');
-      wrap.innerHTML = svgContent;
+      wrap.innerHTML = CVD.svgContent_;
       document.body.appendChild(wrap);
     }
   }
@@ -215,10 +231,11 @@
   /**
    * Updates the SVG filter based on the RGB correction/simulation matrix.
    * @param {!Matrix3x3} matrix  3x3 RGB transformation matrix.
+   * @private
    */
-  function setFilter(matrix) {
-    addElements();
-    const next = 1 - curFilter;
+  setFilter_(matrix) {
+    this.addElements_();
+    const next = 1 - this.curFilter;
 
     debugPrint('update: matrix#' + next + '=' + matrix.toString());
 
@@ -227,39 +244,41 @@
 
     document.documentElement.setAttribute('cvd', next);
 
-    curFilter = next;
+    this.curFilter = next;
   }
 
   /**
    * Updates the SVG matrix using the current settings.
+   * @private
    */
-  function update() {
-    if (curEnable) {
+  update_() {
+    if (this.curEnable) {
       if (!document.body) {
-        document.addEventListener('DOMContentLoaded', update);
+        document.addEventListener('DOMContentLoaded', this.update_.bind(this));
         return;
       }
 
-      const effectiveMatrix = getEffectiveCvdMatrix(
-          curType, curSeverity, curDelta * 2 - 1, curSimulate, curEnable);
+      const effectiveMatrix = this.getEffectiveCvdMatrix_(
+          this.curType, this.curSeverity, this.curDelta * 2 - 1,
+          this.curSimulate, this.curEnable);
 
-      setFilter(effectiveMatrix);
+      this.setFilter_(effectiveMatrix);
 
       if (window == window.top) {
         window.scrollBy(0, 1);
         window.scrollBy(0, -1);
       }
     } else {
-      clearFilter();
+      this.clearFilter_();
     }
   }
 
-
   /**
    * Process a message from background page.
    * @param {!object} message An object containing color filter parameters.
+   * @private
    */
-  function onExtensionMessage(message) {
+  onExtensionMessage_(message) {
     debugPrint('onExtensionMessage: ' + JSON.stringify(message));
     let changed = false;
 
@@ -269,92 +288,94 @@
 
     if (message['type'] !== undefined) {
       const type = message.type;
-      if (curType != type) {
-        curType = type;
+      if (this.curType != type) {
+        this.curType = type;
         changed = true;
       }
     }
 
     if (message['severity'] !== undefined) {
       const severity = message.severity;
-      if (curSeverity != severity) {
-        curSeverity = severity;
+      if (this.curSeverity != severity) {
+        this.curSeverity = severity;
         changed = true;
       }
     }
 
     if (message['delta'] !== undefined) {
       const delta = message.delta;
-      if (curDelta != delta) {
-        curDelta = delta;
+      if (this.curDelta != delta) {
+        this.curDelta = delta;
         changed = true;
       }
     }
 
     if (message['simulate'] !== undefined) {
       const simulate = message.simulate;
-      if (curSimulate != simulate) {
-        curSimulate = simulate;
+      if (this.curSimulate != simulate) {
+        this.curSimulate = simulate;
         changed = true;
       }
     }
 
     if (message['enable'] !== undefined) {
       const enable = message.enable;
-      if (curEnable != enable) {
-        curEnable = enable;
+      if (this.curEnable != enable) {
+        this.curEnable = enable;
         changed = true;
       }
     }
 
     if (changed) {
-      update();
+      this.update_();
     }
   }
 
-
   /**
    * Remove the filter from the page.
+   * @private
    */
-  function clearFilter() {
+  clearFilter_() {
     document.documentElement.removeAttribute('cvd');
   }
 
-
   /**
    * Prepare to process background messages and let it know to send initial
    * values.
+   * @private
    */
-  exports.initializeExtension = function () {
-    chrome.runtime.onMessage.addListener(onExtensionMessage);
-    chrome.runtime.sendMessage("init", onExtensionMessage);
-  };
+  init_() {
+    chrome.runtime.onMessage.addListener(this.onExtensionMessage_.bind(this));
+    chrome.runtime.sendMessage('init', this.onExtensionMessage_.bind(this));
+  }
+
+  // ============ Public Methods ==============
 
   /**
    * Generate SVG filter for color enhancement based on type and severity using
    * default color adjustment.
-   * @param {string} type Type type of color vision defficiency (CVD).
+   * @param {CvdType} type Type type of color vision defficiency (CVD).
    * @param {number} severity The degree of CVD ranging from 0 for normal
    *     vision to 1 for dichromats.
    */
-  exports.getDefaultCvdCorrectionFilter = function(type, severity) {
-    return getEffectiveCvdMatrix(type, severity, 0, false, true);
-  };
+  getDefaultCvdCorrectionFilter(type, severity) {
+    return this.getEffectiveCvdMatrix_(type, severity, 0, false, true);
+  }
 
   /**
    * Adds support for a color enhancement filter.
    * @param {!Matrix3x3} matrix 3x3 RGB transformation matrix.
    */
-  exports.injectColorEnhancementFilter = function(matrix) {
-    setFilter(matrix);
-  };
+  injectColorEnhancementFilter(matrix) {
+    this.setFilter_(matrix);
+  }
 
   /**
    * Clears color correction filter.
    */
-  exports.clearColorEnhancementFilter = function() {
-    clearFilter();
-  };
-})(this);
+  clearColorEnhancementFilter() {
+    this.clearFilter_();
+  }
+}
 
-this.initializeExtension();
+window.cvd = new CVD();
diff --git a/ui/accessibility/extensions/colorenhancer/src/popup.js b/ui/accessibility/extensions/colorenhancer/src/popup.js
index a14046ea..185d23a 100644
--- a/ui/accessibility/extensions/colorenhancer/src/popup.js
+++ b/ui/accessibility/extensions/colorenhancer/src/popup.js
@@ -19,8 +19,8 @@
   /**
    * Creates a radio button for selecting the given type of CVD and a series of
    * color swatches for testing color vision.
-   * @param {string} cvdType Type of CVD, either "PROTANOMALY" or
-   *     "DEUTERANOMALY" or "TRITANOMALY".
+   * @param {!CvdType} cvdType Type of CVD, either PROTANOMALY or
+   *     DEUTERANOMALY or TRITANOMALY.
    *  @return {!Element} Row of color swatches with a leading radio button.
    */
   createTestRow(type) {
@@ -56,29 +56,29 @@
 
   /**
    * Gets the CVD type selected through the radio buttons.
-   * @return {?string}
+   * @return {?CvdType}
    */
   getCvdTypeSelection() {
     let active = undefined;
-    Popup.CVD_TYPES.forEach((str) => {
+    Object.values(CvdType).forEach((str) => {
       if ($('select-' + str).checked) {
         active = str;
         return;
       }
     });
-    return active;
+    return /** @type {?CvdType} */ (active);
   }
 
   /**
    * Sets the radio buttons selection to the given CVD type.
-   * @param {string} cvdType Type of CVD, either "PROTANOMALY" or
-   *     "DEUTERANOMALY" or "TRITANOMALY".
+   * @param {!CvdType} cvdType Type of CVD, either PROTANOMALY or
+   *     DEUTERANOMALY or TRITANOMALY.
    * @return {?string}
    */
   setCvdTypeSelection(cvdType) {
     const highlight = $('row-highlight');
     highlight.hidden = true;
-    Popup.CVD_TYPES.forEach((str) => {
+    Object.values(CvdType).forEach((str) => {
       const checkbox = $('select-' + str);
       if (cvdType == str) {
         checkbox.checked = true;
@@ -132,7 +132,7 @@
   async update() {
     const type = await storage.getDefaultType();
     let validType = false;
-    Popup.CVD_TYPES.forEach((cvdType) => {
+    Object.values(CvdType).forEach((cvdType) => {
       if (cvdType == type) {
         validType = true;
         return;
@@ -186,9 +186,9 @@
     storage.setDefaultSeverity(value).then(() => {
       this.update();
       // Apply filter to popup swatches.
-      const filter = window.getDefaultCvdCorrectionFilter(
-          this.getCvdTypeSelection(), value);
-      injectColorEnhancementFilter(filter);
+      const filter =
+          cvd.getDefaultCvdCorrectionFilter(this.getCvdTypeSelection(), value);
+      cvd.injectColorEnhancementFilter(filter);
       // Force a refresh.
       window.getComputedStyle(document.documentElement, null);
     });
@@ -266,7 +266,7 @@
       $('enable').checked = false;
       this.setCvdTypeSelection('');
       this.updateControls();
-      clearColorEnhancementFilter();
+      cvd.clearColorEnhancementFilter();
     };
     $('reset').hidden = !IS_DEV_MODE;
 
@@ -292,7 +292,7 @@
     };
 
     const swatches = $('swatches');
-    Popup.CVD_TYPES.forEach((cvdType) => {
+    Object.values(CvdType).forEach((cvdType) => {
       swatches.appendChild(this.createTestRow(cvdType));
     });
 
@@ -313,13 +313,6 @@
 }
 
 /**
- * The strings for CVD Types.
- * TODO(mustaq): Define an enum in cvd.js instead.
- * @const {array{string}}
- */
-Popup.CVD_TYPES = ['PROTANOMALY', 'DEUTERANOMALY', 'TRITANOMALY'];
-
-/**
  * Vertical offset for displaying the row highlight.
  * @const {number}
  */
diff --git a/ui/accessibility/extensions/colorenhancer/src/storage.js b/ui/accessibility/extensions/colorenhancer/src/storage.js
index a4299a85..dd948aaf 100644
--- a/ui/accessibility/extensions/colorenhancer/src/storage.js
+++ b/ui/accessibility/extensions/colorenhancer/src/storage.js
@@ -5,7 +5,7 @@
 // TODO(wnwen): Wrap calls.
 // TODO(anastasi): Change interface to remove unneeded promises.
 
-/** @typedef {string|number|boolean} */
+/** @typedef {CvdType|number|boolean} */
 let StoredValue;
 /** @typedef {{newValue: StoredValue, oldValue: StoredValue}} */
 let Change;
@@ -21,7 +21,7 @@
     /** @private {number} */
     this.defaultSeverity_ = Storage.DEFAULT_SEVERITY;
 
-    /** @private {string} */
+    /** @private {!CvdType} */
     this.defaultType_ = Storage.INVALID_TYPE_PLACEHOLDER;
 
     /** @private {boolean} */
@@ -221,11 +221,10 @@
    * @private
    */
   validType_(type) {
-    return type === 'PROTANOMALY' || type === 'DEUTERANOMALY' ||
-        type === 'TRITANOMALY';
+    return Object.values(CvdType).includes(type);
   }
 
-  /** @return {Promise<string>} */
+  /** @return {Promise<CvdType>} */
   getDefaultType() {
     return new Promise(resolve => {
       resolve(this.defaultType_);
@@ -233,7 +232,7 @@
   }
 
   /**
-   * @param {string} type
+   * @param {CvdType} type
    * @return {Promise}
    */
   setDefaultType(type) {
diff --git a/ui/accessibility/extensions/highcontrast/background.js b/ui/accessibility/extensions/highcontrast/background.js
index 52f3fab..43254014 100644
--- a/ui/accessibility/extensions/highcontrast/background.js
+++ b/ui/accessibility/extensions/highcontrast/background.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+Storage.initialize();
+
 function injectContentScripts() {
   chrome.windows.getAll({'populate': true}, function(windows) {
     for (var i = 0; i < windows.length; i++) {
@@ -11,9 +13,6 @@
         if (url.startsWith('chrome') || url.startsWith('about'))
           continue;
 
-        chrome.tabs.insertCSS(
-            tabs[j].id,
-            {file: 'highcontrast.css', allFrames: true});
         chrome.tabs.executeScript(
             tabs[j].id,
             {file: 'highcontrast.js', allFrames: true});
@@ -24,7 +23,7 @@
 
 function updateTabs() {
   var msg = {
-    'enabled': getEnabled()
+    'enabled': Storage.enabled
   };
   chrome.windows.getAll({'populate': true}, function(windows) {
     for (var i = 0; i < windows.length; i++) {
@@ -35,8 +34,8 @@
           continue;
         }
         var msg = {
-          'enabled': getEnabled(),
-          'scheme': getSiteScheme(siteFromUrl(url))
+          'enabled': Storage.enabled,
+          'scheme': Storage.getSiteScheme(siteFromUrl(url))
         };
         chrome.tabs.sendRequest(tabs[j].id, msg);
       }
@@ -45,21 +44,21 @@
 }
 
 function toggleEnabled() {
-  setEnabled(!getEnabled());
+  Storage.enabled = !Storage.enabled;
   updateTabs();
 }
 
 function toggleSite(url) {
   var site = siteFromUrl(url);
-  var scheme = getSiteScheme(site);
+  var scheme = Storage.getSiteScheme(site);
   if (scheme > 0) {
     scheme = 0;
-  } else if (getDefaultScheme() > 0) {
-    scheme = getDefaultScheme();
-  } else {
-    scheme = DEFAULT_SCHEME;
+  } else if (Storage.scheme > 0) {
+    scheme = Storage.scheme;
   }
-  setSiteScheme(site, scheme);
+    scheme = Storage.SCHEME.defaultValue;
+  }
+  Storage.setSiteScheme(site, scheme);
   updateTabs();
 }
 
@@ -76,21 +75,21 @@
           toggleSite(sender.tab ? sender.tab.url : 'www.example.com');
         }
         if (request['init']) {
-          var scheme = getDefaultScheme();
+          var scheme = Storage.scheme;
           if (sender.tab) {
-            scheme = getSiteScheme(siteFromUrl(sender.tab.url));
+            scheme = Storage.getSiteScheme(siteFromUrl(sender.tab.url));
           }
           var msg = {
-            'enabled': getEnabled(),
+            'enabled': Storage.enabled,
             'scheme': scheme
           };
           sendResponse(msg);
         }
       });
 
-  document.addEventListener('storage', function(evt) {
+  chrome.storage.onChanged.addListener(function() {
     updateTabs();
-  }, false);
+  });
 
   if (navigator.appVersion.indexOf('Mac') != -1) {
     chrome.browserAction.setTitle({'title': 'High Contrast (Cmd+Shift+F11)'});
diff --git a/ui/accessibility/extensions/highcontrast/common.js b/ui/accessibility/extensions/highcontrast/common.js
index b4cf068..0318473 100644
--- a/ui/accessibility/extensions/highcontrast/common.js
+++ b/ui/accessibility/extensions/highcontrast/common.js
@@ -2,94 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var DEFAULT_SCHEME = 3;
-var MAX_SCHEME = 5;
-
 function $(id) {
   return document.getElementById(id);
 }
 
-function getEnabled() {
-  var result = localStorage['enabled'];
-  if (result === 'true' || result === 'false') {
-    return (result === 'true');
-  }
-  localStorage['enabled'] = 'true';
-  return true;
-}
-
-function setEnabled(enabled) {
-  localStorage['enabled'] = enabled;
-}
-
-function getKeyAction() {
-  var keyAction = localStorage['keyaction'];
-  if (keyAction == 'global' || keyAction == 'site') {
-    return keyAction;
-  }
-  keyAction = 'global';
-  localStorage['keyaction'] = keyAction;
-  return keyAction;
-}
-
-function setKeyAction(keyAction) {
-  if (keyAction != 'global' && keyAction != 'site') {
-    keyAction = 'global';
-  }
-  localStorage['keyaction'] = keyAction;
-}
-
-function getDefaultScheme() {
-  var scheme = localStorage['scheme'];
-  if (scheme >= 0 && scheme <= MAX_SCHEME) {
-    return scheme;
-  }
-  scheme = DEFAULT_SCHEME;
-  localStorage['scheme'] = scheme;
-  return scheme;
-}
-
-function setDefaultScheme(scheme) {
-  if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
-    scheme = DEFAULT_SCHEME;
-  }
-  localStorage['scheme'] = scheme;
-}
-
-function getSiteScheme(site) {
-  var scheme = getDefaultScheme();
-  try {
-    var siteSchemes = JSON.parse(localStorage['siteschemes']);
-    scheme = siteSchemes[site];
-    if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
-      scheme = getDefaultScheme();
-    }
-  } catch (e) {
-    scheme = getDefaultScheme();
-  }
-  return scheme;
-}
-
-function setSiteScheme(site, scheme) {
-  if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
-    scheme = getDefaultScheme();
-  }
-  var siteSchemes = {};
-  try {
-    siteSchemes = JSON.parse(localStorage['siteschemes']);
-    siteSchemes['www.example.com'] = getDefaultScheme();
-  } catch (e) {
-    siteSchemes = {};
-  }
-  siteSchemes[site] = scheme;
-  localStorage['siteschemes'] = JSON.stringify(siteSchemes);
-}
-
-function resetSiteSchemes() {
-  var siteSchemes = {};
-  localStorage['siteschemes'] = JSON.stringify(siteSchemes);
-}
-
 function siteFromUrl(url) {
   var a = document.createElement('a');
   a.href = url;
diff --git a/ui/accessibility/extensions/highcontrast/manifest.json b/ui/accessibility/extensions/highcontrast/manifest.json
index c22411c..93914de 100644
--- a/ui/accessibility/extensions/highcontrast/manifest.json
+++ b/ui/accessibility/extensions/highcontrast/manifest.json
@@ -5,11 +5,13 @@
   "manifest_version": 2,
   "permissions": [
     "<all_urls>",
+    "storage",
     "tabs"
   ],
   "background": {
     "scripts": [
       "common.js",
+      "storage.js",
       "background.js"
     ]
   },
diff --git a/ui/accessibility/extensions/highcontrast/popup.html b/ui/accessibility/extensions/highcontrast/popup.html
index b920c2c6..3296f2d 100644
--- a/ui/accessibility/extensions/highcontrast/popup.html
+++ b/ui/accessibility/extensions/highcontrast/popup.html
@@ -1,7 +1,6 @@
 <!doctype html>
 <html>
 <head>
-<link rel="stylesheet" type="text/css" href="highcontrast.css">
 <style type="text/css">
 html {
   border-radius: 6px;
@@ -58,6 +57,7 @@
 }
 </style>
 <script type="text/javascript" src="common.js"></script>
+<script type="text/javascript" src="storage.js"></script>
 <script type="text/javascript" src="popup.js"></script>
 </head>
 <body>
diff --git a/ui/accessibility/extensions/highcontrast/popup.js b/ui/accessibility/extensions/highcontrast/popup.js
index bdf95ccd..cbeb96c 100644
--- a/ui/accessibility/extensions/highcontrast/popup.js
+++ b/ui/accessibility/extensions/highcontrast/popup.js
@@ -5,19 +5,20 @@
 var site;
 var key1;
 var key2;
+Storage.initialize();
 
 function setRadio(name, value) {
   var radios = document.querySelectorAll('input[name="' + name + '"]');
   for (var i = 0; i < radios.length; i++) {
     radios[i].checked = (radios[i].value == value);
-    radios[i].disabled = !getEnabled();
+    radios[i].disabled = !Storage.enabled;
   }
 }
 
 function update() {
-  document.body.className = getEnabled() ? '' : 'disabled';
+  document.body.className = Storage.enabled ? '' : 'disabled';
 
-  if (getEnabled()) {
+  if (Storage.enabled) {
     $('title').innerText = chrome.i18n.getMessage('highcontrast_enabled');
     $('toggle').innerHTML =
         '<b>' + chrome.i18n.getMessage('highcontrast_disable') + '</b><br>' +
@@ -31,17 +32,18 @@
     $('subcontrols').style.display = 'none';
   }
 
-  setRadio('keyaction', getKeyAction());
+  setRadio('keyaction', Storage.keyAction);
   if (site) {
-    setRadio('scheme', getSiteScheme(site));
-    $('make_default').disabled = (getSiteScheme(site) == getDefaultScheme());
+    const scheme = Storage.getSiteScheme(site);
+    setRadio('scheme', scheme);
+    $('make_default').disabled = (scheme == Storage.scheme);
   } else {
-    setRadio('scheme', getDefaultScheme());
+    setRadio('scheme', Storage.scheme);
   }
-  if (getEnabled()) {
+  if (Storage.enabled) {
     document.documentElement.setAttribute(
         'hc',
-        site ? 'a' + getSiteScheme(site) : 'a' + getDefaultScheme());
+        site ? 'a' + Storage.getSiteScheme(site) : 'a' + Storage.scheme);
   } else {
     document.documentElement.setAttribute('hc', 'a0');
   }
@@ -49,28 +51,28 @@
 }
 
 function onToggle() {
-  setEnabled(!getEnabled());
+  Storage.enabled = !Storage.enabled;
   update();
 }
 
 function onForget() {
-  resetSiteSchemes();
+  Storage.resetSiteSchemes();
   update();
 }
 
 function onRadioChange(name, value) {
   switch (name) {
     case 'keyaction':
-      setKeyAction(value);
+      Storage.keyAction = value;
       break;
     case 'apply':
-      setApply(value);
+      Storage.enabled = value;
       break;
     case 'scheme':
       if (site) {
-        setSiteScheme(site, value);
+        Storage.setSiteScheme(site, value);
       } else {
-        setDefaultScheme(value);
+        Storage.scheme = value;
       }
       break;
   }
@@ -78,7 +80,7 @@
 }
 
 function onMakeDefault() {
-  setDefaultScheme(getSiteScheme(site));
+  Storage.scheme = Storage.getSiteScheme(site);
   update();
 }
 
diff --git a/ui/accessibility/extensions/highcontrast/storage.js b/ui/accessibility/extensions/highcontrast/storage.js
new file mode 100644
index 0000000..ef446cb
--- /dev/null
+++ b/ui/accessibility/extensions/highcontrast/storage.js
@@ -0,0 +1,222 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/** @enum {string} */
+const KeyAction = {
+  GLOBAL: 'global',
+  SITE: 'site',
+};
+
+class Storage {
+  /** @private */
+  constructor() {
+    /** @private {boolean} */
+    this.enabled_ = Storage.ENABLED.defaultValue;
+    /** @private {!KeyAction} */
+    this.keyAction_ = Storage.KEY_ACTION.defaultValue;
+    /** @private {number} */
+    this.scheme_ = Storage.SCHEME.defaultValue;
+    /** @private {!Object<string, number>} */
+    this.siteSchemes_ = Storage.SITE_SCHEMES.defaultValue;
+
+    this.init_();
+  }
+
+  // ======= Public Methods =======
+
+  static initialize() {
+    if (!Storage.instance) {
+      Storage.instance = new Storage();
+    }
+  }
+
+  /** @return {boolean} */
+  static get enabled() { return Storage.instance.enabled_; }
+  /** @return {!KeyAction} */
+  static get keyAction() { return Storage.instance.keyAction_; }
+  /** @return {number} */
+  static get scheme() { return Storage.instance.scheme_; }
+
+  /**
+   * @param {string} site
+   * @return {number}
+   */
+  static getSiteScheme(site) {
+    const scheme = Storage.instance.siteSchemes_[site];
+    if (Storage.SCHEME.validate(scheme)) {
+      return scheme;
+    }
+    return Storage.instance.scheme;
+  }
+
+  /** @param {boolean} enabled */
+  static set enabled(enabled) {
+    if (Storage.ENABLED.validate(enabled)) {
+      Storage.instance.enabled_ = enabled;
+    } else {
+      Storage.ENABLED.reset();
+    }
+    Storage.instance.store_(Storage.ENABLED);
+  }
+
+  /** @param {!KeyAction} keyAction */
+  static set keyAction(keyAction) {
+    if (Storage.KEY_ACTION.validate(keyAction)) {
+      Storage.instance.keyAction_ = keyAction;
+    } else {
+      Storage.KEY_ACTION.reset();
+    }
+    Storage.instance.store_(Storage.KEY_ACTION);
+  }
+
+  /** @param {number} scheme */
+  static set scheme(scheme) {
+    if (Storage.SCHEME.validate(scheme)) {
+      Storage.instance.scheme_ = scheme;
+    } else {
+      Storage.SCHEME.reset();
+    }
+    Storage.instance.store_(Storage.SCHEME);
+  }
+
+  /**
+   * @param {string} site
+   * @param {number} scheme
+   */
+  static setSiteScheme(site, scheme) {
+    if (Storage.SCHEME.validate(scheme)) {
+      Storage.instance.siteSchemes_[site] = scheme;
+    } else {
+      Storage.instance.siteSchemes_[site] = Storage.instance.scheme;
+    }
+    Storage.instance.store_(Storage.SITE_SCHEMES);
+  }
+
+  static resetSiteSchemes() {
+    Storage.instance.siteSchemes_ = Storage.SITE_SCHEMES.defaultValue;
+    Storage.instance.store_(Storage.SITE_SCHEMES);
+  }
+
+  // ======= Private Methods =======
+
+  /** @private */
+  init_() {
+    chrome.storage.onChanged.addListener(this.onChange_);
+    chrome.storage.local.get(null /* all values */, (results) => {
+      for (const value of Storage.ALL_VALUES) {
+        const newValue = results[value.key];
+        if (!newValue) {
+          continue;
+        }
+
+        if (value.validate(newValue)) {
+          value.set(newValue);
+        } else {
+          value.reset();
+        }
+      }
+    });
+  }
+
+  /**
+   * @param {!Object<string, chrome.storage.StorageChange>} changes
+   * @private
+   */
+  onChange_(changes) {
+    for (const value of Storage.ALL_VALUES) {
+      const newValue = changes[value.key].newValue;
+      if (!newValue) {
+        continue;
+      }
+
+      if (value.validate(newValue)) {
+        value.set(newValue);
+      } else {
+        value.reset();
+      }
+    }
+  }
+
+  /**
+   * @param {!Storage.Value} value
+   */
+  store_(value) {
+    const update = {};
+    update[value.key] = value.get();
+    chrome.storage.local.set(update);
+  }
+
+  // ======= Constants =======
+
+  /** @const {number} */
+  static MAX_SCHEME = 5;
+  /** @constant {number} */
+  static MIN_SCHEME = 0;
+
+  // ======= Stored Values =======
+
+  /**
+   * @typedef {{
+   *     key: string,
+   *     defaultValue: *,
+   *     validate: function(*): boolean,
+   *     get: function: *,
+   *     set: function(*),
+   *     reset: function()
+   * }}
+   */
+  static Value;
+
+  /** @const {!Storage.Value} */
+  static ENABLED = {
+    key: 'enabled',
+    defaultValue: true,
+    validate: (enabled) => enabled === true || enabled === false,
+    get: () => Storage.instance.enabled_,
+    set: (enabled) => Storage.instance.enabled_ = enabled,
+    reset: () => Storage.instance.setEnabled(Storage.ENABLED.defaultValue),
+  };
+
+  /** @const {!Storage.Value} */
+  static KEY_ACTION = {
+    key: 'keyaction',
+    defaultValue: KeyAction.GLOBAL,
+    validate: (keyAction) => Object.values(KeyAction).includes(keyAction),
+    get: () => Storage.instance.keyAction_,
+    set: (keyAction) => Storage.instance.keyAction_ = keyAction,
+    reset: () => Storage.instance.setKeyAction(Storage.KEY_ACTION.defaultValue),
+  };
+
+  /** @const {!Storage.Value} */
+  static SCHEME = {
+    key: 'scheme',
+    defaultValue: 3,
+    validate: (scheme) =>
+        scheme >= Storage.MIN_SCHEME && scheme <= Storage.MAX_SCHEME,
+    get: () => Storage.instance.scheme_,
+    set: (scheme) => Storage.instance.scheme_ = scheme,
+    reset: () => Storage.instance.setScheme(Storage.SCHEME.defaultValue),
+  };
+
+  /** @const {!Storage.Value} */
+  static SITE_SCHEMES = {
+    key: 'siteschemes',
+    defaultValue: {},
+    validate: (siteSchemes) => typeof (siteSchemes) === 'object',
+    get: () => Storage.instance.siteSchemes_,
+    set: (siteSchemes) => {
+      for (const site of Object.keys(siteSchemes)) {
+        if (Storage.SCHEME.validate(siteSchemes[site])) {
+          Storage.instance.siteSchemes_[site] = siteSchemes[site];
+        }
+      }
+    },
+    reset: () => {} /** Do nothing */,
+  };
+
+  /** @const {!Array<!Storage.Value>} */
+  static ALL_VALUES = [
+      Storage.ENABLED, Storage.KEY_ACTION, Storage.SCHEME, Storage.SITE_SCHEMES
+  ];
+}
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm
index fb25951..a86c053 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.mm
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -1132,6 +1132,12 @@
   }
 }
 
+- (NSNumber*)AXIsMultiSelectable {
+  if (![self instanceActive])
+    return nil;
+  return @(_node->HasState(ax::mojom::State::kMultiselectable));
+}
+
 - (NSString*)AXPopupValue {
   if (![self instanceActive])
     return nil;
diff --git a/ui/accessibility/platform/ax_private_attributes_mac.h b/ui/accessibility/platform/ax_private_attributes_mac.h
index e5cd127..044957ab 100644
--- a/ui/accessibility/platform/ax_private_attributes_mac.h
+++ b/ui/accessibility/platform/ax_private_attributes_mac.h
@@ -56,6 +56,8 @@
     @"AXHasPopup";
 AX_EXPORT constexpr NSString* const NSAccessibilityInvalidAttribute =
     @"AXInvalid";
+AX_EXPORT constexpr NSString* const NSAccessibilityIsMultiSelectable =
+    @"AXIsMultiSelectable";
 AX_EXPORT constexpr NSString* const
     NSAccessibilityMathFractionNumeratorAttribute = @"AXMathFractionNumerator";
 AX_EXPORT constexpr NSString* const
diff --git a/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm b/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
index 3da4591..c21d8cc50 100644
--- a/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
+++ b/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
@@ -57,6 +57,7 @@
        NSAccessibilityGrabbedAttribute,
        NSAccessibilityHasPopupAttribute,
        NSAccessibilityInvalidAttribute,
+       NSAccessibilityIsMultiSelectable,
        NSAccessibilityMathFractionNumeratorAttribute,
        NSAccessibilityMathFractionDenominatorAttribute,
        NSAccessibilityMathRootRadicandAttribute,
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc
index f6c262a..b2d977e 100644
--- a/ui/compositor/test/in_process_context_factory.cc
+++ b/ui/compositor/test/in_process_context_factory.cc
@@ -284,15 +284,14 @@
   if (shared_worker_context_provider_) {
     // Note: If context is lost, delete reference after releasing the lock.
     base::AutoLock lock(*shared_worker_context_provider_->GetLock());
-    if (shared_worker_context_provider_->ContextGL()
+    if (shared_worker_context_provider_->RasterInterface()
             ->GetGraphicsResetStatusKHR() != GL_NO_ERROR) {
       shared_worker_context_provider_lost = true;
     }
   }
   if (!shared_worker_context_provider_ || shared_worker_context_provider_lost) {
-    constexpr bool support_locking = true;
     shared_worker_context_provider_ = InProcessContextProvider::CreateOffscreen(
-        &gpu_memory_buffer_manager_, &image_factory_, support_locking);
+        &gpu_memory_buffer_manager_, &image_factory_, /*is_worker=*/true);
     auto result = shared_worker_context_provider_->BindToCurrentThread();
     if (result != gpu::ContextResult::kSuccess)
       shared_worker_context_provider_ = nullptr;
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc
index 5b92d50c..b130545 100644
--- a/ui/compositor/test/in_process_context_provider.cc
+++ b/ui/compositor/test/in_process_context_provider.cc
@@ -7,18 +7,22 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/lazy_instance.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/gpu/context_cache_controller.h"
+#include "components/viz/service/gl/gpu_service_impl.h"
 #include "components/viz/test/test_gpu_service_holder.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
+#include "gpu/command_buffer/client/raster_implementation.h"
 #include "gpu/command_buffer/client/raster_implementation_gles.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
 #include "gpu/config/skia_limits.h"
 #include "gpu/ipc/gl_in_process_context.h"
 #include "gpu/skia_bindings/grcontext_for_gles2_interface.h"
 #include "ipc/common/surface_handle.h"
+#include "ipc/raster_in_process_context.h"
 #include "third_party/skia/include/gpu/GrDirectContext.h"
 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
 
@@ -42,7 +46,7 @@
 InProcessContextProvider::CreateOffscreen(
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     gpu::ImageFactory* image_factory,
-    bool support_locking) {
+    bool is_worker) {
   gpu::ContextCreationAttribs attribs;
   attribs.alpha_size = 8;
   attribs.blue_size = 8;
@@ -54,9 +58,12 @@
   attribs.sample_buffers = 0;
   attribs.fail_if_major_perf_caveat = false;
   attribs.bind_generates_resource = false;
+  attribs.enable_raster_interface = true;
+  attribs.enable_gles2_interface = !is_worker;
+  attribs.enable_oop_rasterization = is_worker;
   return new InProcessContextProvider(attribs, gpu_memory_buffer_manager,
                                       image_factory, gpu::kNullSurfaceHandle,
-                                      "Offscreen", support_locking);
+                                      "Offscreen", is_worker);
 }
 
 InProcessContextProvider::InProcessContextProvider(
@@ -97,63 +104,88 @@
     return bind_result_;
   bind_tried_ = true;
 
-  context_ = std::make_unique<gpu::GLInProcessContext>();
-  bind_result_ = context_->Initialize(
-      viz::TestGpuServiceHolder::GetInstance()->task_executor(),
-      /*surface=*/nullptr,
-      /*is_offscreen=*/window_ == gpu::kNullSurfaceHandle, window_, attribs_,
-      gpu::SharedMemoryLimits(), gpu_memory_buffer_manager_, image_factory_,
-      /*gpu_task_scheduler=*/nullptr,
-      /*display_controller_on_gpu=*/nullptr,
-      base::ThreadTaskRunnerHandle::Get());
+  auto* holder = viz::TestGpuServiceHolder::GetInstance();
+
+  if (attribs_.enable_oop_rasterization) {
+    DCHECK_EQ(window_, gpu::kNullSurfaceHandle);
+    DCHECK(!attribs_.enable_gles2_interface);
+    DCHECK(!attribs_.enable_grcontext);
+
+    raster_context_ = std::make_unique<gpu::RasterInProcessContext>();
+    bind_result_ = raster_context_->Initialize(
+        holder->task_executor(), attribs_, gpu::SharedMemoryLimits(),
+        gpu_memory_buffer_manager_, image_factory_,
+        /*gpu_channel_manager_delegate=*/nullptr,
+        holder->gpu_service()->gr_shader_cache(), nullptr);
+
+    impl_base_ = raster_context_->GetImplementation();
+  } else {
+    gles2_context_ = std::make_unique<gpu::GLInProcessContext>();
+    bind_result_ = gles2_context_->Initialize(
+        viz::TestGpuServiceHolder::GetInstance()->task_executor(),
+        /*surface=*/nullptr,
+        /*is_offscreen=*/window_ == gpu::kNullSurfaceHandle, window_, attribs_,
+        gpu::SharedMemoryLimits(), gpu_memory_buffer_manager_, image_factory_,
+        /*gpu_task_scheduler=*/nullptr,
+        /*display_controller_on_gpu=*/nullptr,
+        base::ThreadTaskRunnerHandle::Get());
+
+    impl_base_ = gles2_context_->GetImplementation();
+  }
 
   if (bind_result_ != gpu::ContextResult::kSuccess)
     return bind_result_;
 
   cache_controller_ = std::make_unique<viz::ContextCacheController>(
-      context_->GetImplementation(), base::ThreadTaskRunnerHandle::Get());
+      impl_base_, base::ThreadTaskRunnerHandle::Get());
   if (support_locking_)
     cache_controller_->SetLock(GetLock());
 
-  std::string unique_context_name =
-      base::StringPrintf("%s-%p", debug_name_.c_str(), context_.get());
-  context_->GetImplementation()->TraceBeginCHROMIUM(
-      "gpu_toplevel", unique_context_name.c_str());
-
-  raster_context_ = std::make_unique<gpu::raster::RasterImplementationGLES>(
-      context_->GetImplementation(), context_->GetImplementation());
+  if (gles2_context_) {
+    gles2_raster_impl_ =
+        std::make_unique<gpu::raster::RasterImplementationGLES>(
+            ContextGL(), ContextSupport());
+  }
 
   return bind_result_;
 }
 
 const gpu::Capabilities& InProcessContextProvider::ContextCapabilities() const {
   CheckValidThreadOrLockAcquired();
-  return context_->GetImplementation()->capabilities();
+  return impl_base_->capabilities();
 }
 
 const gpu::GpuFeatureInfo& InProcessContextProvider::GetGpuFeatureInfo() const {
   CheckValidThreadOrLockAcquired();
-  return context_->GetGpuFeatureInfo();
+
+  return gles2_context_ ? gles2_context_->GetGpuFeatureInfo()
+                        : raster_context_->GetGpuFeatureInfo();
 }
 
 gpu::gles2::GLES2Interface* InProcessContextProvider::ContextGL() {
   CheckValidThreadOrLockAcquired();
-  return context_->GetImplementation();
+  if (!gles2_context_)
+    return nullptr;
+
+  return gles2_context_->GetImplementation();
 }
 
 gpu::raster::RasterInterface* InProcessContextProvider::RasterInterface() {
   CheckValidThreadOrLockAcquired();
-
-  return raster_context_.get();
+  return raster_context_ ? raster_context_->GetImplementation()
+                         : gles2_raster_impl_.get();
 }
 
 gpu::ContextSupport* InProcessContextProvider::ContextSupport() {
-  return context_->GetImplementation();
+  return impl_base_;
 }
 
 class GrDirectContext* InProcessContextProvider::GrContext() {
   CheckValidThreadOrLockAcquired();
 
+  if (attribs_.enable_oop_rasterization)
+    return nullptr;
+
   if (gr_context_)
     return gr_context_->get();
 
@@ -170,7 +202,8 @@
 }
 
 gpu::SharedImageInterface* InProcessContextProvider::SharedImageInterface() {
-  return context_->GetSharedImageInterface();
+  return gles2_context_ ? gles2_context_->GetSharedImageInterface()
+                        : raster_context_->GetSharedImageInterface();
 }
 
 viz::ContextCacheController* InProcessContextProvider::CacheController() {
@@ -206,4 +239,14 @@
     observer.OnContextLost();
 }
 
+void InProcessContextProvider::CheckValidThreadOrLockAcquired() const {
+#if DCHECK_IS_ON()
+  if (support_locking_) {
+    context_lock_.AssertAcquired();
+  } else {
+    DCHECK(context_thread_checker_.CalledOnValidThread());
+  }
+#endif
+}
+
 }  // namespace ui
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h
index fb06159..831f7cf0 100644
--- a/ui/compositor/test/in_process_context_provider.h
+++ b/ui/compositor/test/in_process_context_provider.h
@@ -19,12 +19,14 @@
 #include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/common/context_creation_attribs.h"
 #include "gpu/ipc/common/surface_handle.h"
+#include "ipc/raster_in_process_context.h"
 #include "ui/gfx/native_widget_types.h"
 
 namespace gpu {
 class GLInProcessContext;
 class GpuMemoryBufferManager;
 class ImageFactory;
+class ImplementationBase;
 }
 
 namespace skia_bindings {
@@ -33,6 +35,8 @@
 
 namespace ui {
 
+// TODO(crbug.com/1292507): Merge into viz::TestInProcessContextProvider once
+// on-screen context support is no longer needed.
 class InProcessContextProvider
     : public base::RefCountedThreadSafe<InProcessContextProvider>,
       public viz::ContextProvider,
@@ -46,11 +50,13 @@
       const std::string& debug_name,
       bool support_locking);
 
-  // Uses default attributes for creating an offscreen context.
+  // Uses default attributes for creating an offscreen context. If `is_worker`
+  // is true then the context will support locking and OOP-R (through
+  // RasterInterface) and won't support GLES2 or GrContext.
   static scoped_refptr<InProcessContextProvider> CreateOffscreen(
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       gpu::ImageFactory* image_factory,
-      bool support_locking);
+      bool is_worker);
 
   InProcessContextProvider(const InProcessContextProvider&) = delete;
   InProcessContextProvider& operator=(const InProcessContextProvider&) = delete;
@@ -90,25 +96,22 @@
       bool support_locking);
   ~InProcessContextProvider() override;
 
-  void CheckValidThreadOrLockAcquired() const {
-#if DCHECK_IS_ON()
-    if (support_locking_) {
-      context_lock_.AssertAcquired();
-    } else {
-      DCHECK(context_thread_checker_.CalledOnValidThread());
-    }
-#endif
-  }
+  void CheckValidThreadOrLockAcquired() const;
 
   base::ThreadChecker main_thread_checker_;
   base::ThreadChecker context_thread_checker_;
 
-  std::unique_ptr<gpu::GLInProcessContext> context_;
+  std::unique_ptr<gpu::GLInProcessContext> gles2_context_;
+  std::unique_ptr<gpu::RasterInProcessContext> raster_context_;
+  raw_ptr<gpu::ImplementationBase> impl_base_ = nullptr;
+
+  // Initialized only when `gles2_context_` is used.
   std::unique_ptr<skia_bindings::GrContextForGLES2Interface> gr_context_;
-  std::unique_ptr<gpu::raster::RasterInterface> raster_context_;
+  std::unique_ptr<gpu::raster::RasterInterface> gles2_raster_impl_;
+
   std::unique_ptr<viz::ContextCacheController> cache_controller_;
 
-  [[maybe_unused]] const bool support_locking_;
+  const bool support_locking_;
   bool bind_tried_ = false;
   gpu::ContextResult bind_result_;
 
diff --git a/ui/events/gestures/physics_based_fling_curve.cc b/ui/events/gestures/physics_based_fling_curve.cc
index 877ad832..448edd0b 100644
--- a/ui/events/gestures/physics_based_fling_curve.cc
+++ b/ui/events/gestures/physics_based_fling_curve.cc
@@ -4,6 +4,7 @@
 
 #include "ui/events/gestures/physics_based_fling_curve.h"
 
+#include <algorithm>
 #include <cmath>
 
 namespace {
@@ -159,4 +160,4 @@
 
   return base::Seconds(duration);
 }
-}  // namespace ui
\ No newline at end of file
+}  // namespace ui
diff --git a/ui/events/keycodes/dom/dom_code_data.inc b/ui/events/keycodes/dom/dom_code_data.inc
index dd8ac49..6988e989 100644
--- a/ui/events/keycodes/dom/dom_code_data.inc
+++ b/ui/events/keycodes/dom/dom_code_data.inc
@@ -515,6 +515,8 @@
   DOM_CODE(0x0c00cd, 0x00a4, 0x00ac, 0xe022, 0xffff, "MediaPlayPause",
              MEDIA_PLAY_PAUSE),
   DOM_CODE(0x0c00cf, 0x0246, 0x024e, 0x0000, 0xffff, NULL, SPEECH_INPUT_TOGGLE),
+  DOM_CODE(0x0c00d8, 0x027b, 0x0283, 0x0000, 0xffff, NULL, DICTATE),
+  DOM_CODE(0x0c00d9, 0x0249, 0x0251, 0x0000, 0xffff, NULL, EMOJI_PICKER),
   DOM_CODE(0x0c00e5, 0x00d1, 0x00d9, 0x0000, 0xffff, NULL, BASS_BOOST),
   //DOM_CODE(0x0c00e6, 0x0000, 0x0000, 0x0000, 0xffff, NULL, SURROUND_MODE),
   //DOM_CODE(0x0c0150, 0x0000, 0x0000, 0x0000, 0xffff, NULL, AUDIO_BALANCE_RIGHT),
diff --git a/ui/events/keycodes/dom/keycode_converter_unittest.cc b/ui/events/keycodes/dom/keycode_converter_unittest.cc
index 26e8317..a09b27a 100644
--- a/ui/events/keycodes/dom/keycode_converter_unittest.cc
+++ b/ui/events/keycodes/dom/keycode_converter_unittest.cc
@@ -24,8 +24,8 @@
 // These are in the same order as the columns in dom_code_data.inc
 // as reflected in the DOM_CODE() macro below.
 const size_t expected_mapped_key_count[] = {
-    218,  // evdev
-    218,  // xkb
+    220,  // evdev
+    220,  // xkb
     157,  // windows
     119,  // mac
 };
diff --git a/ui/events/keycodes/dom_us_layout_data.h b/ui/events/keycodes/dom_us_layout_data.h
index 30b42bd..41b3cc0 100644
--- a/ui/events/keycodes/dom_us_layout_data.h
+++ b/ui/events/keycodes/dom_us_layout_data.h
@@ -597,6 +597,10 @@
     // DomCode::EJECT                              0x0C00B8 Eject
     {DomCode::MEDIA_PLAY_PAUSE,
      VKEY_MEDIA_PLAY_PAUSE},  // 0x0C00CD MediaPlayPause
+#if BUILDFLAG(IS_POSIX)
+    {DomCode::DICTATE, VKEY_DICTATE},            // 0x0C00D8 Dictate
+    {DomCode::EMOJI_PICKER, VKEY_EMOJI_PICKER},  // 0x0C00D9 Emoji
+#endif
     {DomCode::MEDIA_SELECT,
      VKEY_MEDIA_LAUNCH_MEDIA_SELECT},                // 0x0C0183 MediaSelect
     {DomCode::LAUNCH_MAIL, VKEY_MEDIA_LAUNCH_MAIL},  // 0x0C018A LaunchMail
@@ -606,6 +610,8 @@
     {DomCode::LAUNCH_CONTROL_PANEL,
      VKEY_SETTINGS},                              // 0x0C019F Launch Assistant
     {DomCode::LAUNCH_ASSISTANT, VKEY_ASSISTANT},  // 0x0C01CB Launch Assistant
+    {DomCode::NEW, VKEY_NEW},                     // 0x0C0201 AC New
+    {DomCode::CLOSE, VKEY_CLOSE},                 // 0x0C0203 AC Close
 #endif
     {DomCode::BROWSER_SEARCH, VKEY_BROWSER_SEARCH},  // 0x0C0221 BrowserSearch
     {DomCode::BROWSER_HOME, VKEY_BROWSER_HOME},      // 0x0C0223 BrowserHome
diff --git a/ui/events/keycodes/keyboard_codes_posix.h b/ui/events/keycodes/keyboard_codes_posix.h
index 379da42..8bdb829 100644
--- a/ui/events/keycodes/keyboard_codes_posix.h
+++ b/ui/events/keycodes/keyboard_codes_posix.h
@@ -242,6 +242,15 @@
   // represent them.
   VKEY_MEDIA_PLAY = 0xE9,
   VKEY_MEDIA_PAUSE = 0xEA,
+
+  // Application keys.
+  VKEY_NEW = 0xEB,
+  VKEY_CLOSE = 0xEC,
+
+  // Emoji Picker.
+  VKEY_EMOJI_PICKER = 0xED,
+  // Start dictation.
+  VKEY_DICTATE = 0xEE,
 };
 
 }  // namespace ui
diff --git a/ui/events/ozone/evdev/BUILD.gn b/ui/events/ozone/evdev/BUILD.gn
index 8e6a5774..b54cd8da 100644
--- a/ui/events/ozone/evdev/BUILD.gn
+++ b/ui/events/ozone/evdev/BUILD.gn
@@ -109,6 +109,8 @@
     "touch_filter/palm_detection_filter_factory.h",
     "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc",
     "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h",
+    "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc",
+    "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h",
     "touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc",
     "touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h",
     "touch_filter/shared_palm_detection_filter_state.h",
@@ -184,6 +186,7 @@
   }
 
   visibility += [
+    "//ash/webui/diagnostics_ui/*",
     "//ui/chromeos/*",
     "//ui/ozone/*",
   ]
diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
index c59463c..90f9265 100644
--- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
+++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
@@ -48,7 +48,7 @@
 
 void NeuralStylusPalmDetectionFilter::FindBiggestNeighborsWithin(
     int neighbor_count,
-    unsigned long min_sample_count,
+    unsigned long neighbor_min_sample_count,
     float max_distance,
     const PalmFilterStroke& stroke,
     std::vector<std::pair<float, int>>* biggest_strokes) const {
@@ -62,7 +62,7 @@
     if (neighbor.tracking_id() == stroke.tracking_id()) {
       continue;
     }
-    if (neighbor.samples().size() < min_sample_count) {
+    if (neighbor.samples().size() < neighbor_min_sample_count) {
       continue;
     }
     float distance =
@@ -84,6 +84,7 @@
 
 void NeuralStylusPalmDetectionFilter::FindNearestNeighborsWithin(
     int neighbor_count,
+    unsigned long neighbor_min_sample_count,
     float max_distance,
     const PalmFilterStroke& stroke,
     std::vector<std::pair<float, int>>* nearest_strokes) const {
@@ -101,7 +102,7 @@
     if (neighbor.tracking_id() == stroke.tracking_id()) {
       continue;
     }
-    if (neighbor.samples().size() < model_->config().min_sample_count) {
+    if (neighbor.samples().size() < neighbor_min_sample_count) {
       continue;
     }
     float distance =
@@ -194,9 +195,13 @@
     stroke.AddSample(CreatePalmFilterSample(touch, time, model_->config(),
                                             palm_filter_dev_info_));
     if (!is_palm_.test(slot) && ShouldDecideStroke(stroke)) {
+      // slots_to_decide will have is_delay_ set to false anyway, no need to do
+      // the delay detection.
       slots_to_decide.insert(slot);
+      continue;
     }
 
+    // Heuristic delay detection.
     if (config.heuristic_delay_start_if_palm && !end_of_stroke &&
         stroke.samples_seen() < config.max_sample_count &&
         IsHeuristicPalmStroke(stroke)) {
@@ -204,6 +209,18 @@
       //  yet. So we mark for delay for now.
       is_delay_.set(slot, true);
     }
+
+    // Early stage delay detection that marks suspicious palms for delay.
+    if (!is_delay_.test(slot) && config.nn_delay_start_if_palm &&
+        config.early_stage_sample_counts.find(stroke.samples_seen()) !=
+            config.early_stage_sample_counts.end()) {
+      VLOG(1) << "About to run a early_stage prediction.";
+      if (DetectSpuriousStroke(ExtractFeatures(tracking_id), tracking_id,
+                               model_->config().output_threshold)) {
+        VLOG(1) << "hold detected.";
+        is_delay_.set(slot, true);
+      }
+    }
   }
 
   for (const int slot : slots_to_decide) {
@@ -274,9 +291,9 @@
       return true;
     }
     std::vector<std::pair<float, int>> biggest_strokes;
-    FindBiggestNeighborsWithin(1 /* neighbors */, 1 /* min sample count */,
-                               model_->config().max_neighbor_distance_in_mm,
-                               stroke, &biggest_strokes);
+    FindBiggestNeighborsWithin(
+        1 /* neighbors */, 1 /* neighbor min sample count */,
+        model_->config().max_neighbor_distance_in_mm, stroke, &biggest_strokes);
     if (!biggest_strokes.empty() &&
         strokes_.find(biggest_strokes[0].second)->second.BiggestSize() >=
             config.heuristic_palm_area_limit) {
@@ -311,12 +328,11 @@
   const int features_per_stroke = features.size();
   std::vector<std::pair<float, int>> nearest_strokes, biggest_strokes;
   const NeuralStylusPalmDetectionFilterModelConfig& config = model_->config();
-  FindNearestNeighborsWithin(config.nearest_neighbor_count,
-                             config.max_neighbor_distance_in_mm, stroke,
-                             &nearest_strokes);
+  FindNearestNeighborsWithin(
+      config.nearest_neighbor_count, config.neighbor_min_sample_count,
+      config.max_neighbor_distance_in_mm, stroke, &nearest_strokes);
   FindBiggestNeighborsWithin(
-      config.biggest_near_neighbor_count,
-      model_->config().min_sample_count /* min sample count */,
+      config.biggest_near_neighbor_count, config.neighbor_min_sample_count,
       config.max_neighbor_distance_in_mm, stroke, &biggest_strokes);
   for (uint32_t i = 0; i < config.nearest_neighbor_count; ++i) {
     if (i < nearest_strokes.size()) {
@@ -445,8 +461,8 @@
     return false;
   }
 
-  // Optionally, we use touch_minor if it's around, so check it's good if it is
-  // present.
+  // Optionally, we use touch_minor if it's around, so check it's good if it
+  // is present.
   if (devinfo.HasAbsEvent(ABS_MT_TOUCH_MINOR) &&
       !code_check(ABS_MT_TOUCH_MINOR)) {
     return false;
diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
index 68d6422..6b023e3 100644
--- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
+++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h
@@ -64,12 +64,13 @@
  private:
   void FindNearestNeighborsWithin(
       int neighbor_count,
+      unsigned long neighbor_min_sample_count,
       float max_distance,
       const PalmFilterStroke& stroke,
       std::vector<std::pair<float, int>>* nearest_strokes) const;
   void FindBiggestNeighborsWithin(
       int neighbor_count,
-      unsigned long min_sample_count,
+      unsigned long neighbor_min_sample_count,
       float max_distance,
       const PalmFilterStroke& stroke,
       std::vector<std::pair<float, int>>* biggest_strokes) const;
diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
index cf284134..fdf858b 100644
--- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
+++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
@@ -6,6 +6,7 @@
 #define UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_MODEL_H_
 
 #include <cstdint>
+#include <unordered_set>
 #include <vector>
 
 #include "base/component_export.h"
@@ -36,6 +37,9 @@
   // Maximum sample count.
   uint32_t max_sample_count = 0;
 
+  // Minimum count of samples for a stroke to be considered as a neighbor.
+  uint32_t neighbor_min_sample_count = 0;
+
   uint32_t max_sequence_start_count_for_inference = 0;
 
   bool include_sequence_count_in_strokes = false;
@@ -54,6 +58,11 @@
   // point.
   bool heuristic_delay_start_if_palm = false;
 
+  // Similar to `heuristic_delay_start_if_palm`, but uses NN model to do the
+  // early check. NN early check happens on strokes with certain sample_counts
+  // defined in `early_stage_sample_counts`.
+  bool nn_delay_start_if_palm = false;
+
   // Maximum blank time within a session, in milliseconds.
   // Two tracking_ids are considered in one session if they overlap with each
   // other or the gap between them is less than max_blank_time.
@@ -74,6 +83,10 @@
   std::vector<float> radius_polynomial_resize;
 
   float output_threshold = 0.0f;
+
+  // If a stroke has these numbers of samples, run an early stage detection to
+  // check if it's spurious and mark it held if so.
+  std::unordered_set<uint32_t> early_stage_sample_counts;
 };
 
 // An abstract model utilized by NueralStylusPalmDetectionFilter.
diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
index 442b234..6c953a51 100644
--- a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
+++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
@@ -9,7 +9,10 @@
 #include <cstring>
 #include <limits>
 #include <tuple>
+
+#ifndef USE_EIGEN
 #define USE_EIGEN 0
+#endif
 
 namespace ui {
 namespace {
diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc
new file mode 100644
index 0000000..fd3add9
--- /dev/null
+++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc
@@ -0,0 +1,15423 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdint>
+#include <cstring>
+#include <limits>
+#include <tuple>
+
+#ifndef USE_EIGEN
+#define USE_EIGEN 0
+#endif
+
+namespace ui::v2 {
+namespace {
+
+// -----------------------------------------------------------------------------
+// OP LIBRARY
+// Copied here to make sure that the inference code always stays in sync with
+// the lib that it was generated for.
+// -----------------------------------------------------------------------------
+
+// Default to using std::copy and std::fill over memcpy and memset as they
+// are usually faster, thanks to the compiler getting stricter alignment
+// guarantees.
+#ifndef USE_TYPED_MEMSETMEMCPY
+#define USE_TYPED_MEMSETMEMCPY 1
+#endif
+#ifndef USE_EIGEN
+#error Please define USE_EIGEN to either 0 or 1
+#endif
+
+// Helper to reinterpret memory as Eigen matrices.
+#if USE_EIGEN
+template <typename Scalar>
+using ConstMatrixMap = typename Eigen::Map<
+    const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>;
+template <typename Scalar>
+using ConstRowVectorMap =
+    typename Eigen::Map<const Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>;
+template <typename Scalar>
+using RowVectorMap =
+    typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>;
+template <typename Scalar>
+using MatrixMap =
+    typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>;
+template <typename Scalar, typename StorageIndex>
+using SparseMatrix = Eigen::SparseMatrix<Scalar, Eigen::RowMajor, StorageIndex>;
+#endif
+
+#if OP_LIB_BENCHMARK
+class PerOpTimings {
+ public:
+  void Add(const std::string& op, absl::Duration time) {
+    time_per_op_[op] += time;
+  }
+
+  void Reset() { time_per_op_.clear(); }
+
+  void WriteTimingsToInfoLog() {
+    std::string message = "Per op totals:\n";
+    absl::Duration total;
+    for (auto& entry : time_per_op_) {
+      total += entry.second;
+      absl::StrAppend(
+          &message, entry.first, ": ",
+          absl::LegacyPrecision(absl::ToDoubleMilliseconds(entry.second)),
+          " ms\n");
+    }
+    absl::StrAppend(&message, "Total: ",
+                    absl::LegacyPrecision(absl::ToDoubleMilliseconds(total)),
+                    " ms\n");
+    VLOG(1) << message;
+  }
+
+ private:
+  std::map<std::string, absl::Duration> time_per_op_;
+};
+
+// Timer for individual operations. For each operation, add a statement like
+//   BENCHMARK_TIMER_V2(name_part1, name_part2, ...);
+// to the beginning of the code. All name parts will be concatenated together
+// and a line will be logged after executing the operation showing the name and
+// the elapsed time.
+class BenchmarkTimer {
+ public:
+  explicit BenchmarkTimer(std::string name)
+      : name_(std::move(name)), start_(absl::Now()) {}
+
+  ~BenchmarkTimer() {
+    const absl::Duration elapsed = absl::Now() - start_;
+    Singleton<PerOpTimings>::get()->Add(name_, elapsed);
+    VLOG(1) << "Time for " << name_ << ": "
+            << absl::ToDoubleMilliseconds(elapsed) << " ms";
+  }
+
+ private:
+  const std::string name_;
+  const absl::Time start_;
+};
+
+#define BENCHMARK_TIMER_V2(...) BenchmarkTimer timer(absl::StrCat(__VA_ARGS__));
+
+#else  // OP_LIB_BENCHMARK
+#define BENCHMARK_TIMER_V2(...)
+#endif  // OP_LIB_BENCHMARK
+
+// The size of a shape in terms of number of coefficients.
+inline int32_t ShapeSize(const int32_t rank, const int32_t* shape) {
+  int32_t size = 1;
+  for (int32_t i = 0; i < rank; ++i)
+    size *= shape[i];
+  return size;
+}
+
+// For convolutional operations, calculates the output size with VALID padding.
+// Returns (height, width).
+inline std::tuple<int, int> GetConvOutputSizeVALID(const int32_t* input_shape,
+                                                   const int32_t* kernel_shape,
+                                                   int32_t stride_y,
+                                                   int32_t stride_x) {
+  return std::make_tuple(
+      (input_shape[1] + stride_y - kernel_shape[0]) / stride_y,
+      (input_shape[2] + stride_x - kernel_shape[1]) / stride_x);
+}
+
+// For convolutional operations, calculates the output size with SAME padding.
+// Returns (height, width).
+inline std::tuple<int, int> GetConvOutputSizeSAME(const int32_t* input_shape,
+                                                  int32_t stride_y,
+                                                  int32_t stride_x) {
+  return std::make_tuple((input_shape[1] + stride_y - 1) / stride_y,
+                         (input_shape[2] + stride_x - 1) / stride_x);
+}
+
+// Helper to compute the size of the inner loop for an op that uses indices to
+// specify which axes are reduced.
+template <typename Tidx>
+int32_t GetReduceInnerSize(int32_t input_tensor_rank,
+                           const int32_t* __restrict input_shape,
+                           int32_t index_tensor_rank,
+                           const int32_t* __restrict index_shape,
+                           const Tidx* __restrict index_values) {
+  assert(index_tensor_rank <= 1);
+  const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1;
+  int32_t inner_size = 1;
+  for (int32_t i = 0; i < num_indices; ++i) {
+    Tidx index_value = index_values[i];
+    if (index_value < 0) {
+      index_value = input_tensor_rank + index_value;
+    }
+    inner_size *= input_shape[index_value];
+  }
+  return inner_size;
+}
+
+template <typename T>
+void ConcatV2Args2(int32_t arg0_rank,
+                   const int32_t* __restrict arg0_shape,
+                   const T* __restrict arg0_values,
+                   int32_t arg1_rank,
+                   const int32_t* __restrict arg1_shape,
+                   const T* __restrict arg1_values,
+                   const int32_t* __restrict axis_value,
+                   T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("ConcatV2Args2");
+  const int32_t axis = axis_value[0];
+  const int32_t num_lines = ShapeSize(axis, arg0_shape);
+  const int32_t arg0_line_size = ShapeSize(arg0_rank - axis, arg0_shape + axis);
+  const int32_t arg1_line_size = ShapeSize(arg1_rank - axis, arg1_shape + axis);
+  for (int32_t line = 0; line < num_lines; ++line) {
+    std::copy(arg0_values, arg0_values + arg0_line_size, output_values);
+    arg0_values += arg0_line_size;
+    output_values += arg0_line_size;
+    std::copy(arg1_values, arg1_values + arg1_line_size, output_values);
+    arg1_values += arg1_line_size;
+    output_values += arg1_line_size;
+  }
+}
+
+template <typename T>
+void MatMul(const int32_t* __restrict input_shape,
+            const T* __restrict input_values,
+            const int32_t* __restrict weight_shape,
+            const T* __restrict weight_values,
+            T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("MatMul");
+#if USE_EIGEN
+  const auto in =
+      ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
+  const auto weight =
+      ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]);
+  auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]);
+  result.noalias() = weight * in;
+#else
+  const int32_t batch_size = input_shape[0];
+  const int32_t num_inputs = weight_shape[0];
+  const int32_t num_outputs = weight_shape[1];
+  assert(input_shape[1] == num_inputs);
+  for (int32_t batch = 0; batch < batch_size; ++batch) {
+    for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
+      T value = 0;
+      for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
+        value += input_values[batch * num_inputs + in_i] *
+                 weight_values[in_i * num_outputs + out_i];
+      }
+      *output_values++ = value;
+    }
+  }
+#endif
+}
+
+template <typename T>
+void DepthwiseConv2dNative(const int32_t* __restrict input_shape,
+                           const T* __restrict input_values,
+                           const int32_t* __restrict kernel_shape,
+                           const T* __restrict kernel_values,
+                           int32_t stride_y,
+                           int32_t stride_x,
+                           int32_t out_height,
+                           int32_t out_width,
+                           T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("DepthwiseConv2dNative");
+  // Give the shape values nicer names.
+  assert(input_shape[3] == kernel_shape[2]);
+  const int32_t batch_size = input_shape[0];
+  const int32_t kernel_height = kernel_shape[0];
+  const int32_t kernel_width = kernel_shape[1];
+  const int32_t in_depth = kernel_shape[2];
+  const int32_t depth_mul = kernel_shape[3];
+  const int32_t in_height = input_shape[1];
+  const int32_t in_width = input_shape[2];
+
+  // Compute the amount of padding needed to get the desired output size.
+  const int32_t pad_height =
+      ((out_height - 1) * stride_y + kernel_height - in_height) / 2;
+  const int32_t pad_width =
+      ((out_width - 1) * stride_x + kernel_width - in_width) / 2;
+
+  // Cache the strides for address computations.
+  const int32_t in_strides[4] = {
+      input_shape[1] * input_shape[2] * input_shape[3],  // batch
+      input_shape[2] * input_shape[3],                   // y
+      input_shape[3],                                    // x
+      1,                                                 // channel
+  };
+  const int32_t kernel_strides[4] = {
+      kernel_shape[1] * kernel_shape[2] * kernel_shape[3],  // y
+      kernel_shape[2] * kernel_shape[3],                    // x
+      kernel_shape[3],                                      // in channels
+      1,                                                    // channel mult
+  };
+
+  T* out_write_ptr = output_values;
+  for (int32_t batch = 0; batch < batch_size; ++batch) {
+    for (int32_t out_y = 0; out_y < out_height; ++out_y) {
+      for (int32_t out_x = 0; out_x < out_width; ++out_x) {
+        // Compute the input read offsets.
+        const int32_t in_y_origin = (out_y * stride_y) - pad_height;
+        const int32_t in_x_origin = (out_x * stride_x) - pad_width;
+
+        // Compute the range of the kernel to be applied (we may need to clip
+        // when we'd read outside of the valid input region - for SAME).
+        const int32_t kernel_y_start =
+            std::max(static_cast<int32_t>(0), -in_y_origin);
+        const int32_t kernel_y_end =
+            std::min(kernel_height, in_height - in_y_origin);
+        const int32_t kernel_x_start =
+            std::max(static_cast<int32_t>(0), -in_x_origin);
+        const int32_t kernel_x_end =
+            std::min(kernel_width, in_width - in_x_origin);
+
+        for (int32_t in_c = 0; in_c < in_depth; ++in_c) {
+          for (int32_t mul_c = 0; mul_c < depth_mul; ++mul_c, ++out_write_ptr) {
+            // Convolve.
+            T sum = 0;
+            for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) {
+              const int32_t in_y = in_y_origin + k_y;
+              assert(in_y >= 0 && in_y < in_height);
+              for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) {
+                const int32_t in_x = in_x_origin + k_x;
+                assert(in_x >= 0 && in_x < in_width);
+                const T input_value =
+                    input_values[batch * in_strides[0] +  // batch
+                                 in_y * in_strides[1] +   // y
+                                 in_x * in_strides[2] +   // x
+                                 in_c];                   // in chan
+                const T kernel_value =
+                    kernel_values[k_y * kernel_strides[0] +   // y
+                                  k_x * kernel_strides[1] +   // x
+                                  in_c * kernel_strides[2] +  // in chan
+                                  mul_c];                     // chan mult
+                sum += input_value * kernel_value;
+              }
+            }
+            *out_write_ptr = sum;
+          }  // mul_c
+        }    // in_c
+      }      // out_x
+    }        // out_y
+  }          // batch
+}
+
+template <typename T>
+void DepthwiseConv2dNativeVALID(const int32_t* __restrict input_shape,
+                                const T* __restrict input_values,
+                                const int32_t* __restrict kernel_shape,
+                                const T* __restrict kernel_values,
+                                int32_t stride_y,
+                                int32_t stride_x,
+                                T* __restrict output_values) {
+  const auto out_size =
+      GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x);
+  DepthwiseConv2dNative<T>(
+      input_shape, input_values, kernel_shape, kernel_values, stride_y,
+      stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values);
+}
+
+template <typename T>
+void DepthwiseConv2dNativeSAME(const int32_t* __restrict input_shape,
+                               const T* __restrict input_values,
+                               const int32_t* __restrict kernel_shape,
+                               const T* __restrict kernel_values,
+                               int32_t stride_y,
+                               int32_t stride_x,
+                               T* __restrict output_values) {
+  const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x);
+  DepthwiseConv2dNative<T>(
+      input_shape, input_values, kernel_shape, kernel_values, stride_y,
+      stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values);
+}
+
+template <typename T>
+void FullyConnected(const int32_t* __restrict input_shape,
+                    const T* __restrict input_values,
+                    const int32_t* __restrict weight_shape,
+                    const T* __restrict weight_values,
+                    const int32_t* __restrict bias_shape,
+                    const T* __restrict bias_values,
+                    T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("FullyConnected");
+#if USE_EIGEN
+  const auto in =
+      ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
+  const auto weight =
+      ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]);
+  const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]);
+  auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]);
+  result.noalias() = (weight * in).colwise() + bias;
+#else
+  const int32_t batch_size = input_shape[0];
+  const int32_t num_inputs = weight_shape[0];
+  const int32_t num_outputs = weight_shape[1];
+  assert(input_shape[1] == num_inputs);
+  assert(bias_shape[0] == num_outputs);
+  for (int32_t batch = 0; batch < batch_size; ++batch) {
+    for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
+      T value = bias_values[out_i];
+      for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
+        value += input_values[batch * num_inputs + in_i] *
+                 weight_values[in_i * num_outputs + out_i];
+      }
+      output_values[batch * num_outputs + out_i] = value;
+    }
+  }
+#endif
+}
+
+template <typename T, typename TBlocks, typename TPaddings>
+void SpaceToBatchNDRank4(const int32_t* __restrict input_shape,
+                         const T* __restrict input_values,
+                         const TBlocks* __restrict block_shape_values,
+                         const TPaddings* __restrict padding_values,
+                         T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("SpaceToBatchNDRank4");
+  const int32_t input_batch_size = input_shape[0];
+  const int32_t input_height = input_shape[1];
+  const int32_t input_width = input_shape[2];
+  const int32_t input_depth = input_shape[3];
+
+  const TBlocks block_shape_height = block_shape_values[0];
+  const TBlocks block_shape_width = block_shape_values[1];
+  const TPaddings padding_top = padding_values[0];
+  const TPaddings padding_bottom = padding_values[1];
+  const TPaddings padding_left = padding_values[2];
+  const TPaddings padding_right = padding_values[3];
+
+  const int32_t block_size = block_shape_height * block_shape_width;
+  const int32_t output_depth = input_depth;
+  const int32_t output_batch_size = input_batch_size * block_size;
+  const int32_t output_height =
+      (padding_top + padding_bottom + input_height) / block_shape_height;
+  const int32_t output_width =
+      (padding_left + padding_right + input_width) / block_shape_width;
+
+  const T pad_value = 0;
+
+  for (int32_t out_b = 0; out_b < output_batch_size; ++out_b) {
+    const int32_t input_batch = out_b % input_batch_size;
+    const int32_t shift_w = (out_b / input_batch_size) % block_shape_width;
+    const int32_t shift_h = (out_b / input_batch_size) / block_shape_width;
+    for (int32_t out_h = 0; out_h < output_height; ++out_h) {
+      for (int32_t out_w = 0; out_w < output_width; ++out_w) {
+        T* out = output_values +
+                 (((out_b * output_height + out_h) * output_width + out_w) *
+                      output_depth +
+                  0);
+        // Check if padding cell are being handled.
+        if (out_h * block_shape_height + shift_h < padding_top ||
+            out_h * block_shape_height + shift_h >=
+                padding_top + input_height ||
+            out_w * block_shape_width + shift_w < padding_left ||
+            out_w * block_shape_width + shift_w >= padding_left + input_width) {
+// This may not execute correctly when pad_value != 0 and T != uint8.
+#if USE_TYPED_MEMSETMEMCPY
+          std::fill(out, out + input_depth, pad_value);
+#else
+          std::memset(out, pad_value, input_depth * sizeof(T));
+#endif
+        } else {
+          const int32_t i0 = input_batch;
+          const int32_t i1 =
+              (out_h * block_shape_height + shift_h) - padding_top;
+          const int32_t i2 =
+              (out_w * block_shape_width + shift_w) - padding_left;
+          const T* in =
+              input_values +
+              (((i0 * input_height + i1) * input_width + i2) * input_depth + 0);
+#if USE_TYPED_MEMSETMEMCPY
+          std::copy(in, in + input_depth, out);
+#else
+          std::memcpy(out, in, input_depth * sizeof(T));
+#endif
+        }
+      }
+    }
+  }
+}
+
+template <typename T, typename TBlocks, typename TCrops>
+void BatchToSpaceNDRank4(const int32_t* __restrict input_shape,
+                         const T* __restrict input_values,
+                         const TBlocks* __restrict block_shape_values,
+                         const TCrops* __restrict crops_values,
+                         T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("BatchToSpaceNDRank4");
+  const int32_t input_batch_size = input_shape[0];
+  const int32_t input_height = input_shape[1];
+  const int32_t input_width = input_shape[2];
+  const int32_t input_depth = input_shape[3];
+  const TBlocks block_shape_height = block_shape_values[0];
+  const TBlocks block_shape_width = block_shape_values[1];
+  const TCrops crops_top = crops_values[0];
+  const TCrops crops_bottom = crops_values[1];
+  const TCrops crops_left = crops_values[2];
+  const TCrops crops_right = crops_values[3];
+
+  const int32_t output_depth = input_depth;
+  const int32_t output_batch_size =
+      input_batch_size / (block_shape_width * block_shape_height);
+  const int32_t output_height =
+      input_height * block_shape_height - crops_top - crops_bottom;
+  const int32_t output_width =
+      input_width * block_shape_width - crops_left - crops_right;
+
+  for (int32_t in_batch = 0; in_batch < input_batch_size; ++in_batch) {
+    const int32_t out_batch = in_batch % output_batch_size;
+    const int32_t spatial_offset = in_batch / output_batch_size;
+    for (int32_t in_h = 0; in_h < input_height; ++in_h) {
+      const int32_t out_h = in_h * block_shape_height +
+                            spatial_offset / block_shape_width - crops_top;
+      if (out_h < 0 || out_h >= output_height) {
+        continue;
+      }
+      for (int32_t in_w = 0; in_w < input_width; ++in_w) {
+        const int32_t out_w = in_w * block_shape_width +
+                              spatial_offset % block_shape_width - crops_left;
+
+        if (out_w < 0 || out_w >= output_width) {
+          continue;
+        }
+        T* out = output_values +
+                 (((out_batch * output_height + out_h) * output_width + out_w) *
+                      output_depth +
+                  0);
+        const T* in = input_values +
+                      (((in_batch * input_height + in_h) * input_width + in_w) *
+                           input_depth +
+                       0);
+#if USE_TYPED_MEMSETMEMCPY
+        std::copy(in, in + input_depth, out);
+#else
+        std::memcpy(out, in, input_depth * sizeof(T));
+#endif
+      }
+    }
+  }
+}
+
+#if USE_EIGEN
+template <typename T, typename Tidx>
+void SparseDenseMatMulCSR(const int32_t* __restrict input_shape,
+                          const T* __restrict input_values,
+                          const int32_t num_rows,
+                          const int32_t* __restrict nnz_shape,
+                          const T* __restrict nnz_values,
+                          const Tidx* __restrict outer_index,
+                          const Tidx* __restrict cols,
+                          T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("SparseDenseMatMulCSR");
+  const int32_t num_cols = input_shape[1];
+  const auto in =
+      ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
+  const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
+      num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
+  auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
+  result.noalias() = weight * in;
+}
+
+template <typename T, typename Tidx>
+void SparseFullyConnectedCSR(const int32_t* __restrict input_shape,
+                             const T* __restrict input_values,
+                             const int32_t num_rows,
+                             const int32_t* __restrict nnz_shape,
+                             const T* __restrict nnz_values,
+                             const Tidx* __restrict outer_index,
+                             const Tidx* __restrict cols,
+                             const int32_t* __restrict bias_shape,
+                             const T* __restrict bias_values,
+                             T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("SparseFullyConnectedCSR");
+  const int32_t num_cols = input_shape[1];
+  const auto in =
+      ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
+  const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]);
+  const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
+      num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
+  auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
+  result.noalias() = (weight * in).colwise() + bias;
+}
+#endif
+
+template <typename T, typename TIndex>
+void Gather(int32_t params_rank,
+            const int32_t* __restrict params_shape,
+            const T* __restrict params_values,
+            int32_t indices_rank,
+            const int32_t* __restrict indices_shape,
+            const TIndex* __restrict indices_values,
+            T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("Gather");
+  const int32_t num_indices = ShapeSize(indices_rank, indices_shape);
+  const int32_t num_params = params_shape[0];
+  const int32_t slice_size = ShapeSize(params_rank - 1, params_shape + 1);
+  for (int32_t i = 0; i < num_indices; ++i) {
+    const int32_t index = indices_values[i];
+    if (index < 0 || index >= num_params) {
+      std::fill(output_values, output_values + slice_size, 0);
+    } else {
+      std::copy(params_values + index * slice_size,
+                params_values + index * slice_size + slice_size, output_values);
+    }
+    output_values += slice_size;
+  }
+}
+
+template <typename T>
+void Im2Row(const int32_t* __restrict input_shape,
+            const T* __restrict input_values,
+            const int32_t* __restrict kernel_shape,
+            int32_t stride_y,
+            int32_t stride_x,
+            int32_t out_height,
+            int32_t out_width,
+            T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("Im2Row");
+  // Give the shape values nicer names.
+  assert(input_shape[3] == kernel_shape[2]);
+  const int32_t batch_size = input_shape[0];
+  const int32_t kernel_height = kernel_shape[0];
+  const int32_t kernel_width = kernel_shape[1];
+  const int32_t in_depth = kernel_shape[2];
+  const int32_t in_height = input_shape[1];
+  const int32_t in_width = input_shape[2];
+
+  // Compute the amount of padding needed to get the desired output size.
+  const int32_t pad_height =
+      ((out_height - 1) * stride_y + kernel_height - in_height) / 2;
+  const int32_t pad_width =
+      ((out_width - 1) * stride_x + kernel_width - in_width) / 2;
+
+  // Cache the strides for address computations.
+  const int32_t x_stride = input_shape[3];
+  const int32_t y_stride = input_shape[2] * x_stride;
+  const int32_t batch_stride = input_shape[1] * y_stride;
+
+  for (int32_t batch = 0; batch < batch_size; ++batch) {
+    for (int32_t out_y = 0; out_y < out_height; ++out_y) {
+      for (int32_t out_x = 0; out_x < out_width; ++out_x) {
+        // Compute the input read offsets.
+        const int32_t in_y_origin = (out_y * stride_y) - pad_height;
+        const int32_t in_x_origin = (out_x * stride_x) - pad_width;
+
+        // Compute the range of the kernel to be applied (we may need to clip
+        // when we'd read outside of the valid input region - for SAME).
+        const int32_t kernel_y_start =
+            std::max(static_cast<int32_t>(0), -in_y_origin);
+        const int32_t kernel_y_end =
+            std::min(kernel_height, in_height - in_y_origin);
+        const int32_t kernel_x_start =
+            std::max(static_cast<int32_t>(0), -in_x_origin);
+        const int32_t kernel_x_end =
+            std::min(kernel_width, in_width - in_x_origin);
+
+        // Padding top.
+        if (kernel_y_start != 0) {
+          const int32_t num_lines = kernel_y_start;
+          const int32_t num_coeffs = num_lines * kernel_width * in_depth;
+#if USE_TYPED_MEMSETMEMCPY
+          std::fill(output_values, output_values + num_coeffs, 0);
+#else
+          std::memset(output_values, 0, num_coeffs * sizeof(T));
+#endif
+          output_values += num_coeffs;
+        }
+        for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) {
+          // Padding left.
+          if (kernel_x_start != 0) {
+            const int32_t num_coeffs = kernel_x_start * in_depth;
+#if USE_TYPED_MEMSETMEMCPY
+            std::fill(output_values, output_values + num_coeffs, 0);
+#else
+            std::memset(output_values, 0, num_coeffs * sizeof(T));
+#endif
+            output_values += num_coeffs;
+          }
+          // Valid values.
+          {
+            const int32_t in_y = in_y_origin + k_y;
+            const int32_t in_x = in_x_origin + kernel_x_start;
+            const int32_t num_coeffs =
+                (kernel_x_end - kernel_x_start) * in_depth;
+#if USE_TYPED_MEMSETMEMCPY
+            const int32_t offset =
+                batch * batch_stride + in_y * y_stride + in_x * x_stride;
+            std::copy(input_values + offset, input_values + offset + num_coeffs,
+                      output_values);
+#else
+            std::memcpy(output_values,
+                        input_values  // Reusing the restricted pointer.
+                            + batch * batch_stride  // batch
+                            + in_y * y_stride       // y
+                            + in_x * x_stride,      // x
+                        num_coeffs * sizeof(T));
+#endif
+            output_values += num_coeffs;
+          }
+          // Padding right.
+          if (kernel_x_end != kernel_width) {
+            const int32_t num_coeffs = (kernel_width - kernel_x_end) * in_depth;
+#if USE_TYPED_MEMSETMEMCPY
+            std::fill(output_values, output_values + num_coeffs, 0);
+#else
+            std::memset(output_values, 0, num_coeffs * sizeof(T));
+#endif
+            output_values += num_coeffs;
+          }
+        }
+        // Padding bottom.
+        if (kernel_y_end != kernel_height) {
+          const int32_t num_lines = kernel_height - kernel_y_end;
+          const int32_t num_coeffs = num_lines * kernel_width * in_depth;
+#if USE_TYPED_MEMSETMEMCPY
+          std::fill(output_values, output_values + num_coeffs, 0);
+#else
+          std::memset(output_values, 0, num_coeffs * sizeof(T));
+#endif
+          output_values += num_coeffs;
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void Im2RowVALID(const int32_t* __restrict input_shape,
+                 const T* __restrict input_values,
+                 const int32_t* __restrict kernel_shape,
+                 int32_t stride_y,
+                 int32_t stride_x,
+                 T* __restrict output_values) {
+  const auto out_size =
+      GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x);
+  Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x,
+            std::get<0>(out_size), std::get<1>(out_size), output_values);
+}
+
+template <typename T>
+void Im2RowSAME(const int32_t* __restrict input_shape,
+                const T* __restrict input_values,
+                const int32_t* __restrict kernel_shape,
+                int32_t stride_y,
+                int32_t stride_x,
+                T* __restrict output_values) {
+  const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x);
+  Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x,
+            std::get<0>(out_size), std::get<1>(out_size), output_values);
+}
+
+// We use macros instead of template functions with templated functors here
+// because it's a lot less verbose and easier for the compiler to optimize.
+#define POOL_OP_V2(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR)           \
+  template <typename T>                                                        \
+  void OP_NAME##Pool(const int32_t* __restrict input_shape,                    \
+                     const T* __restrict input_values, int32_t stride_y,       \
+                     int32_t stride_x, int32_t kernel_height,                  \
+                     int32_t kernel_width, int32_t out_height,                 \
+                     int32_t out_width, T* __restrict output_values) {         \
+    BENCHMARK_TIMER_V2(#OP_NAME, "Pool");                                      \
+    const int32_t batch_size = input_shape[0];                                 \
+    const int32_t in_height = input_shape[1];                                  \
+    const int32_t in_width = input_shape[2];                                   \
+    const int32_t depth = input_shape[3];                                      \
+                                                                               \
+    const int32_t pad_height =                                                 \
+        ((out_height - 1) * stride_y + kernel_height - in_height) / 2;         \
+    const int32_t pad_width =                                                  \
+        ((out_width - 1) * stride_x + kernel_width - in_width) / 2;            \
+                                                                               \
+    const int32_t in_strides[4] = {                                            \
+        input_shape[1] * input_shape[2] * input_shape[3],                      \
+        input_shape[2] * input_shape[3],                                       \
+        input_shape[3],                                                        \
+        1,                                                                     \
+    };                                                                         \
+                                                                               \
+    T* out_write_ptr = output_values;                                          \
+    for (int32_t batch = 0; batch < batch_size; ++batch) {                     \
+      for (int32_t out_y = 0; out_y < out_height; ++out_y) {                   \
+        for (int32_t out_x = 0; out_x < out_width; ++out_x) {                  \
+          const int32_t in_y_origin = (out_y * stride_y) - pad_height;         \
+          const int32_t in_x_origin = (out_x * stride_x) - pad_width;          \
+          const int32_t kernel_y_start =                                       \
+              std::max(static_cast<int32_t>(0), -in_y_origin);                 \
+          const int32_t kernel_y_end =                                         \
+              std::min(kernel_height, in_height - in_y_origin);                \
+          const int32_t kernel_x_start =                                       \
+              std::max(static_cast<int32_t>(0), -in_x_origin);                 \
+          const int32_t kernel_x_end =                                         \
+              std::min(kernel_width, in_width - in_x_origin);                  \
+          const int32_t count = (kernel_y_end - kernel_y_start) *              \
+                                (kernel_x_end - kernel_x_start);               \
+          (void)sizeof(count);                                                 \
+                                                                               \
+          for (int32_t chan = 0; chan < depth; ++chan, ++out_write_ptr) {      \
+            T value = DEFAULT_VALUE;                                           \
+            for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) {    \
+              const int32_t in_y = in_y_origin + k_y;                          \
+              assert(in_y >= 0 && in_y < in_height);                           \
+              for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) {  \
+                const int32_t in_x = in_x_origin + k_x;                        \
+                assert(in_x >= 0 && in_x < in_width);                          \
+                const T next = input_values[batch * in_strides[0] +            \
+                                            in_y * in_strides[1] +             \
+                                            in_x * in_strides[2] + chan];      \
+                value = UPDATE_EXPR;                                           \
+              }                                                                \
+            }                                                                  \
+            *out_write_ptr = RESULT_EXPR;                                      \
+          }                                                                    \
+        }                                                                      \
+      }                                                                        \
+    }                                                                          \
+  }                                                                            \
+                                                                               \
+  template <typename T>                                                        \
+  void OP_NAME##PoolVALID(const int32_t* __restrict input_shape,               \
+                          const T* __restrict input_values, int32_t stride_y,  \
+                          int32_t stride_x, int32_t kernel_height,             \
+                          int32_t kernel_width, T* __restrict output_values) { \
+    const int32_t kernel_shape[4] = {kernel_height, kernel_width, 1, 1};       \
+    const auto out_size =                                                      \
+        GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x); \
+    OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x,            \
+                     kernel_height, kernel_width, std::get<0>(out_size),       \
+                     std::get<1>(out_size), output_values);                    \
+  }                                                                            \
+                                                                               \
+  template <typename T>                                                        \
+  void OP_NAME##PoolSAME(const int32_t* __restrict input_shape,                \
+                         const T* __restrict input_values, int32_t stride_y,   \
+                         int32_t stride_x, int32_t kernel_height,              \
+                         int32_t kernel_width, T* __restrict output_values) {  \
+    const auto out_size =                                                      \
+        GetConvOutputSizeSAME(input_shape, stride_y, stride_x);                \
+    OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x,            \
+                     kernel_height, kernel_width, std::get<0>(out_size),       \
+                     std::get<1>(out_size), output_values);                    \
+  }
+
+POOL_OP_V2(Max, std::numeric_limits<T>::lowest(), std::max(value, next), value)
+POOL_OP_V2(Avg, 0, value + next, value / count)
+
+template <typename T>
+void Memcpy(const int32_t rank,
+            const int32_t* __restrict input_shape,
+            const T* __restrict input_values,
+            T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("Memcpy");
+  const int32_t size = ShapeSize(rank, input_shape);
+  for (int32_t i = 0; i < size; ++i) {
+    output_values[i] = input_values[i];
+  }
+}
+
+template <typename T>
+void Softmax(const int32_t rank,
+             const int32_t* __restrict input_shape,
+             const T* __restrict input_values,
+             const int32_t reduce_dim,
+             T* __restrict output_values,
+             T* __restrict scratch_values) {
+  BENCHMARK_TIMER_V2("Softmax");
+  const int32_t size = ShapeSize(rank, input_shape);
+  if (rank == 2 && reduce_dim == 1) {
+    T logits_max = std::numeric_limits<T>::lowest();
+
+    // Max.
+    for (int32_t i = 0; i < size; ++i) {
+      logits_max = std::max(logits_max, input_values[i]);
+    }
+
+    // Pre-compute exp.
+    for (int32_t i = 0; i < size; ++i) {
+      scratch_values[i] = std::exp(input_values[i] - logits_max);
+    }
+
+    // Sum over the last dimension, then divide the exps and write out.
+    for (int32_t offset = 0; offset < size; offset += input_shape[1]) {
+      const int32_t end_offset = offset + input_shape[1];
+      T sum = 0;
+      for (int32_t i = offset; i < end_offset; ++i) {
+        sum += scratch_values[i];
+      }
+      const T rcp_denom = static_cast<T>(1) / sum;
+      for (int32_t i = 0; i < input_shape[1]; ++i) {
+        output_values[offset + i] = scratch_values[offset + i] * rcp_denom;
+      }
+    }
+  } else {
+    assert(false && "Generic Softmax not yet supported.");
+  }
+}
+
+// Returns the start position for a slice in a single dimension.
+template <typename T>
+int32_t StridedSliceBegin(int32_t range_mask,
+                          const T* __restrict range_values,
+                          const T* __restrict strides,
+                          const int32_t* __restrict input_shape,
+                          int32_t dim) {
+  const bool is_explicit = 0 == (range_mask & (1 << dim));
+  if (is_explicit) {
+    const T range_value = range_values[dim];
+    return (range_value < 0 ? range_value + input_shape[dim] : range_value);
+  } else {
+    const bool is_reverse = strides[dim] < 0;
+    return is_reverse ? input_shape[dim] - 1 : 0;
+  }
+}
+
+// Returns the end position for a slice in a single dimension.
+template <typename T>
+int32_t StridedSliceEnd(int32_t range_mask,
+                        const T* __restrict range_values,
+                        const T* __restrict strides,
+                        const int32_t* __restrict input_shape,
+                        int32_t dim) {
+  const bool is_explicit = 0 == (range_mask & (1 << dim));
+  if (is_explicit) {
+    const T range_value = range_values[dim];
+    return (range_value < 0 ? range_value + input_shape[dim] : range_value);
+  } else {
+    const bool is_reverse = strides[dim] < 0;
+    return is_reverse ? -1 : input_shape[dim];
+  }
+}
+
+template <typename T, typename TIdx>
+void StridedSlice(const int32_t input_rank,
+                  const int32_t* __restrict input_shape,
+                  const T* __restrict input_values,
+                  const TIdx* __restrict begin,
+                  const TIdx* __restrict end,
+                  const TIdx* __restrict strides,
+                  int32_t begin_mask,
+                  int32_t end_mask,
+                  T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("StridedSlice");
+  const int32_t MAX_RANK = 8;
+  assert(input_rank < MAX_RANK);
+
+  // Compute the address strides for each dimension.
+  int32_t dim_addr_strides[MAX_RANK] = {0};
+  dim_addr_strides[input_rank - 1] = 1;
+  for (int32_t dim = input_rank - 2; dim >= 0; --dim) {
+    dim_addr_strides[dim] = dim_addr_strides[dim + 1] * input_shape[dim + 1];
+  }
+
+  // Resolve the masks and get explicit ranges for each dimension.
+  int32_t dim_begin[MAX_RANK];
+  int32_t dim_end[MAX_RANK];
+  bool dim_is_full_range[MAX_RANK];
+  for (int32_t dim = 0; dim < input_rank; ++dim) {
+    const int32_t stride = strides[dim];
+    dim_begin[dim] =
+        StridedSliceBegin(begin_mask, begin, strides, input_shape, dim);
+    dim_end[dim] = StridedSliceEnd(end_mask, end, strides, input_shape, dim);
+    dim_is_full_range[dim] =
+        dim_begin[dim] == 0 && dim_end[dim] == input_shape[dim] && stride == 1;
+    // Make sure that the dim_end is always bigger than dim_begin, this
+    // simplifies the boundary checks below.
+    if (stride > 0 && dim_begin[dim] > dim_end[dim]) {
+      dim_end[dim] += input_shape[dim];
+    }
+
+    // Our termination criteria for loops is that we hit the end exactly, so
+    // we need to ensure that we don't step over the end with stride != 1.
+    const int32_t length_mod = (dim_end[dim] - dim_begin[dim]) % stride;
+    if (length_mod != 0) {
+      dim_end[dim] += stride - length_mod;
+    }
+  }
+
+  // Find out how large the blocks are that we can copy contiguously. (All
+  // dimensions on the right for which we fetch the full range)
+  int32_t last_sliced_dim = input_rank - 1;
+  int32_t block_size = 1;
+  for (int32_t dim = input_rank - 1; dim >= 0 && dim_is_full_range[dim];
+       --dim) {
+    block_size *= input_shape[dim];
+    last_sliced_dim--;
+  }
+
+  // Initialize the read pos for each dimension according to the begin offsets.
+  int32_t read_pos[MAX_RANK] = {0};
+  for (int32_t dim = 0; dim < input_rank; ++dim) {
+    read_pos[dim] = dim_begin[dim];
+  }
+
+  while (read_pos[0] != dim_end[0]) {
+    // Compute the read offset for the current position.
+    int32_t read_offset = 0;
+    for (int32_t dim = 0; dim <= last_sliced_dim; ++dim) {
+      read_offset += (read_pos[dim] % input_shape[dim]) * dim_addr_strides[dim];
+    }
+
+#if USE_TYPED_MEMSETMEMCPY
+    std::copy(input_values + read_offset,
+              input_values + read_offset + block_size, output_values);
+#else
+    std::memcpy(output_values, input_values + read_offset,
+                block_size * sizeof(T));
+#endif
+    output_values += block_size;
+
+    // Advance the read position.
+    for (int32_t dim = last_sliced_dim; dim >= 0; --dim) {
+      read_pos[dim] += strides[dim];
+      if (dim == 0 || read_pos[dim] != dim_end[dim])
+        break;
+      read_pos[dim] = dim_begin[dim];
+    }
+  }
+}
+
+template <typename T>
+void TransposeRank3(const int32_t* __restrict input_shape,
+                    const T* __restrict input_values,
+                    const int32_t* __restrict perm,
+                    T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("TransposeRank3");
+  const int32_t in_strides[3] = {
+      input_shape[1] * input_shape[2],
+      input_shape[2],
+      1,
+  };
+  const int32_t out_strides[3] = {in_strides[perm[0]], in_strides[perm[1]],
+                                  in_strides[perm[2]]};
+  const int32_t out_shape[3] = {input_shape[perm[0]], input_shape[perm[1]],
+                                input_shape[perm[2]]};
+
+  int32_t write_offset = 0;
+  for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) {
+    const int32_t read_offset0 = it0 * out_strides[0];
+    for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) {
+      const int32_t read_offset01 = read_offset0 + it1 * out_strides[1];
+      for (int32_t it2 = 0; it2 < out_shape[2]; ++it2, ++write_offset) {
+        const int32_t read_offset = read_offset01 + it2 * out_strides[2];
+        output_values[write_offset] = input_values[read_offset];
+      }
+    }
+  }
+}
+
+template <typename T>
+void TransposeRank4(const int32_t* __restrict input_shape,
+                    const T* __restrict input_values,
+                    const int32_t* __restrict perm,
+                    T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("TransposeRank4");
+  const int32_t in_strides[4] = {
+      input_shape[1] * input_shape[2] * input_shape[3],
+      input_shape[2] * input_shape[3],
+      input_shape[3],
+      1,
+  };
+  const int32_t out_strides[4] = {in_strides[perm[0]], in_strides[perm[1]],
+                                  in_strides[perm[2]], in_strides[perm[3]]};
+  const int32_t out_shape[4] = {input_shape[perm[0]], input_shape[perm[1]],
+                                input_shape[perm[2]], input_shape[perm[3]]};
+
+  int32_t write_offset = 0;
+  for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) {
+    const int32_t read_offset0 = it0 * out_strides[0];
+    for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) {
+      const int32_t read_offset01 = read_offset0 + it1 * out_strides[1];
+      for (int32_t it2 = 0; it2 < out_shape[2]; ++it2) {
+        const int32_t read_offset012 = read_offset01 + it2 * out_strides[2];
+        for (int32_t it3 = 0; it3 < out_shape[3]; ++it3, ++write_offset) {
+          const int32_t read_offset = read_offset012 + it3 * out_strides[3];
+          output_values[write_offset] = input_values[read_offset];
+        }
+      }
+    }
+  }
+}
+
+template <typename T, typename TIdx, typename TDepth>
+void OneHot(const int32_t input_rank,
+            const int32_t* __restrict input_shape,
+            const TIdx* __restrict input_values,
+            const TDepth* __restrict depth,
+            const T* __restrict on_value,
+            const T* __restrict off_value,
+            const int32_t axis,
+            T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("OneHot");
+  const int32_t num_elements = ShapeSize(input_rank, input_shape);
+  // We can assume axis >= 0 in this implementation.
+  const int32_t prefix_dim_size = ShapeSize(axis, input_shape);
+  const int32_t suffix_dim_size = num_elements / prefix_dim_size;
+  int32_t write_offset = 0;
+  for (int32_t i = 0; i < prefix_dim_size; ++i) {
+    const int32_t read_offset_pre = i * suffix_dim_size;
+    for (TDepth d = 0; d < *depth; ++d) {
+      for (int32_t j = 0; j < suffix_dim_size; ++j, ++write_offset) {
+        const int32_t read_offset = read_offset_pre + j;
+        output_values[write_offset] =
+            (input_values[read_offset] == d) ? *on_value : *off_value;
+      }
+    }
+  }
+}
+
+template <typename T, typename TIdx, typename TDepth>
+void OneHotLastDim(const int32_t input_rank,
+                   const int32_t* __restrict input_shape,
+                   const TIdx* __restrict input_values,
+                   const TDepth* __restrict depth,
+                   const T* __restrict on_value,
+                   const T* __restrict off_value,
+                   T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("OneHotLastDim");
+  const int32_t num_elements = ShapeSize(input_rank, input_shape);
+  int32_t write_offset = 0;
+  for (int32_t i = 0; i < num_elements; ++i) {
+    for (TDepth d = 0; d < *depth; ++d, ++write_offset) {
+      output_values[write_offset] =
+          (input_values[i] == d) ? *on_value : *off_value;
+    }
+  }
+}
+
+// -----------------------------------------------------------------------------
+// Simple unary ops
+// -----------------------------------------------------------------------------
+
+// We use macros instead of template functions with templated functors here
+// because it's a lot less verbose and easier for the compiler to optimize.
+
+#if USE_EIGEN
+
+#define SIMPLE_UNARY_OP_V2(OP_NAME, _, EXPR_EIGEN)                        \
+  template <typename T>                                                   \
+  void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \
+               const T* __restrict input_values,                          \
+               T* __restrict output_values) {                             \
+    BENCHMARK_TIMER_V2(#OP_NAME);                                         \
+    const int32_t size = ShapeSize(rank, input_shape);                    \
+    auto values = ConstRowVectorMap<T>(input_values, size).array();       \
+    auto output = RowVectorMap<T>(output_values, size).array();           \
+    output = EXPR_EIGEN;                                                  \
+  }
+
+#else
+
+#define SIMPLE_UNARY_OP_V2(OP_NAME, EXPR, _)                              \
+  template <typename T>                                                   \
+  void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \
+               const T* __restrict input_values,                          \
+               T* __restrict output_values) {                             \
+    BENCHMARK_TIMER_V2(#OP_NAME);                                         \
+    const int32_t size = ShapeSize(rank, input_shape);                    \
+    for (int32_t i = 0; i < size; ++i) {                                  \
+      const T value = input_values[i];                                    \
+      output_values[i] = EXPR;                                            \
+    }                                                                     \
+  }
+
+#endif
+
+// Second macro param is value expression, third entry is Eigen vector
+// expression.
+SIMPLE_UNARY_OP_V2(Abs, std::abs(value), values.abs())
+SIMPLE_UNARY_OP_V2(Acos, std::acos(value), values.acos())
+SIMPLE_UNARY_OP_V2(Asin, std::asin(value), values.asin())
+SIMPLE_UNARY_OP_V2(Atan, std::atan(value), values.atan())
+SIMPLE_UNARY_OP_V2(Cos, std::cos(value), values.cos())
+SIMPLE_UNARY_OP_V2(Cosh, std::cosh(value), values.cosh())
+SIMPLE_UNARY_OP_V2(Exp, std::exp(value), values.exp())
+SIMPLE_UNARY_OP_V2(Elu,
+                   value < 0 ? std::expm1(value) : value,
+                   // Use branchless version of Elu: min(ReLU, e^x - 1)
+                   values.max(0).min(values.exp() - 1))
+SIMPLE_UNARY_OP_V2(HardSigmoid,
+                   std::min(std::max((static_cast<T>(0.2) * value +
+                                      static_cast<T>(0.5)),
+                                     static_cast<T>(0)),
+                            static_cast<T>(1)),
+                   (0.2 * values + 0.5).max(0).min(1))
+SIMPLE_UNARY_OP_V2(Log, std::log(value), values.log())
+SIMPLE_UNARY_OP_V2(Log1p, std::log1p(value), values.log1p())
+SIMPLE_UNARY_OP_V2(Neg, -value, -values)
+SIMPLE_UNARY_OP_V2(Reciprocal, static_cast<T>(1) / value, values.cwiseInverse())
+SIMPLE_UNARY_OP_V2(Relu, std::max(value, static_cast<T>(0)), values.max(0))
+SIMPLE_UNARY_OP_V2(Relu6,
+                   std::min(std::max(value, static_cast<T>(0)),
+                            static_cast<T>(6)),
+                   values.max(0).min(6))
+SIMPLE_UNARY_OP_V2(Rsqrt, static_cast<T>(1) / std::sqrt(value), values.rsqrt())
+SIMPLE_UNARY_OP_V2(Sigmoid,
+                   static_cast<T>(1) / (1 + std::exp(-value)),
+                   ((-values).exp() + 1).cwiseInverse())
+SIMPLE_UNARY_OP_V2(Sin, std::sin(value), values.sin())
+SIMPLE_UNARY_OP_V2(Sinh, std::sinh(value), values.sinh())
+SIMPLE_UNARY_OP_V2(Sqrt, std::sqrt(value), values.sqrt())
+SIMPLE_UNARY_OP_V2(Square, value* value, values.square())
+SIMPLE_UNARY_OP_V2(Tan, std::tan(value), values.tan())
+SIMPLE_UNARY_OP_V2(Tanh, std::tanh(value), values.tanh())
+
+// -----------------------------------------------------------------------------
+// Broadcasting binary ops
+// -----------------------------------------------------------------------------
+
+template <typename T, typename OP>
+void OpNoBroadcast(const int32_t left_rank,
+                   const int32_t* __restrict left_shape,
+                   const T* __restrict left_values,
+                   const int32_t right_rank,
+                   const int32_t* __restrict right_shape,
+                   const T* __restrict right_values,
+                   T* __restrict output_values,
+                   OP op) {
+  BENCHMARK_TIMER_V2(op.name, "NoBroadcast");
+  const int32_t size = ShapeSize(left_rank, left_shape);
+#if USE_EIGEN
+  auto lhs = ConstRowVectorMap<T>(left_values, size).array();
+  auto rhs = ConstRowVectorMap<T>(right_values, size).array();
+  auto output = RowVectorMap<T>(output_values, size).array();
+  op.apply(lhs, rhs, output);
+#else
+  for (int32_t i = 0; i < size; ++i) {
+    output_values[i] = op(left_values[i], right_values[i]);
+  }
+#endif
+}
+
+template <typename T, typename OP>
+void OpInnerBroadcast(int32_t left_rank,
+                      const int32_t* __restrict left_shape,
+                      const T* __restrict left_values,
+                      int32_t right_rank,
+                      const int32_t* __restrict right_shape,
+                      const T* __restrict right_values,
+                      T* __restrict output_values,
+                      OP op) {
+  BENCHMARK_TIMER_V2(op.name, "InnerBroadcast");
+  const int32_t output_size = ShapeSize(left_rank, left_shape);
+  const int32_t inner_size = ShapeSize(right_rank, right_shape);
+  const int32_t outer_size = output_size / inner_size;
+#if USE_EIGEN
+  if (inner_size == 1) {
+    // Apply the same value to all elements.
+    auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size);
+    auto output = MatrixMap<T>(output_values, inner_size, outer_size);
+    op.apply(left.array(), right_values[0], output.array());
+  } else {
+    auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size);
+    auto right = ConstRowVectorMap<T>(right_values, inner_size);
+    auto output = MatrixMap<T>(output_values, inner_size, outer_size);
+    for (int32_t col = 0; col < outer_size; col++) {
+      op.apply(left.col(col).array(), right.array(), output.col(col).array());
+    }
+  }
+#else
+  for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) {
+    for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) {
+      const int32_t offset = idx_out * inner_size + idx_in;
+      output_values[offset] = op(left_values[offset], right_values[idx_in]);
+    }
+  }
+#endif
+}
+
+// Increments indices according to a shape.
+// Returns false if indices can't be incremented because they point to the last
+// element.
+//
+// E.g. if shape is (2, 3) and indices is [1, 2], indices is incremented to [2,
+// 0].
+inline bool IncrementIndices(int32_t rank,
+                             const int32_t* shape,
+                             int32_t* indices) {
+  int32_t i = rank - 1;
+  while (i >= 0 && indices[i] == shape[i] - 1) {
+    --i;
+  }
+  if (i < 0) {
+    return false;
+  }
+  indices[i] += 1;
+  for (++i; i < rank; ++i) {
+    indices[i] = 0;
+  }
+  return true;
+}
+
+// Returns the offset in a values array given its shape and indices.
+// E.g. if the shape is (2, 3) and indices are [1, 2] the offset is 1*3 + 2.
+inline int32_t Offset(int32_t rank,
+                      const int32_t* shape,
+                      const int32_t* indices) {
+  int32_t offset = 0;
+  int32_t mul = 1;
+  for (int32_t i = rank - 1; i >= 0; --i) {
+    offset += mul * indices[i];
+    mul *= shape[i];
+  }
+  return offset;
+}
+
+// Like Offset() but with broadcasting.
+// E.g. if the input_shape is (2, 1, 3) and indices are [1, 2, 2] the offset is
+// 1*1*3 + 2*0 + 2.
+// The indices_rank can be greater than the input_rank and then the first
+// indices_rank - input_rank indices are ignored.
+// E.g. if the input_shape is (4) and indices are [2, 3, 1] the offset is 1.
+inline int32_t BroadcastOffset(int32_t input_rank,
+                               const int32_t* input_shape,
+                               int32_t indices_rank,
+                               const int32_t* indices) {
+  int32_t offset = 0;
+  int32_t mul = 1;
+  for (int32_t i = input_rank - 1; i >= 0; --i) {
+    int32_t index =
+        input_shape[i] == 1 ? 0 : indices[i + indices_rank - input_rank];
+    offset += mul * index;
+    mul *= input_shape[i];
+  }
+  return offset;
+}
+
+template <typename T, typename OP>
+void OpGenericBroadcast(int32_t left_rank,
+                        const int32_t* __restrict left_shape,
+                        const T* __restrict left_values,
+                        int32_t right_rank,
+                        const int32_t* __restrict right_shape,
+                        const T* __restrict right_values,
+                        T* __restrict output_values,
+                        OP op) {
+  BENCHMARK_TIMER_V2(op.name, "GenericBroadcast");
+  const int32_t output_rank = std::max(left_rank, right_rank);
+  const int32_t kMaxRank = 8;
+  assert(output_rank <= kMaxRank);
+
+  int32_t output_shape[kMaxRank];
+  for (int32_t i = 0; i < output_rank; ++i) {
+    int32_t left_i = i - output_rank + left_rank;
+    int32_t right_i = i - output_rank + right_rank;
+    output_shape[i] = std::max(left_i >= 0 ? left_shape[left_i] : 0,
+                               right_i >= 0 ? right_shape[right_i] : 0);
+  }
+
+  int32_t output_indices[kMaxRank]{};
+  do {
+    output_values[Offset(output_rank, output_shape, output_indices)] =
+        op(left_values[BroadcastOffset(left_rank, left_shape, output_rank,
+                                       output_indices)],
+           right_values[BroadcastOffset(right_rank, right_shape, output_rank,
+                                        output_indices)]);
+  } while (IncrementIndices(output_rank, output_shape, output_indices));
+}
+
+#define BROADCAST_BINARY_OP_V2(OP_NAME, EXPR, EXPR_EIGEN)                      \
+  template <typename T>                                                        \
+  struct Op##OP_NAME {                                                         \
+    const char* name = #OP_NAME;                                               \
+    T operator()(const T lhs, const T rhs) { return EXPR; }                    \
+    template <typename X, typename Y, typename Z>                              \
+    void apply(const X& lhs, const Y& rhs, Z out) {                            \
+      out = EXPR_EIGEN;                                                        \
+    }                                                                          \
+  };                                                                           \
+  template <typename T>                                                        \
+  void OP_NAME##NoBroadcast(                                                   \
+      const int32_t left_rank, const int32_t* __restrict left_shape,           \
+      const T* __restrict left_values, const int32_t right_rank,               \
+      const int32_t* __restrict right_shape, const T* __restrict right_values, \
+      T* __restrict output_values) {                                           \
+    OpNoBroadcast(left_rank, left_shape, left_values, right_rank, right_shape, \
+                  right_values, output_values, Op##OP_NAME<T>());              \
+  }                                                                            \
+  template <typename T>                                                        \
+  void OP_NAME##InnerBroadcast(                                                \
+      const int32_t left_rank, const int32_t* __restrict left_shape,           \
+      const T* __restrict left_values, const int32_t right_rank,               \
+      const int32_t* __restrict right_shape, const T* __restrict right_values, \
+      T* __restrict output_values) {                                           \
+    OpInnerBroadcast(left_rank, left_shape, left_values, right_rank,           \
+                     right_shape, right_values, output_values,                 \
+                     Op##OP_NAME<T>());                                        \
+  }                                                                            \
+  template <typename T>                                                        \
+  void OP_NAME(const int32_t left_rank, const int32_t* __restrict left_shape,  \
+               const T* __restrict left_values, const int32_t right_rank,      \
+               const int32_t* __restrict right_shape,                          \
+               const T* __restrict right_values,                               \
+               T* __restrict output_values) {                                  \
+    OpGenericBroadcast(left_rank, left_shape, left_values, right_rank,         \
+                       right_shape, right_values, output_values,               \
+                       Op##OP_NAME<T>());                                      \
+  }
+
+// Second macro param is value expression, third entry is Eigen vector
+// expression.
+BROADCAST_BINARY_OP_V2(Add, lhs + rhs, lhs + rhs)
+BROADCAST_BINARY_OP_V2(Maximum, std::max(lhs, rhs), lhs.max(rhs))
+BROADCAST_BINARY_OP_V2(Minimum, std::min(lhs, rhs), lhs.min(rhs))
+BROADCAST_BINARY_OP_V2(Mul, lhs* rhs, lhs* rhs)
+BROADCAST_BINARY_OP_V2(Sub, lhs - rhs, lhs - rhs)
+BROADCAST_BINARY_OP_V2(SquaredDifference,
+                       (lhs - rhs) * (lhs - rhs),
+                       (lhs - rhs).square())
+
+// -----------------------------------------------------------------------------
+// Reduce ops
+// -----------------------------------------------------------------------------
+
+// We use macros instead of template functions with templated functors here
+// because it's a lot less verbose and easier for the compiler to optimize.
+#define REDUCE_OP_V2(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR)        \
+  template <typename T, typename Tidx>                                        \
+  void OP_NAME##InnerReduce(                                                  \
+      int32_t input_rank, const int32_t* __restrict input_shape,              \
+      const T* __restrict input_values, int32_t index_tensor_rank,            \
+      const int32_t* __restrict index_shape,                                  \
+      const Tidx* __restrict index_values, T* __restrict output_values) {     \
+    BENCHMARK_TIMER_V2(#OP_NAME, "InnerReduce");                              \
+    const int32_t inner_size =                                                \
+        GetReduceInnerSize(input_rank, input_shape, index_tensor_rank,        \
+                           index_shape, index_values);                        \
+    const int32_t input_size = ShapeSize(input_rank, input_shape);            \
+    const int32_t outer_size = input_size / inner_size;                       \
+    for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) {              \
+      T value = DEFAULT_VALUE;                                                \
+      for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) {               \
+        const T prev = value;                                                 \
+        const T next = input_values[idx_out * inner_size + idx_in];           \
+        value = UPDATE_EXPR;                                                  \
+      }                                                                       \
+      const T count = inner_size;                                             \
+      /* Used by mean reduce. */                                              \
+      (void)sizeof(count);                                                    \
+      output_values[idx_out] = RESULT_EXPR;                                   \
+    }                                                                         \
+  }                                                                           \
+  template <typename T, typename Tidx>                                        \
+  void OP_NAME##GenericReduceRank2(                                           \
+      int32_t input_rank, const int32_t* __restrict input_shape,              \
+      const T* __restrict input_values, int32_t index_tensor_rank,            \
+      const int32_t* __restrict index_shape,                                  \
+      const Tidx* __restrict index_values, T* __restrict output_values) {     \
+    assert(input_rank == 2);                                                  \
+    assert(index_tensor_rank <= 1);                                           \
+    BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank2");                       \
+    const int32_t output_size = input_shape[1];                               \
+    std::fill_n(output_values, output_size, DEFAULT_VALUE);                   \
+    for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) {                   \
+      for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1, ++input_values) { \
+        T* out_ptr = output_values + dim1;                                    \
+        const T prev = *out_ptr;                                              \
+        const T next = *input_values;                                         \
+        *out_ptr = UPDATE_EXPR;                                               \
+      }                                                                       \
+    }                                                                         \
+    const T count = input_shape[0];                                           \
+    /* Used by mean reduce. */                                                \
+    (void)sizeof(count);                                                      \
+    for (int32_t i = 0; i < output_size; ++i) {                               \
+      const T value = output_values[i];                                       \
+      output_values[i] = RESULT_EXPR;                                         \
+    }                                                                         \
+  }                                                                           \
+  template <typename T, typename Tidx>                                        \
+  void OP_NAME##GenericReduceRank3(                                           \
+      int32_t input_rank, const int32_t* __restrict input_shape,              \
+      const T* __restrict input_values, int32_t index_tensor_rank,            \
+      const int32_t* __restrict index_shape,                                  \
+      const Tidx* __restrict index_values, T* __restrict output_values) {     \
+    assert(input_rank == 3);                                                  \
+    assert(index_tensor_rank <= 1);                                           \
+    BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank3");                       \
+    int32_t out_shape[3] = {input_shape[0], input_shape[1], input_shape[2]};  \
+    bool reduce_mask[3] = {false, false, false};                              \
+    const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1;   \
+    for (int32_t i = 0; i < num_indices; ++i) {                               \
+      reduce_mask[index_values[i]] = true;                                    \
+      out_shape[index_values[i]] = 1;                                         \
+    }                                                                         \
+    const int32_t out_strides[3] = {                                          \
+        reduce_mask[0] ? 0 : out_shape[1] * out_shape[2],                     \
+        reduce_mask[1] ? 0 : out_shape[2],                                    \
+        reduce_mask[2] ? 0 : 1,                                               \
+    };                                                                        \
+    const int32_t output_size = ShapeSize(input_rank, out_shape);             \
+    std::fill_n(output_values, output_size, DEFAULT_VALUE);                   \
+    for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) {                   \
+      for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) {                 \
+        for (int32_t dim2 = 0; dim2 < input_shape[2];                         \
+             ++dim2, ++input_values) {                                        \
+          T* out_ptr = output_values + out_strides[0] * dim0 +                \
+                       out_strides[1] * dim1 + out_strides[2] * dim2;         \
+          const T prev = *out_ptr;                                            \
+          const T next = *input_values;                                       \
+          *out_ptr = UPDATE_EXPR;                                             \
+        }                                                                     \
+      }                                                                       \
+    }                                                                         \
+    const T count = (reduce_mask[0] ? input_shape[0] : 1) *                   \
+                    (reduce_mask[1] ? input_shape[1] : 1) *                   \
+                    (reduce_mask[2] ? input_shape[2] : 1);                    \
+    /* Used by mean reduce. */                                                \
+    (void)sizeof(count);                                                      \
+    for (int32_t i = 0; i < output_size; ++i) {                               \
+      const T value = output_values[i];                                       \
+      output_values[i] = RESULT_EXPR;                                         \
+    }                                                                         \
+  }                                                                           \
+  template <typename T, typename Tidx>                                        \
+  void OP_NAME##GenericReduceRank4(                                           \
+      int32_t input_rank, const int32_t* __restrict input_shape,              \
+      const T* __restrict input_values, int32_t index_tensor_rank,            \
+      const int32_t* __restrict index_shape,                                  \
+      const Tidx* __restrict index_values, T* __restrict output_values) {     \
+    assert(input_rank == 4);                                                  \
+    assert(index_tensor_rank <= 1);                                           \
+    BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank4");                       \
+    int32_t out_shape[4] = {input_shape[0], input_shape[1], input_shape[2],   \
+                            input_shape[3]};                                  \
+    bool reduce_mask[4] = {false, false, false, false};                       \
+    const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1;   \
+    for (int32_t i = 0; i < num_indices; ++i) {                               \
+      reduce_mask[index_values[i]] = true;                                    \
+      out_shape[index_values[i]] = 1;                                         \
+    }                                                                         \
+    const int32_t out_strides[4] = {                                          \
+        reduce_mask[0] ? 0 : out_shape[1] * out_shape[2] * out_shape[3],      \
+        reduce_mask[1] ? 0 : out_shape[2] * out_shape[3],                     \
+        reduce_mask[2] ? 0 : out_shape[3],                                    \
+        reduce_mask[3] ? 0 : 1,                                               \
+    };                                                                        \
+    const int32_t output_size = ShapeSize(input_rank, out_shape);             \
+    std::fill_n(output_values, output_size, DEFAULT_VALUE);                   \
+    for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) {                   \
+      for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) {                 \
+        for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) {               \
+          for (int32_t dim3 = 0; dim3 < input_shape[3];                       \
+               ++dim3, ++input_values) {                                      \
+            T* out_ptr = output_values + out_strides[0] * dim0 +              \
+                         out_strides[1] * dim1 + out_strides[2] * dim2 +      \
+                         out_strides[3] * dim3;                               \
+            const T prev = *out_ptr;                                          \
+            const T next = *input_values;                                     \
+            *out_ptr = UPDATE_EXPR;                                           \
+          }                                                                   \
+        }                                                                     \
+      }                                                                       \
+    }                                                                         \
+    const T count = (reduce_mask[0] ? input_shape[0] : 1) *                   \
+                    (reduce_mask[1] ? input_shape[1] : 1) *                   \
+                    (reduce_mask[2] ? input_shape[2] : 1) *                   \
+                    (reduce_mask[3] ? input_shape[3] : 1);                    \
+    /* Used by mean reduce. */                                                \
+    (void)sizeof(count);                                                      \
+    for (int32_t i = 0; i < output_size; ++i) {                               \
+      const T value = output_values[i];                                       \
+      output_values[i] = RESULT_EXPR;                                         \
+    }                                                                         \
+  }                                                                           \
+  template <typename T, typename Tidx>                                        \
+  void OP_NAME##GenericReduceRank5(                                           \
+      int32_t input_rank, const int32_t* __restrict input_shape,              \
+      const T* __restrict input_values, int32_t index_tensor_rank,            \
+      const int32_t* __restrict index_shape,                                  \
+      const Tidx* __restrict index_values, T* __restrict output_values) {     \
+    assert(input_rank == 5);                                                  \
+    assert(index_tensor_rank <= 1);                                           \
+    BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank5");                       \
+    int32_t out_shape[5] = {input_shape[0], input_shape[1], input_shape[2],   \
+                            input_shape[3], input_shape[4]};                  \
+    /* If true, reduce the input across that dimension. */                    \
+    bool reduce_mask[5] = {false, false, false, false, false};                \
+    const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1;   \
+    for (int32_t i = 0; i < num_indices; ++i) {                               \
+      reduce_mask[index_values[i]] = true;                                    \
+      out_shape[index_values[i]] = 1;                                         \
+    }                                                                         \
+    const int32_t out_strides[5] = {                                          \
+        reduce_mask[0]                                                        \
+            ? 0                                                               \
+            : out_shape[1] * out_shape[2] * out_shape[3] * out_shape[4],      \
+        reduce_mask[1] ? 0 : out_shape[2] * out_shape[3] * out_shape[4],      \
+        reduce_mask[2] ? 0 : out_shape[3] * out_shape[4],                     \
+        reduce_mask[3] ? 0 : out_shape[4],                                    \
+        reduce_mask[4] ? 0 : 1,                                               \
+    };                                                                        \
+    const int32_t output_size = ShapeSize(input_rank, out_shape);             \
+    std::fill_n(output_values, output_size, DEFAULT_VALUE);                   \
+    for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) {                   \
+      for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) {                 \
+        for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) {               \
+          for (int32_t dim3 = 0; dim3 < input_shape[3]; ++dim3) {             \
+            for (int32_t dim4 = 0; dim4 < input_shape[4];                     \
+                 ++dim4, ++input_values) {                                    \
+              T* out_ptr = output_values + out_strides[0] * dim0 +            \
+                           out_strides[1] * dim1 + out_strides[2] * dim2 +    \
+                           out_strides[3] * dim3 + out_strides[4] * dim4;     \
+              const T prev = *out_ptr;                                        \
+              const T next = *input_values;                                   \
+              *out_ptr = UPDATE_EXPR;                                         \
+            }                                                                 \
+          }                                                                   \
+        }                                                                     \
+      }                                                                       \
+    }                                                                         \
+    const T count = (reduce_mask[0] ? input_shape[0] : 1) *                   \
+                    (reduce_mask[1] ? input_shape[1] : 1) *                   \
+                    (reduce_mask[2] ? input_shape[2] : 1) *                   \
+                    (reduce_mask[3] ? input_shape[3] : 1) *                   \
+                    (reduce_mask[4] ? input_shape[4] : 1);                    \
+    /* Used by mean reduce. */                                                \
+    (void)sizeof(count);                                                      \
+    for (int32_t i = 0; i < output_size; ++i) {                               \
+      const T value = output_values[i];                                       \
+      output_values[i] = RESULT_EXPR;                                         \
+    }                                                                         \
+  }
+
+REDUCE_OP_V2(Max, std::numeric_limits<T>::lowest(), std::max(prev, next), value)
+REDUCE_OP_V2(Min,
+             std::numeric_limits<T>::infinity(),
+             std::min(prev, next),
+             value)
+REDUCE_OP_V2(Sum, 0, prev + next, value)
+REDUCE_OP_V2(Mean, 0, prev + next, value / count)
+
+// -----------------------------------------------------------------------------
+// Dequantize ops
+// -----------------------------------------------------------------------------
+
+template <typename T>
+void DequantizeMinCombined(const int32_t rank,
+                           const int32_t* __restrict input_shape,
+                           const T* __restrict input_values,
+                           const float* __restrict min_range,
+                           const float* __restrict max_range,
+                           float* __restrict output_values) {
+  BENCHMARK_TIMER_V2("DequantizeMinCombined");
+  const int32_t size = ShapeSize(rank, input_shape);
+  const float offset =
+      std::is_signed<T>::value
+          ? (static_cast<float>(std::numeric_limits<T>::max()) -
+             std::numeric_limits<T>::min() + 1) /
+                2.0f
+          : 0.0f;
+  const float range_scale = (max_range[0] - min_range[0]) /
+                            (static_cast<float>(std::numeric_limits<T>::max()) -
+                             std::numeric_limits<T>::min());
+  for (int32_t i = 0; i < size; ++i) {
+    output_values[i] =
+        ((static_cast<int32_t>(input_values[i]) + offset) * range_scale) +
+        min_range[0];
+  }
+}
+
+template <typename T>
+void DequantizeMinFirst(const int32_t rank,
+                        const int32_t* __restrict input_shape,
+                        const T* __restrict input_values,
+                        const float* __restrict min_range,
+                        const float* __restrict max_range,
+                        float* __restrict output_values) {
+  BENCHMARK_TIMER_V2("DequantizeMinFirst");
+  const int32_t size = ShapeSize(rank, input_shape);
+  const float range_scale = (max_range[0] - min_range[0]) /
+                            (static_cast<float>(std::numeric_limits<T>::max()) -
+                             std::numeric_limits<T>::min());
+  const float range_min_rounded =
+      (max_range[0] == min_range[0]
+           ? min_range[0]
+           : std::round(min_range[0] / range_scale) * range_scale);
+  for (int32_t i = 0; i < size; ++i) {
+    output_values[i] = ((static_cast<int32_t>(input_values[i]) -
+                         std::numeric_limits<T>::min()) *
+                        range_scale) +
+                       range_min_rounded;
+  }
+}
+
+// -----------------------------------------------------------------------------
+// AddN op
+// -----------------------------------------------------------------------------
+
+template <typename T>
+void AddN(const int32_t rank,
+          const int32_t* __restrict shape,
+          std::initializer_list<const T* __restrict> input_values,
+          T* __restrict output_values) {
+  BENCHMARK_TIMER_V2("AddN");
+  const int32_t size = ShapeSize(rank, shape);
+#if USE_EIGEN
+  auto output = RowVectorMap<T>(output_values, size).array();
+  std::fill_n(output_values, size, 0);
+  for (const auto input_value : input_values) {
+    output += ConstRowVectorMap<T>(input_value, size).array();
+  }
+#else
+  for (int32_t i = 0; i < size; ++i) {
+    T output_value = 0;
+    for (auto input_value : input_values) {
+      output_value += input_value[i];
+    }
+    output_values[i] = output_value;
+  }
+#endif
+}
+
+// -----------------------------------------------------------------------------
+// CONSTANTS
+// Note that for now, endianness of the target machine needs to match that of
+// the one training was performed on.
+// -----------------------------------------------------------------------------
+const int32_t dnn_hiddenlayer_0_bias__0__cf__0_shape[1] = {117};
+const union {
+  uint8_t bytes[468];
+  float values[117];
+} dnn_hiddenlayer_0_bias__0__cf__0 = {{
+    0x6a, 0x8b, 0x40, 0xbe, 0x09, 0xc4, 0xd0, 0x3f, 0xe9, 0x26, 0xe7, 0x3d,
+    0x98, 0x1c, 0x00, 0xbf, 0x24, 0x35, 0x2c, 0x3f, 0x5c, 0x46, 0x7e, 0xbe,
+    0x66, 0xe7, 0x16, 0x3d, 0x62, 0x63, 0x48, 0x3f, 0xd9, 0xe5, 0x2a, 0xbf,
+    0x5b, 0x67, 0x18, 0xc0, 0x6d, 0xfe, 0x13, 0xc0, 0xb0, 0xed, 0xb8, 0x3d,
+    0x69, 0x75, 0x38, 0xbf, 0x1d, 0x41, 0x0b, 0x40, 0x2d, 0xf1, 0x94, 0xbe,
+    0xa0, 0x2d, 0x05, 0xbe, 0xbd, 0x15, 0x89, 0x3f, 0xa4, 0x2b, 0x64, 0x3f,
+    0xb7, 0x75, 0x18, 0xbf, 0xef, 0x9c, 0x29, 0x3f, 0x23, 0x65, 0x46, 0xc0,
+    0x93, 0x47, 0x90, 0x3e, 0xfa, 0x73, 0x2d, 0xbd, 0xb2, 0xbe, 0x14, 0xbe,
+    0xf5, 0x8a, 0x8a, 0xbf, 0x53, 0x2a, 0xc7, 0x3e, 0x99, 0x85, 0xd0, 0x3f,
+    0x8f, 0x87, 0xc6, 0x3e, 0xe3, 0xdb, 0x38, 0xc0, 0x93, 0xa0, 0x8f, 0x3e,
+    0x2a, 0xba, 0x7b, 0x3e, 0x38, 0x4b, 0xab, 0xbe, 0x6a, 0x4d, 0x5e, 0xbf,
+    0x38, 0x95, 0xd8, 0x3e, 0x59, 0xae, 0xfb, 0x3e, 0x14, 0xc0, 0xa0, 0xbe,
+    0x79, 0x17, 0xd0, 0xbe, 0x4f, 0xe6, 0xab, 0xbd, 0xbd, 0x40, 0x6a, 0xbf,
+    0xfd, 0xd5, 0x81, 0xbe, 0x83, 0xa3, 0x0f, 0xbc, 0xa3, 0x8f, 0x3e, 0x40,
+    0x97, 0xbf, 0x5e, 0xbe, 0xc1, 0x01, 0xcc, 0x3e, 0x74, 0x44, 0x5c, 0xbf,
+    0xa1, 0xda, 0xf0, 0xbf, 0x9f, 0xa9, 0x8d, 0x3f, 0x7b, 0x46, 0xc1, 0xbe,
+    0x9e, 0xd3, 0xb5, 0x3f, 0xdb, 0x4a, 0x0c, 0xbd, 0x94, 0xd6, 0x14, 0xbf,
+    0x29, 0x8e, 0xe1, 0xbe, 0xca, 0x15, 0x2c, 0xbe, 0x52, 0x30, 0x38, 0x40,
+    0xcb, 0x91, 0x1a, 0xc0, 0xa5, 0x17, 0xd9, 0xbe, 0x02, 0x0e, 0x33, 0x40,
+    0x22, 0x53, 0x8f, 0xbe, 0xbb, 0x23, 0xcd, 0xbe, 0xbc, 0x45, 0x20, 0xbe,
+    0x00, 0xfb, 0x9f, 0x3e, 0x8e, 0xba, 0xa6, 0x3e, 0xdd, 0x13, 0xe5, 0x3f,
+    0xc6, 0x25, 0x70, 0xbf, 0xe8, 0xa7, 0x60, 0x3d, 0x74, 0xe6, 0xb3, 0x3f,
+    0x3c, 0x7b, 0x23, 0xc0, 0xed, 0x1e, 0x04, 0x3d, 0xd9, 0x8a, 0x87, 0xbf,
+    0x0f, 0xd5, 0xd2, 0xbf, 0x3f, 0x60, 0x80, 0xbe, 0x55, 0x35, 0xf1, 0xbf,
+    0x7d, 0x40, 0xea, 0xbe, 0x78, 0x44, 0x31, 0x3e, 0x82, 0x1d, 0x31, 0x40,
+    0xd9, 0x99, 0xb2, 0x3f, 0x2a, 0xf2, 0x81, 0x3f, 0xab, 0x29, 0x87, 0xbe,
+    0x27, 0x14, 0xe4, 0xbe, 0x2b, 0x08, 0xa0, 0x3e, 0x62, 0xfd, 0xa3, 0x3e,
+    0xc3, 0x85, 0x98, 0xbb, 0x7c, 0x94, 0x0f, 0x3e, 0x7f, 0x69, 0xaa, 0xbe,
+    0x0d, 0xc8, 0xa6, 0x3f, 0xa5, 0x97, 0xe7, 0xbe, 0x48, 0x06, 0xa5, 0xbf,
+    0x71, 0x92, 0x20, 0xbf, 0x49, 0x12, 0x08, 0x3f, 0x17, 0x42, 0x92, 0x3e,
+    0xf1, 0xcf, 0x1b, 0x3f, 0x6e, 0x81, 0x41, 0xbd, 0xaf, 0x69, 0x4e, 0x3e,
+    0x4d, 0x4d, 0x84, 0x3d, 0x7f, 0x8f, 0x8d, 0xbf, 0x4a, 0xb1, 0x2b, 0xbe,
+    0xac, 0xae, 0x22, 0xc0, 0xce, 0x9a, 0x65, 0xbe, 0x4c, 0x14, 0x05, 0x40,
+    0xdd, 0x53, 0x81, 0xbe, 0x1f, 0x54, 0x39, 0xbf, 0x40, 0x88, 0x28, 0x40,
+    0x01, 0x6a, 0xd8, 0xbd, 0x25, 0x16, 0x30, 0xbf, 0x74, 0xfd, 0x1b, 0x40,
+    0x3f, 0x1a, 0x46, 0xc0, 0x34, 0xc8, 0x0e, 0xc0, 0xbf, 0x85, 0x8e, 0xbf,
+    0x5a, 0x75, 0x4c, 0xc0, 0xb4, 0xd5, 0xed, 0xbe, 0x09, 0xb6, 0x5c, 0x3e,
+    0xf0, 0x6b, 0x7a, 0xbd, 0xb6, 0x49, 0x56, 0xbb, 0x8c, 0x08, 0x4c, 0x3d,
+    0x42, 0x81, 0x0f, 0x40, 0xa0, 0x78, 0x6d, 0xbe, 0x95, 0x58, 0x06, 0xc0,
+}};
+const int32_t dnn_hiddenlayer_0_kernel__1__cf__1_shape[2] = {173, 117};
+const union {
+  uint8_t bytes[80964];
+  float values[20241];
+} dnn_hiddenlayer_0_kernel__1__cf__1 = {{
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7e, 0xb4, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x50, 0xa9, 0x70, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x50, 0xa9, 0x70, 0xbf, 0x4a, 0x72, 0x22, 0xc0, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0xa4, 0x78, 0xab, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x84, 0x08, 0xc2, 0xc0, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x28, 0x94, 0xd2, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x38, 0x83, 0xba, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
+    0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0xf2, 0x6b, 0x19, 0xc0, 0x7a, 0x63, 0x0d, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x7c, 0x63, 0x0d, 0x40, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0xec, 0x8f, 0x4c, 0xc0,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x76, 0x87, 0x40, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0xc8, 0xb1, 0xfc, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x58, 0x85, 0x3d, 0x40,
+    0x2c, 0x70, 0x1f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc4, 0x7a, 0x2e, 0x40,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+    0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x38, 0x83, 0xba, 0x3f,
+    0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+    0x74, 0x87, 0xc0, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0xea, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x1c, 0x81, 0x37, 0x40,
+    0x50, 0x72, 0xa2, 0x3f, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+    0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe0, 0x7c, 0x31, 0x40,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x4c, 0x72, 0x22, 0x40,
+    0x94, 0x89, 0x43, 0xc0, 0x3e, 0x5f, 0x07, 0xc0, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xec, 0x8f, 0x4c, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x98, 0x65, 0x10, 0x40, 0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x3c, 0xf1, 0xa0, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x03, 0x5b, 0x81, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xe0, 0x7c, 0xb1, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x18, 0xa5, 0xea, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0x58, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x84, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x18, 0xa5, 0xea, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0xe0, 0x7c, 0x31, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0xd8, 0xa0, 0x64, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0xc8, 0xb1, 0xfc, 0xbf, 0x20, 0x5d, 0x04, 0xc0, 0x60, 0xa9, 0xf0, 0x3e,
+    0xc8, 0xb1, 0x7c, 0xbf, 0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc2, 0x7a, 0x2e, 0xc0,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x4a, 0x72, 0x22, 0xc0, 0x00, 0x7f, 0x34, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0x28, 0x40,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
+    0x50, 0xa9, 0xf0, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xb8, 0x67, 0x13, 0x40,
+    0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa4, 0x78, 0x2b, 0x40,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0x3f,
+    0xd4, 0x69, 0x16, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf,
+    0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xf4, 0x6b, 0x19, 0x40,
+    0x50, 0x72, 0xa2, 0x3f, 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x84, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0xa4, 0x78, 0x2b, 0xc0, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0xad, 0xf6, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+    0xc2, 0x7a, 0x2e, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+    0x46, 0x96, 0x55, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x28, 0x94, 0xd2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0xfc, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xe8, 0xb3, 0x7f, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x03, 0x5b, 0x81, 0xc0, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x10, 0x6e, 0x1c, 0x3f,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x64, 0x98, 0xd8, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+    0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xf2, 0x6b, 0x19, 0xc0,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0xb6, 0x67, 0x13, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x30, 0x70, 0x1f, 0x40,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x74, 0x87, 0xc0, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x88, 0x76, 0xa8, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
+    0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0x7a, 0xae, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+    0x5c, 0x61, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
+    0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xb8, 0x67, 0x13, 0x40,
+    0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x7a, 0x63, 0x0d, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0xb4, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+    0x7a, 0x63, 0x0d, 0xc0, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0xfe, 0x7e, 0x34, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xe0, 0x7c, 0x31, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xfa, 0xa2, 0x67, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x88, 0x76, 0xa8, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x98, 0x65, 0x90, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x02, 0x5b, 0x01, 0xc0,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x04, 0x5b, 0x01, 0x40,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x5c, 0x61, 0x8a, 0xbf, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+    0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x61, 0x8a, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0xbf,
+    0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
+    0x00, 0x7f, 0x34, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
+    0x18, 0xa5, 0xea, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x5c, 0x61, 0x0a, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xfe, 0x7e, 0x34, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x84, 0x76, 0xa8, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xfc, 0x7e, 0xb4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x90, 0x3f,
+    0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x98, 0x65, 0x90, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+    0x10, 0x6e, 0x9c, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0x58, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x68, 0x98, 0xd8, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0x34, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x98, 0x65, 0x10, 0xc0, 0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0x5f, 0x07, 0x40, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0xd8, 0x69, 0x96, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x58, 0x85, 0x3d, 0xc0,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0xe4, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x3a, 0x83, 0x3a, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x40,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0xc8, 0xb1, 0xfc, 0xbf, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x88, 0x76, 0xa8, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xe0, 0x7c, 0x31, 0x40,
+    0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0x40, 0x40,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x28, 0x94, 0xd2, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+    0x86, 0x76, 0x28, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+    0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x02, 0x5b, 0x01, 0xc0,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
+    0x50, 0x72, 0xa2, 0x3f, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x7f, 0xb4, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x48, 0x72, 0xa2, 0xbf,
+    0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xc2, 0x7a, 0x2e, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x40,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x0a, 0x40,
+    0x3a, 0x83, 0x3a, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x10, 0x6e, 0x9c, 0xbf,
+    0x0a, 0x92, 0x4f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x98, 0x65, 0x10, 0x40, 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x0a, 0xc0,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xc5, 0xe8, 0x94, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xf2, 0x6b, 0x99, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x70, 0x87, 0x40, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xfc, 0x7e, 0xb4, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0xf0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x98, 0x65, 0x90, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+    0x5c, 0x61, 0x0a, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x38, 0x83, 0xba, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x84, 0x76, 0xa8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0x50, 0x72, 0xa2, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0xfc, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+    0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x70, 0xab, 0x73, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x84, 0x76, 0xa8, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0xa2, 0x0a, 0xc5, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x50, 0xa9, 0xf0, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+    0x02, 0x5b, 0x01, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x78, 0x87, 0xc0, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0x5f, 0x07, 0x40,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x94, 0xd2, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x48, 0x72, 0xa2, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xc8, 0x7a, 0xae, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0xf3, 0xa2, 0x0c, 0xc1, 0x80, 0x65, 0x10, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+    0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x8c, 0xad, 0xf6, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x50, 0x72, 0xa2, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0x72, 0xa2, 0x3f,
+    0xd4, 0x69, 0x16, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x88, 0x76, 0xa8, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0x3f,
+    0xfc, 0x7e, 0xb4, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x50, 0x72, 0xa2, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xb8, 0x67, 0x13, 0x40,
+    0xfc, 0x7e, 0xb4, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x4a, 0x72, 0x22, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x50, 0x72, 0xa2, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+    0x3e, 0x5f, 0x07, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x38, 0x83, 0xba, 0x3f,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x10, 0x40,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x10, 0x40,
+    0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x64, 0x98, 0xd8, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+    0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x50, 0xa9, 0x70, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x98, 0x65, 0x90, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+    0x5c, 0x61, 0x0a, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x68, 0x98, 0xd8, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x50, 0x72, 0xa2, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x61, 0x8a, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0x90, 0x76, 0x28, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x18, 0xa5, 0xea, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xdc, 0xa0, 0xe4, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xb6, 0x67, 0x13, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x84, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x50, 0x72, 0xa2, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x5c, 0x61, 0x8a, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x88, 0x76, 0xa8, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+    0x7a, 0x63, 0x0d, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0xe4, 0x3f,
+    0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x98, 0x65, 0x90, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x38, 0x83, 0xba, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x98, 0x65, 0x90, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x07, 0x40,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0xf2, 0x6b, 0x99, 0xc0, 0x60, 0x98, 0x58, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xfc, 0x7e, 0xb4, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0xec, 0x8f, 0x4c, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+    0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
+    0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x20, 0x5d, 0x04, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x50, 0xa9, 0xf0, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0x8f, 0xcc, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+    0xb6, 0x67, 0x13, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+    0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
+    0x28, 0x94, 0xd2, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xc8, 0x7a, 0xae, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
+    0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x18, 0xa5, 0xea, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0xdc, 0xa0, 0xe4, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
+    0xd4, 0x69, 0x16, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+    0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x38, 0x83, 0xba, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x50, 0x72, 0xa2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+    0xfc, 0x7e, 0xb4, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x02, 0x5b, 0x01, 0xc0, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x3a, 0x83, 0x3a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x9c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x18, 0xa5, 0xea, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x10, 0x6e, 0x9c, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xfc, 0x7e, 0xb4, 0xbf,
+    0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x76, 0x28, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0xd0, 0xb1, 0x7c, 0x3f, 0xe0, 0x7c, 0xb1, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x38, 0x15, 0xd4, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x28, 0x94, 0xd2, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x50, 0x72, 0xa2, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x3a, 0x83, 0xba, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x98, 0x65, 0x90, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x38, 0x83, 0xba, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
+    0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x3f, 0x5f, 0x87, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xd4, 0x69, 0x16, 0x40, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x35, 0xa7, 0xed, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x78, 0x87, 0xc0, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xce, 0x8d, 0x49, 0xc0,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x8c, 0xad, 0xf6, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x64, 0x98, 0xd8, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+    0x50, 0xa9, 0x70, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x84, 0x76, 0xa8, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0xdc, 0xa0, 0x64, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x96, 0xf7, 0xa9, 0xc0, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x84, 0x76, 0xa8, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+    0x02, 0x5b, 0x01, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x1c, 0x81, 0x37, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x46, 0x96, 0x55, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x18, 0xa5, 0xea, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x7a, 0xae, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x2c, 0x70, 0x1f, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x70, 0xab, 0x73, 0xc0, 0x00, 0x7f, 0xb4, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x38, 0x83, 0xba, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xd8, 0x69, 0x96, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0xb4, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x7a, 0xae, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x34, 0xa7, 0x6d, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x49, 0x04, 0xbc, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+    0xd8, 0x69, 0x96, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x74, 0x87, 0xc0, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f,
+    0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x88, 0x76, 0xa8, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xd0, 0xb1, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x70, 0xab, 0x73, 0xc0,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x50, 0x72, 0xa2, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x98, 0x65, 0x10, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x84, 0x76, 0xa8, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x8c, 0xad, 0xf6, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x50, 0xa9, 0x70, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x0d, 0x00, 0xb6, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0x90, 0x76, 0x28, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+    0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x20, 0x5d, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x5c, 0x61, 0x8a, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+    0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf, 0xe0, 0xa0, 0x64, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x7a, 0x63, 0x8d, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x7a, 0x63, 0x0d, 0xc0,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x61, 0x8a, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0xd8, 0x69, 0x96, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xa4, 0x78, 0x2b, 0xc0,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x84, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x10, 0x6e, 0x9c, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x38, 0x83, 0xba, 0x3f, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xca, 0xb1, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x94, 0x89, 0xc3, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xc0,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0x40, 0x3f, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xec, 0x8f, 0x4c, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x69, 0x74, 0xa5, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0xc0, 0x7a, 0xae, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x21, 0x5d, 0x84, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x18, 0xa5, 0xea, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x61, 0x8a, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xd8, 0x69, 0x96, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xb0, 0x8b, 0xc6, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x12, 0xdc, 0x82, 0xc0, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0xb4, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x18, 0xa5, 0xea, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x48, 0x72, 0xa2, 0xbf,
+    0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0xad, 0xf6, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+    0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x38, 0x83, 0xba, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x28, 0x94, 0xd2, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0x28, 0x94, 0x52, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0x6e, 0x1c, 0xbf, 0x94, 0x89, 0xc3, 0xc0, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0xfc, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x46, 0x96, 0x55, 0xc0, 0x00, 0x7f, 0xb4, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x78, 0x87, 0xc0, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x64, 0x98, 0xd8, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x20, 0x5d, 0x84, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xc8, 0x7a, 0xae, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x38, 0x83, 0xba, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x98, 0x65, 0x90, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x88, 0x76, 0xa8, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0x6a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x98, 0x65, 0x90, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x9c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+    0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x74, 0x87, 0xc0, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x48, 0x72, 0xa2, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+    0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x84, 0x3f,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0xbe, 0x9e, 0x61, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x0b, 0x92, 0xcf, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x72, 0x22, 0xc0,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0xb6, 0x67, 0x13, 0xc0, 0x80, 0x87, 0x40, 0x3f,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+    0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x86, 0x76, 0x28, 0xc0,
+    0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xd4, 0x69, 0x96, 0xbf,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x0c, 0xc8, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+    0xfa, 0xa2, 0x67, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x10, 0xc0,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0xd4, 0x69, 0x96, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x86, 0x76, 0x28, 0xc0,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0x20, 0x5d, 0x04, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
+    0x84, 0x76, 0xa8, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+    0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x46, 0x96, 0x55, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x96, 0xf7, 0xa9, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0xdc, 0xa0, 0xe4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x74, 0x87, 0xc0, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+    0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+    0xd4, 0x69, 0x96, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x52, 0xa9, 0x70, 0xc0, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+    0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+    0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+    0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
+    0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+    0x60, 0x87, 0xc0, 0xbe, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x12, 0xdc, 0x82, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+    0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0x58, 0xa9, 0xf0, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x50, 0xa9, 0x70, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x10, 0x6e, 0x1c, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x98, 0x65, 0x90, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0x84, 0x76, 0xa8, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0xc0, 0x7a, 0xae, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x64, 0x98, 0x58, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0xc2, 0x7a, 0xae, 0xc0, 0x10, 0x6e, 0x1c, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x7a, 0x63, 0x0d, 0xc0,
+    0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x88, 0x76, 0xa8, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+    0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+    0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+    0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x3a, 0x83, 0x3a, 0xc0,
+    0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+    0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+    0x20, 0x5d, 0x04, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+    0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+    0x64, 0x98, 0xd8, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+    0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+    0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+    0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+    0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+    0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+    0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x98, 0x65, 0x90, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+    0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+    0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+    0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xe0, 0xa0, 0x64, 0x3f,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+    0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+    0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
+    0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+    0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x8e, 0xad, 0x76, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x76, 0x87, 0xc0, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+    0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0xf0, 0xbf,
+    0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+    0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x65, 0x10, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+    0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+    0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x16, 0xc0,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+    0x60, 0x98, 0x58, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+    0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+    0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+    0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+    0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+    0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+    0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+    0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+    0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+    0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+    0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf,
+    0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+    0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+    0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+    0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+    0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xb6, 0x67, 0x13, 0xc0,
+}};
+const int32_t dnn_hiddenlayer_1_bias__2__cf__2_shape[1] = {115};
+const union {
+  uint8_t bytes[460];
+  float values[115];
+} dnn_hiddenlayer_1_bias__2__cf__2 = {{
+    0x79, 0x65, 0x22, 0x3d, 0x8e, 0xfa, 0x43, 0xbd, 0x8a, 0x89, 0xd4, 0xbf,
+    0x5b, 0x33, 0xa7, 0x3c, 0x8a, 0x75, 0x40, 0xbe, 0xf7, 0x04, 0xbf, 0xbe,
+    0x86, 0xfd, 0xb2, 0xbf, 0xaa, 0x80, 0x7b, 0xbe, 0x55, 0xab, 0xb4, 0xbf,
+    0x64, 0x26, 0x82, 0xbe, 0x5d, 0x82, 0xcd, 0xbf, 0xf3, 0xd4, 0x38, 0xbf,
+    0xc7, 0x76, 0xbf, 0x3f, 0x9f, 0x27, 0x3c, 0xbe, 0x7c, 0x3c, 0x9e, 0x3f,
+    0x5e, 0x7f, 0x7c, 0x3e, 0x55, 0x54, 0x94, 0xbf, 0x86, 0x1b, 0x80, 0x3e,
+    0x49, 0xe5, 0xef, 0xbf, 0xff, 0xca, 0xb9, 0xbf, 0x28, 0x5a, 0xfc, 0xbf,
+    0xc0, 0xc4, 0x32, 0xbf, 0xba, 0xa1, 0x04, 0x3f, 0xc7, 0x1c, 0xf5, 0xbd,
+    0x9f, 0xe0, 0x7f, 0xbf, 0xea, 0x2b, 0x5e, 0x3f, 0x64, 0x62, 0xcc, 0xbe,
+    0x6b, 0x95, 0x0a, 0x3f, 0x0b, 0xaa, 0xb7, 0x3e, 0xab, 0xf1, 0x79, 0x3f,
+    0x89, 0xe5, 0xf6, 0x3e, 0xb6, 0x96, 0xcc, 0x3e, 0xed, 0xd4, 0x25, 0x3f,
+    0x8c, 0x85, 0xeb, 0xbd, 0x1d, 0x80, 0xb8, 0x3f, 0xf7, 0x3e, 0xce, 0xbe,
+    0x8d, 0x25, 0x97, 0x3d, 0x70, 0xe2, 0xbe, 0xbd, 0x48, 0xd8, 0x40, 0xbe,
+    0x66, 0xe1, 0x09, 0x3e, 0x92, 0xb0, 0x1a, 0x3f, 0x25, 0xe7, 0xb3, 0xbe,
+    0x19, 0x90, 0xf4, 0x3f, 0xd8, 0xf2, 0xdf, 0xbf, 0xce, 0xee, 0x27, 0xbe,
+    0x65, 0x9f, 0xc1, 0xbe, 0xc3, 0x91, 0x7a, 0xbf, 0x83, 0x9b, 0x4a, 0x3f,
+    0x77, 0x7d, 0xab, 0x3d, 0xa0, 0x14, 0xa2, 0xbf, 0x88, 0xb8, 0x9f, 0x3c,
+    0x53, 0x14, 0x12, 0xbe, 0xf2, 0x1c, 0x92, 0xbe, 0xba, 0xcf, 0x87, 0x3e,
+    0x75, 0x16, 0x82, 0xbe, 0x30, 0x3d, 0xf2, 0xbd, 0x20, 0x12, 0x31, 0xbc,
+    0x45, 0x9d, 0x90, 0xbf, 0xd4, 0x9a, 0x11, 0xc0, 0x47, 0xf8, 0x6c, 0x3e,
+    0x94, 0xcb, 0x72, 0xbe, 0x7a, 0x2d, 0x20, 0xbf, 0x50, 0x8f, 0xac, 0x3e,
+    0x5a, 0x80, 0x84, 0xbf, 0xf6, 0x3e, 0x89, 0xbf, 0x97, 0x93, 0xee, 0xbf,
+    0x80, 0xc6, 0xb0, 0x3f, 0xe9, 0x3c, 0xe8, 0xbf, 0x6e, 0x21, 0x06, 0x3e,
+    0x97, 0xf2, 0xcd, 0xbd, 0xf5, 0x2f, 0x62, 0xbf, 0x7f, 0xd7, 0xf1, 0xbd,
+    0x35, 0x48, 0x83, 0x3e, 0xa1, 0xae, 0xcb, 0x3e, 0x00, 0x79, 0xac, 0xbd,
+    0x63, 0xbd, 0x12, 0xbc, 0x67, 0xe3, 0xaf, 0x3f, 0xac, 0x51, 0xf0, 0xbd,
+    0x39, 0x1a, 0xb9, 0xbf, 0xbd, 0xd8, 0x36, 0xc0, 0x80, 0xc8, 0x5c, 0x3f,
+    0xec, 0xbd, 0x61, 0xbf, 0xce, 0xa6, 0x12, 0x3f, 0xad, 0x8a, 0xdd, 0x3e,
+    0x53, 0xc4, 0x59, 0x3e, 0xfe, 0x7f, 0x81, 0xbf, 0x16, 0x55, 0x40, 0xbf,
+    0x43, 0x30, 0xdf, 0x3c, 0xba, 0xf6, 0x5d, 0x3e, 0x13, 0xd8, 0x9d, 0xbe,
+    0xee, 0x41, 0x7d, 0x3f, 0xf5, 0x2c, 0xfc, 0xbe, 0x46, 0xdf, 0x09, 0xbe,
+    0xf3, 0x5a, 0x35, 0x40, 0x30, 0xb4, 0x1c, 0xbe, 0x3e, 0xbf, 0x30, 0x3f,
+    0x86, 0x41, 0x1b, 0x3e, 0x3f, 0x4a, 0xcc, 0x3f, 0x81, 0xce, 0xb7, 0x3f,
+    0xa9, 0xed, 0x55, 0x3f, 0x81, 0xe5, 0x7b, 0x3e, 0x95, 0xdd, 0x8d, 0x3e,
+    0x86, 0x89, 0x77, 0x3f, 0xe6, 0x98, 0x2e, 0x3e, 0xca, 0x82, 0x15, 0xbf,
+    0x3e, 0x96, 0x44, 0xbe, 0x9d, 0xb3, 0xc1, 0x3f, 0x7f, 0x4b, 0xbc, 0x3f,
+    0x98, 0xd3, 0x18, 0x3d, 0xc7, 0xbb, 0x58, 0x3d, 0xb6, 0x7b, 0x8d, 0xbd,
+    0xa9, 0xdf, 0x13, 0xbf, 0x38, 0x16, 0x87, 0xbf, 0x87, 0xaa, 0x35, 0x3f,
+    0xb3, 0x28, 0x33, 0x3f,
+}};
+const int32_t dnn_hiddenlayer_1_kernel__3__cf__3_shape[2] = {117, 115};
+const union {
+  uint8_t bytes[53820];
+  float values[13455];
+} dnn_hiddenlayer_1_kernel__3__cf__3 = {{
+    0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x31, 0x75, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x34, 0x87, 0x08, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
+    0x4a, 0x0a, 0x43, 0x3f, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x46, 0x89, 0x2f, 0x3f, 0xc0, 0x52, 0xb2, 0x3c,
+    0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0xac, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xa2, 0xf4, 0x02, 0x3f, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x29, 0x66, 0x4b, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0xea, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x3c, 0x08, 0x9c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x5e, 0xac, 0x13, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+    0xea, 0xbd, 0x05, 0xbf, 0x6c, 0xae, 0x3a, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xec, 0xbd, 0x85, 0x3e, 0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x65, 0x2d, 0x27, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x50, 0x8b, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xea, 0xbd, 0x05, 0x3f,
+    0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0x3f,
+    0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
+    0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+    0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0x21, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+    0x02, 0x41, 0x40, 0x3f, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x32, 0xe7, 0x5e, 0x3f, 0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0x4e, 0xbf,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+    0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x12, 0xe3, 0x10, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x5d, 0xac, 0x93, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x0c, 0xea, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+    0x8d, 0x52, 0x32, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xb6, 0x77, 0x3d, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0xaa, 0x75, 0x16, 0x3f, 0x6c, 0xae, 0x3a, 0xbf,
+    0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xb8, 0x77, 0xbd, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x86, 0xd1, 0x1e, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x90, 0x52, 0xb2, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xdf, 0x9c, 0x48, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x36, 0x87, 0x08, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x8d, 0x52, 0x32, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0xda, 0x97, 0xbf, 0xb8, 0x77, 0xbd, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0xf2, 0x3e, 0x19, 0xbf,
+    0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa2, 0xf4, 0x02, 0x3f,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0xde, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0xde, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+    0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xa8, 0x75, 0x16, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
+    0x80, 0x52, 0x32, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0xc4, 0x79, 0xe4, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+    0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xea, 0xbd, 0x05, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x8d, 0x52, 0x32, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+    0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x84, 0x31, 0xf5, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0xb6, 0x77, 0x3d, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x22, 0xe5, 0x37, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xca, 0x19, 0x0e, 0x3f,
+    0x88, 0x31, 0x75, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+    0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xca, 0x19, 0x0e, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x14, 0xe3, 0x90, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+    0x7e, 0x50, 0x0b, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
+    0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x18, 0xc4, 0xfa, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
+    0x20, 0xe5, 0xb7, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+    0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+    0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+    0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
+    0x5a, 0x0c, 0x6a, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+    0xfa, 0xbf, 0x2c, 0x3f, 0x20, 0xe5, 0xb7, 0xbe, 0x5a, 0x0c, 0x6a, 0xbf,
+    0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+    0x7e, 0x50, 0x8b, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+    0x6c, 0xae, 0x3a, 0xbf, 0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+    0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x12, 0xe3, 0x10, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
+    0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
+    0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x24, 0xe5, 0xb7, 0x3e,
+    0xc4, 0x79, 0xe4, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x3c, 0x08, 0x1c, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x7e, 0x50, 0x0b, 0x3f,
+    0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xa8, 0x75, 0x16, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x85, 0xbf,
+    0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+    0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xb8, 0x77, 0xbd, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0xd3, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x43, 0x89, 0x2f, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x16, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x17, 0xc4, 0x7a, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x6c, 0xae, 0x3a, 0xbf, 0x80, 0x52, 0x32, 0xbc,
+    0x00, 0xbe, 0x05, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xea, 0xbd, 0x05, 0xbf,
+    0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xb4, 0x77, 0xbd, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+    0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0xd3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x9c, 0x54, 0xd9, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+    0x34, 0xe7, 0xde, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xa2, 0xf4, 0x02, 0x3f,
+    0x80, 0x52, 0xb2, 0xbc, 0x56, 0x2b, 0x00, 0x3f, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+    0x80, 0x50, 0x8b, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x18, 0xc4, 0xfa, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xbe, 0xf8, 0x50, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x74, 0x2f, 0xce, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x14, 0xe3, 0x90, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0xa2, 0xf4, 0x02, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x58, 0x0c, 0x6a, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x74, 0x2f, 0xce, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x24, 0xe5, 0xb7, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0xb8, 0x77, 0xbd, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0xea, 0xbd, 0x05, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
+    0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d,
+    0x08, 0xc2, 0xd3, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+    0x88, 0x31, 0x75, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
+    0x34, 0x87, 0x08, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x1a, 0x64, 0x24, 0xbf, 0x1a, 0x64, 0x24, 0x3f, 0xa8, 0x75, 0x96, 0xbe,
+    0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0xbe,
+    0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x29, 0x66, 0x4b, 0xbf,
+    0x34, 0xe7, 0xde, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x18, 0xc4, 0xfa, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x56, 0x2b, 0x00, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+    0x18, 0xc4, 0xfa, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x68, 0x72, 0xbf,
+    0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0xa0, 0xf4, 0x02, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x41, 0x40, 0xbf,
+    0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x58, 0x0c, 0xea, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
+    0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x8d, 0x52, 0x32, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0x12, 0xe3, 0x10, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0xbc, 0x12, 0xe3, 0x10, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0xbc, 0x5e, 0xac, 0x13, 0x3f, 0xf9, 0xbf, 0x2c, 0xbf,
+    0xa8, 0x75, 0x16, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0xea, 0xbd, 0x05, 0xbf, 0x58, 0x0c, 0xea, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+    0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
+    0xe7, 0x1d, 0x5c, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+    0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x9c, 0x54, 0xd9, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
+    0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x84, 0x31, 0xf5, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
+    0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
+    0x22, 0xe5, 0x37, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0xa7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3e, 0x08, 0x1c, 0x3f,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb4, 0x77, 0xbd, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x8d, 0x52, 0x32, 0xbf,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0x7e, 0x50, 0x8b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x45, 0x59, 0x84, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xc8, 0x19, 0x0e, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0x34, 0x87, 0x88, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa2, 0xf4, 0x02, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x86, 0xd1, 0x1e, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x84, 0x31, 0xf5, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x86, 0xd1, 0x1e, 0x3f,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xc5, 0x79, 0x64, 0xbf,
+    0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
+    0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x12, 0xe3, 0x10, 0x3f, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x10, 0xe3, 0x10, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x90, 0x52, 0xb2, 0x3e, 0x90, 0x22, 0x87, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
+    0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x66, 0x2d, 0x27, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xa8, 0x75, 0x96, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x34, 0xe7, 0xde, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x64, 0x2d, 0xa7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0xea, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xc4, 0x79, 0xe4, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x9c, 0x54, 0xd9, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0xb2, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x9c, 0x54, 0xd9, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0x75, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0xc4, 0x79, 0xe4, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xf9, 0xbf, 0x2c, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x56, 0x2b, 0x80, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0xec, 0x9e, 0xef, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x1a, 0x64, 0x24, 0x3f,
+    0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe8, 0xbd, 0x05, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0xe3, 0x10, 0xbe, 0x86, 0xd1, 0x1e, 0x3f, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+    0x0c, 0xc2, 0xd3, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x12, 0xe3, 0x10, 0xbf,
+    0x30, 0xe7, 0xde, 0x3d, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xc4, 0x79, 0xe4, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+    0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x46, 0x89, 0x2f, 0x3f, 0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xfc, 0xbf, 0xac, 0x3e,
+    0xa8, 0x75, 0x16, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+    0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0xde, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xec, 0x9e, 0xef, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x80, 0x50, 0x8b, 0x3e,
+    0xc4, 0x79, 0xe4, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+    0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x10, 0x43, 0x67, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
+    0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x61, 0x8d, 0x7d, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0x12, 0xe3, 0x10, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0x32, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xc4, 0xfa, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x1c, 0xbf,
+    0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3e, 0x65, 0x2d, 0x27, 0xbf,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xa8, 0x75, 0x16, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x86, 0xd1, 0x1e, 0x3f,
+    0xec, 0x9e, 0xef, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x90, 0x22, 0x87, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x8d, 0x52, 0x32, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+    0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xec, 0x9e, 0xef, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
+    0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xfc, 0xbf, 0xac, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xea, 0xbd, 0x05, 0x3f, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
+    0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0xf9, 0xbf, 0x2c, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x9c, 0x54, 0xd9, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x50, 0x8b, 0x3e,
+    0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x7b, 0xb0, 0x61, 0xbf,
+    0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0xa0, 0x52, 0x32, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0x32, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x82, 0xbf,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+    0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe5, 0xb7, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x30, 0xe7, 0xde, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x41, 0x40, 0xbf,
+    0x6c, 0xae, 0x3a, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
+    0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xf8, 0xbf, 0xac, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0xa0, 0xf4, 0x82, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x83, 0x31, 0x75, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+    0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0xaf, 0xf6, 0x29, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x0c, 0x6a, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x65, 0x2d, 0x27, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+    0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0xb8, 0x77, 0xbd, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+    0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x16, 0xbf,
+    0x90, 0x52, 0xb2, 0x3d, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x5c, 0x0c, 0xea, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf,
+    0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+    0x64, 0x2d, 0xa7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0xf4, 0x02, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x74, 0x2f, 0xce, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc,
+    0xd0, 0x9a, 0x21, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x18, 0xc4, 0xfa, 0xbe, 0x9c, 0x54, 0x59, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
+    0x3c, 0x08, 0x1c, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x17, 0xc4, 0x7a, 0xbf, 0xb8, 0x77, 0xbd, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0x59, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xc8, 0x19, 0x0e, 0xbf,
+    0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+    0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x4b, 0x0a, 0x43, 0xbf,
+    0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+    0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+    0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+    0x86, 0xd1, 0x1e, 0x3f, 0x83, 0x31, 0x75, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+    0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
+    0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+    0xa8, 0x75, 0x16, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x52, 0x8b, 0x56, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+    0xd8, 0x1b, 0x35, 0xbf, 0xee, 0x9e, 0x6f, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x36, 0x87, 0x08, 0x3f,
+    0x80, 0x50, 0x8b, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0xfc, 0xbf, 0xac, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0x08, 0xc2, 0x53, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xb8, 0x77, 0xbd, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x74, 0x2f, 0xce, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x5a, 0x0c, 0x6a, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0xbf,
+    0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xae, 0xf6, 0x29, 0x3f,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0xda, 0x97, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xfb, 0x8f, 0x81, 0xbf,
+    0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc,
+    0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x24, 0xe5, 0xb7, 0x3e, 0x22, 0xe5, 0x37, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0x5e, 0x3e, 0x56, 0x2b, 0x00, 0x3f, 0xa0, 0x52, 0x32, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+    0x86, 0xd1, 0x1e, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+    0x64, 0x2d, 0xa7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+    0x5e, 0xac, 0x13, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x6c, 0xae, 0x3a, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x5c, 0x0c, 0xea, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x68, 0x2d, 0xa7, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x3c, 0x08, 0x9c, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+    0x4b, 0x0a, 0x43, 0xbf, 0x86, 0xd1, 0x1e, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+    0xc9, 0x19, 0x8e, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
+    0x68, 0x2d, 0xa7, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x56, 0x2b, 0x00, 0x3f, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x24, 0xe5, 0xb7, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x5c, 0x0c, 0xea, 0x3e, 0x56, 0x2b, 0x80, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x86, 0xd1, 0x1e, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x31, 0xe7, 0x5e, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0xaf, 0xf6, 0x29, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x54, 0x5b, 0xab, 0xbf,
+    0x58, 0x0c, 0x6a, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x52, 0x8b, 0x56, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0x9e, 0xef, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0xf4, 0x02, 0xbf,
+    0x19, 0x94, 0xcf, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x24, 0xb5, 0x8c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe,
+    0x83, 0x31, 0x75, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x56, 0x2b, 0x80, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
+    0x84, 0x31, 0xf5, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xc7, 0x49, 0xb9, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
+    0x24, 0xe5, 0xb7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0x6c, 0xae, 0x3a, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x3c, 0x08, 0x1c, 0xbf,
+    0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xd0, 0x9a, 0xa1, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x01, 0x41, 0xc0, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x85, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x34, 0x87, 0x08, 0xbf,
+    0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xc5, 0x79, 0x64, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf,
+    0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc4, 0x79, 0xe4, 0x3e, 0x33, 0xb7, 0xb3, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x56, 0x2b, 0x00, 0xbf, 0x52, 0x8b, 0x56, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x02, 0x11, 0x95, 0xbf,
+    0x24, 0xe5, 0xb7, 0x3e, 0xfb, 0x8f, 0x81, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x2d, 0x27, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+    0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x50, 0x8b, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0xb6, 0x77, 0x3d, 0xbf,
+    0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
+    0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x4b, 0x0a, 0x43, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x34, 0xe7, 0xde, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x85, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x16, 0xbf,
+    0x3c, 0x08, 0x1c, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+    0x8d, 0x52, 0x32, 0xbf, 0x3c, 0x08, 0x1c, 0xbf, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x3e, 0x08, 0x1c, 0x3f,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x58, 0x0c, 0xea, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x5c, 0x0c, 0xea, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x12, 0xe3, 0x10, 0x3f,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x9e, 0x54, 0x59, 0x3f,
+    0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x86, 0xd1, 0x1e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0x5e, 0xac, 0x13, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x40, 0x08, 0x1c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0x58, 0x0c, 0x6a, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+    0xea, 0xbd, 0x05, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+    0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
+    0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+    0x90, 0x52, 0xb2, 0xbd, 0x9c, 0x54, 0x59, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xd8, 0x1b, 0x35, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xcd, 0xfa, 0x77, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0xbe, 0x4b, 0x0a, 0x43, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+    0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x36, 0x87, 0x08, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x8d, 0x52, 0x32, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0xa4, 0xd5, 0x6c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+    0xea, 0xbd, 0x05, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0x46, 0x89, 0x2f, 0x3f, 0xea, 0xbd, 0x85, 0xbf, 0x56, 0x2b, 0x80, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+    0x61, 0x8d, 0x7d, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0xa4, 0xd5, 0x6c, 0xbf, 0x66, 0x2d, 0x27, 0x3f, 0xdf, 0x9c, 0x48, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x6e, 0xae, 0x3a, 0x3f, 0x24, 0xe5, 0xb7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf,
+    0x12, 0xe3, 0x10, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x65, 0x2d, 0x27, 0xbf, 0x76, 0xff, 0xa2, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x36, 0x87, 0x08, 0x3f, 0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x08, 0xc2, 0xd3, 0xbe, 0x46, 0x89, 0x2f, 0x3f, 0xe4, 0x9c, 0xc8, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x22, 0x87, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+    0x34, 0x87, 0x88, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x56, 0x2b, 0x00, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x24, 0xb5, 0x8c, 0xbf, 0xdf, 0x9c, 0x48, 0xbf,
+    0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
+    0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0xec, 0xbd, 0x85, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x61, 0x8d, 0x7d, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x65, 0x2d, 0x27, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x88, 0x31, 0x75, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+    0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e,
+    0x18, 0xc4, 0xfa, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x86, 0xd1, 0x1e, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x05, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+    0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
+    0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x65, 0x2d, 0x27, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x43, 0x89, 0x2f, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0xbd, 0x05, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
+    0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
+    0xa0, 0x52, 0x32, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
+    0x20, 0xe5, 0xb7, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xc4, 0x79, 0xe4, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x30, 0xe7, 0x5e, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x9c, 0x54, 0x59, 0xbf,
+    0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x14, 0xe3, 0x90, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x7e, 0x50, 0x0b, 0xbf, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
+    0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xf8, 0xbf, 0xac, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x3c, 0x08, 0x9c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x52, 0x8b, 0x56, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0xfb, 0x8f, 0x81, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x24, 0xe5, 0xb7, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x6c, 0xae, 0x3a, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0xa2, 0xf4, 0x02, 0x3f, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xa0, 0xf4, 0x02, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x88, 0x31, 0x75, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0xfb, 0x8f, 0x81, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+    0x90, 0x52, 0x32, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xae, 0xf6, 0x29, 0x3f,
+    0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x50, 0x8b, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xa2, 0xf4, 0x02, 0x3f, 0x14, 0xe3, 0x90, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0xe3, 0x10, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0xc8, 0x19, 0x0e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+    0x00, 0x41, 0x40, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x34, 0x87, 0x08, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
+    0xa8, 0x75, 0x16, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xfc, 0xbf, 0xac, 0x3e,
+    0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+    0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x7e, 0x50, 0x0b, 0x3f, 0xb8, 0x77, 0x3d, 0x3e,
+    0x86, 0xd1, 0x1e, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x9c, 0x54, 0xd9, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xcd, 0xfa, 0x77, 0xbf,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0xa0, 0xf4, 0x02, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x76, 0x2f, 0x4e, 0x3f, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x77, 0x3d, 0xbf,
+    0xe0, 0x9c, 0x48, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0xb8, 0x77, 0x3d, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x74, 0x2f, 0x4e, 0xbf,
+    0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+    0xec, 0x9e, 0xef, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x31, 0xf5, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x66, 0x2d, 0x27, 0x3f,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0xe7, 0x5e, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+    0x68, 0x2d, 0x27, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xf2, 0x3e, 0x19, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x5c, 0x0c, 0xea, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
+    0x84, 0x31, 0xf5, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+    0x74, 0x2f, 0x4e, 0xbf, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+    0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x36, 0x87, 0x08, 0x3f,
+    0x90, 0x52, 0xb2, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xf2, 0x3e, 0x19, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x6c, 0xae, 0x3a, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x56, 0x2b, 0x00, 0xbf,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+    0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0xe4, 0x9c, 0xc8, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+    0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0xa0, 0xf4, 0x02, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+    0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x22, 0xe5, 0x37, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x74, 0x2f, 0xce, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x18, 0xc4, 0xfa, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbc,
+    0x40, 0x08, 0x1c, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x36, 0x87, 0x08, 0x3f,
+    0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+    0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x90, 0x52, 0x32, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0x74, 0x2f, 0xce, 0xbe,
+    0x83, 0x31, 0x75, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e, 0xc6, 0x79, 0x64, 0x3f,
+    0x9c, 0x54, 0xd9, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x14, 0xe3, 0x90, 0x3e, 0xf2, 0x3e, 0x19, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x5e, 0xac, 0x13, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
+    0xaa, 0x75, 0x16, 0x3f, 0x68, 0x2d, 0xa7, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x84, 0x31, 0xf5, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0xb8, 0x77, 0xbd, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+    0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xa2, 0xf4, 0x02, 0x3f, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xf8, 0xbf, 0xac, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+    0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x9c, 0x54, 0xd9, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x6e, 0xae, 0x3a, 0x3f,
+    0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x74, 0x2f, 0xce, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
+    0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+    0xa8, 0x75, 0x96, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0x08, 0x9c, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x52, 0x8b, 0x56, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+    0x80, 0x31, 0xf5, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x56, 0x2b, 0x00, 0xbf, 0xa0, 0xf4, 0x02, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xd0, 0x9a, 0xa1, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+    0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x9c, 0x54, 0xd9, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x29, 0x66, 0x4b, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
+    0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+    0x17, 0xc4, 0x7a, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x7e, 0x50, 0x8b, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x1a, 0x64, 0x24, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0xd0, 0x9a, 0x21, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x5e, 0xac, 0x13, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+    0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x9c, 0x54, 0xd9, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+    0xec, 0x9e, 0xef, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x18, 0xc4, 0xfa, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0x95, 0xd3, 0x45, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+    0x34, 0xe7, 0xde, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x6c, 0xae, 0x3a, 0xbf,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+    0x24, 0xe5, 0xb7, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+    0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xb8, 0x77, 0x3d, 0x3e, 0xfa, 0xbf, 0x2c, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x00, 0x41, 0x40, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x36, 0x87, 0x08, 0x3f, 0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xc4, 0xfa, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+    0x34, 0xe7, 0xde, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x1c, 0xc4, 0xfa, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0x90, 0x52, 0xb2, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x30, 0xe7, 0x5e, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xea, 0xbd, 0x05, 0x3f, 0x5c, 0x0c, 0xea, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+    0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+    0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0xf4, 0x02, 0xbf,
+    0x08, 0xc2, 0x53, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x52, 0x32, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x31, 0xf5, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x8c, 0x52, 0xb2, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0xee, 0x9e, 0x6f, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x84, 0x31, 0xf5, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x95, 0xd3, 0x45, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
+    0xea, 0xbd, 0x85, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x18, 0xc4, 0xfa, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+    0xc8, 0x19, 0x0e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x29, 0x66, 0x4b, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x45, 0x59, 0x84, 0xbf, 0x24, 0xb5, 0x8c, 0xbf, 0x90, 0x52, 0x32, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e,
+    0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x84, 0x31, 0xf5, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x9c, 0x54, 0xd9, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x8c, 0x52, 0xb2, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+    0x30, 0xe7, 0xde, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+    0xee, 0x9e, 0x6f, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0x22, 0xe5, 0x37, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xaf, 0xf6, 0x29, 0xbf, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0xe7, 0x1d, 0x5c, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+    0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x1c, 0x3e,
+    0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xd8, 0x1b, 0x35, 0xbf,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x8d, 0x52, 0x32, 0xbf,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+    0xdf, 0x9c, 0x48, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x58, 0x0c, 0xea, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x1a, 0x64, 0x24, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xec, 0x9e, 0xef, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x56, 0x2b, 0x00, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0xa8, 0x75, 0x96, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x95, 0xd3, 0x45, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+    0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0xae, 0xf6, 0x29, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0xb4, 0x77, 0xbd, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
+    0x30, 0xe7, 0x5e, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x52, 0x8b, 0x56, 0xbf,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xdf, 0x9c, 0x48, 0xbf,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x58, 0x0c, 0x6a, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
+    0x60, 0x2d, 0x27, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+    0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+    0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+    0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+    0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0xda, 0x1b, 0x35, 0x3f,
+    0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+    0xaa, 0x75, 0x16, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e,
+    0x5c, 0x0c, 0xea, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0x90, 0x52, 0xb2, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0xf4, 0x02, 0xbf,
+    0x14, 0xe3, 0x90, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0xbd, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x5e, 0xac, 0x13, 0x3f, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+    0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x7e, 0x50, 0x0b, 0x3f,
+    0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f,
+    0xa8, 0x75, 0x96, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x12, 0xe3, 0x10, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x22, 0xe5, 0x37, 0xbf, 0x00, 0x41, 0x40, 0xbf,
+    0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x12, 0xe3, 0x10, 0xbf,
+    0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x08, 0x1c, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
+    0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x7c, 0x50, 0x8b, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+    0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0x86, 0xd1, 0x1e, 0x3f, 0x6c, 0xae, 0x3a, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
+    0x43, 0x89, 0x2f, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x18, 0xc4, 0xfa, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0xb8, 0x77, 0xbd, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x58, 0x2b, 0x80, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0x74, 0x2f, 0xce, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+    0xea, 0xbd, 0x05, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xd0, 0x9a, 0x21, 0xbf,
+    0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0x32, 0xbc, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
+    0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbf, 0x56, 0x2b, 0x00, 0x3f,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+    0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xbe, 0x05, 0x3d, 0xf9, 0xbf, 0x2c, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+    0xc4, 0x79, 0xe4, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x7e, 0x50, 0x0b, 0x3f, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x10, 0xe3, 0x10, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0xc4, 0x79, 0xe4, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+    0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x7e, 0x50, 0x0b, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0xb6, 0x77, 0x3d, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x56, 0x2b, 0x00, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x58, 0x0c, 0x6a, 0xbe,
+    0x38, 0x68, 0x72, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0xd0, 0x9a, 0x21, 0xbf,
+    0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+    0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0x7e, 0x50, 0x0b, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x88, 0x31, 0x75, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x86, 0xd1, 0x1e, 0xbf, 0x74, 0x2f, 0x4e, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x22, 0xe5, 0x37, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf8, 0xbf, 0xac, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x4b, 0x0a, 0x43, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+    0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x1c, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0xa2, 0xf4, 0x02, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+    0xd8, 0x1b, 0x35, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x12, 0xe3, 0x10, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0x08, 0x9c, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xd8, 0x1b, 0x35, 0xbf, 0xc8, 0x19, 0x0e, 0xbf,
+    0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x3c, 0x08, 0x1c, 0xbf,
+    0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
+    0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0xbd, 0x85, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xdf, 0x9c, 0x48, 0xbf,
+    0xec, 0x9e, 0xef, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x5a, 0x0c, 0x6a, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+    0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xaf, 0xf6, 0xa9, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
+    0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x9c, 0x54, 0x59, 0xbf,
+    0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf,
+    0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+    0x6c, 0xae, 0x3a, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0x34, 0x87, 0x08, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x65, 0x2d, 0x27, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0x3f,
+    0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
+    0x30, 0xe7, 0x5e, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x56, 0x2b, 0x00, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbd, 0x85, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x58, 0x0c, 0xea, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x54, 0x2b, 0x80, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+    0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x3c, 0x08, 0x9c, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc4, 0x79, 0xe4, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0x84, 0x31, 0xf5, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x80, 0x50, 0x8b, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0x3f,
+    0x34, 0xe7, 0xde, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+    0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0x52, 0x8b, 0x56, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+    0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xb8, 0x77, 0xbd, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0xde, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+    0xec, 0x9e, 0xef, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+    0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+    0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x52, 0x32, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x6c, 0xae, 0x3a, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x30, 0xe7, 0x5e, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+    0x5c, 0x0c, 0xea, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+    0x5c, 0x0c, 0xea, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0xea, 0xbd, 0x05, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x8e, 0x52, 0x32, 0x3f, 0x74, 0x2f, 0xce, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0xa8, 0x75, 0x16, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x14, 0xe3, 0x90, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+    0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
+    0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x00, 0x41, 0x40, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x52, 0x8b, 0x56, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x34, 0x87, 0x08, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xf2, 0x3e, 0x19, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+    0x52, 0x8b, 0x56, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+    0x18, 0xc4, 0xfa, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+    0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x13, 0xe3, 0x90, 0xbf,
+    0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0xe1, 0x6c, 0x9d, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x34, 0x87, 0x08, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0xb2, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+    0xd0, 0x9a, 0x21, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0xc2, 0x53, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+    0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0x4e, 0xbf,
+    0x40, 0x08, 0x1c, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0x7b, 0xb0, 0x61, 0xbf,
+    0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0x84, 0x31, 0xf5, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+    0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x84, 0x31, 0xf5, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x84, 0x31, 0xf5, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x1a, 0x64, 0x24, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+    0xe7, 0x1d, 0x5c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x58, 0x2b, 0x80, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x56, 0x2b, 0x00, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d,
+    0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x24, 0xe5, 0xb7, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x54, 0x2b, 0x80, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x14, 0xe3, 0x90, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0xf2, 0x3e, 0x19, 0x3f, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0x59, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xec, 0x9e, 0xef, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0xb2, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x9c, 0xc8, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0xe7, 0x5e, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0x7b, 0xb0, 0x61, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+    0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0x5c, 0x0c, 0xea, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0xb6, 0x77, 0x3d, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x08, 0xc2, 0x53, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x82, 0x31, 0x75, 0x3f,
+    0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+    0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x22, 0xe5, 0x37, 0x3f,
+    0x30, 0xe7, 0xde, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+    0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+    0xe2, 0x9c, 0x48, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x95, 0xd3, 0x45, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x0a, 0xc2, 0x53, 0x3f,
+    0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x12, 0xe3, 0x10, 0x3f,
+    0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x7f, 0x50, 0x8b, 0x3f,
+    0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x96, 0xd3, 0x45, 0x3f, 0x3e, 0x08, 0x1c, 0x3f, 0xb8, 0x77, 0x3d, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x84, 0x31, 0xf5, 0x3e, 0x1a, 0x64, 0x24, 0xbf,
+    0x08, 0xc2, 0x53, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0x53, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+    0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+    0x30, 0xe7, 0x5e, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+    0xa0, 0xf4, 0x02, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+    0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x8c, 0x52, 0xb2, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x00, 0x41, 0x40, 0xbf,
+    0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x56, 0x2b, 0x00, 0xbf,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0xec, 0xbd, 0x85, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+    0xa2, 0xf4, 0x02, 0x3f, 0xa0, 0x52, 0x32, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+    0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
+    0xc4, 0x79, 0xe4, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x5e, 0xac, 0x13, 0x3f,
+    0x90, 0x52, 0xb2, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+    0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+    0xe0, 0x9c, 0x48, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+    0x3c, 0x08, 0x1c, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+    0xa8, 0x75, 0x16, 0xbf, 0x43, 0x89, 0x2f, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
+    0x34, 0x87, 0x88, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x34, 0x87, 0x08, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0xda, 0x1b, 0x35, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xe7, 0x1d, 0x5c, 0xbf, 0x9e, 0x54, 0x59, 0x3f,
+    0x9c, 0x54, 0xd9, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x1a, 0x64, 0x24, 0x3f, 0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x22, 0xe5, 0x37, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+    0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+    0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x5c, 0x0c, 0xea, 0x3e,
+    0x80, 0x50, 0x8b, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa8, 0x75, 0x96, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+    0xea, 0xbd, 0x05, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
+    0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xf8, 0xbf, 0xac, 0xbe,
+    0x34, 0x87, 0x08, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x88, 0x31, 0x75, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x86, 0xd1, 0x1e, 0xbf,
+    0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+    0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+    0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xec, 0xbd, 0x85, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x80, 0x31, 0x75, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0x0a, 0xc2, 0x53, 0x3f, 0xca, 0x19, 0x0e, 0x3f,
+    0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+    0xc4, 0x79, 0xe4, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0x3f,
+    0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf,
+    0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x4b, 0x0a, 0x43, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+    0xa2, 0xf4, 0x02, 0x3f, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
+    0x22, 0xe5, 0x37, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+    0x83, 0x31, 0x75, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x96, 0xd3, 0x45, 0x3f,
+    0x58, 0x0c, 0x6a, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xc8, 0x19, 0x0e, 0xbf,
+    0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+    0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
+    0x84, 0x31, 0xf5, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0x3f,
+    0x0a, 0x92, 0xa8, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x17, 0xc4, 0x7a, 0xbf, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+    0x90, 0x52, 0xb2, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
+    0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0xfc, 0xbf, 0xac, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+    0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0x75, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xec, 0x9e, 0xef, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0xb2, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x05, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+    0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+    0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+    0x30, 0xe7, 0xde, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0x20, 0xe7, 0x5e, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+    0x3c, 0x08, 0x1c, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
+    0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+    0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0xf9, 0xbf, 0x2c, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0x0a, 0x92, 0xa8, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+    0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+    0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
+    0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0x5e, 0xac, 0x13, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x34, 0xe7, 0xde, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+    0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+    0x30, 0xe7, 0xde, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x68, 0x2d, 0xa7, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0xe8, 0xbd, 0x05, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0xbd,
+    0x3e, 0x08, 0x1c, 0x3f, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
+    0xf9, 0xbf, 0x2c, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x52, 0xb2, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x88, 0x31, 0x75, 0x3e,
+    0xa8, 0x75, 0x16, 0xbf, 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+    0xe0, 0x9c, 0xc8, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+    0xec, 0xbd, 0x85, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0x14, 0xe3, 0x90, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x56, 0x2b, 0x00, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x34, 0x87, 0x08, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+    0xc4, 0x79, 0xe4, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+    0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
+    0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xb4, 0x77, 0xbd, 0xbe,
+    0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0xf4, 0x02, 0xbf,
+    0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x34, 0x87, 0x08, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0x7c, 0x50, 0x8b, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+    0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+    0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x64, 0x2d, 0xa7, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xee, 0x9e, 0x6f, 0xbf,
+    0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xca, 0x19, 0x0e, 0x3f,
+    0xa0, 0xf4, 0x02, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x38, 0x68, 0x72, 0xbf,
+    0x38, 0x68, 0x72, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+    0x1c, 0xc4, 0xfa, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x08, 0xc2, 0x53, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+    0xea, 0xbd, 0x05, 0xbf, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
+    0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x02, 0x11, 0x95, 0xbf,
+    0x90, 0x31, 0xf5, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+    0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xe9, 0xed, 0xb0, 0xbf,
+    0xb4, 0x77, 0xbd, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x86, 0xd1, 0x9e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+    0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x5c, 0x0c, 0xea, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0xf2, 0x3e, 0x19, 0x3f, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x3c, 0x08, 0x9c, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xec, 0x9e, 0xef, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+    0x68, 0x2d, 0xa7, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0x74, 0x2f, 0xce, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x8e, 0x52, 0x32, 0x3f,
+    0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x5a, 0x0c, 0x6a, 0xbf, 0x3c, 0x08, 0x9c, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+    0x08, 0xc2, 0x53, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
+    0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0x40, 0x08, 0x9c, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+    0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+    0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0xc4, 0x79, 0xe4, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+    0x88, 0x31, 0x75, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x31, 0x75, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+    0xe8, 0xbd, 0x85, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xcd, 0xfa, 0x77, 0xbf, 0x7b, 0xb0, 0x61, 0xbf, 0x88, 0x31, 0x75, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
+    0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+    0xc0, 0x52, 0xb2, 0x3c, 0x56, 0x2b, 0x00, 0x3f, 0x8c, 0x52, 0xb2, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+    0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x8d, 0x52, 0x32, 0xbf,
+    0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x95, 0xd3, 0x45, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+    0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+    0x8d, 0x52, 0x32, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+    0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
+    0x20, 0xe5, 0xb7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0x6a, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xda, 0xeb, 0x89, 0xbf,
+    0x58, 0x0c, 0x6a, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+    0xc4, 0x79, 0xe4, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+    0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+    0x34, 0x87, 0x08, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf,
+    0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x88, 0x31, 0x75, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x65, 0x2d, 0x27, 0xbf,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+    0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+    0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0xc8, 0x19, 0x0e, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+    0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+    0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+    0x65, 0x2d, 0x27, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+    0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+    0x88, 0x52, 0x32, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe,
+    0xa8, 0x75, 0x16, 0xbf, 0xe7, 0x1d, 0x5c, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+    0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x74, 0x2f, 0xce, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x90, 0x52, 0xb2, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x4c, 0xda, 0x97, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
+    0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+    0xb8, 0x77, 0x3d, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+    0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xc4, 0x79, 0xe4, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xea, 0xbd, 0x05, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xb6, 0x77, 0x3d, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+    0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+    0xaf, 0xf6, 0x29, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0xa7, 0x3e,
+    0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xaa, 0x75, 0x16, 0x3f,
+    0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+    0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x8c, 0x52, 0xb2, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x9c, 0x54, 0xd9, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x7e, 0x50, 0x0b, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+    0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x64, 0x2d, 0xa7, 0xbe,
+    0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x1c, 0xbf,
+    0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x68, 0x2d, 0xa7, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+    0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x1a, 0x64, 0x24, 0xbf,
+    0x58, 0x0c, 0xea, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+    0x08, 0xc2, 0x53, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x34, 0xe7, 0xde, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xec, 0x9e, 0xef, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+    0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+    0x58, 0x0c, 0x6a, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0x31, 0xe7, 0x5e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x74, 0x2f, 0xce, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+    0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x24, 0xe5, 0xb7, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+    0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x4b, 0x0a, 0x43, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+    0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0xaf, 0xf6, 0x29, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+    0xe8, 0xbd, 0x05, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0x6c, 0xae, 0x3a, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+    0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+    0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+    0xc4, 0x79, 0xe4, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+    0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+    0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe,
+    0x90, 0x52, 0x32, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+    0x74, 0x2f, 0xce, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+    0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+    0xea, 0xbd, 0x05, 0xbf, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+    0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+    0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x60, 0x2d, 0x27, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0x48, 0xbe,
+    0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
+    0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+    0xd0, 0x9a, 0x21, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+    0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+    0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+    0x58, 0x2b, 0x80, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x3c, 0x08, 0x9c, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x6a, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0x96, 0xd3, 0x45, 0x3f, 0x7c, 0x50, 0x8b, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+    0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x6a, 0x3e,
+    0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+    0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+    0xfc, 0xbf, 0xac, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+    0x74, 0x2f, 0xce, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0xea, 0xbd, 0x05, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+    0x4c, 0x0a, 0xc3, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+    0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0x14, 0xe3, 0x90, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x56, 0x2b, 0x00, 0x3f,
+    0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+    0x88, 0x52, 0x32, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x54, 0x2b, 0x80, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+    0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+    0x90, 0x52, 0xb2, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+    0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xaa, 0x75, 0x16, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+    0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+    0x4c, 0x0a, 0xc3, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+    0xe0, 0xbd, 0x85, 0xbd, 0x86, 0xd1, 0x9e, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xea, 0xbd, 0x05, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0x12, 0xe3, 0x10, 0x3f, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0x32, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0x9c, 0x48, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+    0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+    0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+    0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x31, 0xf5, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+    0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+    0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+    0xe8, 0xbd, 0x85, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+    0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+    0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+    0x64, 0x2d, 0xa7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+    0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+    0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+    0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+    0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0xd8, 0x1b, 0x35, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+    0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+    0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+    0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+    0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0xc2, 0xd3, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+    0xfb, 0x8f, 0x81, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+    0x74, 0x2f, 0xce, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+    0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+    0x30, 0xe7, 0xde, 0xbd, 0xe7, 0x1d, 0x5c, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+    0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+    0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+    0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+    0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0xc4, 0x79, 0xe4, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+    0x40, 0x08, 0x9c, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
+    0x24, 0xe5, 0xb7, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xb4, 0x77, 0xbd, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+    0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+    0x56, 0x2b, 0x00, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+    0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+    0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0xa8, 0x75, 0x96, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+    0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+    0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+    0x00, 0xbe, 0x05, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+    0x38, 0x08, 0x1c, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+    0xc4, 0x79, 0xe4, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+    0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+    0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe,
+    0xd0, 0x9a, 0xa1, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+    0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+    0x60, 0x2d, 0x27, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+    0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xae, 0xf6, 0x29, 0x3f,
+    0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+    0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+    0x3c, 0x08, 0x9c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+    0xc4, 0x79, 0xe4, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x86, 0xd1, 0x1e, 0x3f,
+    0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x1a, 0x64, 0x24, 0x3f,
+    0x9c, 0x54, 0xd9, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x76, 0x2f, 0x4e, 0x3f, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+    0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+    0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+    0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xcd, 0xfa, 0x77, 0xbf,
+    0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xc4, 0xfa, 0xbe,
+    0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
+    0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
+    0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+    0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2d, 0x27, 0xbe,
+    0xea, 0xbd, 0x05, 0x3f, 0x08, 0xc2, 0xd3, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+    0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+    0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+    0xea, 0xbd, 0x05, 0xbf, 0xfa, 0xbf, 0x2c, 0x3f, 0x80, 0x52, 0x32, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+    0x6e, 0xae, 0x3a, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+    0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+    0x20, 0xe7, 0x5e, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+    0xfc, 0xbf, 0xac, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+    0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+    0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+    0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+    0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+    0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+    0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+    0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+    0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+    0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xfc, 0xbf, 0xac, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+    0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+    0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+    0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+    0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+    0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+    0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+    0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+    0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+    0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
+    0x40, 0x08, 0x9c, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+    0xe0, 0xbd, 0x85, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+    0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+    0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
+    0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+    0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+    0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+    0x40, 0x08, 0x9c, 0x3d, 0x61, 0x8d, 0x7d, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+    0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+    0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+    0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe,
+    0x8d, 0x52, 0x32, 0xbf, 0xb6, 0x77, 0x3d, 0xbf, 0x1c, 0xc4, 0xfa, 0x3e,
+    0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+    0xa8, 0x75, 0x96, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+    0x5e, 0xac, 0x13, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+    0xec, 0x9e, 0xef, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+    0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+    0x1a, 0x64, 0x24, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+    0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+    0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+    0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+    0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+    0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+    0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+    0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+    0xec, 0x9e, 0xef, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+    0xa2, 0xf4, 0x02, 0x3f, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+    0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+    0xe0, 0x9c, 0x48, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x74, 0x2f, 0xce, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+    0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd,
+    0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+    0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+    0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+    0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+    0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+    0x10, 0xe3, 0x10, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+    0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+    0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+    0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+    0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
+    0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+    0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+}};
+const int32_t dnn_hiddenlayer_2_bias__4__cf__4_shape[1] = {59};
+const union {
+  uint8_t bytes[236];
+  float values[59];
+} dnn_hiddenlayer_2_bias__4__cf__4 = {{
+    0x57, 0x61, 0xf1, 0x3f, 0x30, 0x26, 0x90, 0x3f, 0xe7, 0xc6, 0xe5, 0xbc,
+    0x26, 0x25, 0xc0, 0xbd, 0x28, 0xeb, 0x96, 0xbe, 0x03, 0x9f, 0xa7, 0xbf,
+    0x54, 0x6c, 0xec, 0x3f, 0xfa, 0x8e, 0x1c, 0x3f, 0x35, 0x7d, 0x0a, 0x40,
+    0xeb, 0x5a, 0x3d, 0xbf, 0xa0, 0xcb, 0x28, 0x3f, 0xee, 0x93, 0xc9, 0x3f,
+    0x1f, 0x68, 0x23, 0xbf, 0xbf, 0x97, 0x8c, 0x3f, 0xc3, 0x2c, 0xe4, 0xbf,
+    0xf3, 0xc7, 0xd8, 0x3e, 0x69, 0x6d, 0xd5, 0x3e, 0x49, 0x5f, 0x19, 0x40,
+    0x9c, 0x2f, 0xfb, 0x3d, 0x38, 0x3e, 0x08, 0xbf, 0x58, 0x26, 0x06, 0x40,
+    0xf3, 0x59, 0x80, 0xbf, 0xc7, 0x4c, 0x0b, 0xc0, 0xc3, 0x12, 0x20, 0x3f,
+    0x2a, 0xd6, 0x08, 0xbf, 0x80, 0xe3, 0x9b, 0x3e, 0x4a, 0xc1, 0x0d, 0x40,
+    0xe1, 0x1d, 0x9f, 0xbf, 0xdb, 0x27, 0xfa, 0xbd, 0xa0, 0xde, 0xa5, 0xbf,
+    0xd1, 0x4a, 0x01, 0x3f, 0xb2, 0x0d, 0x2e, 0xbf, 0xe5, 0x3b, 0x8c, 0x3f,
+    0x64, 0xe9, 0x53, 0x3f, 0xf5, 0xb7, 0xc4, 0x3e, 0x5e, 0x26, 0x97, 0xbf,
+    0x66, 0x90, 0x65, 0x3f, 0x58, 0x16, 0x20, 0x40, 0xe3, 0x7e, 0xe9, 0xbf,
+    0x84, 0x87, 0x32, 0x3f, 0x3d, 0xd8, 0x34, 0xbf, 0xa9, 0xe2, 0xf3, 0xbe,
+    0xe2, 0x54, 0xa8, 0xbe, 0xe1, 0x85, 0x19, 0x3f, 0xbb, 0x54, 0xd0, 0x3f,
+    0xe0, 0x88, 0x16, 0xbf, 0xcd, 0x35, 0xcc, 0x3f, 0xff, 0x1b, 0x03, 0xbf,
+    0x92, 0x93, 0xf6, 0xbe, 0xcb, 0x9a, 0x2d, 0x3f, 0x52, 0xb0, 0xd9, 0xbe,
+    0xd1, 0x0b, 0x48, 0xbf, 0x78, 0x2c, 0xe9, 0x3e, 0xad, 0x46, 0x0a, 0xbf,
+    0x80, 0x2d, 0x84, 0x3f, 0xa8, 0x55, 0x48, 0x3f, 0x1f, 0x69, 0x18, 0xbe,
+    0x48, 0xc0, 0xd1, 0xbf, 0xa3, 0x20, 0xe8, 0xbf,
+}};
+const int32_t dnn_hiddenlayer_2_kernel__5__cf__5_shape[2] = {115, 59};
+const union {
+  uint8_t bytes[27140];
+  float values[6785];
+} dnn_hiddenlayer_2_kernel__5__cf__5 = {{
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x0d, 0xaf, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x12, 0x75, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x10, 0xd2, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+    0x56, 0xaa, 0x87, 0xbe, 0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x55, 0x2e, 0x3c, 0xbf,
+    0xa8, 0x2b, 0x99, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d,
+    0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+    0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+    0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x2a, 0x9b, 0x12, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0x3e,
+    0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x0d, 0xaf, 0xbe,
+    0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0xda, 0x3e, 0x2a, 0x7a, 0x05, 0x3f,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0x2a, 0x7a, 0x05, 0x3f, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+    0xd5, 0x7c, 0x28, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x10, 0xd2, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xff, 0x72, 0x79, 0xbf,
+    0x50, 0xd3, 0x7d, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0x49, 0x3f,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x28, 0x82, 0x6e, 0x3f,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
+    0x00, 0x4a, 0x83, 0xbe, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x00, 0x4a, 0x03, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
+    0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x4a, 0x83, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+    0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x54, 0x70, 0xd6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
+    0x2a, 0xbc, 0x1f, 0x3f, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xb2, 0xf0, 0x3e,
+    0x00, 0xad, 0xaa, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xaf, 0xcd, 0x3e,
+    0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xd3, 0xfd, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+    0x54, 0xaa, 0x87, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+    0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xaa, 0xd0, 0x5a, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x00, 0x6b, 0x90, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0xaa, 0x2b, 0x99, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x0d, 0x2f, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa8, 0x12, 0x75, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd,
+    0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xff, 0x30, 0x5f, 0xbf, 0x00, 0x6b, 0x90, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+    0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0xaa, 0x6d, 0x33, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+    0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x73, 0xf9, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+    0xaa, 0x12, 0xf5, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+    0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x50, 0x91, 0xe3, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0x3f, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x56, 0xaa, 0x87, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xaa, 0x4c, 0x26, 0x3f, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x50, 0x91, 0xe3, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x80, 0x0a, 0x0c, 0x3c,
+    0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x54, 0x2e, 0xbc, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0x26, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
+    0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+    0x55, 0xaa, 0x07, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0x50, 0x0d, 0x2f, 0x3e, 0xd4, 0xbe, 0x42, 0xbf, 0xaa, 0x12, 0xf5, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+    0xaa, 0x0a, 0x0c, 0xbf, 0x80, 0x0a, 0x0c, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+    0x50, 0x4f, 0x49, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+    0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0x10, 0xd2, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0x3e,
+    0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+    0x54, 0xaa, 0x87, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x80, 0xda, 0x09, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x00, 0xce, 0xb7, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
+    0x00, 0x4a, 0x03, 0xbf, 0x55, 0x2e, 0x3c, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0xff, 0x0f, 0x52, 0xbf, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+    0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x4a, 0x83, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xaa, 0x0a, 0x0c, 0xbf, 0xaa, 0xf1, 0xe7, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
+    0xa0, 0x12, 0xf5, 0x3d, 0x55, 0xaa, 0x07, 0xbf, 0x60, 0x0d, 0x2f, 0xbd,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+    0x50, 0x0d, 0x2f, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0xff, 0x30, 0x5f, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0xbe,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x00, 0x6b, 0x10, 0xbf, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xff, 0x8b, 0x1d, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x10, 0xd2, 0x3c, 0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x50, 0x0d, 0x2f, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x10, 0x52, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0xce, 0xb7, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0x63, 0x3e,
+    0xaa, 0x0a, 0x0c, 0x3f, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x10, 0xd2, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0xf5, 0x3e,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x2a, 0xbc, 0x1f, 0x3f,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0x54, 0x2e, 0xbc, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x55, 0xaa, 0x07, 0xbf,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xef, 0xc4, 0xbe,
+    0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xaa, 0x2b, 0x19, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xd5, 0x19, 0x01, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x00, 0xad, 0xaa, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x58, 0x91, 0x63, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0xa8, 0x2b, 0x99, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x54, 0x2e, 0xbc, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x28, 0x1f, 0x47, 0x3f,
+    0x54, 0x91, 0xe3, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x73, 0xf9, 0x3e,
+    0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0xaa, 0x12, 0xf5, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x8c, 0x3e,
+    0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd,
+    0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0x70, 0xd6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x2a, 0x61, 0x61, 0xbf, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+    0x54, 0xd3, 0xfd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+    0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+    0x54, 0xec, 0xa1, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x54, 0x0d, 0xaf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x4f, 0xc9, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x54, 0xcb, 0x14, 0x3f, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x19, 0xbf,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xd5, 0x7c, 0x28, 0xbf,
+    0xaa, 0x0a, 0x0c, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0xa3, 0x7b, 0xbf,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x7f, 0xc1, 0x65, 0xbf, 0xa8, 0x0a, 0x8c, 0x3e,
+    0x55, 0xec, 0x21, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x31, 0xdf, 0xbe, 0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x91, 0x63, 0x3e,
+    0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x54, 0x70, 0xd6, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0xef, 0xc4, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0x58, 0x91, 0x63, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+    0xff, 0xac, 0x2a, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+    0x00, 0xad, 0xaa, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+    0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+    0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x0d, 0xaf, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x2a, 0x7a, 0x05, 0xbf, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0xef, 0xc4, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
+    0xaa, 0xd0, 0xda, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x4f, 0xc9, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x2a, 0x1f, 0x47, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e,
+    0x54, 0xcb, 0x94, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+    0xaa, 0x12, 0xf5, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+    0xaa, 0x12, 0x75, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0x63, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+    0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+    0x00, 0x10, 0xd2, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x31, 0xdf, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbd,
+    0x50, 0x0d, 0x2f, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0xef, 0xc4, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0x8e, 0xc0, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+    0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x54, 0x91, 0xe3, 0xbe,
+    0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+    0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x12, 0xf5, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0x2f, 0x3e, 0x54, 0xd3, 0xfd, 0x3e,
+    0xa8, 0x2b, 0x99, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x52, 0x6c, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x50, 0x91, 0xe3, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3f, 0x58, 0xcb, 0x14, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x52, 0xec, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x19, 0xbf,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
+    0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0x50, 0x0d, 0xaf, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d,
+    0x00, 0x10, 0x52, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x54, 0x2e, 0xbc, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x54, 0x91, 0xe3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+    0x50, 0x91, 0xe3, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xa0, 0x12, 0x75, 0xbd, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x0d, 0xaf, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
+    0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x2e, 0xbc, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xff, 0x51, 0x6c, 0xbf,
+    0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+    0x54, 0xcb, 0x94, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x4a, 0x03, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+    0x2a, 0xbc, 0x1f, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+    0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x10, 0xd2, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+    0x00, 0xce, 0xb7, 0x3e, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x00, 0x8c, 0x1d, 0x3f, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x83, 0x3e,
+    0x00, 0x73, 0xf9, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x73, 0xf9, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+    0x50, 0x4f, 0x49, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0xad, 0xaa, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xff, 0x72, 0x79, 0xbf, 0xa8, 0xaf, 0xcd, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+    0x00, 0x52, 0xec, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0xf1, 0xe7, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x58, 0x4f, 0x49, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+    0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x12, 0xf5, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0x3f,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0x54, 0xcb, 0x94, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0x54, 0x91, 0xe3, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0xce, 0xb7, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x54, 0x2e, 0xbc, 0x3e, 0x7f, 0xc1, 0x65, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0x3c,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x54, 0xcb, 0x94, 0x3e, 0x55, 0xec, 0x21, 0xbf, 0x58, 0x4f, 0x49, 0xbe,
+    0xaa, 0x6d, 0xb3, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x0d, 0xaf, 0x3d,
+    0x55, 0x0d, 0x2f, 0xbf, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0xd2, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x6b, 0x90, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+    0x50, 0x91, 0xe3, 0x3d, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x4a, 0x03, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x54, 0x91, 0xe3, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x6b, 0x90, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x6b, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x0c, 0x3f, 0x54, 0x2e, 0xbc, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+    0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0x7f, 0xfb, 0x16, 0xbf, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0x2f, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x58, 0x91, 0x63, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+    0xb0, 0x12, 0xf5, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x4f, 0xc9, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x0d, 0xaf, 0x3e,
+    0xaa, 0x2b, 0x19, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x50, 0x91, 0x63, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x00, 0xce, 0x37, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0xd5, 0x19, 0x81, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+    0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+    0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e, 0x54, 0xec, 0xa1, 0xbe,
+    0x80, 0xda, 0x09, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0x31, 0xdf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+    0x54, 0x91, 0xe3, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x54, 0x91, 0xe3, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x52, 0xec, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+    0xaa, 0xaf, 0xcd, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0x61, 0x61, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+    0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xaa, 0x2b, 0x19, 0xbf,
+    0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf,
+    0x50, 0x4f, 0x49, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x50, 0x0d, 0x2f, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+    0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x2b, 0x99, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0xd4, 0x19, 0x01, 0x3f,
+    0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0xb7, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
+    0xa8, 0xd0, 0xda, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x70, 0xd6, 0x3e,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
+    0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0xd0, 0xda, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x6b, 0x90, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0xd0, 0xda, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
+    0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
+    0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0xef, 0xc4, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x4a, 0x03, 0xbe, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x91, 0xe3, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
+    0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0xa8, 0x8e, 0xc0, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+    0x2a, 0x9b, 0x12, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+    0x54, 0xaa, 0x87, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x52, 0xec, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xa8, 0x2b, 0x99, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x4a, 0x83, 0x3e, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0x3e,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+    0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
+    0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+    0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
+    0xaa, 0xaf, 0x4d, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+    0xaa, 0x2b, 0x19, 0xbf, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e,
+    0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x2b, 0x99, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0xd2, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x54, 0x70, 0xd6, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0x3e,
+    0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0xad, 0x2a, 0x3f, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+    0x00, 0x52, 0x6c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x55, 0xaa, 0x07, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+    0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0xd4, 0x7c, 0x28, 0x3f, 0x00, 0x4a, 0x83, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x58, 0x4f, 0x49, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x56, 0xaa, 0x87, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0xd0, 0xda, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+    0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x52, 0x6c, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0x3d,
+    0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+    0x54, 0xec, 0xa1, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x54, 0x91, 0xe3, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x2a, 0x9b, 0x12, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+    0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x4f, 0x49, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+    0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xf1, 0xe7, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x73, 0xf9, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0xce, 0xb7, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xd4, 0x19, 0x01, 0x3f,
+    0x00, 0x10, 0xd2, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0x0a, 0x0c, 0x3f, 0xa8, 0xd0, 0x5a, 0xbe, 0x7f, 0x7f, 0x4b, 0xbf,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x10, 0x3f, 0x54, 0xcb, 0x94, 0xbe,
+    0xd4, 0x7c, 0x28, 0x3f, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+    0x2a, 0xfe, 0x39, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
+    0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e, 0x54, 0x2e, 0x3c, 0x3f,
+    0x00, 0x4a, 0x03, 0x3f, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x58, 0x91, 0x63, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+    0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
+    0x00, 0x8c, 0x1d, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
+    0x54, 0xec, 0xa1, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e, 0x80, 0xda, 0x09, 0xbf,
+    0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x2a, 0xbc, 0x1f, 0x3f,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0xef, 0xc4, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x10, 0xd2, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0xad, 0xaa, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+    0x55, 0xec, 0x21, 0xbf, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
+    0x54, 0x70, 0xd6, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0xd3, 0xfd, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x55, 0x0d, 0x2f, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0x63, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xaa, 0x07, 0x3f, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+    0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x91, 0x63, 0xbf,
+    0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0xef, 0xc4, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xd0, 0xda, 0xbe,
+    0xff, 0xee, 0x44, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x4a, 0x83, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x12, 0xf5, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xd3, 0xfd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x10, 0x52, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x4f, 0xc9, 0x3e,
+    0x00, 0x52, 0xec, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xff, 0x8b, 0x1d, 0xbf,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+    0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0x3e,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x80, 0xda, 0x09, 0xbf,
+    0x54, 0xec, 0xa1, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xaa, 0x87, 0x3e,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0x6d, 0xb3, 0x3e, 0x2a, 0x9b, 0x12, 0x3f, 0xa0, 0x12, 0x75, 0xbd,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0xcb, 0x94, 0x3e,
+    0x7f, 0x5e, 0x3e, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
+    0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x31, 0xdf, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x54, 0x2e, 0xbc, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+    0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x73, 0xf9, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0x80, 0x0a, 0x0c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xaa, 0x0a, 0x0c, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00,
+    0xa8, 0x8e, 0x40, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x54, 0xd3, 0xfd, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x80, 0xda, 0x89, 0xbf,
+    0x00, 0x31, 0xdf, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x52, 0xec, 0xbe,
+    0x00, 0x73, 0xf9, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+    0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+    0x54, 0x2e, 0xbc, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x31, 0xdf, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x8e, 0xc0, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0x2a, 0xbc, 0x1f, 0x3f, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xd3, 0x7d, 0x3e,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+    0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+    0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x55, 0xcb, 0x14, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0xaf, 0x4d, 0xbf,
+    0x00, 0x4a, 0x03, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x58, 0x91, 0x63, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x52, 0xec, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
+    0x54, 0xd3, 0xfd, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+    0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
+    0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x00, 0xce, 0xb7, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x4a, 0x03, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0x4c, 0x26, 0xbe, 0xd4, 0xbe, 0x42, 0xbf, 0x00, 0xad, 0xaa, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0xda, 0x09, 0xbf,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+    0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+    0xa8, 0x8e, 0xc0, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0x52, 0xec, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+    0x00, 0x52, 0xec, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+    0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+    0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0xa8, 0x8e, 0xc0, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xcb, 0x94, 0x3e,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+    0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0x70, 0xd6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+    0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
+    0x54, 0x0d, 0xaf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
+    0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
+    0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x10, 0x52, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x7f, 0x1c, 0x24, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x2a, 0x7a, 0x05, 0xbf,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0xb7, 0x3e,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x4a, 0x03, 0x3f, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
+    0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
+    0x54, 0xcb, 0x14, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+    0xa0, 0x12, 0x75, 0xbd, 0xaa, 0x2b, 0x19, 0x3f, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+    0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x58, 0x4f, 0x49, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+    0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0xd4, 0xbe, 0x42, 0xbf,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x00, 0xce, 0xb7, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x8e, 0x40, 0xbf,
+    0x00, 0x8c, 0x1d, 0x3e, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0x3d,
+    0x00, 0x31, 0xdf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x70, 0xd6, 0x3e,
+    0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x12, 0x75, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+    0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x12, 0xf5, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
+    0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+    0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+    0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+    0xd5, 0x19, 0x01, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x4a, 0x83, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0xd5, 0x19, 0x01, 0xbf, 0x54, 0xec, 0xa1, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0xcb, 0x14, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0x7f, 0xfb, 0x16, 0xbf, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0x63, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x54, 0x70, 0x56, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x54, 0x2e, 0xbc, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf,
+    0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x00, 0x10, 0xd2, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x10, 0x52, 0xbd, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x4a, 0x83, 0x3e,
+    0x2a, 0x9b, 0x12, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf,
+    0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x7f, 0x1c, 0x24, 0xbf,
+    0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe,
+    0xd5, 0x19, 0x01, 0xbf, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+    0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x91, 0xe3, 0x3e,
+    0xa0, 0x12, 0x75, 0x3d, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0x31, 0xdf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0xaf, 0x4d, 0xbf,
+    0x00, 0xad, 0xaa, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbe,
+    0x80, 0xfb, 0x16, 0x3f, 0x2a, 0x7a, 0x05, 0xbf, 0x54, 0xec, 0xa1, 0x3e,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x54, 0x70, 0xd6, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0x54, 0x70, 0xd6, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x54, 0xcb, 0x94, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x10, 0x52, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+    0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xb2, 0xf0, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+    0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0x54, 0x91, 0xe3, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x54, 0xec, 0xa1, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x54, 0x91, 0xe3, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0x37, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x73, 0xf9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+    0xd5, 0x9d, 0x35, 0xbf, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x54, 0x4f, 0xc9, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+    0x54, 0x2e, 0xbc, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xad, 0xaa, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0x63, 0x3e,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x31, 0xdf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0xda, 0x3e,
+    0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0x4a, 0x03, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
+    0xaa, 0x12, 0xf5, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0xad, 0xaa, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e,
+    0xff, 0xee, 0x44, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0xce, 0xb7, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0xda, 0x09, 0xbf,
+    0xa8, 0x4c, 0xa6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x8e, 0x40, 0xbf,
+    0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x91, 0x63, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0x7f, 0x5e, 0x3e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x10, 0xd2, 0x3c, 0x2a, 0x7a, 0x05, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x55, 0xaa, 0x07, 0xbf,
+    0xaa, 0xd0, 0xda, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0x2e, 0x3c, 0xbf,
+    0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+    0x54, 0xd3, 0xfd, 0xbe, 0x7f, 0x3d, 0x31, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x7f, 0xfb, 0x16, 0xbf,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+    0x54, 0xd3, 0xfd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0x26, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0xda, 0x09, 0xbf, 0x58, 0xcb, 0x14, 0xbe,
+    0xd5, 0x5b, 0x1b, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+    0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x52, 0x6c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+    0x00, 0x73, 0xf9, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x50, 0xd3, 0x7d, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
+    0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xd5, 0x19, 0x01, 0xbf,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+    0xd5, 0x19, 0x01, 0xbf, 0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+    0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+    0xa8, 0xd0, 0xda, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x10, 0xd2, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x6b, 0x10, 0xbf, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+    0x54, 0xec, 0xa1, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
+    0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
+    0xaa, 0x2b, 0x19, 0xbf, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xa8, 0x12, 0x75, 0xbe, 0x2a, 0xdd, 0x2c, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x1d, 0x3e,
+    0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xaf, 0x4d, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
+    0x50, 0xd3, 0x7d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+    0xa8, 0x12, 0x75, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x6b, 0x90, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x10, 0xd2, 0x3d,
+    0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0xaa, 0x4c, 0x26, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+    0x7f, 0x1c, 0x24, 0xbf, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xef, 0xc4, 0xbe,
+    0xff, 0x8b, 0x1d, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0x3d, 0x55, 0x2e, 0x3c, 0xbf, 0x00, 0xce, 0x37, 0x3e,
+    0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+    0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x52, 0xec, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0xa8, 0xf1, 0x67, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0xec, 0x3e, 0x7f, 0x5e, 0x3e, 0xbf,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+    0xa0, 0x12, 0x75, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0xa8, 0x4c, 0x26, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x2a, 0x7a, 0x05, 0x3f,
+    0x2a, 0x9b, 0x12, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x12, 0x75, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xaa, 0x07, 0x3f,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x7f, 0xfb, 0x16, 0xbf,
+    0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x54, 0x0d, 0xaf, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3d,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0x63, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0x3e,
+    0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+    0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0x52, 0x6c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
+    0x00, 0x10, 0xd2, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x2a, 0x82, 0x6e, 0xbf,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+    0x54, 0xcb, 0x94, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x99, 0x3e,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+    0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xcb, 0x14, 0xbf,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x54, 0xcb, 0x14, 0x3f, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
+    0x50, 0x91, 0x63, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
+    0x00, 0xef, 0xc4, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x2e, 0xbc, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
+    0x00, 0x10, 0x52, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x52, 0x6c, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x4a, 0x83, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
+    0x54, 0x91, 0xe3, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+    0x00, 0x6b, 0x90, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+    0xa0, 0x12, 0x75, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
+    0xa8, 0x4c, 0xa6, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0xef, 0xc4, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+    0x2a, 0xfe, 0x39, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+    0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x6b, 0x90, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x00, 0x10, 0xd2, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+    0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0xce, 0xb7, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x4a, 0x83, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
+    0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0xec, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+    0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0x3e,
+    0x55, 0xcb, 0x14, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xd3, 0xfd, 0xbe,
+    0xd4, 0x3a, 0x0e, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x54, 0x70, 0xd6, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x50, 0x0d, 0x2f, 0x3e,
+    0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x00, 0xad, 0xaa, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0xce, 0x37, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0xce, 0x37, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x6b, 0x90, 0xbe, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0x10, 0x52, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+    0xa8, 0xaf, 0xcd, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x10, 0xd2, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xd4, 0x5b, 0x1b, 0x3f,
+    0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xa8, 0xf1, 0xe7, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xcb, 0x94, 0x3e,
+    0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+    0x54, 0xd3, 0xfd, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0x10, 0x52, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
+    0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d,
+    0x54, 0xcb, 0x94, 0x3e, 0xaa, 0x0a, 0x0c, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
+    0x50, 0x4f, 0x49, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0xd5, 0x5b, 0x1b, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd,
+    0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0x50, 0x4f, 0x49, 0x3e, 0x7f, 0x3d, 0x31, 0xbf, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x10, 0xd2, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+    0xaa, 0x2b, 0x19, 0xbf, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+    0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xbc, 0x9f, 0xbf, 0x50, 0x91, 0xe3, 0x3d,
+    0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xd4, 0x42, 0x77, 0xbf,
+    0x00, 0x10, 0x52, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+    0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x6d, 0xb3, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x7f, 0x1c, 0x24, 0xbf, 0x00, 0xad, 0xaa, 0x3e,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+    0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+    0x55, 0xaa, 0x07, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x70, 0xd6, 0x3e,
+    0x2a, 0xbc, 0x1f, 0xbf, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xd4, 0xdf, 0x4f, 0xbf,
+    0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x4a, 0x03, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x54, 0xec, 0xa1, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x31, 0xdf, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x55, 0xec, 0x21, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+    0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0x0d, 0xaf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+    0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xd5, 0x19, 0x01, 0xbf, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe,
+    0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+    0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x54, 0x4f, 0xc9, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x4c, 0x26, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
+    0x00, 0x10, 0xd2, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
+    0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+    0xaa, 0xf1, 0x67, 0xbf, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+    0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x54, 0xec, 0xa1, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0x52, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0x3e,
+    0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+    0x50, 0x91, 0xe3, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+    0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x00, 0xad, 0xaa, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0xd4, 0x5b, 0x1b, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
+    0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00,
+    0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+    0x54, 0x91, 0x63, 0xbf, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
+    0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xfe, 0x39, 0xbf, 0x50, 0x91, 0x63, 0x3e,
+    0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xa8, 0x12, 0x75, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x31, 0xdf, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x56, 0xaa, 0x87, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
+    0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x00, 0x6b, 0x90, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+    0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+    0x00, 0x00, 0x00, 0x00, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+    0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
+    0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x03, 0x3f,
+    0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x7f, 0x3d, 0x31, 0xbf,
+    0x00, 0xce, 0x37, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+    0xd4, 0x19, 0x01, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x54, 0x91, 0xe3, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x00, 0x00, 0x00,
+    0x54, 0xaa, 0x07, 0x3f, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+    0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+    0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x31, 0xdf, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xd4, 0x00, 0x5d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0xaa, 0xaf, 0xcd, 0xbe, 0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x80, 0xda, 0x09, 0xbf, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+    0x54, 0xaa, 0x07, 0x3f, 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x2a, 0xbc, 0x1f, 0xbf,
+    0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0x2f, 0x3e,
+    0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x4a, 0x83, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3e,
+    0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xad, 0x2a, 0x3f,
+    0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
+    0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa8, 0xf1, 0xe7, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xec, 0xa1, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+    0xa0, 0x12, 0x75, 0x3d, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0x00, 0x10, 0x52, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0xd3, 0x7d, 0x3e,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+    0x54, 0x70, 0xd6, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+    0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+    0x56, 0xaa, 0x87, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
+    0x54, 0xb2, 0xf0, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+    0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0x3e,
+    0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
+    0x00, 0x73, 0xf9, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+    0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x52, 0xec, 0x3e,
+    0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+    0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+    0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x4c, 0x26, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+    0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+    0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xd3, 0x7d, 0x3e,
+    0xd5, 0x3a, 0x0e, 0xbf, 0x54, 0xb2, 0xf0, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+    0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xd5, 0x3a, 0x0e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0xda, 0x09, 0x3f,
+    0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x8c, 0x9d, 0xbd, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+    0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+    0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+    0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
+    0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+    0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x70, 0xd6, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+    0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
+    0x00, 0x8c, 0x9d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+    0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x6d, 0x33, 0xbf,
+    0x00, 0x8c, 0x1d, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+    0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x6d, 0xb3, 0x3e, 0xd4, 0x21, 0x6a, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
+    0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x55, 0x0d, 0x2f, 0xbf,
+    0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x00, 0x00, 0x00,
+    0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xe2, 0x72, 0xbf, 0x00, 0x10, 0xd2, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0xec, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x52, 0x6c, 0x3e,
+    0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x50, 0x0d, 0x2f, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0xce, 0xb7, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+    0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
+    0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x54, 0x70, 0xd6, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
+    0x54, 0xec, 0xa1, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x12, 0x75, 0x3e,
+    0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+    0x7f, 0x5e, 0x3e, 0xbf, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+    0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x55, 0xec, 0x21, 0xbf,
+    0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+    0x00, 0xce, 0xb7, 0x3e, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+    0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0xda, 0x3e,
+    0x54, 0x70, 0xd6, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0x00, 0x10, 0x52, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+    0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+    0x00, 0xce, 0x37, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xff, 0x8b, 0x1d, 0xbf,
+    0x00, 0xce, 0x37, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+    0x56, 0xaa, 0x87, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x00, 0x10, 0x52, 0x3d, 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0xaa, 0x0a, 0x8c, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0xce, 0x37, 0x3e, 0x55, 0xcb, 0x14, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
+    0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+    0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+    0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+    0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+    0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x12, 0xf5, 0x3e,
+    0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
+    0xa0, 0x12, 0x75, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
+    0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0x00, 0x10, 0x52, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+    0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+    0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x1d, 0x3f, 0xaa, 0x8e, 0xc0, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
+    0xaa, 0x6d, 0xb3, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+    0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
+    0x58, 0xd3, 0x7d, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
+    0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+    0x60, 0x0d, 0x2f, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+    0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0x00, 0x10, 0xd2, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+    0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
+    0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xa8, 0x0a, 0x8c, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+    0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc,
+    0x00, 0x4a, 0x03, 0xbe, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+    0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+    0x00, 0x4a, 0x83, 0x3e, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+    0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+    0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+    0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+    0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+    0xc0, 0x01, 0x80, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+    0x00, 0x10, 0x52, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
+    0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+    0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+    0x54, 0xcb, 0x94, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+    0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x4f, 0x49, 0x3e,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0xb2, 0xf0, 0xbe,
+    0x00, 0x10, 0xd2, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x10, 0x52, 0x3e,
+    0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e,
+    0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+    0x00, 0x10, 0xd2, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x0a, 0x0c, 0xbe,
+    0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+    0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+    0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+    0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+    0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d,
+    0x80, 0x0a, 0x0c, 0x3c, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
+    0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x2a, 0x7a, 0x05, 0xbf,
+    0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+    0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+    0x00, 0x4a, 0x03, 0x3f, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+    0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+    0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+    0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+    0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+    0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+    0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+    0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+    0x58, 0xd3, 0x7d, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+    0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+    0x00, 0xce, 0x37, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+    0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+    0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+    0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xd5, 0x5b, 0x1b, 0xbf,
+    0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+    0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+    0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+    0x54, 0xcb, 0x94, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+    0x54, 0x4f, 0xc9, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
+    0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+    0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+    0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+    0x60, 0x0d, 0x2f, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
+    0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+    0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+    0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+    0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+    0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xff, 0xac, 0x2a, 0xbf,
+    0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x6b, 0x10, 0xbf,
+    0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+    0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
+    0x00, 0xce, 0xb7, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+    0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
+    0x50, 0x91, 0x63, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+    0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd,
+    0x00, 0x10, 0x52, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+    0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0x3e,
+    0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+    0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
+    0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+    0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+    0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x90, 0xbe,
+    0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+    0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+    0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+    0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+    0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+    0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+    0x00, 0x6b, 0x90, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0xa8, 0x0a, 0x0c, 0x3e,
+    0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+    0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+    0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+}};
+const int32_t dnn_logits_bias__6__cf__6_shape[1] = {1};
+const union {
+  uint8_t bytes[4];
+  float values[1];
+} dnn_logits_bias__6__cf__6 = {{
+    0xa9,
+    0x35,
+    0x05,
+    0xc0,
+}};
+const int32_t dnn_logits_kernel__7__cf__7_shape[2] = {59, 1};
+const union {
+  uint8_t bytes[236];
+  float values[59];
+} dnn_logits_kernel__7__cf__7 = {{
+    0xd8, 0x84, 0x02, 0xbd, 0x58, 0x41, 0x31, 0xbd, 0x32, 0x3a, 0x83, 0x3d,
+    0xce, 0xa0, 0x16, 0xbc, 0xe3, 0xc6, 0xa3, 0x3d, 0x2d, 0x19, 0x03, 0x3d,
+    0x10, 0x9f, 0x8d, 0xbd, 0xac, 0x19, 0x93, 0x3d, 0xdf, 0xbe, 0x87, 0xbd,
+    0xab, 0x00, 0x83, 0x3d, 0xe6, 0x8b, 0x76, 0xbd, 0x37, 0xf7, 0xa5, 0xbd,
+    0x8e, 0x55, 0xb9, 0x3d, 0x48, 0xc0, 0xe2, 0xbb, 0x2c, 0x10, 0x6c, 0x3d,
+    0x9f, 0x14, 0x19, 0xbb, 0x29, 0x15, 0xa6, 0xbd, 0x46, 0xb5, 0xb7, 0xbd,
+    0x5c, 0xf3, 0xf9, 0x3c, 0x12, 0xde, 0x23, 0x3e, 0x65, 0x28, 0x83, 0xbd,
+    0x0e, 0xbb, 0x2e, 0x3d, 0x51, 0x53, 0x11, 0x3d, 0xf9, 0xf7, 0xd8, 0xbd,
+    0x6b, 0x71, 0xec, 0x3d, 0xa0, 0xce, 0xa5, 0xbd, 0xa2, 0xd8, 0xcd, 0xbd,
+    0x6d, 0xda, 0x78, 0x3d, 0xfb, 0x74, 0x85, 0x3e, 0x36, 0x7b, 0x9e, 0x3b,
+    0x05, 0xc9, 0x6b, 0xbd, 0x52, 0x47, 0xda, 0x3d, 0x89, 0x6d, 0x36, 0xbc,
+    0x1f, 0x34, 0x03, 0xbd, 0x43, 0x68, 0xa6, 0x3d, 0xfa, 0xfd, 0x58, 0x3d,
+    0x92, 0x07, 0x53, 0xbb, 0xca, 0xbd, 0x2f, 0xbd, 0xb1, 0x63, 0xd7, 0x3d,
+    0x8b, 0x63, 0xf4, 0x3d, 0xf2, 0x5c, 0xd3, 0x3d, 0xb4, 0xb3, 0x00, 0x3e,
+    0x3c, 0xb2, 0x45, 0xbd, 0x15, 0xbb, 0x9e, 0x3d, 0x2e, 0xab, 0xc8, 0xbd,
+    0x9a, 0xad, 0x99, 0xbc, 0xac, 0xf6, 0x54, 0xbd, 0x7f, 0xf9, 0xa0, 0x3d,
+    0x54, 0xa4, 0xc1, 0x3d, 0xb8, 0x08, 0xb9, 0xbd, 0x0d, 0x84, 0xd1, 0xbc,
+    0x8a, 0x8d, 0x3b, 0x3d, 0xe0, 0x7d, 0xd3, 0xbc, 0xf7, 0xea, 0xfa, 0x3c,
+    0xb2, 0x30, 0x89, 0xbd, 0xbc, 0x6e, 0x8e, 0xbd, 0x80, 0x70, 0x74, 0x3d,
+    0xaf, 0x25, 0x86, 0x3d, 0x99, 0x50, 0x8b, 0x3d,
+}};
+
+}  // anonymous namespace
+
+// -----------------------------------------------------------------------------
+// INFERENCE
+// -----------------------------------------------------------------------------
+
+int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2] = {1,
+                                                                         173};
+int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2] = {1, 1};
+namespace internal_onedevice {
+void Inference(
+    const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
+    ,
+    float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
+                                                                       1,1 */
+    ,
+    FixedAllocations* __restrict fixed) {
+  const int32_t input_from_feature_columns_input_layer_concat_concat0_shape[] =
+      {1, 173};
+
+#if OP_LIB_BENCHMARK
+  Singleton<PerOpTimings>::get()->Reset();
+#endif
+
+  // dnn/hiddenlayer_0/MatMul_merged_with_dnn/hiddenlayer_0/BiasAdd
+  FullyConnected<float>(
+      input_from_feature_columns_input_layer_concat_concat0_shape,
+      input_from_feature_columns_input_layer_concat_concat0,
+      dnn_hiddenlayer_0_kernel__1__cf__1_shape,
+      dnn_hiddenlayer_0_kernel__1__cf__1.values,
+      dnn_hiddenlayer_0_bias__0__cf__0_shape,
+      dnn_hiddenlayer_0_bias__0__cf__0.values, fixed->alloc0);
+
+  fixed->shape0[0] = 1;
+  fixed->shape0[1] = 117;
+
+  // dnn/hiddenlayer_0/Relu
+  Relu<float>(2,  // rank
+              fixed->shape0, fixed->alloc0, fixed->alloc0);
+
+  // dnn/hiddenlayer_1/MatMul_merged_with_dnn/hiddenlayer_1/BiasAdd
+  FullyConnected<float>(fixed->shape0, fixed->alloc0,
+                        dnn_hiddenlayer_1_kernel__3__cf__3_shape,
+                        dnn_hiddenlayer_1_kernel__3__cf__3.values,
+                        dnn_hiddenlayer_1_bias__2__cf__2_shape,
+                        dnn_hiddenlayer_1_bias__2__cf__2.values, fixed->alloc1);
+
+  fixed->shape0[0] = 1;
+  fixed->shape0[1] = 115;
+
+  // dnn/hiddenlayer_1/Relu
+  Relu<float>(2,  // rank
+              fixed->shape0, fixed->alloc1, fixed->alloc1);
+
+  // dnn/hiddenlayer_2/MatMul_merged_with_dnn/hiddenlayer_2/BiasAdd
+  FullyConnected<float>(fixed->shape0, fixed->alloc1,
+                        dnn_hiddenlayer_2_kernel__5__cf__5_shape,
+                        dnn_hiddenlayer_2_kernel__5__cf__5.values,
+                        dnn_hiddenlayer_2_bias__4__cf__4_shape,
+                        dnn_hiddenlayer_2_bias__4__cf__4.values, fixed->alloc0);
+
+  fixed->shape0[0] = 1;
+  fixed->shape0[1] = 59;
+
+  // dnn/hiddenlayer_2/Relu
+  Relu<float>(2,  // rank
+              fixed->shape0, fixed->alloc0, fixed->alloc0);
+
+  // dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd
+  FullyConnected<float>(
+      fixed->shape0, fixed->alloc0, dnn_logits_kernel__7__cf__7_shape,
+      dnn_logits_kernel__7__cf__7.values, dnn_logits_bias__6__cf__6_shape,
+      dnn_logits_bias__6__cf__6.values,
+      logits_MatMul_merged_with_dnn_logits_BiasAdd0);
+
+#if OP_LIB_BENCHMARK
+  Singleton<PerOpTimings>::get()->WriteTimingsToInfoLog();
+#endif
+}
+}  // namespace internal_onedevice
+}  // namespace ui::v2
diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h
new file mode 100644
index 0000000..733d0bd
--- /dev/null
+++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+// Code generated by tf.native.
+#ifndef UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
+#define UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
+#include <cstdint>
+
+namespace ui::v2::internal_onedevice {
+struct alignas(16) FixedAllocations {
+  float alloc0[117];
+  float alloc1[115];
+  int32_t shape0[2];
+};
+
+extern int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2];
+extern int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2];
+
+#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_RANK_V2 \
+  2
+#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM0_SIZE_V2 \
+  1
+#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM1_SIZE_V2 \
+  173
+#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_RANK_V2 2
+#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM0_SIZE_V2 \
+  1
+#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM1_SIZE_V2 \
+  1
+
+void Inference(
+    const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
+    ,
+    float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
+                                                                       1,1 */
+    ,
+    FixedAllocations* __restrict fixed);
+
+}  // namespace ui::v2::internal_onedevice
+#endif  // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
index 47341cf..97dce11 100644
--- a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
+++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
@@ -16,8 +16,11 @@
 #include <utility>
 #include <vector>
 
+#include "base/feature_list.h"
 #include "base/logging.h"
 #include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h"
+#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h"
+#include "ui/events/ozone/features.h"
 #define USE_EIGEN 0
 
 namespace ui {
@@ -25,10 +28,9 @@
 float OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Inference(
     const std::vector<float>& features) const {
   DVLOG(1) << "In Inference.";
-  std::unique_ptr<internal_onedevice::FixedAllocations> fixed_allocations(
-      new internal_onedevice::FixedAllocations());
-  if (features.size() != 323) {
-    LOG(DFATAL) << "Bad count. Is " << features.size() << " expected " << 323;
+  if (features.size() != expected_feature_size_) {
+    LOG(DFATAL) << "Bad count. Is " << features.size() << " expected "
+                << expected_feature_size_;
     return nanf("");
   }
   // TODO(robsc): Update to DVLOG_IS_ON if relevant.
@@ -38,7 +40,17 @@
     }
   }
   float output = 0;
-  internal_onedevice::Inference(&features[0], &output, fixed_allocations.get());
+  if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) {
+    std::unique_ptr<v2::internal_onedevice::FixedAllocations> fixed_allocations(
+        new v2::internal_onedevice::FixedAllocations());
+    v2::internal_onedevice::Inference(&features[0], &output,
+                                      fixed_allocations.get());
+  } else {
+    std::unique_ptr<internal_onedevice::FixedAllocations> fixed_allocations(
+        new internal_onedevice::FixedAllocations());
+    internal_onedevice::Inference(&features[0], &output,
+                                  fixed_allocations.get());
+  }
   return output;
 }
 
@@ -49,17 +61,34 @@
 
 OneDeviceTrainNeuralStylusPalmDetectionFilterModel::
     OneDeviceTrainNeuralStylusPalmDetectionFilterModel() {
-  config_.nearest_neighbor_count = 0;
-  config_.biggest_near_neighbor_count = 4;
+  // Common configurations:
   config_.include_sequence_count_in_strokes = true;
   config_.max_neighbor_distance_in_mm = 100.0f;
-  config_.min_sample_count = 5;
-  config_.max_sample_count = 12;
   config_.max_dead_neighbor_time = base::Milliseconds(100.0f);
   config_.heuristic_palm_touch_limit = 20.0f;
   config_.heuristic_palm_area_limit = 400.0f;
   config_.max_blank_time = base::Milliseconds(100.0f);
-  config_.output_threshold = 1.2885f;
+  config_.nearest_neighbor_count = 0;
+  config_.biggest_near_neighbor_count = 4;
+
+  if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) {
+    config_.min_sample_count = 3;
+    config_.max_sample_count = 6;
+    config_.neighbor_min_sample_count = 1;
+    config_.output_threshold = 0.90271f;
+    expected_feature_size_ = 173;
+
+    if (base::FeatureList::IsEnabled(kEnableNeuralPalmAdaptiveHold)) {
+      config_.nn_delay_start_if_palm = true;
+      config_.early_stage_sample_counts = std::unordered_set<uint32_t>({2});
+    }
+  } else {
+    config_.min_sample_count = 5;
+    config_.max_sample_count = 12;
+    config_.neighbor_min_sample_count = 5;
+    config_.output_threshold = 1.2885f;
+    expected_feature_size_ = 323;
+  }
 }
 
 OneDeviceTrainNeuralStylusPalmDetectionFilterModel::
diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
index 874fdd3..a058d71a 100644
--- a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
+++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
@@ -33,6 +33,7 @@
 
  private:
   NeuralStylusPalmDetectionFilterModelConfig config_;
+  size_t expected_feature_size_;
 };
 
 }  // namespace ui
diff --git a/ui/events/ozone/features.cc b/ui/events/ozone/features.cc
index 61c8dce..0297d76a 100644
--- a/ui/events/ozone/features.cc
+++ b/ui/events/ozone/features.cc
@@ -12,6 +12,12 @@
 const base::Feature kEnableNeuralPalmDetectionFilter{
     "EnableNeuralPalmDetectionFilter", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kEnableNeuralPalmAdaptiveHold{
+    "EnableNeuralPalmAdaptiveHold", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kEnableNeuralPalmRejectionModelV2{
+    "EnableNeuralPalmRejectionModelV2", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kEnableNeuralStylusReportFilter{
     "EnableNeuralStylusReportFilter", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/ui/events/ozone/features.h b/ui/events/ozone/features.h
index ae74cf03..6abe3e4f 100644
--- a/ui/events/ozone/features.h
+++ b/ui/events/ozone/features.h
@@ -17,6 +17,12 @@
 extern const base::Feature kEnableNeuralPalmDetectionFilter;
 
 COMPONENT_EXPORT(EVENTS_OZONE)
+extern const base::Feature kEnableNeuralPalmAdaptiveHold;
+
+COMPONENT_EXPORT(EVENTS_OZONE)
+extern const base::Feature kEnableNeuralPalmRejectionModelV2;
+
+COMPONENT_EXPORT(EVENTS_OZONE)
 extern const base::Feature kEnableNeuralStylusReportFilter;
 
 COMPONENT_EXPORT(EVENTS_OZONE)
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
index da65ca9a..a1106d4 100644
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
@@ -826,6 +826,11 @@
       {{DomCode::LAUNCH_CONTROL_PANEL, EF_NONE}, VKEY_SETTINGS},
       {{DomCode::PRIVACY_SCREEN_TOGGLE, EF_NONE}, VKEY_PRIVACY_SCREEN_TOGGLE},
       {{DomCode::MICROPHONE_MUTE_TOGGLE, EF_NONE}, VKEY_MICROPHONE_MUTE_TOGGLE},
+      {{DomCode::EMOJI_PICKER, EF_NONE}, VKEY_EMOJI_PICKER},
+      {{DomCode::DICTATE, EF_NONE}, VKEY_DICTATE},
+      // Verify the AC Application keys.
+      {{DomCode::NEW, EF_NONE}, VKEY_NEW},
+      {{DomCode::CLOSE, EF_NONE}, VKEY_CLOSE},
       // Verify that number pad digits produce located VKEY codes.
       {{DomCode::NUMPAD0, EF_NONE, XKB_KEY_KP_0, '0'}, VKEY_NUMPAD0},
       {{DomCode::NUMPAD9, EF_NONE, XKB_KEY_KP_9, '9'}, VKEY_NUMPAD9},
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index 49b32d2..84b9ce0d 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -418,10 +418,6 @@
   cursor: default;
 }
 
-div.splitter.splitter-active .splitter-button:hover {
-  --hover-bg-color: none;
-}
-
 html.col-resize div.splitter:not(.splitter-active) .splitter-button:hover {
   --hover-bg-color: none;
 }
@@ -431,10 +427,14 @@
   cursor: default;
 }
 
-div.splitter.splitter-active .splitter-button:not(:active) {
+div.splitter.splitter-active .splitter-button:active:not(:hover) {
   background-color: var(--cros-ripple-color);
 }
 
+div.splitter.splitter-active .splitter-button:not(:active) {
+  background-color: var(--cros-icon-button-pressed-color);
+}
+
 div.splitter .splitter-button .icon {
   -webkit-mask-image: url(../images/common/dragger.svg);
   -webkit-mask-position: center;
diff --git a/ui/file_manager/file_manager/foreground/css/menu.css b/ui/file_manager/file_manager/foreground/css/menu.css
index cc04b62..567517f 100644
--- a/ui/file_manager/file_manager/foreground/css/menu.css
+++ b/ui/file_manager/file_manager/foreground/css/menu.css
@@ -46,19 +46,23 @@
 }
 
 cr-menu > [sub-menu]::after {
-  color: var(--cros-menu-shortcut-color);
-  content: '▶' / '';
+  -webkit-mask-image: url(../images/files/ui/arrow_right.svg);
+  -webkit-mask-position: center;
+  -webkit-mask-repeat: no-repeat;
+  background-color: var(--cros-icon-color-primary);
+  content: '';
   float: right;
-  font-size: 0.7em;
+  height: 32px;
+  width: 20px;
 }
 
 html[dir='rtl'] cr-menu > [sub-menu]::after {
-  content: '◀' / '';
   float: left;
+  transform: scaleX(-1);
 }
 
 cr-menu > [sub-menu][disabled]::after {
-  color: var(--cros-text-color-disabled);
+  background-color: var(--cros-text-color-disabled);
 }
 
 /* Keeps menu visibile while animating. Fade out animation is performed by
diff --git a/ui/file_manager/file_manager/foreground/js/BUILD.gn b/ui/file_manager/file_manager/foreground/js/BUILD.gn
index ad9a989..126698b 100644
--- a/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -792,7 +792,9 @@
 js_library("file_type_filters_controller") {
   deps = [
     ":directory_model",
+    "//ui/file_manager/file_manager/common/js:metrics",
     "//ui/file_manager/file_manager/common/js:util",
+    "//ui/file_manager/file_manager/externs:directory_change_event",
     "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
   ]
 }
@@ -803,7 +805,10 @@
     ":file_type_filters_controller",
     "//chrome/test/data/webui:chai_assert",
     "//ui/file_manager/file_manager/common/js:files_app_entry_types",
+    "//ui/file_manager/file_manager/common/js:metrics",
+    "//ui/file_manager/file_manager/common/js:mock_chrome",
     "//ui/file_manager/file_manager/common/js:volume_manager_types",
+    "//ui/file_manager/file_manager/externs:directory_change_event",
     "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
     "//ui/webui/resources/js:load_time_data.m",
     "//ui/webui/resources/js/cr:event_target.m",
diff --git a/ui/file_manager/file_manager/foreground/js/file_type_filters_controller.js b/ui/file_manager/file_manager/foreground/js/file_type_filters_controller.js
index 069c66a..038b77e5 100644
--- a/ui/file_manager/file_manager/foreground/js/file_type_filters_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/file_type_filters_controller.js
@@ -2,7 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {metrics} from '../../common/js/metrics.js';
 import {str, util} from '../../common/js/util.js';
+import {DirectoryChangeEvent} from '../../externs/directory_change_event.js';
 import {FakeEntry} from '../../externs/files_app_entry_interfaces.js';
 
 import {DirectoryModel} from './directory_model.js';
@@ -75,6 +77,29 @@
   }
 
   /**
+   * @param {chrome.fileManagerPrivate.RecentFileType} fileType File type filter
+   *     which needs to be recorded.
+   * @private
+   */
+  recordFileTypeFilterUMA_(fileType) {
+    /**
+     * Keep the order of this in sync with FileManagerRecentFilterType in
+     * tools/metrics/histograms/enums.xml.
+     * The array indices will be recorded in UMA as enum values. The index for
+     * each filter type should never be renumbered nor reused in this array.
+     */
+    const FileTypeFiltersForUMA =
+        /** @type {!Array<!chrome.fileManagerPrivate.RecentFileType>} */ ([
+          chrome.fileManagerPrivate.RecentFileType.ALL,    // 0
+          chrome.fileManagerPrivate.RecentFileType.AUDIO,  // 1
+          chrome.fileManagerPrivate.RecentFileType.IMAGE,  // 2
+          chrome.fileManagerPrivate.RecentFileType.VIDEO,  // 3
+        ]);
+    Object.freeze(FileTypeFiltersForUMA);
+    metrics.recordEnum('Recent.FilterByType', fileType, FileTypeFiltersForUMA);
+  }
+
+  /**
    * Creates filter button's UI element.
    * @param {string} label Label of the filter button.
    * @param {chrome.fileManagerPrivate.RecentFileType} fileType File type filter
@@ -100,8 +125,10 @@
    * @private
    */
   onCurrentDirectoryChanged_(event) {
+    const directoryChangeEvent = /** @type {!DirectoryChangeEvent} */ (event);
     // We show filter buttons only in Recents view at this moment.
-    this.container_.hidden = !(event.newDirEntry == this.recentEntry_);
+    this.container_.hidden =
+        !(directoryChangeEvent.newDirEntry == this.recentEntry_);
   }
 
   /**
@@ -110,7 +137,7 @@
    * @private
    */
   onFilterButtonClicked_(event) {
-    const {target} = event;
+    const target = /** @type {HTMLButtonElement} */ (event.target);
     // At least one filter button should be selected, so we don't allow user to
     // unselect a filter button by clicking it, e.g. do nothing if an active
     // filter button is clicked.
@@ -124,6 +151,7 @@
     // Refresh current directory with the updated Recent setting.
     // We don't need to invalidate the cached metadata for this rescan.
     this.directoryModel_.rescan(false);
+    this.recordFileTypeFilterUMA_(newFilter);
   }
 
   /**
diff --git a/ui/file_manager/file_manager/foreground/js/file_type_filters_controller_unittest.m.js b/ui/file_manager/file_manager/foreground/js/file_type_filters_controller_unittest.m.js
index 3326f66..41f911d 100644
--- a/ui/file_manager/file_manager/foreground/js/file_type_filters_controller_unittest.m.js
+++ b/ui/file_manager/file_manager/foreground/js/file_type_filters_controller_unittest.m.js
@@ -7,8 +7,10 @@
 import {assertEquals, assertFalse, assertTrue} from 'chrome://test/chai_assert.js';
 
 import {EntryList, FakeEntryImpl} from '../../common/js/files_app_entry_types.js';
+import {metrics} from '../../common/js/metrics.js';
 import {installMockChrome} from '../../common/js/mock_chrome.js';
 import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js';
+import {DirectoryChangeEvent} from '../../externs/directory_change_event.js';
 import {FakeEntry} from '../../externs/files_app_entry_interfaces.js';
 
 import {DirectoryModel} from './directory_model.js';
@@ -39,6 +41,14 @@
  */
 let fileTypeFiltersController;
 
+/**
+ * Mock metrics.
+ * @param {string} name
+ * @param {*} value
+ * @param {Array<*>|number=} opt_validValues
+ */
+metrics.recordEnum = function(name, value, opt_validValues) {};
+
 export function setUp() {
   // Mock loadTimeData strings.
   loadTimeData.resetForTesting({
@@ -87,7 +97,7 @@
       this.currentDirEntry = dirEntry;
 
       // Emit 'directory-changed' event synchronously to simplify testing.
-      const event = new Event('directory-changed');
+      const event = new DirectoryChangeEvent('directory-changed');
       event.previousDirEntry = previousDirEntry;
       event.newDirEntry = this.currentDirEntry;
       this.dispatchEvent(event);
diff --git a/ui/gfx/ca_layer_result.h b/ui/gfx/ca_layer_result.h
index c9df6124..5e0e08a3 100644
--- a/ui/gfx/ca_layer_result.h
+++ b/ui/gfx/ca_layer_result.h
@@ -49,7 +49,9 @@
   kCALayerFailedCopyRequests = 31,
   kCALayerFailedOverlayDisabled = 32,
   kCALayerFailedVideoCaptureEnabled = 33,
-  kMaxValue = kCALayerFailedVideoCaptureEnabled,
+  kCALayerUnknownDidNotSwap = 34,  // For gpu_bench_marking only
+  kCALayerUnknownNoWidget = 35,    // For gpu_bench_marking only
+  kMaxValue = kCALayerUnknownNoWidget,
 };
 }  // namespace gfx
 
diff --git a/ui/gfx/mojom/ca_layer_result.mojom b/ui/gfx/mojom/ca_layer_result.mojom
index e07c70d..e77c4c19 100644
--- a/ui/gfx/mojom/ca_layer_result.mojom
+++ b/ui/gfx/mojom/ca_layer_result.mojom
@@ -41,4 +41,3 @@
   kCALayerFailedOverlayDisabled = 32,
   kCALayerFailedVideoCaptureEnabled = 33,
 };
-
diff --git a/ui/gfx/mojom/ca_layer_result_mojom_traits.cc b/ui/gfx/mojom/ca_layer_result_mojom_traits.cc
index 88506a7..686f3e90 100644
--- a/ui/gfx/mojom/ca_layer_result_mojom_traits.cc
+++ b/ui/gfx/mojom/ca_layer_result_mojom_traits.cc
@@ -66,6 +66,12 @@
       return gfx::mojom::CALayerResult::kCALayerFailedOverlayDisabled;
     case gfx::kCALayerFailedVideoCaptureEnabled:  // = 33,
       return gfx::mojom::CALayerResult::kCALayerFailedVideoCaptureEnabled;
+    case gfx::kCALayerUnknownDidNotSwap:  // = 34,
+      NOTREACHED();
+      return gfx::mojom::CALayerResult::kCALayerFailedUnknown;
+    case gfx::kCALayerUnknownNoWidget:  // = 35,
+      NOTREACHED();
+      return gfx::mojom::CALayerResult::kCALayerFailedUnknown;
   }
 
   NOTREACHED() << "CALayer result:" << ca_layer_error_code;
@@ -161,6 +167,7 @@
       *out = gfx::kCALayerFailedVideoCaptureEnabled;
       return true;
   }
+
   NOTREACHED() << "Invalid CALayer result: " << input;
   return false;
 }
diff --git a/ui/gfx/range/range.cc b/ui/gfx/range/range.cc
index 2776f3d7..699040e7 100644
--- a/ui/gfx/range/range.cc
+++ b/ui/gfx/range/range.cc
@@ -6,8 +6,6 @@
 
 #include <inttypes.h>
 
-#include <algorithm>
-
 #include "base/strings/stringprintf.h"
 
 namespace gfx {
diff --git a/ui/gfx/range/range.h b/ui/gfx/range/range.h
index 239cd15..b3708e4 100644
--- a/ui/gfx/range/range.h
+++ b/ui/gfx/range/range.h
@@ -8,6 +8,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <algorithm>
 #include <limits>
 #include <ostream>
 #include <string>
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.h b/ui/views/cocoa/native_widget_mac_ns_window_host.h
index 03c2f1a9..1964f62 100644
--- a/ui/views/cocoa/native_widget_mac_ns_window_host.h
+++ b/ui/views/cocoa/native_widget_mac_ns_window_host.h
@@ -490,6 +490,7 @@
   bool is_miniaturized_ = false;
   bool is_window_key_ = false;
   bool is_mouse_capture_active_ = false;
+  bool is_headless_mode_window_ = false;
   gfx::Rect window_bounds_before_fullscreen_;
 
   // Weak pointers to event monitors for this widget. The event monitors
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
index 946de81..b77478d9 100644
--- a/ui/views/cocoa/native_widget_mac_ns_window_host.mm
+++ b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -393,6 +393,8 @@
     window_params->modal_type = widget->widget_delegate()->GetModalType();
     window_params->is_translucent =
         params.opacity == Widget::InitParams::WindowOpacity::kTranslucent;
+    window_params->is_headless_mode_window = params.headless_mode;
+    is_headless_mode_window_ = params.headless_mode;
 
     // OSX likes to put shadows on most things. However, frameless windows (with
     // styleMask = NSBorderlessWindowMask) default to no shadow. So change that.
@@ -541,10 +543,12 @@
   compositor_->compositor()->SetRootLayer(layer());
 
   // The compositor is locked (prevented from producing frames) until the widget
-  // is made visible.
+  // is made visible unless the window was created in headless mode in which
+  // case it will never become visible but we want its compositor to produce
+  // frames for screenshooting and screencasting.
   UpdateCompositorProperties();
   layer()->SetVisible(is_visible_);
-  if (is_visible_)
+  if (is_visible_ || is_headless_mode_window_)
     compositor_->Unsuspend();
 
   // Register the CGWindowID (used to identify this window for video capture)
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index eeb1b978..a5718171 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -390,6 +390,9 @@
     // If set, mouse events will be sent to the widget even if inactive.
     bool wants_mouse_events_when_inactive = false;
 
+    // If set, the widget was created in headless mode.
+    bool headless_mode = false;
+
     // Contains any properties with which the native widget should be
     // initialized prior to adding it to the window hierarchy. All the
     // properties in |init_properties_container| will be moved to the native