diff --git a/DEPS b/DEPS
index 5e386c6..98e35bd 100644
--- a/DEPS
+++ b/DEPS
@@ -142,7 +142,7 @@
   # 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': '8034ecbaa47488bb1ca89785bb13d5fa2cee8f01',
+  'v8_revision': 'd32b1ad164ec906d80c8d637611852347b8f812a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -154,7 +154,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '900e1dac1b2da6fae567e8e2da7a36f7b2cbd625',
+  'swiftshader_revision': 'e899321b0bf7f8ebcab4a5b4e562474701829b75',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -201,7 +201,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': 'ab176bd6b58cc828cafb73a86dac354947bbf998',
+  'catapult_revision': '304e5101f38227ea858688612e7bef77a9a35aae',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -217,7 +217,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.
-  'feed_revision': 'd8b173e83ca88bafc9d69339f939604886f4d583',
+  'feed_revision': '5708e2dcfff432c1fe4106b876813a7205e32ea0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_build-tools_version
   # and whatever else without interference from each other.
@@ -269,7 +269,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.
-  'shaderc_revision': 'b3523d57461c1460af68dbd6bec1e8dd5c7ce2e7',
+  'shaderc_revision': '16f6e6ab932f4fe99dd96131af8c9cc6af226cdc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -292,7 +292,7 @@
   # revisions.
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:8c7f49102234f4f4b9349dcb258554675475e596',
+  'gn_version': 'git_revision:972ed755f8e6d31cae9ba15fcd08136ae1a7886f',
 
   # Also, if you change these, update buildtools/DEPS too. Also update the
   # libc++ svn_revision in //buildtools/deps_revisions.gni.
@@ -633,7 +633,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_build_tools/aapt2',
-              'version': 'j6U3mv7-KG3PSDtVvTwycWzjwvFR1_sSdA540AYxpucC',
+              'version': 'version:3.6.0-alpha03-5516695-cr0',
           },
       ],
       'condition': 'checkout_android',
@@ -807,7 +807,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ec964f7b30c8c4066df0447c71540778d0ddd38b',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f2482cb0559075fe480ba2573a17c6d0066eb041',
       'condition': 'checkout_linux',
   },
 
@@ -1187,7 +1187,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'a7344dc0fbc749429c3a5253ec825a5f2f1ccecc',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '79519d67783bc8e59cca6a70848c153363883221',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1355,7 +1355,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '8f7b41afd885dd55b445d36d41e126d92a14df35',
+    Var('webrtc_git') + '/src.git' + '@' + 'f4996d436060f2956549833d9564d680fd68a487',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1396,7 +1396,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d70229338697af120b79d4f82287d8739a53be33',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e3905cd79dbe3503c306ce0fd851c120220347d1',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 476a861..b5b766b 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -1110,7 +1110,6 @@
     deps = upstream_only_webview_deps
     apk_name = "SystemWebView"
     min_sdk_version = 21
-    target_sdk_version = 28
   }
 
   android_resource_sizes_test("resource_sizes_system_webview_apk") {
@@ -1123,6 +1122,10 @@
   system_webview_apk_tmpl("trichrome_webview_apk") {
     android_manifest = trichrome_webview_android_manifest
     android_manifest_dep = ":trichrome_webview_manifest"
+
+    # TODO(torne): make minsdk=Q once we no longer build hacky P version
+    min_sdk_version = android_sdk_version
+
     deps = upstream_only_webview_deps
     apk_name = "TrichromeWebView"
     use_trichrome_library = true
@@ -1137,6 +1140,10 @@
   system_webview_apk_tmpl("trichrome_webview_for_bundle_apk") {
     android_manifest = trichrome_webview_android_manifest
     android_manifest_dep = ":trichrome_webview_manifest"
+
+    # TODO(torne): make minsdk=Q once we no longer build hacky P version
+    min_sdk_version = android_sdk_version
+
     deps = upstream_only_webview_deps
     apk_name = "TrichromeWebViewForBundle"
     use_trichrome_library = true
diff --git a/android_webview/docs/commandline-flags.md b/android_webview/docs/commandline-flags.md
index 94d0e6713..2bb1946 100644
--- a/android_webview/docs/commandline-flags.md
+++ b/android_webview/docs/commandline-flags.md
@@ -8,43 +8,68 @@
 production builds of Android.
 ***
 
-WebView reads flags from a specific file during startup. To enable flags, write
-to the file with:
+WebView reads flags from a specific file on the device as part of the startup
+sequence. Therefore, it's important to always **kill the WebView-based app**
+you're examining after modifying commandline flags, to ensure the flags are
+picked up during the next app restart.
+
+WebView always looks for the same file on the device
+(`/data/local/tmp/webview-command-line`), regardless of which package is the
+[the WebView provider](prerelease.md).
+
+### Python script
+
+The simplest way to set WebView flags is with the dedicated python script. This
+works regardless of which package is the WebView provider:
 
 ```sh
 # Overwrite flags (supports multiple)
-build/android/adb_system_webview_command_line \
-    --show-composited-layer-borders \
-    --log-net-log=foo.json
+build/android/adb_system_webview_command_line --show-composited-layer-borders --webview-log-js-console-messages
 # Clear flags
 build/android/adb_system_webview_command_line ""
 # Print flags
 build/android/adb_system_webview_command_line
 ```
 
-Or, for a locally compiled APK:
+### Generated Wrapper Script
+
+If you have a locally compiled APK, you may instead set flags using the
+Generated Wrapper Script like so:
 
 ```sh
 autoninja -C out/Default system_webview_apk
 # Overwrite flags (supports multiple)
-out/Default/bin/system_webview_apk argv --args='--show-composited-layer-borders --log-net-log=foo.json'
+out/Default/bin/system_webview_apk argv --args='--show-composited-layer-borders --webview-log-js-console-messages'
 # Clear flags
 out/Default/bin/system_webview_apk argv --args=''
 # Print flags
 out/Default/bin/system_webview_apk argv
 ```
 
+*** note
+**Note:** be careful if using a `monochrome_*` target, as the Generated Wrapper
+Script writes to Chrome browser's flags file, and WebView **will not pick up
+these flags**. If using Monochrome, you can set flags with the
+`system_webview_*` Generated Wrapper Scripts, or use one of the other methods
+in this doc.
+***
+
+### Manual
+
 Or, you can use the `adb` in your `$PATH` like so:
 
 ```sh
 FLAG_FILE=/data/local/tmp/webview-command-line
-# Overwrite flags
-adb shell "echo '_ --show-composited-layer-borders' > ${FLAG_FILE}"
-# The first token is ignored. We use '_' as a convenient placeholder, but any
-# token is acceptable.
+# Overwrite flags (supports multiple). The first token is ignored. We use '_'
+# as a convenient placeholder, but any token is acceptable.
+adb shell "echo '_ --show-composited-layer-borders --webview-log-js-console-messages' > ${FLAG_FILE}"
+# Clear flags
+adb shell "rm ${FLAG_FILE}"
+# Print flags
+adb shell "cat ${FLAG_FILE}"
 ```
 
-### Applying Features with flags
+## Applying Features with flags
 
 WebView supports the same `--enable-features=feature1,feature2` and
 `--disable-features=feature3,feature4` syntax as the rest of Chromium. You can
@@ -59,7 +84,7 @@
 
  * `--show-composited-layer-borders`
  * `--enable-features=NetworkService,NetworkServiceInProcess`
- * `--log-net-log=<filename.json>`
+ * `--webview-log-js-console-messages`
 
 WebView also defines its own flags and Features:
 
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index 4d0bff5..b1a4267 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -32,6 +32,8 @@
       "//base:base_java",
     ]
 
+    target_sdk_version = android_sdk_version
+
     if (!defined(alternative_android_sdk_dep)) {
       alternative_android_sdk_dep = webview_framework_dep
     }
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 10ac2f2..8781c8a1 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -745,8 +745,6 @@
                 l10n_util::GetStringUTF16(
                     IDS_ASH_VOICE_INTERACTION_DISABLED_IN_GUEST_MESSAGE));
       return;
-    // TODO(crbug.com/974228) Add final strings when we have them.
-    case mojom::AssistantAllowedState::DISALLOWED_BY_KIOSK_NEXT:
     case mojom::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE:
       ShowToast(kVoiceInteractionErrorToastId,
                 l10n_util::GetStringUTF16(
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
index 77c11de..e566999 100644
--- a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
+++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -110,9 +110,9 @@
   DISALLOW_COPY_AND_ASSIGN(ShortcutsListScrollView);
 };
 
-ShortcutsListScrollView* CreateScrollView(
+std::unique_ptr<ShortcutsListScrollView> CreateScrollView(
     std::unique_ptr<views::View> content_view) {
-  ShortcutsListScrollView* const scroller = new ShortcutsListScrollView();
+  auto scroller = std::make_unique<ShortcutsListScrollView>();
   scroller->SetDrawOverflowIndicator(false);
   scroller->ClipHeightTo(0, 0);
   scroller->SetContents(std::move(content_view));
@@ -548,7 +548,7 @@
     found_items_list_view->SetBorder(views::CreateEmptyBorder(
         gfx::Insets(kTopPadding, kHorizontalPadding, 0, kHorizontalPadding)));
     search_container_content_view =
-        CreateScrollView(std::move(found_items_list_view));
+        CreateScrollView(std::move(found_items_list_view)).release();
   }
   replacement_strings.emplace_back(search_query);
   search_box_view_->SetAccessibleValue(l10n_util::GetStringFUTF16(
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc
index 5631958..5e2f0e3 100644
--- a/ash/public/cpp/ash_features.cc
+++ b/ash/public/cpp/ash_features.cc
@@ -41,6 +41,9 @@
 const base::Feature kMediaSessionNotification{"MediaSessionNotification",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kMultiDisplayOverviewAndSplitView{
+    "MultiDisplayOverviewAndSplitView", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kNightLight{"NightLight", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kNotificationExpansionAnimation{
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h
index 2063583..9bf3fc16 100644
--- a/ash/public/cpp/ash_features.h
+++ b/ash/public/cpp/ash_features.h
@@ -54,6 +54,10 @@
 // TODO(beccahughes): Remove after launch. (https://crbug.com/897836)
 ASH_PUBLIC_EXPORT extern const base::Feature kMediaSessionNotification;
 
+// Enables multi-display support for overview and split view.
+// TODO(crbug.com/952461): Remove this when the feature is fully launched.
+ASH_PUBLIC_EXPORT extern const base::Feature kMultiDisplayOverviewAndSplitView;
+
 // Enables the Night Light feature.
 ASH_PUBLIC_EXPORT extern const base::Feature kNightLight;
 
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom
index 8974772..21b618f 100644
--- a/ash/public/interfaces/voice_interaction_controller.mojom
+++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -44,9 +44,7 @@
   // Disallowed because the user's account type is currently not supported.
   DISALLOWED_BY_ACCOUNT_TYPE,
   // Disallowed because the device is in Kiosk mode.
-  DISALLOWED_BY_KIOSK_MODE,
-  // Disallowed because Kiosk Next is enabled.
-  DISALLOWED_BY_KIOSK_NEXT,
+  DISALLOWED_BY_KIOSK_MODE
 };
 
 // Allows observing changes to voice interaction status and settings.
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index d3fba93..d03fe4e 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Activa o desactiva la conexión de red. <ph name="STATE_TEXT" />.</translation>
 <translation id="1771761307086386028">Desplazar a la derecha</translation>
 <translation id="1812997170047690955">¿Qué hay en mi pantalla?</translation>
+<translation id="1820355135508821526">Una política aplicada al dispositivo ha inhabilitado <ph name="FEATURE_NAME" />. Ponte en contacto con el administrador para solicitar cambios.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistente (cargando...)</translation>
 <translation id="1850504506766569011">La conexión Wi-Fi está desactivada.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Reiniciar para actualizar</translation>
 <translation id="2597972630681408282">Luz nocturna: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation>
+<translation id="2651765386227849097">El Asistente de Google está inhabilitado en este dispositivo.</translation>
 <translation id="2653659639078652383">Enviar</translation>
 <translation id="2658778018866295321">Hacer clic y arrastrar</translation>
 <translation id="2700493154570097719">Elegir el teclado</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">La batería está llena.</translation>
 <translation id="490375751687810070">Vertical</translation>
 <translation id="4905614135390995787">La combinación de teclas para activar el modo de contraste alto ha cambiado. Utiliza <ph name="NEW_SHORTCUT" /> en lugar de <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" /> % de batería</translation>
 <translation id="4917385247580444890">Buena</translation>
 <translation id="4918086044614829423">Aceptar</translation>
 <translation id="4924411785043111640">Reiniciar y restablecer</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">Clavija para micrófono</translation>
 <translation id="5669267381087807207">Activando</translation>
 <translation id="5673434351075758678">De "<ph name="FROM_LOCALE" />" a "<ph name="TO_LOCALE" />" después de sincronizar tu configuración.</translation>
+<translation id="5682642926269496722">El Asistente de Google no está disponible para la cuenta de usuario actual.</translation>
 <translation id="5691772641933328258">Huella digital no reconocida</translation>
 <translation id="5710450975648804523">Modo No molestar activado</translation>
 <translation id="574392208103952083">Mediana</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">No se ha podido verificar tu contraseña. Vuelve a intentarlo.</translation>
 <translation id="607652042414456612">Tu ordenador es visible para dispositivos Bluetooth cercanos y aparecerá como "<ph name="NAME" />" con la dirección <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">Cargando <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">El Asistente de Google no está disponible en las sesiones de invitado.</translation>
 <translation id="615957422585914272">Mostrar teclado en pantalla</translation>
 <translation id="6164005077879661055">Todos los archivos y datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se haya eliminado este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en la página <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Más información</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">Se ha vinculado el dispositivo Bluetooth "<ph name="DEVICE_NAME" />" y ya está disponible para todos los usuarios. Para eliminar esta vinculación, accede a Configuración.</translation>
 <translation id="6715542151869432661">No se han encontrado dispositivos móviles.</translation>
 <translation id="6723839937902243910">Batería</translation>
+<translation id="6727969043791803658">Conectado, <ph name="BATTERY_PERCENTAGE" /> % de batería</translation>
 <translation id="6751826523481687655">El control del rendimiento está activado</translation>
 <translation id="6790428901817661496">Reproducir</translation>
 <translation id="6803622936009808957">No se han podido duplicar las pantallas porque no se han encontrado resoluciones compatibles. Se ha utilizado el modo de escritorio ampliado en su lugar.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 990b884e..b6ab501 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Ota verkkoyhteys käyttöön tai poista se käytöstä. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Vieritä oikealle</translation>
 <translation id="1812997170047690955">Mitä näytölläni näkyy?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" /> on poistettu käytöstä tähän laitteeseen liittyvän käytännön vuoksi. Ota yhteyttä järjestelmänvalvojaan, jos haluat pyytää muutoksia.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (ladataan…)</translation>
 <translation id="1850504506766569011">Wi-Fi ei ole käytössä.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Päivitä käynnistämällä uudelleen</translation>
 <translation id="2597972630681408282">Yövalo: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM-kortti on lukittu.</translation>
+<translation id="2651765386227849097">Google Assistantin käyttö on estetty tällä laitteella.</translation>
 <translation id="2653659639078652383">Lähetä</translation>
 <translation id="2658778018866295321">Klikkaa ja vedä</translation>
 <translation id="2700493154570097719">Määritä näppäimistö</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">Akku on täynnä.</translation>
 <translation id="490375751687810070">Pystysuora</translation>
 <translation id="4905614135390995787">Suuren kontrastin tilan pikanäppäin on muuttunut. Käytä uutta pikanäppäintä <ph name="NEW_SHORTCUT" /> vanhan (<ph name="OLD_SHORTCUT" />) sijaan.</translation>
+<translation id="490788395437447240">Akku: <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="4917385247580444890">Vahva</translation>
 <translation id="4918086044614829423">Hyväksy</translation>
 <translation id="4924411785043111640">Käynnistä uudelleen ja palauta</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">Mikrofoniliitäntä</translation>
 <translation id="5669267381087807207">Aktivoidaan</translation>
 <translation id="5673434351075758678">Muutos asetusten synkronoinnin yhteydessä: <ph name="FROM_LOCALE" /> – <ph name="TO_LOCALE" /></translation>
+<translation id="5682642926269496722">Google Assistantia ei voi käyttää nykyisellä käyttäjätilillä.</translation>
 <translation id="5691772641933328258">Sormenjälkeä ei tunnistettu</translation>
 <translation id="5710450975648804523">Älä häiritse ‑tila on käytössä</translation>
 <translation id="574392208103952083">Keskikoko</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">Salasanasi vahvistaminen epäonnistui. Yritä uudelleen.</translation>
 <translation id="607652042414456612">Lähellä olevat Bluetooth-laitteet voivat löytää tietokoneesi. Tietokoneesi nimi on <ph name="NAME" /> ja osoite <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">Ladataan laitetta <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">Google Assistantia ei voi käyttää Vierailija-käyttökerralla.</translation>
 <translation id="615957422585914272">Näytä ruutunäppäimistö</translation>
 <translation id="6164005077879661055">Kaikki valvottuun käyttäjään yhdistetyt tiedostot ja paikalliset tiedot poistetaan
  pysyvästi, kun tämä valvottu käyttäjä poistetaan. Vieraillut verkkosivustot ja
@@ -375,6 +380,7 @@
 <translation id="6713285437468012787">Bluetooth-laitteeseen <ph name="DEVICE_NAME" /> on nyt muodostettu laitepariyhteys, ja se on kaikkien käyttäjien saatavilla. Voit poistaa laiteparin Asetuksien kautta.</translation>
 <translation id="6715542151869432661">Mobiililaitteita ei löytynyt.</translation>
 <translation id="6723839937902243910">Virta</translation>
+<translation id="6727969043791803658">Yhdistetty, akun taso <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6751826523481687655">Tehokkuuden seuranta on käytössä</translation>
 <translation id="6790428901817661496">Toista</translation>
 <translation id="6803622936009808957">Näyttöjen peilaaminen ei onnistunut, sillä tuettua resoluutiota ei löytynyt. Sen sijaan valittiin työpöydän laajennus.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 601d216..19e7d49 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">I-toggle ang koneksyon sa network. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Mag-scroll pakanan</translation>
 <translation id="1812997170047690955">Ano ang nasa screen ko?</translation>
+<translation id="1820355135508821526">Na-disable ang <ph name="FEATURE_NAME" /> ng patakarang nakalapat sa device na ito. Makipag-usap sa iyong administrator para humiling ng mga pagbabago.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (naglo-load...)</translation>
 <translation id="1850504506766569011">Naka-off ang Wi-Fi.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">I-restart para mag-update</translation>
 <translation id="2597972630681408282">Night Light: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">Naka-lock ang SIM card</translation>
+<translation id="2651765386227849097">Naka-disable ang Google Assistant sa device na ito.</translation>
 <translation id="2653659639078652383">Isumite</translation>
 <translation id="2658778018866295321">I-click at i-drag</translation>
 <translation id="2700493154570097719">Itakda ang iyong keyboard</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">Puno na ang baterya.</translation>
 <translation id="490375751687810070">Vertical</translation>
 <translation id="4905614135390995787">Nagbago ang shortcut upang i-toggle ang High Contrast Mode. Pakigamit ang <ph name="NEW_SHORTCUT" /> sa halip na <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% ang baterya</translation>
 <translation id="4917385247580444890">Malakas</translation>
 <translation id="4918086044614829423">Tanggapin</translation>
 <translation id="4924411785043111640">I-restart at i-reset</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Jack ng mikropono</translation>
 <translation id="5669267381087807207">Ina-activate</translation>
 <translation id="5673434351075758678">Gagawing "<ph name="TO_LOCALE" />" mula "<ph name="FROM_LOCALE" />" pagkatapos i-sync ang iyong mga setting.</translation>
+<translation id="5682642926269496722">Hindi available ang Google Assistant para sa kasalukuyang user account.</translation>
 <translation id="5691772641933328258">Hindi nakilala ang fingerprint</translation>
 <translation id="5710450975648804523">Naka-on ang Huwag Istorbohin</translation>
 <translation id="574392208103952083">Katamtaman</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">Paumanhin, hindi ma-verify ang iyong password. Pakisubukang muli.</translation>
 <translation id="607652042414456612">Ang iyong computer ay katuklas-tuklas sa mga kalapit na Bluetooth device at lalabas bilang "<ph name="NAME" />" na may address na <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">China-charge ang <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">Hindi available ang Google Assistant sa isang session ng bisita.</translation>
 <translation id="615957422585914272">Ipakita ang on-screen na keyboard</translation>
 <translation id="6164005077879661055">Permanenteng matatanggal ang lahat ng file at lokal na data na kaugnay ng pinangangasiwaang user sa oras na alisin ang pinangangasiwaang user na ito. Maaari pa ring makita ng manager ang mga nabisitang website at setting para sa pinangangasiwaang user na ito sa <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Matuto pa</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">Naipares na ang bluetooth device na "<ph name="DEVICE_NAME" />" at available na ngayon sa lahat ng user. Maaari mong alisin ang pagpapares na ito gamit ang Mga Setting.</translation>
 <translation id="6715542151869432661">Walang nahanap na mobile device.</translation>
 <translation id="6723839937902243910">Power</translation>
+<translation id="6727969043791803658">Nakakonekta, <ph name="BATTERY_PERCENTAGE" />% ang baterya</translation>
 <translation id="6751826523481687655">Naka-on ang pag-trace ng performance</translation>
 <translation id="6790428901817661496">I-play</translation>
 <translation id="6803622936009808957">Hindi ma-mirror ang mga display dahil walang mga sinusuportahang resolusyon na nakita. Pumasok na lang sa pinalawak na desktop.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index bca856bd..6248712 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">नेटवर्क कनेक्शन टॉगल करें. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">दाईं तरफ़ स्क्रोल करें</translation>
 <translation id="1812997170047690955">मेरी स्क्रीन पर क्या है?</translation>
+<translation id="1820355135508821526">इस डिवाइस पर लागू की गई किसी नीति ने <ph name="FEATURE_NAME" /> की सुविधा बंद कर दी है. कृपया अपने एडमिन से बात करके बदलावों का अनुरोध करें.</translation>
 <translation id="1823873187264960516">ईथरनेट: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (सेवा लोड हो रही है...)</translation>
 <translation id="1850504506766569011">वाई-फ़ाई  बंद है.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">अपडेट करने के लिए रीस्टार्ट करें</translation>
 <translation id="2597972630681408282">नाइट लाइट: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">सिम कार्ड लॉक है</translation>
+<translation id="2651765386227849097">इस डिवाइस पर Google Assistant की सुविधा बंद है.</translation>
 <translation id="2653659639078652383">सबमिट करें</translation>
 <translation id="2658778018866295321">क्लिक करके खींचें और छोड़ें</translation>
 <translation id="2700493154570097719">अपना कीबोर्ड सेट करें</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">बैटरी भरी हुई है.</translation>
 <translation id="490375751687810070">लम्बवत</translation>
 <translation id="4905614135390995787">उच्च कंट्रास्ट मोड को टॉगल करने का शॉर्टकट बदल गया है. कृपया<ph name="OLD_SHORTCUT" /> के बजाय <ph name="NEW_SHORTCUT" /> का उपयोग करें.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% बैटरी</translation>
 <translation id="4917385247580444890">सशक्त</translation>
 <translation id="4918086044614829423">स्वीकार करें</translation>
 <translation id="4924411785043111640">रीस्टार्ट करें और रीसेट करें</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">माइक जैक</translation>
 <translation id="5669267381087807207">सक्रिय कर रहा है</translation>
 <translation id="5673434351075758678">अपनी सेटिंग सिंक करने के बाद "<ph name="FROM_LOCALE" />" से "<ph name="TO_LOCALE" />".</translation>
+<translation id="5682642926269496722">मौजूदा उपयोगकर्ता खाते के लिए Google Assistant की सुविधा उपलब्ध नहीं है.</translation>
 <translation id="5691772641933328258">फ़िंगरप्रिंट नहीं पहचाना गया</translation>
 <translation id="5710450975648804523">'परेशान न करें' मोड चालू है</translation>
 <translation id="574392208103952083">मध्यम</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">माफ़ करें, आपके पासवर्ड की पुष्टि नहीं की जा सकी. कृपया फिर से कोशिश करें.</translation>
 <translation id="607652042414456612">आपका कंप्यूर आस-पास के ब्लूटूथ डिवाइस के लिए खोजे जाने योग्य है और वह "<ph name="NAME" />" के रूप में <ph name="ADDRESS" /> पते के साथ दिखाई देगा</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> चार्ज हो रहा है</translation>
+<translation id="612734058257491180">मेहमान के तौर पर ब्राउज़ करने के सेशन में Google Assistant की सुविधा उपलब्ध नहीं होती.</translation>
 <translation id="615957422585914272">ऑन-स्क्रीन कीबोर्ड दिखाएं</translation>
 <translation id="6164005077879661055">'निगरानी में रखे गए इस उपयोगकर्ता' को हटाने के बाद, निगरानी में रखे गए उपयोगकर्ता से जुड़ीं सभी फ़ाइलें और 'स्थानीय डेटा' हमेशा के लिए मिट जाएंगे. 'निगरानी में रखे गए इस उपयोगकर्ता' की देखी गईं वेबसाइटें और सेटिंग <ph name="MANAGEMENT_URL" /> पर प्रबंधक को अब भी दिखेंगी.</translation>
 <translation id="6165508094623778733">ज़्यादा जानें</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" यु्ग्मित हो गया है और अब वह सभी उपयोगकर्ताओं के लिए उपलब्ध है. आप सेटिंग का उपयोग करके इस युग्मन को निकाल सकते हैं.</translation>
 <translation id="6715542151869432661">कोई मोबाइल डिवाइस नहीं मिला.</translation>
 <translation id="6723839937902243910">पावर</translation>
+<translation id="6727969043791803658">कनेक्ट किया गया, <ph name="BATTERY_PERCENTAGE" /> % बैटरी बची है</translation>
 <translation id="6751826523481687655">'परफ़ॉर्मेंस ट्रेसिंग' चालू कर दी गई है</translation>
 <translation id="6790428901817661496">चलाएं</translation>
 <translation id="6803622936009808957">प्रदर्शनों को मिरर नहीं किया जा सका क्योंकि कोई समर्थित रिज़ॉल्यूशन नहीं मिला. इसके बजाय विस्तारित डेस्कटॉप में चला गया है.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index f7e4a24..3da61ec 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">הפעלה או השבתה של החיבור לרשת. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">גלילה ימינה</translation>
 <translation id="1812997170047690955">מה מופיע במסך שלי?</translation>
+<translation id="1820355135508821526">התכונה <ph name="FEATURE_NAME" /> הושבתה על-ידי מדיניות שהוחלה על המכשיר הזה. יש לפנות את מנהל המערכת כדי לבקש שינויים.</translation>
 <translation id="1823873187264960516">אתרנט: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">‏Assistant (בטעינה...)</translation>
 <translation id="1850504506766569011">‏Wi-Fi כבוי.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">צריך להפעיל מחדש כדי לעדכן</translation>
 <translation id="2597972630681408282">תאורת לילה: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">‏כרטיס ה-SIM נעול</translation>
+<translation id="2651765386227849097">‏Google Assistant מושבת במכשיר הזה.</translation>
 <translation id="2653659639078652383">שלח</translation>
 <translation id="2658778018866295321">לחיצה וגרירה</translation>
 <translation id="2700493154570097719">בחירת מקלדת</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">הסוללה טעונה במלואה.</translation>
 <translation id="490375751687810070">אנכי</translation>
 <translation id="4905614135390995787">מקש הקיצור להפעלה או כיבוי של מצב ניגודיות גבוהה השתנה. השתמש ב-<ph name="NEW_SHORTCUT" /> במקום ב-<ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240">%<ph name="BATTERY_PERCENTAGE" /> סוללה</translation>
 <translation id="4917385247580444890">חזק</translation>
 <translation id="4918086044614829423">אשר</translation>
 <translation id="4924411785043111640">הפעלה מחדש ואתחול</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">שקע מיקרופון</translation>
 <translation id="5669267381087807207">מפעיל</translation>
 <translation id="5673434351075758678">מ"<ph name="FROM_LOCALE" />" ל"<ph name="TO_LOCALE" />" אחרי סנכרון ההגדרות.</translation>
+<translation id="5682642926269496722">‏Google Assistant אינו זמין לחשבון המשתמש הנוכחי.</translation>
 <translation id="5691772641933328258">טביעת האצבע לא זוהתה</translation>
 <translation id="5710450975648804523">מצב 'נא לא להפריע' מופעל</translation>
 <translation id="574392208103952083">בינוני</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">מצטערים, אי אפשר לאמת את הסיסמה שלך. צריך לנסות שוב.</translation>
 <translation id="607652042414456612">‏מכשירי Bluetooth קרובים יכולים לאתר את המחשב שלך, והוא יופיע כ-"<ph name="NAME" />" עם הכתובת <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">טעינה של <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">‏Google Assistant אינו זמין בגלישה כאורח.</translation>
 <translation id="615957422585914272">הצג מקלדת במסך</translation>
 <translation id="6164005077879661055">כל הקבצים והנתונים המקומיים המשויכים למשתמש בפיקוח יימחקו לצמיתות לאחר שמשתמש בפיקוח זה יוסר. המנהל עדיין יוכל לראות את האתרים שבהם משתמש בפיקוח זה ביקר, ואת ההגדרות שלו, בכתובת <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">למידע נוסף</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">‏מכשיר ה-Bluetooth‏ "<ph name="DEVICE_NAME" />" הותאם והוא זמין כעת לכל המשתמשים. אתה יכול להסיר את ההתאמה הזו ב'הגדרות'.</translation>
 <translation id="6715542151869432661">לא נמצאו מכשירים ניידים.</translation>
 <translation id="6723839937902243910">חשמל</translation>
+<translation id="6727969043791803658">‏מחובר, ‎<ph name="BATTERY_PERCENTAGE" />%‎ סוללה</translation>
 <translation id="6751826523481687655">מעקב הביצועים פועל</translation>
 <translation id="6790428901817661496">הפעל</translation>
 <translation id="6803622936009808957">לא ניתן היה לשקף מסכים מכיוון שלא נמצאה רזולוציה נתמכת. במקום זאת התצוגה עברה למצב שולחן עבודה מורחב.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 7c6bc70..8889e7d 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">ネットワーク接続を切り替えます。<ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">右にスクロール</translation>
 <translation id="1812997170047690955">画面上のアイテムを検索します</translation>
+<translation id="1820355135508821526">このデバイスに適用されているポリシーにより <ph name="FEATURE_NAME" /> が無効にされています。管理者に連絡して、設定の変更をリクエストしてください。</translation>
 <translation id="1823873187264960516">イーサネット: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">アシスタント(読み込み中...)</translation>
 <translation id="1850504506766569011">Wi-Fi が無効になりました。</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">再起動して更新</translation>
 <translation id="2597972630681408282">夜間モード: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM カードはロックされています</translation>
+<translation id="2651765386227849097">このデバイスでは Google アシスタントが無効にされています。</translation>
 <translation id="2653659639078652383">送信</translation>
 <translation id="2658778018866295321">クリックしてドラッグ</translation>
 <translation id="2700493154570097719">キーボードを設定</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">バッテリー残量: 満。</translation>
 <translation id="490375751687810070">縦</translation>
 <translation id="4905614135390995787">ハイ コントラスト モードを切り替えるショートカットが変わりました。これまでの <ph name="OLD_SHORTCUT" /> キーではなく <ph name="NEW_SHORTCUT" /> キーを使用してください。</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% のバッテリー残量</translation>
 <translation id="4917385247580444890">強い</translation>
 <translation id="4918086044614829423">同意する</translation>
 <translation id="4924411785043111640">再起動してリセット</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">マイク差込口</translation>
 <translation id="5669267381087807207">有効にしています</translation>
 <translation id="5673434351075758678">設定の同期後に「<ph name="FROM_LOCALE" />」から「<ph name="TO_LOCALE" />」に変更されました。</translation>
+<translation id="5682642926269496722">Google アシスタントは、現在のユーザー アカウントではご利用いただけません。</translation>
 <translation id="5691772641933328258">指紋を認識できません</translation>
 <translation id="5710450975648804523">サイレント モードがオンになっています</translation>
 <translation id="574392208103952083">中</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">パスワードを確認できませんでした。もう一度お試しください。</translation>
 <translation id="607652042414456612">お使いのパソコンは近くの Bluetooth デバイスで検出可能です。名前「<ph name="NAME" />」、アドレス「<ph name="ADDRESS" />」のデバイスとして表示されます</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> を充電しています</translation>
+<translation id="612734058257491180">Google アシスタントは、ゲスト セッションではご利用いただけません。</translation>
 <translation id="615957422585914272">画面キーボードを表示する</translation>
 <translation id="6164005077879661055">この監視対象ユーザーを削除すると、このユーザーに関連付けられたすべてのファイルとローカル データも完全に削除されます。この監視対象ユーザーがアクセスしたウェブサイトやこのユーザーの設定は引き続き、管理者が <ph name="MANAGEMENT_URL" /> で見ることができます。</translation>
 <translation id="6165508094623778733">詳細</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">Bluetooth デバイス「<ph name="DEVICE_NAME" />」がペア設定されました。すべてのユーザーはこのデバイスを使用できます。[設定] から、このペア設定を削除することもできます。</translation>
 <translation id="6715542151869432661">モバイル デバイスが見つかりませんでした。</translation>
 <translation id="6723839937902243910">電源</translation>
+<translation id="6727969043791803658">接続済み、<ph name="BATTERY_PERCENTAGE" />% のバッテリー残量</translation>
 <translation id="6751826523481687655">パフォーマンス追跡機能が有効になっています</translation>
 <translation id="6790428901817661496">再生</translation>
 <translation id="6803622936009808957">サポートされている解像度が見つからなかったため、ディスプレイをミラーリングできませんでした。代わりに拡張デスクトップ モードに切り替えました。</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 9f5c4bf0..2836bbe 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">ಬಲಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
 <translation id="1812997170047690955">ನನ್ನ ಪರದೆಯಲ್ಲಿ ಏನಿದೆ?</translation>
+<translation id="1820355135508821526">ಈ ಸಾಧನಕ್ಕೆ ಅನ್ವಯಿಸಲಾದ ಕಾರ್ಯನೀತಿಯಿಂದಾಗಿ <ph name="FEATURE_NAME" /> ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಬದಲಾವಣೆಗಳ ವಿನಂತಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರೊಂದಿಗೆ ಮಾತನಾಡಿ.</translation>
 <translation id="1823873187264960516">ಇಥರ್ನೆಟ್: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">ಸಹಾಯಕ (ಲೋಡ್ ಆಗುತ್ತಿದೆ...)</translation>
 <translation id="1850504506766569011">ವೈ-ಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">ಅಪ್‌ಡೇಟ್ ಮಾಡಲು, ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="2597972630681408282">ನೈಟ್ ಲೈಟ್: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">ಸಿಮ್‌ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="2651765386227849097">ಈ ಸಾಧನದಲ್ಲಿ Google ಅಸಿಸ್ಟೆಂಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="2653659639078652383">ಸಲ್ಲಿಸು</translation>
 <translation id="2658778018866295321">ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ</translation>
 <translation id="2700493154570097719">ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಹೊಂದಿಸಿ</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">ಬ್ಯಾಟರಿ ತುಂಬಿದೆ.</translation>
 <translation id="490375751687810070">ಲಂಬ</translation>
 <translation id="4905614135390995787">ಹೆಚ್ಚು ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್ ಅನ್ನು ಟಾಗಲ್‌ ಮಾಡಲು ಶಾರ್ಟ್‌ಕಟ್ ಬದಲಾಗಿದೆ. <ph name="OLD_SHORTCUT" /> ಬದಲಿಗೆ <ph name="NEW_SHORTCUT" /> ಅನ್ನು ಬಳಸಿ.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% ರಷ್ಟು ಬ್ಯಾಟರಿ</translation>
 <translation id="4917385247580444890">ಪ್ರಬಲ</translation>
 <translation id="4918086044614829423">ಸಮ್ಮತಿಸು</translation>
 <translation id="4924411785043111640">ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಮರುಹೊಂದಿಸಿ</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">ಮೈಕ್ ಜ್ಯಾಕ್</translation>
 <translation id="5669267381087807207">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5673434351075758678">ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿದ ಬಳಿಕ "<ph name="FROM_LOCALE" />" ನಿಂದ "<ph name="TO_LOCALE" />" ಗೆ.</translation>
+<translation id="5682642926269496722">Google ಅಸಿಸ್ಟೆಂಟ್ ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರ ಖಾತೆಗೆ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="5691772641933328258">ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
 <translation id="5710450975648804523">ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ</translation>
 <translation id="574392208103952083">ಮಧ್ಯಮ</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="607652042414456612">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್‌‌ ಸಾಧನಗಳು ಅನ್ವೇಷಿಸಬಹುದಾಗಿದೆ ಮತ್ತು <ph name="ADDRESS" /> ವಿಳಾಸದೊಂದಿಗೆ "<ph name="NAME" />" ರೂಪದಲ್ಲಿ ಗೋಚರಿಸುತ್ತದೆ</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ</translation>
+<translation id="612734058257491180">Google ಅಸಿಸ್ಟೆಂಟ್‌ ಅತಿಥಿ ಸೆಶನ್‌ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="615957422585914272">ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು</translation>
 <translation id="6164005077879661055">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಒಮ್ಮೆ ತೆಗೆದುಹಾಕಿದರೆ, ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲ ಫೈಲ್‌ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರಿಗಾಗಿ ಭೇಟಿ ನೀಡಲಾದ ವೆಬ್‌ಸೈಟ್‌ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳು <ph name="MANAGEMENT_URL" /> ನಲ್ಲಿ ನಿರ್ವಾಹಕರಿಗೆ ಈಗಲೂ ಗೋಚರಿಸಬಹುದು.</translation>
 <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">ಬ್ಲೂಟೂತ್ ಸಾಧನವನ್ನು "<ph name="DEVICE_NAME" />" ಜೋಡಿಸಲಾಗಿದೆ ಮತ್ತು ಇದೀಗ ಎಲ್ಲಾ ಬಳಕೆದಾರರಿಗೂ ಲಭ್ಯವಿದೆ. ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ಈ ಜೋಡಣೆಯನ್ನು ತೆಗೆದುಹಾಕಬಹುದು.</translation>
 <translation id="6715542151869432661">ಯಾವುದೇ ಮೊಬೈಲ್ ಸಾಧನಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation>
 <translation id="6723839937902243910">ಪವರ್‌</translation>
+<translation id="6727969043791803658">ಸಂಪರ್ಕಗೊಂಡಿದೆ, <ph name="BATTERY_PERCENTAGE" />% ರಷ್ಟು ಬ್ಯಾಟರಿ ಲಭ್ಯವಿದೆ</translation>
 <translation id="6751826523481687655">ಕಾರ್ಯಕ್ಷಮತೆಯ ಟ್ರೇಸಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6790428901817661496">ಪ್ಲೇ ಮಾಡು</translation>
 <translation id="6803622936009808957">ಯಾವುದೇ ಬೆಂಬಲಿತ ಪರಿಹಾರಗಳು ಕಂಡುಬರದ ಕಾರಣ ಪ್ರದರ್ಶನಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಲಾಗಲಿಲ್ಲ. ಬದಲಿಗೆ ವಿಸ್ತರಿತ ಡೆಸ್ಕ್‌ಟಾಪ್ ಅನ್ನು ನಮೂದಿಸಲಾಗಿದೆ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index f8cf0b64..b2a27fa0 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">네트워크 연결을 전환합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">오른쪽으로 스크롤</translation>
 <translation id="1812997170047690955">화면에 표시된 내용 찾아보기</translation>
+<translation id="1820355135508821526">기기에 적용된 정책에 따라 <ph name="FEATURE_NAME" />이(가) 사용 중지되었습니다. 설정을 변경하려면 관리자에게 문의하세요.</translation>
 <translation id="1823873187264960516">이더넷: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">어시스턴트(로드 중...)</translation>
 <translation id="1850504506766569011">Wi-Fi가 꺼져 있습니다.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">업데이트하려면 다시 시작</translation>
 <translation id="2597972630681408282">야간 조명: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM 카드가 잠겨 있습니다.</translation>
+<translation id="2651765386227849097">기기에서 Google 어시스턴트가 사용 중지되어 있습니다.</translation>
 <translation id="2653659639078652383">제출</translation>
 <translation id="2658778018866295321">클릭하여 드래그</translation>
 <translation id="2700493154570097719">키보드 설정</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">배터리 충전이 완료되었습니다.</translation>
 <translation id="490375751687810070">세로</translation>
 <translation id="4905614135390995787">고대비 모드 전환 단축키가 변경되었습니다. <ph name="OLD_SHORTCUT" /> 대신 <ph name="NEW_SHORTCUT" />을(를) 사용하세요.</translation>
+<translation id="490788395437447240">배터리 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="4917385247580444890">강력</translation>
 <translation id="4918086044614829423">수락</translation>
 <translation id="4924411785043111640">다시 시작 및 재설정</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">마이크 잭</translation>
 <translation id="5669267381087807207">활성화 중</translation>
 <translation id="5673434351075758678">설정 동기화 후 ‘<ph name="FROM_LOCALE" />’에서 ‘<ph name="TO_LOCALE" />’(으)로 변경합니다.</translation>
+<translation id="5682642926269496722">현재 사용자 계정에서 Google 어시스턴트를 사용할 수 없습니다.</translation>
 <translation id="5691772641933328258">지문을 인식할 수 없음</translation>
 <translation id="5710450975648804523">방해 금지 모드 사용 중</translation>
 <translation id="574392208103952083">보통</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">비밀번호가 일치하지 않습니다. 다시 시도해 주세요.</translation>
 <translation id="607652042414456612">내 컴퓨터가 근처 블루투스 기기에서 검색할 수 있도록 설정되어 있으며 주소(<ph name="ADDRESS" />)와 함께 '<ph name="NAME" />'(으)로 표시됩니다.</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> 충전 중</translation>
+<translation id="612734058257491180">게스트 세션에서는 Google 어시스턴트를 사용할 수 없습니다.</translation>
 <translation id="615957422585914272">터치 키보드 표시</translation>
 <translation id="6164005077879661055">관리 대상 사용자를 제거하면 해당 관리 대상 사용자와 연결되어 있는 모든 파일 및 로컬 데이터가 영구적으로 삭제됩니다. 하지만 관리자는 관리 대상 사용자의 방문한 웹사이트 및 설정을 <ph name="MANAGEMENT_URL" /> 페이지에서 계속 볼 수 있습니다.</translation>
 <translation id="6165508094623778733">자세히 알아보기</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">블루투스 기기 '<ph name="DEVICE_NAME" />'이(가) 페어링되어 이제 모든 사용자가 사용할 수 있습니다. 설정에서 이 페어링을 삭제할 수 있습니다.</translation>
 <translation id="6715542151869432661">휴대기기를 찾을 수 없습니다.</translation>
 <translation id="6723839937902243910">전원</translation>
+<translation id="6727969043791803658">연결됨, 배터리 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6751826523481687655">성능 추적이 사용 설정되어 있습니다.</translation>
 <translation id="6790428901817661496">재생</translation>
 <translation id="6803622936009808957">지원되는 해상도가 없으므로 디스플레이를 그대로 반영할 수 없습니다. 대신 확장 데스크톱을 시작했습니다.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index b5056869..e987ca6 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">നെറ്റ്‌വർക്ക് കണക്ഷൻ മാറ്റുക. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">വലത്തോട്ട് സ്ക്രോൾ ചെയ്യുക</translation>
 <translation id="1812997170047690955">എന്റെ സ്‌ക്രീനിൽ എന്താണുള്ളത്?</translation>
+<translation id="1820355135508821526">ഈ ഉപകരണത്തിൽ ബാധകമാക്കിയ ഒരു നയം <ph name="FEATURE_NAME" /> എന്നതിനെ പ്രവർത്തനരഹിതമാക്കി. മാറ്റങ്ങൾ അഭ്യർത്ഥിക്കാൻ നിങ്ങളുടെ അഡ്‌മിനോട് സംസാരിക്കുക.</translation>
 <translation id="1823873187264960516">ഇതർനെറ്റ്: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">സഹായി (ലോഡുചെയ്യുന്നു...)</translation>
 <translation id="1850504506766569011">Wi-Fi ഓഫുചെയ്‌തു.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">അപ്‌ഡേറ്റ് ചെയ്യാൻ റീസ്‌റ്റാർട്ട് ചെയ്യുക</translation>
 <translation id="2597972630681408282">നൈറ്റ് ‌ലൈറ്റ്: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">സിം കാർഡ് ലോക്കുചെയ്‌തു</translation>
+<translation id="2651765386227849097">ഈ ഉപകരണത്തിൽ Google അസിസ്‌റ്റന്റ് പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="2653659639078652383">സമര്‍പ്പിക്കൂ</translation>
 <translation id="2658778018866295321">ക്ലിക്ക് ചെയ്‌ത് വലിച്ചിടുക</translation>
 <translation id="2700493154570097719">നിങ്ങളുടെ കീബോഡ് സജ്ജീകരിക്കുക</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">ബാറ്ററി ചാർജുചെയ്യൽ പൂർണ്ണമായി.</translation>
 <translation id="490375751687810070">ലംബം</translation>
 <translation id="4905614135390995787">ഉയർന്ന ദൃശ്യതീവ്രത മോഡ് ടോഗിൾ ചെയ്യാനുള്ള ‌കുറുക്കുവഴി മാറ്റി. <ph name="OLD_SHORTCUT" /> എന്നതിനുപകരം <ph name="NEW_SHORTCUT" /> ഉപയോഗിക്കുക.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation>
 <translation id="4917385247580444890">ശക്തം</translation>
 <translation id="4918086044614829423">സ്വീകരിക്കുക</translation>
 <translation id="4924411785043111640">പുനഃരാരംഭിച്ച് പുനഃസജ്ജീകരിക്കുക</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Mic jack</translation>
 <translation id="5669267381087807207">സജീവമാക്കുന്നു</translation>
 <translation id="5673434351075758678">നിങ്ങളുടെ ക്രമീകരണം സമന്വയിപ്പിച്ചതിന് ശേഷം, "<ph name="FROM_LOCALE" />" എന്നതിൽ നിന്ന്"<ph name="TO_LOCALE" />" എന്നതിലേക്ക്.</translation>
+<translation id="5682642926269496722">നിലവിലെ ഉപയോക്തൃ അക്കൗണ്ടിന് Google അസിസ്‌റ്റന്റ് ലഭ്യമല്ല.</translation>
 <translation id="5691772641933328258">വിരലടയാളം തിരിച്ചറിഞ്ഞില്ല</translation>
 <translation id="5710450975648804523">'ശല്യപ്പെടുത്തരുത്' ഓണാണ്</translation>
 <translation id="574392208103952083">ഇടത്തരം</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">ക്ഷമിക്കണം, നിങ്ങളുടെ പാസ്‌വേഡ് പരിശോധിച്ചുറപ്പിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="607652042414456612">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സമീപത്തുള്ള Bluetooth ഉപകരണങ്ങൾക്ക് കണ്ടെത്താനാകുന്നതാണ് ഒപ്പം അത് <ph name="ADDRESS" /> എന്ന വിലാസത്തിൽ "<ph name="NAME" />" എന്നതായി ദൃശ്യമാകും.</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> ചാർജ് ചെയ്യുന്നു</translation>
+<translation id="612734058257491180">അതിഥി സെഷനിൽ Google അസി‌സ്‌റ്റന്റ് ലഭ്യമല്ല.</translation>
 <translation id="615957422585914272">ഓൺ-സ്‌ക്രീൻ കീബോർഡ് ദൃശ്യമാക്കുക</translation>
 <translation id="6164005077879661055">മേൽനോട്ടത്തിലുള്ള ഉപയോക്താവിനെ നീക്കംചെയ്‌താൽ, മേൽനോട്ടത്തിലുള്ള ഉപയോക്താവുമായി ബന്ധപ്പെടുത്തിയിട്ടുള്ള എല്ലാ ഫയലുകളും പ്രാദേശിക ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും. മേൽനോട്ടത്തിലുള്ള ഈ ഉപയോക്താവിനായി സന്ദർശിച്ച വെബ്‌സൈറ്റുകളും ക്രമീകരണങ്ങളും <ph name="MANAGEMENT_URL" />-ൽ മാനേജർക്ക് തുടർന്നും കാണാനായേക്കും.</translation>
 <translation id="6165508094623778733">കൂടുതലറിയുക</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">"<ph name="DEVICE_NAME" />" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കി, അത് ഇപ്പോൾ എല്ലാ ഉപയോക്താക്കൾക്കും ലഭ്യമാണ്. ക്രമീകരണങ്ങൾ ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഈ ജോടിയാക്കൽ നീക്കംചെയ്യാം.</translation>
 <translation id="6715542151869432661">മൊബൈലുകളൊന്നും കണ്ടെത്തിയില്ല.</translation>
 <translation id="6723839937902243910">പവർ</translation>
+<translation id="6727969043791803658">കണക്റ്റ് ചെയ്‌തു, <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation>
 <translation id="6751826523481687655">പ്രകടനം പിന്തുടരൽ ഓണാണ്</translation>
 <translation id="6790428901817661496">പ്ലേചെയ്യുക</translation>
 <translation id="6803622936009808957">പിന്തുണയ്‌ക്കുന്ന മിഴിവുകൾ കണ്ടെത്താത്തതിനാൽ പ്രദർശനങ്ങൾ പ്രതിഫലിപ്പിക്കാനായില്ല. പകരം വിപുലീകൃത ഡെസ്‌ക്‌ടോപ്പ് നൽകി.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 5b3810c..06dacce 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">नेटवर्क कनेक्शन टॉगल करा. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">उजवीकडे स्क्रोल करा</translation>
 <translation id="1812997170047690955">माझ्या स्क्रीनवर काय आहे?</translation>
+<translation id="1820355135508821526">या डिव्हाइसवर लागू केलेल्या धोरणाने <ph name="FEATURE_NAME" /> बंद केले आहे. कृपया बदलण्याची विनंती करण्यासाठी तुमच्या अॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation>
 <translation id="1823873187264960516">इथरनेट: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">साहाय्यक (लोड होत आहे...)</translation>
 <translation id="1850504506766569011">वाय-फाय बंद आहे.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">अपडेट करण्यासाठी रीस्टार्ट करा</translation>
 <translation id="2597972630681408282">रात्रीचा प्रकाश: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">सिम कार्ड लॉक केले आहे</translation>
+<translation id="2651765386227849097">या डिव्हाइसवर Google असिस्टंट बंद केले आहे.</translation>
 <translation id="2653659639078652383">सबमिट करा</translation>
 <translation id="2658778018866295321">क्लिक आणि ड्रॅग करा</translation>
 <translation id="2700493154570097719">तुमचा कीबोर्ड सेट करा</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">बॅटरी भरली आहे.</translation>
 <translation id="490375751687810070">उभा</translation>
 <translation id="4905614135390995787">उच्च तीव्रता मोड टॉगल करण्यासाठी शॉर्टकट बदलला आहे. कृपया <ph name="OLD_SHORTCUT" /> ऐवजी <ph name="NEW_SHORTCUT" /> वापरा.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% बॅटरी</translation>
 <translation id="4917385247580444890">मजबूत</translation>
 <translation id="4918086044614829423">स्वीकारा</translation>
 <translation id="4924411785043111640">रीस्टार्ट करा आणि रीसेट करा</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">माइक जॅक</translation>
 <translation id="5669267381087807207">सक्रिय करीत आहे </translation>
 <translation id="5673434351075758678">तुमच्या सेटिंग्ज सिंक केल्यानंतर "<ph name="FROM_LOCALE" />" पासून "<ph name="TO_LOCALE" />" पर्यंत.</translation>
+<translation id="5682642926269496722">सध्याच्या वापरकर्ता खात्यावर Google असिस्टंट उपलब्ध नाही.</translation>
 <translation id="5691772641933328258">फिंगरप्रिंट ओळखले नाही</translation>
 <translation id="5710450975648804523">व्यत्यय आणू नका सुरू आहे</translation>
 <translation id="574392208103952083">मध्यम</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">सॉरी, तुमच्या पासवर्डची पडताळणी होऊ शकत नाही. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="607652042414456612">तुमचा कॉंप्युटर जवळपासच्या ब्लूटूथ डिव्हाइसवर शोधण्यायोग्य आहे आणि <ph name="ADDRESS" /> पत्त्यासह "<ph name="NAME" />" म्हणून दिसेल</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> चार्ज करीत आहे</translation>
+<translation id="612734058257491180">अतिथी सत्रामध्ये Google असिस्टंट उपलब्ध नाही.</translation>
 <translation id="615957422585914272">ऑन-स्‍क्रीन कीबोर्ड दर्शवा</translation>
 <translation id="6164005077879661055">एकदा हा पर्यवेक्षित वापरकर्ता काढल्यानंतर पर्यवेक्षित वापरकर्त्याशी संबद्ध सर्व फायली आणि स्थानिक डेटा कायमचा हटवला जाईल. या पर्यवेक्षित वापरकर्त्यासाठी भेट दिलेल्या वेबसाइट आणि सेटिंग्ज तरीही <ph name="MANAGEMENT_URL" /> वर व्यवस्थापकाद्वारे दृश्यमान असू शकतात.</translation>
 <translation id="6165508094623778733">अधिक जाणून घ्या</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">"<ph name="DEVICE_NAME" />" ब्लूटूथ डिव्हाइस जोडले गेले आहे आणि सर्व वापरकर्त्यांसाठी आता उपलब्ध आहे. तुम्ही सेटिंग्ज वापरून हे पेअरिंग काढू शकता.</translation>
 <translation id="6715542151869432661">कोणतेही मोबाइल डिव्हाइस आढळले नाहीत.</translation>
 <translation id="6723839937902243910">सामर्थ्य</translation>
+<translation id="6727969043791803658">कनेक्ट केले, <ph name="BATTERY_PERCENTAGE" />% बॅटरी</translation>
 <translation id="6751826523481687655">परफॉर्मंस ट्रेसिंग चालू आहे</translation>
 <translation id="6790428901817661496">प्ले करा</translation>
 <translation id="6803622936009808957">समर्थित रिजोल्यूशन न आढळल्यामुळे प्रदर्शने मिरर करू शकली नाहीत. त्याऐवजी विस्तारित डेस्कटॉप एंटर केला.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 3835c42..3a99548 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Slå av/på nettverkstilkobling. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Rull til høyre</translation>
 <translation id="1812997170047690955">Hva er på skjermen?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" /> er slått av på grunn av en regel som gjelder for denne enheten. Snakk med administratoren din for å spørre om endringer.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (laster inn …)</translation>
 <translation id="1850504506766569011">Wi-Fi er slått av.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Start på nytt for å oppdatere</translation>
 <translation id="2597972630681408282">Nattlys: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM-kortet er låst</translation>
+<translation id="2651765386227849097">Google-assistenten er slått av på denne enheten.</translation>
 <translation id="2653659639078652383">Send</translation>
 <translation id="2658778018866295321">Klikk og dra</translation>
 <translation id="2700493154570097719">Velg tastatur</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">Batteriet er fullt.</translation>
 <translation id="490375751687810070">Vertikal</translation>
 <translation id="4905614135390995787">Hurtigtasten for å slå høykontrastmodus av eller på er endret. Bruk <ph name="NEW_SHORTCUT" /> i stedet for <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" /> % batteri</translation>
 <translation id="4917385247580444890">Sterk</translation>
 <translation id="4918086044614829423">Godta</translation>
 <translation id="4924411785043111640">Start på nytt og tilbakestill</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Mikrofonkontakt</translation>
 <translation id="5669267381087807207">Aktiverer</translation>
 <translation id="5673434351075758678">Fra «<ph name="FROM_LOCALE" />» til «<ph name="TO_LOCALE" />» etter at innstillingene dine ble synkronisert.</translation>
+<translation id="5682642926269496722">Google-assistenten er ikke tilgjengelig for denne brukerkontoen.</translation>
 <translation id="5691772641933328258">Gjenkjenner ikke fingeravtrykket</translation>
 <translation id="5710450975648804523">Ikke forstyrr er på</translation>
 <translation id="574392208103952083">Medium</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">Beklager, men passordet ditt kunne ikke bekreftes. Prøv på nytt.</translation>
 <translation id="607652042414456612">Datamaskinen din kan registreres av Bluetooth-enheter i nærheten, og vises med navnet «<ph name="NAME" />» og adressen <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">Lader <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">Google-assistenten er ikke tilgjengelig i gjesteøkter.</translation>
 <translation id="615957422585914272">Vis skjermtastaturet</translation>
 <translation id="6164005077879661055">Alle filer og lokale data tilknyttet den administrerte brukeren slettes permanent når den administrerte brukeren fjernes. Besøkte nettsteder og innstillinger for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Finn ut mer</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">Nå er Bluetooth-enheten «<ph name="DEVICE_NAME" />» koblet til og tilgjengelig for alle brukere. Du kan oppheve denne tilkoblingen via Innstillinger.</translation>
 <translation id="6715542151869432661">Fant ingen mobilenheter.</translation>
 <translation id="6723839937902243910">Strøm</translation>
+<translation id="6727969043791803658">Koblet til – <ph name="BATTERY_PERCENTAGE" /> % batteri</translation>
 <translation id="6751826523481687655">Ytelsessporing er slått på</translation>
 <translation id="6790428901817661496">Spill av</translation>
 <translation id="6803622936009808957">Kunne ikke speile skjermene fordi ingen støttede oppløsninger ble funnet. Utvidet skrivebord ble brukt i stedet.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index d65ba76..f52f64fb 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Comută conexiunea la rețea. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Derulează la dreapta</translation>
 <translation id="1812997170047690955">Ce este pe ecranul meu?</translation>
+<translation id="1820355135508821526">Funcția <ph name="FEATURE_NAME" /> a fost dezactivată de o politică aplicată acestui dispozitiv. Discută cu administratorul pentru a solicita modificări.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistent (se încarcă...)</translation>
 <translation id="1850504506766569011">Conexiunea Wi-Fi este dezactivată.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Repornește pentru a actualiza</translation>
 <translation id="2597972630681408282">Lumină de noapte: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">Cardul SIM este blocat</translation>
+<translation id="2651765386227849097">Asistentul Google este dezactivat pe acest dispozitiv.</translation>
 <translation id="2653659639078652383">Trimite</translation>
 <translation id="2658778018866295321">Dă clic și trage</translation>
 <translation id="2700493154570097719">Setează tastatura</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">Bateria este încărcată complet.</translation>
 <translation id="490375751687810070">Vertical</translation>
 <translation id="4905614135390995787">Comanda rapidă pentru comutarea modului Contrast ridicat s-a modificat. Folosește <ph name="NEW_SHORTCUT" /> în loc de <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240">Nivelul bateriei: <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="4917385247580444890">Puternic</translation>
 <translation id="4918086044614829423">Accept</translation>
 <translation id="4924411785043111640">Repornește și resetează</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Mufă pentru microfon</translation>
 <translation id="5669267381087807207">Se activează</translation>
 <translation id="5673434351075758678">Din „<ph name="FROM_LOCALE" />” în „<ph name="TO_LOCALE" />” după sincronizarea setărilor.</translation>
+<translation id="5682642926269496722">Asistentul Google nu este disponibil pentru contul de utilizator actual.</translation>
 <translation id="5691772641933328258">Amprenta nu a fost recunoscută</translation>
 <translation id="5710450975648804523">Funcția Nu deranja este activată</translation>
 <translation id="574392208103952083">Medie</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">Ne pare rău, parola nu a putut fi confirmată. Încearcă din nou.</translation>
 <translation id="607652042414456612">Computerul poate fi detectat de dispozitivele Bluetooth din apropiere și va apărea ca „<ph name="NAME" />” cu adresa <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">Se încarcă <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">Asistentul Google nu este disponibil într-o sesiune publică.</translation>
 <translation id="615957422585914272">Afișați tastatura pe ecran</translation>
 <translation id="6164005077879661055">Toate fișierele și datele locale asociate acestui utilizator monitorizat vor fi șterse definitiv după eliminarea acestui utilizator monitorizat. Site-urile web accesate și setările acestui utilizator monitorizat pot fi în continuare vizibile pentru manager la <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Află mai multe</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">Dispozitivul Bluetooth „<ph name="DEVICE_NAME" />” a fost conectat și este disponibil acum pentru toți utilizatorii. Puteți elimina această conexiune din Setări.</translation>
 <translation id="6715542151869432661">Nu s-au găsit dispozitive mobile.</translation>
 <translation id="6723839937902243910">Alimentare</translation>
+<translation id="6727969043791803658">Conectat, nivelul bateriei: <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6751826523481687655">Urmărirea performanțelor este activată</translation>
 <translation id="6790428901817661496">Redă</translation>
 <translation id="6803622936009808957">Afișajele nu au putut fi oglindite, deoarece nu au fost găsite rezoluții acceptate. Ați intrat, în schimb, în modul monitor extins.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 26584f7e..8b4d394 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Изменить настройки сетевого подключения. <ph name="STATE_TEXT" />.</translation>
 <translation id="1771761307086386028">Вправо</translation>
 <translation id="1812997170047690955">Объекты на экране</translation>
+<translation id="1820355135508821526">Одно из правил, применяемых к этому устройству, запрещает использовать функцию "<ph name="FEATURE_NAME" />". Обратитесь к администратору.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Ассистент (загрузка…)</translation>
 <translation id="1850504506766569011">Wi-Fi отключен</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Перезагрузить и обновить</translation>
 <translation id="2597972630681408282">Ночной режим: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM-карта заблокирована</translation>
+<translation id="2651765386227849097">Google Ассистент отключен на этом устройстве.</translation>
 <translation id="2653659639078652383">Отправить</translation>
 <translation id="2658778018866295321">Перетаскивание</translation>
 <translation id="2700493154570097719">Выберите раскладку</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">Батарея полностью заряжена.</translation>
 <translation id="490375751687810070">Вертикальная ориентация</translation>
 <translation id="4905614135390995787">Изменились быстрые клавиши для управления режимом высокой контрастности. Используйте <ph name="NEW_SHORTCUT" /> вместо <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240">Батарея заряжена на <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="4917385247580444890">Сильный</translation>
 <translation id="4918086044614829423">Принять</translation>
 <translation id="4924411785043111640">Перезапустить и сбросить настройки</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Микрофонный разъем</translation>
 <translation id="5669267381087807207">Активация</translation>
 <translation id="5673434351075758678">В результате синхронизации настроек язык изменен. Теперь используется <ph name="TO_LOCALE" />, а не <ph name="FROM_LOCALE" />.</translation>
+<translation id="5682642926269496722">Google Ассистент недоступен в этом аккаунте.</translation>
 <translation id="5691772641933328258">Не удалось распознать отпечаток</translation>
 <translation id="5710450975648804523">Режим "Не беспокоить" включен</translation>
 <translation id="574392208103952083">Средний</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">Не удалось подтвердить пароль. Повторите попытку.</translation>
 <translation id="607652042414456612">Расположенные поблизости устройства Bluetooth видят ваш компьютер под именем <ph name="NAME" /> с адресом <ph name="ADDRESS" />.</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> заряжается</translation>
+<translation id="612734058257491180">В рамках гостевого сеанса Google Ассистент недоступен.</translation>
 <translation id="615957422585914272">Показывать экранную клавиатуру</translation>
 <translation id="6164005077879661055">После удаления контролируемого профиля все файлы и локальные данные, связанные с ним, будут удалены. Посещенные страницы и настройки этого профиля будут видны его менеджеру на странице: <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Подробнее...</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">Устройство <ph name="DEVICE_NAME" /> подключено через Bluetooth и доступно всем пользователям. Вы можете отключить его на странице настроек.</translation>
 <translation id="6715542151869432661">Мобильные устройства не найдены.</translation>
 <translation id="6723839937902243910">Питание</translation>
+<translation id="6727969043791803658">Подключено, батарея заряжена на <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6751826523481687655">Отслеживание эффективности включено.</translation>
 <translation id="6790428901817661496">Воспроизвести</translation>
 <translation id="6803622936009808957">Не удалось дублировать изображение экрана, т. к. указанное разрешение не поддерживается. Включен режим расширенного рабочего стола.</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index e2d0e481..f0f3f46 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">நெட்வொர்க் இணைப்பை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">வலப்புறம் செல்</translation>
 <translation id="1812997170047690955">எனது திரையில் இருப்பவையா?</translation>
+<translation id="1820355135508821526">இந்தச் சாதனத்தில் அமைக்கப்பட்டுள்ள கொள்கையின்படி <ph name="FEATURE_NAME" /> அம்சம் முடக்கப்பட்டுள்ளது. இதை மாற்ற உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
 <translation id="1823873187264960516">ஈதர்நெட்: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">அசிஸ்டண்ட் (ஏற்றுகிறது...)</translation>
 <translation id="1850504506766569011">வைஃபை முடக்கத்தில் உள்ளது.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">புதுப்பிக்க, மீண்டும் தொடங்குக</translation>
 <translation id="2597972630681408282">நைட் லைட்: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">சிம் கார்டு பூட்டப்பட்டுள்ளது</translation>
+<translation id="2651765386227849097">இந்தச் சாதனத்தில் Google அசிஸ்டண்ட் முடக்கப்பட்டுள்ளது.</translation>
 <translation id="2653659639078652383">சமர்ப்பி</translation>
 <translation id="2658778018866295321">கிளிக் செய்து இழுக்கும்</translation>
 <translation id="2700493154570097719">எனது விசைப்பலகையை அமை</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">பேட்டரி நிரம்பியது.</translation>
 <translation id="490375751687810070">செங்குத்து</translation>
 <translation id="4905614135390995787">அதிக ஒளி மாறுபாட்டுப் பயன்முறையை மாற்றும் ஷார்ட்கட் மாற்றப்பட்டது. <ph name="OLD_SHORTCUT" />க்குப் பதிலாக, <ph name="NEW_SHORTCUT" />ஐப் பயன்படுத்தவும்.</translation>
+<translation id="490788395437447240">பேட்டரி: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="4917385247580444890">வலிமையானது</translation>
 <translation id="4918086044614829423">ஏற்கிறேன்</translation>
 <translation id="4924411785043111640">மீண்டும் தொடங்கி, மீட்டமை</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">மைக் ஜாக்</translation>
 <translation id="5669267381087807207">செயலாக்குகிறது</translation>
 <translation id="5673434351075758678">அமைப்புகளை ஒத்திசைத்த பின்னர், "<ph name="FROM_LOCALE" />" இலிருந்து "<ph name="TO_LOCALE" />"க்கு மாற்றப்பட்டது.</translation>
+<translation id="5682642926269496722">பயனரின் தற்போதைய கணக்கில் Google அசிஸ்டண்ட் ஆதரிக்கப்படாது.</translation>
 <translation id="5691772641933328258">கைரேகை அங்கீகரிக்கப்படவில்லை</translation>
 <translation id="5710450975648804523">தொந்தரவு செய்ய வேண்டாம்: ஆன்</translation>
 <translation id="574392208103952083">நடுநிலை</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">கடவுச்சொல்லைச் சரிபார்க்க முடியவில்லை. மீண்டும் முயலவும்.</translation>
 <translation id="607652042414456612">உங்கள் கம்ப்யூட்டர் அருகிலுள்ள Bluetooth சாதனங்களால் கண்டறியப்படும், மேலும் <ph name="ADDRESS" /> என்ற முகவரியுடன் "<ph name="NAME" />" என்ற பெயரில் தோன்றும்</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> சார்ஜ் ஏற்றப்படுகிறது</translation>
+<translation id="612734058257491180">விருந்தினர் அமர்வில் Google அசிஸ்டண்ட்டைப் பயன்படுத்த இயலாது.</translation>
 <translation id="615957422585914272">ஸ்கிரீன் கீபோர்டைக் காட்டு</translation>
 <translation id="6164005077879661055">இந்தக் மேற்பார்வையிடப்படும் பயனர் அகற்றப்பட்டவுடன் மேற்பார்வையிடப்படும் பயனருடன் தொடர்புடைய எல்லா கோப்புகளும், அகத் தரவும் நிரந்தரமாக நீக்கப்படும். இந்தக் மேற்பார்வையிடப்படும் பயனர் பார்வையிட்ட இணையதளங்களையும் அமைப்புகளையும் <ph name="MANAGEMENT_URL" /> இல் இன்னும் நிர்வாகியால் பார்க்க முடியும்.</translation>
 <translation id="6165508094623778733">மேலும் அறிக</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />" ஆனது இணைக்கப்பட்டது மற்றும் இப்போது எல்லா பயனர்களுக்கும் கிடைக்கக்கூடியதாக உள்ளது. அமைப்புகளைப் பயன்படுத்தி இந்த இணைத்தலை நீங்கள் அகற்றலாம்.</translation>
 <translation id="6715542151869432661">மொபைல் சாதனங்கள் எதுவுமில்லை.</translation>
 <translation id="6723839937902243910">ஆற்றல்</translation>
+<translation id="6727969043791803658">இணைக்கப்பட்டது, பேட்டரி: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6751826523481687655">செயல்திறன் டிரேஸிங் இயக்கத்தில் உள்ளது</translation>
 <translation id="6790428901817661496">இயக்கு</translation>
 <translation id="6803622936009808957">ஆதரிக்கும் தெளிவுகள் கிடைக்காததால் காட்சிகளைப் பிரதிபலிக்க முடியவில்லை. பதிலாக நீட்டிக்கப்பட்ட டெஸ்க்டாப்பிற்குச் சென்றது.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index cf2f82b..0dec8f0 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">నెట్‌వర్క్ కనెక్షన్‌ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">కుడికి స్క్రోల్ చేయి</translation>
 <translation id="1812997170047690955">నా స్క్రీన్‌పై ఏమి ఉన్నాయి?</translation>
+<translation id="1820355135508821526">ఈ పరికరానికి వర్తింపజేసిన విధానం కారణంగా <ph name="FEATURE_NAME" /> నిలిపివేయబడింది. మార్పులను అభ్యర్థించండానికి, దయచేసి మీ నిర్వాహకుడితో మాట్లాడండి.</translation>
 <translation id="1823873187264960516">ఈథర్‌నెట్: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">సహాయకం (లోడ్ అవుతోంది...)</translation>
 <translation id="1850504506766569011">Wi-Fi ఆఫ్ చేయబడింది.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">అప్‌డేేట్ చేయడానికి పునఃప్రారంభించండి</translation>
 <translation id="2597972630681408282">రాత్రి కాంతి: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM కార్డ్ లాక్ అయింది</translation>
+<translation id="2651765386227849097">ఈ పరికరంలో Google అసిస్టెంట్ నిలిపివేయబడింది.</translation>
 <translation id="2653659639078652383">సమర్పించు</translation>
 <translation id="2658778018866295321">క్లిక్ చేసి, లాగండి</translation>
 <translation id="2700493154570097719">మీ కీబోర్డ్‌ని సెట్ చేయండి</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">బ్యాటరీ నిండింది.</translation>
 <translation id="490375751687810070">నిలువుగా ఉంది</translation>
 <translation id="4905614135390995787">అధిక కాంట్రాస్ట్ మోడ్‌ను టోగుల్ చేయడానికి ఉన్న షార్ట్‌కట్ మార్చబడింది. దయచేసి <ph name="OLD_SHORTCUT" />కు బదులుగా <ph name="NEW_SHORTCUT" /> ఉపయోగించండి.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% బ్యాటరీ</translation>
 <translation id="4917385247580444890">బలమైన</translation>
 <translation id="4918086044614829423">ఆమోదించు</translation>
 <translation id="4924411785043111640">మళ్లీ ప్రారంభించి, రీసెట్ చేయండి</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">మైక్ జాక్</translation>
 <translation id="5669267381087807207">సక్రియం చేస్తోంది</translation>
 <translation id="5673434351075758678">మీ సెట్టింగులను సమకాలీకరించిన తర్వాత "<ph name="FROM_LOCALE" />" నుండి "<ph name="TO_LOCALE" />"కి.</translation>
+<translation id="5682642926269496722">ప్రస్తుత వినియోగదారు ఖాతాలో Google అసిస్టెంట్ పని చేయదు.</translation>
 <translation id="5691772641933328258">వేలిముద్ర గుర్తించబడలేదు</translation>
 <translation id="5710450975648804523">'అంతరాయం కలిగించవద్దు' మోడ్ ఆన్‌లో ఉంది</translation>
 <translation id="574392208103952083">మధ్యస్థం</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">క్షమించండి, మీ పాస్‌వర్డ్ ధృవీకరించబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="607652042414456612">మీ కంప్యూటర్ సమీప బ్లూటూత్ పరికరాల్లో కనుగొనబడుతుంది మరియు చిరునామా <ph name="ADDRESS" />తో "<ph name="NAME" />" లాగా కనిపిస్తుంది</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" />ని ఛార్జ్ చేస్తోంది</translation>
+<translation id="612734058257491180">అతిథి సెషన్‌లో Google అసిస్టెంట్ పని చేయదు.</translation>
 <translation id="615957422585914272">స్క్రీన్‌పై కీబోర్డ్‌ను చూపు</translation>
 <translation id="6164005077879661055">ఈ పర్యవేక్షించబడే వినియోగదారు తీసివేయబడినప్పుడు, పర్యవేక్షించబడే వినియోగదారుతో అనుబంధించబడిన అన్ని ఫైల్‌లు మరియు స్థానిక డేటా శాశ్వతంగా తొలగించబడతాయి. ఈ పర్యవేక్షించబడే వినియోగదారు సందర్శించిన వెబ్‌సైట్‌లు మరియు వీరి సెట్టింగ్‌లు ఇప్పటికీ <ph name="MANAGEMENT_URL" />లో నిర్వాహకునికి కనిపించవచ్చు.</translation>
 <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత చేయబడింది. ఇప్పుడు అందరు వినియోగదారులకు అందుబాటులో ఉంది. మీరు సెట్టింగ్‌లను ఉపయోగించి ఈ జతను తీసివేయవచ్చు.</translation>
 <translation id="6715542151869432661">మొబైల్ పరికరాలేవీ కనుగొనబడలేదు.</translation>
 <translation id="6723839937902243910">పవర్</translation>
+<translation id="6727969043791803658">కనెక్ట్ చేయబడింది, <ph name="BATTERY_PERCENTAGE" />% బ్యాటరీ ఉంది</translation>
 <translation id="6751826523481687655">పనితీరు స్థితిగతి కనుగొనడం ఆన్‌లో ఉంది</translation>
 <translation id="6790428901817661496">ప్లే చేయి</translation>
 <translation id="6803622936009808957">మద్దతు ఉన్న రిజల్యూషన్‌లు కనుగొనబడనందున ప్రదర్శనలను ప్రతిబింబించడం సాధ్యపడలేదు. దానికి బదులుగా విస్తారిత డెస్క్‌టాప్‌కు మారారు.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index ef5cb17..b8668d6f 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">เปิด/ปิดการเชื่อมต่อเครือข่าย <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">เลื่อนไปทางขวา</translation>
 <translation id="1812997170047690955">รายการที่อยู่ในหน้าจอของฉัน</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" />ปิดใช้โดยนโยบายที่ใช้กับอุปกรณ์นี้ โปรดติดต่อผู้ดูแลระบบเพื่อขอให้เปลี่ยนแปลง</translation>
 <translation id="1823873187264960516">อีเทอร์เน็ต: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (กำลังโหลด...)</translation>
 <translation id="1850504506766569011">WiFi ปิดอยู่</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">รีสตาร์ทเพื่ออัปเดต</translation>
 <translation id="2597972630681408282">แสงตอนกลางคืน: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">ซิมการ์ดถูกล็อก</translation>
+<translation id="2651765386227849097">มีการปิดใช้ Google Assistant ในอุปกรณ์นี้</translation>
 <translation id="2653659639078652383">ส่ง</translation>
 <translation id="2658778018866295321">คลิกแล้วลาก</translation>
 <translation id="2700493154570097719">ตั้งค่าแป้นพิมพ์</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">แบตเตอรี่เต็ม</translation>
 <translation id="490375751687810070">แนวตั้ง</translation>
 <translation id="4905614135390995787">มีการเปลี่ยนแปลงแป้นพิมพ์ลัดสำหรับสลับโหมดคอนทราสต์สูง โปรดใช้ <ph name="NEW_SHORTCUT" /> แทน <ph name="OLD_SHORTCUT" /></translation>
+<translation id="490788395437447240">แบตเตอรี่ <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="4917385247580444890">แรง</translation>
 <translation id="4918086044614829423">ยอมรับ</translation>
 <translation id="4924411785043111640">รีสตาร์ทและรีเซ็ต</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">ช่องเสียบไมโครโฟน</translation>
 <translation id="5669267381087807207">กำลังเปิดการใช้งาน</translation>
 <translation id="5673434351075758678">เปลี่ยนจาก "<ph name="FROM_LOCALE" />" เป็น "<ph name="TO_LOCALE" />" หลังการซิงก์การตั้งค่า</translation>
+<translation id="5682642926269496722">Google Assistant ไม่พร้อมใช้งานกับบัญชีผู้ใช้ปัจจุบัน</translation>
 <translation id="5691772641933328258">ระบบไม่รู้จักลายนิ้วมือนี้</translation>
 <translation id="5710450975648804523">โหมดห้ามรบกวนเปิดอยู่</translation>
 <translation id="574392208103952083">ขนาดกลาง</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">ขออภัย ยืนยันรหัสผ่านไม่ได้ โปรดลองอีกครั้ง</translation>
 <translation id="607652042414456612">ค้นพบคอมพิวเตอร์ของคุณอยู่ใกล้กับอุปกรณ์บลูทูธและจะปรากฏเป็น "<ph name="NAME" />" พร้อมด้วยที่อยู่ <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">กำลังชาร์จ<ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">ใช้ Google Assistant ในเซสชันผู้เยี่ยมชมไม่ได้</translation>
 <translation id="615957422585914272">แสดงแป้นพิมพ์บนหน้าจอ</translation>
 <translation id="6164005077879661055">ไฟล์และข้อมูลในตัวเครื่องทั้งหมดที่เกี่ยวข้องกับผู้ใช้ภายใต้การดูแลจะถูกลบออกอย่างถาวรเมื่อผู้ใช้ภายใต้การดูแลนี้ถูกลบ เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL" /></translation>
 <translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ได้รับการจับคู่และขณะนี้พร้อมให้บริการแก่ผู้ใช้ทุกคนแล้ว คุณสามารถลบการจับคู่นี้โดยใช้การตั้งค่า</translation>
 <translation id="6715542151869432661">ไม่พบอุปกรณ์เคลื่อนที่</translation>
 <translation id="6723839937902243910">พลังงาน</translation>
+<translation id="6727969043791803658">เชื่อมต่อแล้ว แบตเตอรี่ <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6751826523481687655">การติดตามประสิทธิภาพเปิดอยู่</translation>
 <translation id="6790428901817661496">เล่น</translation>
 <translation id="6803622936009808957">ไม่สามารถแสดงผลคู่ขนานได้เนื่องจากไม่พบความละเอียดที่สนับสนุน เข้าสู่เดสก์ท็อปแบบขยายแทน</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 3b1bcbd..21c3b168 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Ağ bağlantısını aç/kapat. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Sağa kaydır</translation>
 <translation id="1812997170047690955">Ekranımda ne var?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" />, bu cihaza uygulanan bir politika tarafından devre dışı bırakıldı. Lütfen değişiklik talep etmek için yöneticinizle konuşun.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistan (yükleniyor...)</translation>
 <translation id="1850504506766569011">Kablosuz kapalı.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Güncellemek için yeniden başlat</translation>
 <translation id="2597972630681408282">Gece Işığı: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM kart kilitli</translation>
+<translation id="2651765386227849097">Google Asistan bu cihazda engellendi.</translation>
 <translation id="2653659639078652383">Gönder</translation>
 <translation id="2658778018866295321">Tıkla ve sürükle</translation>
 <translation id="2700493154570097719">Klavyenizi ayarlayın</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">Pil dolu.</translation>
 <translation id="490375751687810070">Dikey</translation>
 <translation id="4905614135390995787">Yüksek Kontrast Modunu açma/kapatma kısayolu değişti. Lütfen <ph name="OLD_SHORTCUT" /> yerine <ph name="NEW_SHORTCUT" /> tuşlarını kullanın.</translation>
+<translation id="490788395437447240">%<ph name="BATTERY_PERCENTAGE" /> pil</translation>
 <translation id="4917385247580444890">Güçlü</translation>
 <translation id="4918086044614829423">Kabul et</translation>
 <translation id="4924411785043111640">Yeniden başlat ve sıfırla</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">Mikrofon jakı</translation>
 <translation id="5669267381087807207">Etkinleştiriliyor</translation>
 <translation id="5673434351075758678">Ayarlarınız senkronize edildikten sonra "<ph name="FROM_LOCALE" />" olan dil "<ph name="TO_LOCALE" />" olarak değiştirildi.</translation>
+<translation id="5682642926269496722">Google Asistan geçerli kullanıcı hesabı için kullanılamaz.</translation>
 <translation id="5691772641933328258">Parmak izi tanınmadı</translation>
 <translation id="5710450975648804523">Rahatsız Etmeyin modu açık</translation>
 <translation id="574392208103952083">Orta</translation>
@@ -332,6 +336,7 @@
 <translation id="607652042414456612">Bilgisayarınız yakındaki Bluetooth cihazlar tarafından keşfedilebilir durumdadır. Ayrıca,
 <ph name="ADDRESS" /> adresine sahip "<ph name="NAME" />" olarak görünecek</translation>
 <translation id="6106745654298855237"><ph name="POWER_SOURCE" /> şarj ediyor</translation>
+<translation id="612734058257491180">Google Asistan, misafir oturumunda kullanılamaz.</translation>
 <translation id="615957422585914272">Dokunmatik klavyeyi göster</translation>
 <translation id="6164005077879661055">Denetlenen bu kullanıcı kaldırıldığında denetlenen kullanıcıyla ilişkilendirilmiş tüm dosyalar ve yerel veriler kalıcı olarak silinir. Yönetici, denetlenen bu kullanıcıya ilişkin ziyaret edilen web sayfaları ve ayarları <ph name="MANAGEMENT_URL" /> adresinden görüntülemeye devam edebilir.</translation>
 <translation id="6165508094623778733">Daha fazla bilgi edinin</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşlendi ve artık tüm kullanıcılar tarafından kullanılabilir. Bu eşlemeyi Ayarlar'ı kullanarak kaldırabilirsiniz.</translation>
 <translation id="6715542151869432661">Mobil cihaz bulunamadı.</translation>
 <translation id="6723839937902243910">Güç</translation>
+<translation id="6727969043791803658">Bağlandı, %<ph name="BATTERY_PERCENTAGE" /> pil</translation>
 <translation id="6751826523481687655">Performans izleme açık</translation>
 <translation id="6790428901817661496">Oynat</translation>
 <translation id="6803622936009808957">Desteklenen bir çözünürlük bulunamadığı için ekranlar yansıtılamıyor. Bunun yerine genişletilmiş masaüstüne geçiliyor.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 707b57f..32d87f5d 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">Bật/tắt kết nối mạng. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Cuộn sang phải</translation>
 <translation id="1812997170047690955">Trên màn hình của tôi có nội dung gì?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" /> đã tắt theo một chính sách áp dụng cho thiết bị này. Vui lòng liên hệ với quản trị viên để yêu cầu thay đổi.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Trợ lý (đang tải...)</translation>
 <translation id="1850504506766569011">Wi-Fi đang tắt.</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">Khởi động lại để cập nhật</translation>
 <translation id="2597972630681408282">Ánh sáng đêm: <ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">Thẻ SIM bị khóa</translation>
+<translation id="2651765386227849097">Trợ lý Google đã tắt trên thiết bị này.</translation>
 <translation id="2653659639078652383">Gửi</translation>
 <translation id="2658778018866295321">Nhấp và kéo</translation>
 <translation id="2700493154570097719">Đặt bàn phím</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">Pin đầy.</translation>
 <translation id="490375751687810070">Dọc</translation>
 <translation id="4905614135390995787">Phím tắt để chuyển đổi Chế độ tương phản cao đã thay đổi. Vui lòng sử dụng <ph name="NEW_SHORTCUT" /> thay vì <ph name="OLD_SHORTCUT" />.</translation>
+<translation id="490788395437447240"><ph name="BATTERY_PERCENTAGE" />% pin</translation>
 <translation id="4917385247580444890">Mạnh</translation>
 <translation id="4918086044614829423">Chấp nhận</translation>
 <translation id="4924411785043111640">Khởi động lại và đặt lại</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">Giắc cắm micrô</translation>
 <translation id="5669267381087807207">Đang kích hoạt</translation>
 <translation id="5673434351075758678">Từ "<ph name="FROM_LOCALE" />" sang "<ph name="TO_LOCALE" />" sau khi đồng bộ hóa cài đặt của bạn.</translation>
+<translation id="5682642926269496722">Tài khoản người dùng hiện tại chưa hỗ trợ Trợ lý Google.</translation>
 <translation id="5691772641933328258">Không nhận dạng được vân tay</translation>
 <translation id="5710450975648804523">Chế độ Không làm phiền đang bật</translation>
 <translation id="574392208103952083">Trung bình</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">Rất tiếc, chúng tôi không thể xác minh được mật khẩu của bạn. Vui lòng thử lại.</translation>
 <translation id="607652042414456612">Máy tính của bạn có thể phát hiện thiết bị Bluetooth gần đó và hiện thị dưới tên "<ph name="NAME" />" với địa chỉ là <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">Đang sạc <ph name="POWER_SOURCE" /></translation>
+<translation id="612734058257491180">Bạn không thể dùng Trợ lý Google trong phiên khách.</translation>
 <translation id="615957422585914272">Hiển thị bàn phím ảo</translation>
 <translation id="6164005077879661055">Tất cả các tệp và dữ liệu trên máy được liên kết với người dùng được giám sát sẽ vĩnh viễn bị xóa khi người dùng được giám sát này bị xóa. Các trang web đã truy cập và các cài đặt của người dùng được giám sát này có thể vẫn hiển thị với người quản lý tại <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Tìm hiểu thêm</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />"đã được ghép nối và hiện khả dụng với tất cả người dùng. Bạn có thể xóa ghép nối này bằng Cài đặt.</translation>
 <translation id="6715542151869432661">Không tìm thấy thiết bị di động nào.</translation>
 <translation id="6723839937902243910">Nguồn</translation>
+<translation id="6727969043791803658">Đã kết nối, <ph name="BATTERY_PERCENTAGE" />% pin</translation>
 <translation id="6751826523481687655">Tính năng theo dõi hiệu suất đang bật</translation>
 <translation id="6790428901817661496">Phát</translation>
 <translation id="6803622936009808957">Không thể phản chiếu màn hình do không tìm thấy độ phân giải được hỗ trợ. Thay vào đó, đã chuyển sang chế độ màn hình mở rộng.</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 4574cda..24b6e56 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">切换网络连接设置。<ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">向右滚动</translation>
 <translation id="1812997170047690955">我的屏幕上有什么内容?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" />已由应用于此设备的某个政策停用。如要更改,请与您的管理员联系。</translation>
 <translation id="1823873187264960516">以太网:<ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">智能助理(正在加载中…)</translation>
 <translation id="1850504506766569011">Wi-Fi 已关闭。</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">重启以进行更新</translation>
 <translation id="2597972630681408282">夜间模式:<ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM 卡已被锁定</translation>
+<translation id="2651765386227849097">此设备已停用 Google 助理。</translation>
 <translation id="2653659639078652383">提交</translation>
 <translation id="2658778018866295321">点击并拖动</translation>
 <translation id="2700493154570097719">设置键盘</translation>
@@ -262,6 +264,7 @@
 <translation id="4895488851634969361">电池电量已满。</translation>
 <translation id="490375751687810070">纵向</translation>
 <translation id="4905614135390995787">用于切换高反差模式的快捷键已更改。请使用 <ph name="NEW_SHORTCUT" />,而不是 <ph name="OLD_SHORTCUT" />。</translation>
+<translation id="490788395437447240">电池电量:<ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="4917385247580444890">强</translation>
 <translation id="4918086044614829423">接受</translation>
 <translation id="4924411785043111640">重启并重置</translation>
@@ -299,6 +302,7 @@
 <translation id="5648021990716966815">麦克风耳机插孔</translation>
 <translation id="5669267381087807207">正在激活</translation>
 <translation id="5673434351075758678">当系统同步完您的设置后,“<ph name="FROM_LOCALE" />”即会改为“<ph name="TO_LOCALE" />”。</translation>
+<translation id="5682642926269496722">当前用户帐号无法使用 Google 助理。</translation>
 <translation id="5691772641933328258">无法识别指纹</translation>
 <translation id="5710450975648804523">“请勿打扰”模式已开启</translation>
 <translation id="574392208103952083">中</translation>
@@ -332,6 +336,7 @@
 <translation id="6064337552080329342">抱歉,系统无法验证您的密码。请重试。</translation>
 <translation id="607652042414456612">附近的蓝牙设备可检测到您的计算机(名称将显示为“<ph name="NAME" />”,地址为<ph name="ADDRESS" />)</translation>
 <translation id="6106745654298855237">正在为“<ph name="POWER_SOURCE" />”充电</translation>
+<translation id="612734058257491180">无法在访客会话中使用 Google 助理。</translation>
 <translation id="615957422585914272">显示屏幕键盘</translation>
 <translation id="6164005077879661055">删除该受监管用户后,与其相关联的所有文件和本地数据都会被永久删除,但管理员仍可以在 <ph name="MANAGEMENT_URL" /> 上查看该用户的设置和访问过的网站。</translation>
 <translation id="6165508094623778733">了解详情</translation>
@@ -373,6 +378,7 @@
 <translation id="6713285437468012787">蓝牙设备“<ph name="DEVICE_NAME" />”已配对,现可供所有用户使用。您可以通过“设置”取消此配对。</translation>
 <translation id="6715542151869432661">找不到任何移动设备。</translation>
 <translation id="6723839937902243910">电源</translation>
+<translation id="6727969043791803658">已连接,剩余电量为 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6751826523481687655">已启用性能跟踪</translation>
 <translation id="6790428901817661496">播放</translation>
 <translation id="6803622936009808957">找不到系统支持的分辨率,因此无法镜像显示屏。已改为进入扩展桌面。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 78edd270..142be2f 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -59,6 +59,7 @@
 <translation id="1761222317188459878">切換網路連線設定。<ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">向右捲動</translation>
 <translation id="1812997170047690955">我的畫面內容有什麼資訊?</translation>
+<translation id="1820355135508821526"><ph name="FEATURE_NAME" />已由這個裝置所套用的政策停用。如要變更,請聯絡你的管理員。</translation>
 <translation id="1823873187264960516">乙太網路:<ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">小幫手 (載入中…)</translation>
 <translation id="1850504506766569011">Wi-Fi 已關閉。</translation>
@@ -113,6 +114,7 @@
 <translation id="2582112259361606227">重新啟動即可更新</translation>
 <translation id="2597972630681408282">夜燈功能:<ph name="NIGHT_LIGHT_STATUS" /></translation>
 <translation id="2617342710774726426">SIM 卡已鎖定</translation>
+<translation id="2651765386227849097">這個裝置已停用 Google 助理。</translation>
 <translation id="2653659639078652383">提交</translation>
 <translation id="2658778018866295321">按住並拖曳</translation>
 <translation id="2700493154570097719">設定鍵盤</translation>
@@ -261,6 +263,7 @@
 <translation id="4895488851634969361">電池電量已滿。</translation>
 <translation id="490375751687810070">縱向</translation>
 <translation id="4905614135390995787">切換高對比模式的快速鍵已變更,請改用 <ph name="NEW_SHORTCUT" /> (停用 <ph name="OLD_SHORTCUT" />)。</translation>
+<translation id="490788395437447240">電量:<ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="4917385247580444890">強</translation>
 <translation id="4918086044614829423">接受</translation>
 <translation id="4924411785043111640">重新啟動並重設</translation>
@@ -298,6 +301,7 @@
 <translation id="5648021990716966815">麥克風插孔</translation>
 <translation id="5669267381087807207">啟用中</translation>
 <translation id="5673434351075758678">同步處理設定後,「<ph name="FROM_LOCALE" />」已變更為「<ph name="TO_LOCALE" />」。</translation>
+<translation id="5682642926269496722">Google 助理不適用於目前的使用者帳戶。</translation>
 <translation id="5691772641933328258">指紋辨識失敗</translation>
 <translation id="5710450975648804523">「零打擾」模式已開啟</translation>
 <translation id="574392208103952083">中</translation>
@@ -331,6 +335,7 @@
 <translation id="6064337552080329342">很抱歉!系統無法驗證你的密碼,請再試一次。</translation>
 <translation id="607652042414456612">你的電腦已開放附近的藍牙裝置搜尋,顯示名稱為「<ph name="NAME" />」,位址則是 <ph name="ADDRESS" /></translation>
 <translation id="6106745654298855237">正在為「<ph name="POWER_SOURCE" />」充電</translation>
+<translation id="612734058257491180">Google 助理不適用於訪客工作階段。</translation>
 <translation id="615957422585914272">顯示螢幕小鍵盤</translation>
 <translation id="6164005077879661055">將這位受監管的使用者移除後,系統即會永久刪除所有與該使用者相關的檔案和本機資料。管理員仍可前往 <ph name="MANAGEMENT_URL" /> 查看這位受監管使用者的網頁瀏覽記錄和設定。</translation>
 <translation id="6165508094623778733">瞭解詳情</translation>
@@ -372,6 +377,7 @@
 <translation id="6713285437468012787">藍牙裝置「<ph name="DEVICE_NAME" />」已配對成功,可供所有使用者使用。如要移除配對,請使用「設定」。</translation>
 <translation id="6715542151869432661">找不到行動裝置。</translation>
 <translation id="6723839937902243910">電源</translation>
+<translation id="6727969043791803658">已連線,電量為 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6751826523481687655">效能追蹤已啟用</translation>
 <translation id="6790428901817661496">播放</translation>
 <translation id="6803622936009808957">找不到系統支援的解析度,因此無法顯示鏡像。已改為進入延伸桌面。</translation>
diff --git a/ash/system/accessibility/autoclick_menu_bubble_controller.cc b/ash/system/accessibility/autoclick_menu_bubble_controller.cc
index 6336692334..d95edba 100644
--- a/ash/system/accessibility/autoclick_menu_bubble_controller.cc
+++ b/ash/system/accessibility/autoclick_menu_bubble_controller.cc
@@ -28,8 +28,8 @@
 
 namespace {
 // Autoclick menu constants.
-const int kAutoclickMenuWidth = 321;
-const int kAutoclickMenuWidthWithScroll = 371;
+const int kAutoclickMenuWidth = 319;
+const int kAutoclickMenuWidthWithScroll = 369;
 const int kAutoclickMenuHeight = 64;
 
 mojom::AutoclickMenuPosition DefaultSystemPosition() {
@@ -177,7 +177,8 @@
 
   // Un-inset the bounds to get the widget's bounds, which includes the drop
   // shadow.
-  resting_bounds.Inset(-kCollisionWindowWorkAreaInsetsDp,
+  resting_bounds.Inset(-kCollisionWindowWorkAreaInsetsDp, 0,
+                       -kCollisionWindowWorkAreaInsetsDp,
                        -kCollisionWindowWorkAreaInsetsDp);
   if (bubble_widget_->GetWindowBoundsInScreen() == resting_bounds)
     return;
diff --git a/ash/system/accessibility/autoclick_menu_view.cc b/ash/system/accessibility/autoclick_menu_view.cc
index fad944d..7b9e9c1 100644
--- a/ash/system/accessibility/autoclick_menu_view.cc
+++ b/ash/system/accessibility/autoclick_menu_view.cc
@@ -46,10 +46,12 @@
   AutoclickMenuButton(views::ButtonListener* listener,
                       const gfx::VectorIcon& icon,
                       int accessible_name_id,
-                      int size = kTrayItemSize)
+                      int size = kTrayItemSize,
+                      bool draw_highlight = true)
       : TopShortcutButton(listener, accessible_name_id),
         icon_(&icon),
-        size_(size) {
+        size_(size),
+        draw_highlight_(draw_highlight) {
     EnableCanvasFlippingForRTLUI(false);
     SetPreferredSize(gfx::Size(size_, size_));
     UpdateImage();
@@ -84,13 +86,15 @@
 
   // TopShortcutButton:
   void PaintButtonContents(gfx::Canvas* canvas) override {
-    gfx::Rect rect(GetContentsBounds());
-    cc::PaintFlags flags;
-    flags.setAntiAlias(true);
-    flags.setColor(toggled_ ? kAutoclickMenuButtonColorActive
-                            : kUnifiedMenuButtonColor);
-    flags.setStyle(cc::PaintFlags::kFill_Style);
-    canvas->DrawCircle(gfx::PointF(rect.CenterPoint()), size_ / 2, flags);
+    if (draw_highlight_) {
+      gfx::Rect rect(GetContentsBounds());
+      cc::PaintFlags flags;
+      flags.setAntiAlias(true);
+      flags.setColor(toggled_ ? kAutoclickMenuButtonColorActive
+                              : kUnifiedMenuButtonColor);
+      flags.setStyle(cc::PaintFlags::kFill_Style);
+      canvas->DrawCircle(gfx::PointF(rect.CenterPoint()), size_ / 2, flags);
+    }
 
     views::ImageButton::PaintButtonContents(canvas);
   }
@@ -128,6 +132,7 @@
   // True if the button is currently toggled.
   bool toggled_ = false;
   int size_;
+  const bool draw_highlight_;
 
   DISALLOW_COPY_AND_ASSIGN(AutoclickMenuButton);
 };
@@ -176,7 +181,8 @@
           new AutoclickMenuButton(this,
                                   kAutoclickPositionBottomLeftIcon,
                                   IDS_ASH_AUTOCLICK_OPTION_CHANGE_POSITION,
-                                  kPanelPositionButtonSize)) {
+                                  kPanelPositionButtonSize,
+                                  false /* no highlight */)) {
   // TODO(katie): Initialize scroll above once it launches, target in M77.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kEnableExperimentalAccessibilityAutoclick)) {
diff --git a/ash/system/power/power_button_controller.cc b/ash/system/power/power_button_controller.cc
index 302a24c..6bcda10 100644
--- a/ash/system/power/power_button_controller.cc
+++ b/ash/system/power/power_button_controller.cc
@@ -9,9 +9,6 @@
 #include <utility>
 
 #include "ash/accelerators/accelerator_controller_impl.h"
-#include "ash/display/window_tree_host_manager.h"
-#include "ash/home_screen/home_screen_controller.h"
-#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/session/session_controller_impl.h"
@@ -87,15 +84,6 @@
   return menu_widget;
 }
 
-bool ShouldGoHomeOnScreenOn() {
-  return Shell::Get()->kiosk_next_shell_controller()->IsEnabled();
-}
-
-void GoHome() {
-  int64_t primary_display_id = WindowTreeHostManager::GetPrimaryDisplayId();
-  Shell::Get()->home_screen_controller()->GoHome(primary_display_id);
-}
-
 }  // namespace
 
 constexpr base::TimeDelta PowerButtonController::kScreenStateChangeDelay;
@@ -271,10 +259,6 @@
         (menu_shown_when_power_button_down_ &&
          pre_shutdown_timer_was_running)) {
       display_controller_->SetBacklightsForcedOff(true);
-
-      if (ShouldGoHomeOnScreenOn())
-        GoHome();
-
       LockScreenIfRequired();
     }
   }
diff --git a/ash/system/power/power_button_controller_unittest.cc b/ash/system/power/power_button_controller_unittest.cc
index c226d41..1917b93 100644
--- a/ash/system/power/power_button_controller_unittest.cc
+++ b/ash/system/power/power_button_controller_unittest.cc
@@ -8,11 +8,7 @@
 #include "ash/accessibility/test_accessibility_controller_client.h"
 #include "ash/display/screen_orientation_controller.h"
 #include "ash/display/screen_orientation_controller_test_api.h"
-#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
-#include "ash/kiosk_next/kiosk_next_shell_test_util.h"
-#include "ash/kiosk_next/mock_kiosk_next_shell_client.h"
 #include "ash/media/media_controller_impl.h"
-#include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
@@ -28,13 +24,11 @@
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
-#include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/power_manager/suspend.pb.h"
-#include "ui/aura/window.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/test/display_manager_test_api.h"
 #include "ui/events/event.h"
@@ -1404,72 +1398,4 @@
                                          PowerButtonPosition::TOP,
                                          PowerButtonPosition::BOTTOM));
 
-class KioskNextPowerButtonTest : public PowerButtonControllerTest {
- public:
-  KioskNextPowerButtonTest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell);
-  }
-
-  void SetUp() override {
-    set_start_session(false);
-    PowerButtonControllerTest::SetUp();
-    client_ = std::make_unique<MockKioskNextShellClient>();
-  }
-
-  void TearDown() override {
-    client_.reset();
-    home_screen_window_.reset();
-    PowerButtonControllerTest::TearDown();
-  }
-
-  void SetUpHomeWindow() {
-    home_screen_window_ = CreateTestWindow();
-    home_screen_window_->set_owned_by_parent(false);
-    Shell::GetContainer(Shell::GetPrimaryRootWindow(),
-                        kShellWindowId_HomeScreenContainer)
-        ->AddChild(home_screen_window_.get());
-
-    wm::ActivateWindow(home_screen_window_.get());
-  }
-
- protected:
-  std::unique_ptr<aura::Window> home_screen_window_;
-  std::unique_ptr<MockKioskNextShellClient> client_;
-  base::test::ScopedFeatureList scoped_feature_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(KioskNextPowerButtonTest);
-};
-
-TEST_F(KioskNextPowerButtonTest, FocusKioskNextHome) {
-  LogInKioskNextUser(GetSessionControllerClient());
-  SetUpHomeWindow();
-  EXPECT_TRUE(home_screen_window_->HasFocus());
-
-  std::unique_ptr<aura::Window> window = CreateTestWindow();
-  wm::ActivateWindow(window.get());
-  EXPECT_FALSE(home_screen_window_->HasFocus());
-
-  PressPowerButton();
-  ReleasePowerButton();
-  EXPECT_TRUE(home_screen_window_->HasFocus());
-}
-
-TEST_F(KioskNextPowerButtonTest, KioskNextHomeNotFocusedWhenPowerMenuShown) {
-  LogInKioskNextUser(GetSessionControllerClient());
-  SetUpHomeWindow();
-  std::unique_ptr<aura::Window> window = CreateTestWindow();
-  wm::ActivateWindow(window.get());
-
-  EXPECT_TRUE(window->HasFocus());
-  EXPECT_FALSE(home_screen_window_->HasFocus());
-
-  OpenPowerButtonMenu();
-  EXPECT_FALSE(window->HasFocus());
-  EXPECT_FALSE(home_screen_window_->HasFocus());
-  TapToDismissPowerButtonMenu();
-
-  EXPECT_TRUE(window->HasFocus());
-  EXPECT_FALSE(home_screen_window_->HasFocus());
-}
-
 }  // namespace ash
diff --git a/ash/system/unified/feature_pods_container_view.cc b/ash/system/unified/feature_pods_container_view.cc
index 6f62cb8ec..3fe2433b 100644
--- a/ash/system/unified/feature_pods_container_view.cc
+++ b/ash/system/unified/feature_pods_container_view.cc
@@ -339,4 +339,21 @@
     Layout();
 }
 
+void FeaturePodsContainerView::OnGestureEvent(ui::GestureEvent* event) {
+  if (controller_->pagination_controller()->OnGestureEvent(*event,
+                                                           GetContentsBounds()))
+    event->SetHandled();
+}
+
+void FeaturePodsContainerView::OnScrollEvent(ui::ScrollEvent* event) {
+  controller_->pagination_controller()->OnScroll(
+      gfx::Vector2d(event->x_offset(), event->y_offset()), event->type());
+  event->SetHandled();
+}
+
+bool FeaturePodsContainerView::OnMouseWheel(const ui::MouseWheelEvent& event) {
+  return controller_->pagination_controller()->OnScroll(event.offset(),
+                                                        event.type());
+}
+
 }  // namespace ash
diff --git a/ash/system/unified/feature_pods_container_view.h b/ash/system/unified/feature_pods_container_view.h
index 2e65e344..c67844a 100644
--- a/ash/system/unified/feature_pods_container_view.h
+++ b/ash/system/unified/feature_pods_container_view.h
@@ -57,6 +57,10 @@
   void ViewHierarchyChanged(
       const views::ViewHierarchyChangedDetails& details) override;
   void Layout() override;
+  void OnGestureEvent(ui::GestureEvent* event) override;
+  void OnScrollEvent(ui::ScrollEvent* event) override;
+  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
+
   const char* GetClassName() const override;
 
  private:
@@ -93,7 +97,7 @@
   UnifiedSystemTrayController* const controller_;
 
   // Owned by UnifiedSystemTrayModel.
-  PaginationModel* pagination_model_;
+  PaginationModel* const pagination_model_;
 
   // The last |expanded_amount| passed to SetExpandedAmount().
   double expanded_amount_;
diff --git a/ash/system/unified/feature_pods_container_view_unittest.cc b/ash/system/unified/feature_pods_container_view_unittest.cc
index 0249a2c5..0d387c0b 100644
--- a/ash/system/unified/feature_pods_container_view_unittest.cc
+++ b/ash/system/unified/feature_pods_container_view_unittest.cc
@@ -5,6 +5,7 @@
 #include "ash/system/unified/feature_pods_container_view.h"
 
 #include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/pagination/pagination_controller.h"
 #include "ash/public/cpp/pagination/pagination_model.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/feature_pod_button.h"
@@ -75,6 +76,8 @@
 
   PaginationModel* pagination_model() { return model_->pagination_model(); }
 
+  UnifiedSystemTrayController* controller() { return controller_.get(); }
+
   int preferred_size_changed_count() const {
     return preferred_size_changed_count_;
   }
@@ -245,4 +248,164 @@
   EXPECT_EQ(final_bounds, buttons_[0]->bounds());
 }
 
+TEST_F(FeaturePodsContainerViewTest, PaginationGestureHandling) {
+  const int kNumberOfPages = 8;
+
+  EnablePagination();
+  AddButtons(kUnifiedFeaturePodItemsInRow * kUnifiedFeaturePodItemsRows *
+             kNumberOfPages);
+
+  gfx::Point container_origin = container()->GetBoundsInScreen().origin();
+  ui::GestureEvent swipe_left_begin(
+      container_origin.x(), container_origin.y(), 0, base::TimeTicks(),
+      ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, -1, 0));
+  ui::GestureEvent swipe_left_update(
+      container_origin.x(), container_origin.y(), 0, base::TimeTicks(),
+      ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, -1000, 0));
+  ui::GestureEvent swipe_right_begin(
+      container_origin.x(), container_origin.y(), 0, base::TimeTicks(),
+      ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 1, 0));
+  ui::GestureEvent swipe_right_update(
+      container_origin.x(), container_origin.y(), 0, base::TimeTicks(),
+      ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 1000, 0));
+  ui::GestureEvent swipe_end(container_origin.x(), container_origin.y(), 0,
+                             base::TimeTicks(),
+                             ui::GestureEventDetails(ui::ET_GESTURE_END));
+
+  int previous_page = pagination_model()->selected_page();
+
+  // Swipe left takes to next page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate swipe left
+    container()->OnGestureEvent(&swipe_left_begin);
+    container()->OnGestureEvent(&swipe_left_update);
+    container()->OnGestureEvent(&swipe_end);
+
+    int current_page = pagination_model()->selected_page();
+    // Expect next page
+    EXPECT_EQ(previous_page + 1, current_page);
+    previous_page = current_page;
+  }
+
+  // Swipe left on last page does nothing
+  container()->OnGestureEvent(&swipe_left_begin);
+  container()->OnGestureEvent(&swipe_left_update);
+  container()->OnGestureEvent(&swipe_end);
+
+  EXPECT_EQ(previous_page, pagination_model()->selected_page());
+
+  // Swipe right takes to previous page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate swipe right
+    container()->OnGestureEvent(&swipe_right_begin);
+    container()->OnGestureEvent(&swipe_right_update);
+    container()->OnGestureEvent(&swipe_end);
+
+    int current_page = pagination_model()->selected_page();
+    // Expect previous page
+    EXPECT_EQ(previous_page - 1, current_page);
+    previous_page = current_page;
+  }
+
+  // Swipe right on first page does nothing
+  container()->OnGestureEvent(&swipe_right_begin);
+  container()->OnGestureEvent(&swipe_right_update);
+  container()->OnGestureEvent(&swipe_end);
+
+  EXPECT_EQ(previous_page, pagination_model()->selected_page());
+}
+
+TEST_F(FeaturePodsContainerViewTest, PaginationScrollHandling) {
+  const int kNumberOfPages = 8;
+  const int num_fingers = 2;
+
+  EnablePagination();
+  AddButtons(kUnifiedFeaturePodItemsInRow * kUnifiedFeaturePodItemsRows *
+             kNumberOfPages);
+
+  EXPECT_EQ(kNumberOfPages, pagination_model()->total_pages());
+
+  gfx::Point container_origin = container()->GetBoundsInScreen().origin();
+
+  ui::ScrollEvent fling_up_start(ui::ET_SCROLL_FLING_START, container_origin,
+                                 base::TimeTicks(), 0, 0, 100, 0, 10,
+                                 num_fingers);
+
+  ui::ScrollEvent fling_down_start(ui::ET_SCROLL_FLING_START, container_origin,
+                                   base::TimeTicks(), 0, 0, -100, 0, 10,
+                                   num_fingers);
+
+  ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, container_origin,
+                               base::TimeTicks(), 0, 0, 0, 0, 0, num_fingers);
+
+  int previous_page = pagination_model()->selected_page();
+
+  // Scroll down takes to next page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate Scroll left
+    container()->OnScrollEvent(&fling_down_start);
+    container()->OnScrollEvent(&fling_cancel);
+    pagination_model()->FinishAnimation();
+
+    int current_page = pagination_model()->selected_page();
+    // Expect next page
+    EXPECT_EQ(previous_page + 1, current_page);
+    previous_page = current_page;
+  }
+
+  // Scroll up takes to previous page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate Scroll up
+    container()->OnScrollEvent(&fling_up_start);
+    container()->OnScrollEvent(&fling_cancel);
+    pagination_model()->FinishAnimation();
+
+    int current_page = pagination_model()->selected_page();
+    // Expect previous page
+    EXPECT_EQ(previous_page - 1, current_page);
+    previous_page = current_page;
+  }
+}
+
+TEST_F(FeaturePodsContainerViewTest, PaginationMouseWheelHandling) {
+  const int kNumberOfPages = 8;
+
+  EnablePagination();
+  AddButtons(kUnifiedFeaturePodItemsInRow * kUnifiedFeaturePodItemsRows *
+             kNumberOfPages);
+
+  gfx::Point container_origin = container()->GetBoundsInScreen().origin();
+  ui::MouseWheelEvent wheel_up(gfx::Vector2d(0, 1000), container_origin,
+                               container_origin, base::TimeTicks(), 0, 0);
+
+  ui::MouseWheelEvent wheel_down(gfx::Vector2d(0, -1000), container_origin,
+                                 container_origin, base::TimeTicks(), 0, 0);
+
+  int previous_page = pagination_model()->selected_page();
+
+  // Mouse wheel down takes to next page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate mouse wheel down
+    container()->OnMouseWheel(wheel_down);
+    pagination_model()->FinishAnimation();
+
+    int current_page = pagination_model()->selected_page();
+    // Expect next page
+    EXPECT_EQ(previous_page + 1, current_page);
+    previous_page = current_page;
+  }
+
+  // Mouse wheel up takes to previous page
+  for (int i = 0; i < kNumberOfPages - 1; i++) {
+    // Simulate mouse wheel up
+    container()->OnMouseWheel(wheel_up);
+    pagination_model()->FinishAnimation();
+
+    int current_page = pagination_model()->selected_page();
+    // Expect previous page
+    EXPECT_EQ(previous_page - 1, current_page);
+    previous_page = current_page;
+  }
+}
+
 }  // namespace ash
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index 8605222d..0098c71b 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -7,6 +7,7 @@
 #include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
 #include "ash/metrics/user_metrics_action.h"
 #include "ash/metrics/user_metrics_recorder.h"
+#include "ash/public/cpp/pagination/pagination_controller.h"
 #include "ash/public/cpp/system_tray_client.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
@@ -62,6 +63,10 @@
 
 }  // namespace
 
+// TODO(amehfooz): Add histograms for pagination metrics in system tray.
+void RecordPageSwitcherSourceByEventType(ui::EventType type,
+                                         bool is_tablet_mode) {}
+
 UnifiedSystemTrayController::UnifiedSystemTrayController(
     UnifiedSystemTrayModel* model,
     UnifiedSystemTrayBubble* bubble)
@@ -76,6 +81,11 @@
       kUnifiedSystemTrayPageTransitionDurationMs,
       kUnifiedSystemTrayOverScrollPageTransitionDurationMs);
 
+  pagination_controller_ = std::make_unique<PaginationController>(
+      model_->pagination_model(), PaginationController::SCROLL_AXIS_HORIZONTAL,
+      base::BindRepeating(&RecordPageSwitcherSourceByEventType),
+      Shell::Get()->tablet_mode_controller()->InTabletMode());
+
   Shell::Get()->metrics()->RecordUserMetricsAction(UMA_STATUS_AREA_MENU_OPENED);
   UMA_HISTOGRAM_BOOLEAN("ChromeOS.SystemTray.IsExpandedOnOpen",
                         model_->IsExpandedOnOpen());
diff --git a/ash/system/unified/unified_system_tray_controller.h b/ash/system/unified/unified_system_tray_controller.h
index 1ce565c..211472c 100644
--- a/ash/system/unified/unified_system_tray_controller.h
+++ b/ash/system/unified/unified_system_tray_controller.h
@@ -23,6 +23,7 @@
 
 class DetailedViewController;
 class FeaturePodControllerBase;
+class PaginationController;
 class UnifiedBrightnessSliderController;
 class UnifiedVolumeSliderController;
 class UnifiedSystemTrayBubble;
@@ -113,6 +114,10 @@
 
   UnifiedSystemTrayModel* model() { return model_; }
 
+  PaginationController* pagination_controller() {
+    return pagination_controller_.get();
+  }
+
  private:
   friend class UnifiedSystemTrayControllerTest;
 
@@ -171,6 +176,8 @@
   std::vector<std::unique_ptr<FeaturePodControllerBase>>
       feature_pod_controllers_;
 
+  std::unique_ptr<PaginationController> pagination_controller_;
+
   // Controller of volume slider. Owned.
   std::unique_ptr<UnifiedVolumeSliderController> volume_slider_controller_;
 
diff --git a/ash/wm/collision_detection/collision_detection_utils.cc b/ash/wm/collision_detection/collision_detection_utils.cc
index ec69c12b..5d0e2eb 100644
--- a/ash/wm/collision_detection/collision_detection_utils.cc
+++ b/ash/wm/collision_detection/collision_detection_utils.cc
@@ -48,11 +48,14 @@
 }
 
 gfx::Rect ComputeCollisionRectFromBounds(const gfx::Rect& bounds,
-                                         const aura::Window* parent) {
+                                         const aura::Window* parent,
+                                         bool inset = true) {
   gfx::Rect collision_rect = bounds;
   ::wm::ConvertRectToScreen(parent, &collision_rect);
-  collision_rect.Inset(-kCollisionWindowWorkAreaInsetsDp,
-                       -kCollisionWindowWorkAreaInsetsDp);
+  if (inset) {
+    collision_rect.Inset(-kCollisionWindowWorkAreaInsetsDp,
+                         -kCollisionWindowWorkAreaInsetsDp);
+  }
   return collision_rect;
 }
 
@@ -97,8 +100,22 @@
       if (ShouldIgnoreWindowForCollision(window, priority))
         continue;
       // Use the target bounds in case an animation is in progress.
-      rects.push_back(ComputeCollisionRectFromBounds(window->GetTargetBounds(),
-                                                     window->parent()));
+      if (priority ==
+              CollisionDetectionUtils::RelativePriority::kAutomaticClicksMenu &&
+          window->GetProperty(kCollisionDetectionRelativePriority) ==
+              CollisionDetectionUtils::RelativePriority::
+                  kAutomaticClicksScrollMenu) {
+        // The autoclick menu widget and autoclick scroll menu widget are 0dip
+        // apart because they must be drawn at 8dips apart including drop
+        // shadow. This special case means we should not add an inset if we
+        // are calculating collision rects for the autoclick menu.
+        rects.push_back(ComputeCollisionRectFromBounds(
+            window->GetTargetBounds(), window->parent(),
+            false /* do not inset */));
+      } else {
+        rects.push_back(ComputeCollisionRectFromBounds(
+            window->GetTargetBounds(), window->parent()));
+      }
     }
   }
 
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index e9d3bdb..3ae8f7b0 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -705,6 +705,7 @@
 void OverviewItem::UpdatePhantomsForDragging(
     const gfx::PointF& location_in_screen,
     bool allow_original_window_opacity_change) {
+  DCHECK(AreMultiDisplayOverviewAndSplitViewEnabled());
   DCHECK_GT(Shell::GetAllRootWindows().size(), 1u);
 
   aura::Window* window = transform_window_.IsMinimized()
@@ -725,6 +726,7 @@
 }
 
 void OverviewItem::DestroyPhantomsForDragging() {
+  DCHECK(AreMultiDisplayOverviewAndSplitViewEnabled());
   phantoms_for_dragging_.reset();
   aura::Window* window = transform_window_.IsMinimized()
                              ? item_widget_->GetNativeWindow()
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc
index afa0c187b..b5698e2 100644
--- a/ash/wm/overview/overview_window_drag_controller.cc
+++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -186,8 +186,10 @@
 
   did_move_ = true;
   current_drag_behavior_ = DragBehavior::kNormalDrag;
-  Shell::Get()->mouse_cursor_filter()->ShowSharedEdgeIndicator(
-      item_->root_window());
+  if (AreMultiDisplayOverviewAndSplitViewEnabled()) {
+    Shell::Get()->mouse_cursor_filter()->ShowSharedEdgeIndicator(
+        item_->root_window());
+  }
   item_->ScaleUpSelectedItem(
       OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW);
   original_scaled_size_ = item_->target_bounds().size();
@@ -255,8 +257,10 @@
   if (current_drag_behavior_ == DragBehavior::kNormalDrag) {
     DCHECK(item_->overview_grid()->drop_target_widget());
 
-    Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
-    item_->DestroyPhantomsForDragging();
+    if (AreMultiDisplayOverviewAndSplitViewEnabled()) {
+      Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
+      item_->DestroyPhantomsForDragging();
+    }
     item_->overview_grid()->RemoveDropTarget();
     if (should_allow_split_view_) {
       overview_session_->SetSplitViewDragIndicatorsIndicatorState(
@@ -372,7 +376,7 @@
   bounds.set_x(centerpoint.x() - bounds.width() / 2.f);
   bounds.set_y(centerpoint.y() - bounds.height() / 2.f);
   item_->SetBounds(bounds, OVERVIEW_ANIMATION_NONE);
-  if (display_count_ > 1u) {
+  if (AreMultiDisplayOverviewAndSplitViewEnabled() && display_count_ > 1u) {
     item_->UpdatePhantomsForDragging(location_in_screen,
                                      allow_original_window_opacity_change);
   }
@@ -383,8 +387,10 @@
     const gfx::PointF& location_in_screen) {
   DCHECK_EQ(current_drag_behavior_, DragBehavior::kNormalDrag);
   DCHECK(item_->overview_grid()->drop_target_widget());
-  Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
-  item_->DestroyPhantomsForDragging();
+  if (AreMultiDisplayOverviewAndSplitViewEnabled()) {
+    Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
+    item_->DestroyPhantomsForDragging();
+  }
   item_->overview_grid()->RemoveDropTarget();
 
   const gfx::Point rounded_screen_point =
diff --git a/ash/wm/splitview/split_view_utils.cc b/ash/wm/splitview/split_view_utils.cc
index 9f826c1..7f6b467 100644
--- a/ash/wm/splitview/split_view_utils.cc
+++ b/ash/wm/splitview/split_view_utils.cc
@@ -233,6 +233,11 @@
       ash::features::kDragToSnapInClamshellMode);
 }
 
+bool AreMultiDisplayOverviewAndSplitViewEnabled() {
+  return base::FeatureList::IsEnabled(
+      ash::features::kMultiDisplayOverviewAndSplitView);
+}
+
 bool ShouldAllowSplitView() {
   if (!Shell::Get()->tablet_mode_controller()->InTabletMode() &&
       !IsClamshellSplitViewModeEnabled()) {
diff --git a/ash/wm/splitview/split_view_utils.h b/ash/wm/splitview/split_view_utils.h
index 4012a6a..5547e81 100644
--- a/ash/wm/splitview/split_view_utils.h
+++ b/ash/wm/splitview/split_view_utils.h
@@ -84,6 +84,9 @@
 // clamshell mode.
 ASH_EXPORT bool IsClamshellSplitViewModeEnabled();
 
+// Checks multi-display support for overview and split view.
+ASH_EXPORT bool AreMultiDisplayOverviewAndSplitViewEnabled();
+
 // Returns true if split view mode is supported.
 ASH_EXPORT bool ShouldAllowSplitView();
 
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index df42af9..dff69254 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -153,6 +153,8 @@
       help="android:targetSdkVersion for APK.")
   input_opts.add_argument(
       '--max-sdk-version', help="android:maxSdkVersion for APK.")
+  input_opts.add_argument(
+      '--manifest-package', help='Package name of the AndroidManifest.xml.')
 
   input_opts.add_argument(
       '--locale-whitelist',
@@ -459,16 +461,10 @@
   doc, manifest_node, app_node = manifest_utils.ParseManifest(
       options.android_manifest)
 
-  manifest_utils.AssertNoUsesSdk(manifest_node)
-
-  uses_sdk_attributes = [
-      ('android:minSdkVersion', options.min_sdk_version),
-      ('android:targetSdkVersion', options.target_sdk_version),
-  ]
-  if options.max_sdk_version:
-    uses_sdk_attributes += [('android:maxSdkVersion', options.max_sdk_version)]
-  uses_sdk_node = manifest_utils.MakeElement('uses-sdk', uses_sdk_attributes)
-  manifest_node.insert(0, uses_sdk_node)
+  manifest_utils.AssertUsesSdk(manifest_node, options.min_sdk_version,
+                               options.target_sdk_version,
+                               options.max_sdk_version)
+  manifest_utils.AssertPackage(manifest_node, options.manifest_package)
 
   manifest_node.set('platformBuildVersionCode', version_code)
   manifest_node.set('platformBuildVersionName', version_name)
@@ -727,6 +723,7 @@
       'link',
       '--auto-add-overlay',
       '--no-version-vectors',
+      # Set SDK versions in case they are not set in the Android manifest.
       '--min-sdk-version',
       options.min_sdk_version,
       '--target-sdk-version',
@@ -741,6 +738,7 @@
     link_command += ['--version-name', options.version_name]
   if options.proguard_file:
     link_command += ['--proguard', build.proguard_path]
+    link_command += ['--proguard-minimal-keep-rules']
   if options.proguard_file_main_dex:
     link_command += ['--proguard-main-dex', build.proguard_main_dex_path]
   if options.emit_ids_out:
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index 10c644b7..ac645d7 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -15,6 +15,7 @@
 import sys
 import traceback
 from xml.dom import minidom
+from xml.etree import ElementTree
 
 from util import build_utils
 from util import manifest_utils
@@ -34,6 +35,7 @@
                 android_sdk_version,
                 srcjars,
                 min_sdk_version,
+                manifest_package,
                 resource_sources,
                 disable=None,
                 classpath=None,
@@ -195,20 +197,20 @@
     lint_manifest_path = os.path.join(project_dir, 'AndroidManifest.xml')
     shutil.copyfile(os.path.abspath(manifest_path), lint_manifest_path)
 
-    # Add the minSdkVersion to the manifest.
+    # Check that minSdkVersion and package is correct and add it to the manifest
+    # in case it does not exist.
     doc, manifest, _ = manifest_utils.ParseManifest(lint_manifest_path)
-    # TODO(crbug.com/891996): Only activate once downstream has been updated.
-    # manifest_utils.AssertNoUsesSdk(manifest)
-    if min_sdk_version:
-      # TODO(crbug.com/891996): Don't remove uses-sdk once downstream has been
-      # updated.
-      uses_sdk = manifest.find('./uses-sdk')
-      if uses_sdk is not None:
-        manifest.remove(uses_sdk)
-      uses_sdk = manifest_utils.MakeElement(
-          'uses-sdk', [('android:minSdkVersion', min_sdk_version)])
+    manifest_utils.AssertUsesSdk(manifest, min_sdk_version)
+    manifest_utils.AssertPackage(manifest, manifest_package)
+    uses_sdk = manifest.find('./uses-sdk')
+    if uses_sdk is None:
+      uses_sdk = ElementTree.Element('uses-sdk')
       manifest.insert(0, uses_sdk)
-      manifest_utils.SaveManifest(doc, lint_manifest_path)
+    uses_sdk.set('{%s}minSdkVersion' % manifest_utils.ANDROID_NAMESPACE,
+                 min_sdk_version)
+    if manifest_package:
+      manifest.set('package', manifest_package)
+    manifest_utils.SaveManifest(doc, lint_manifest_path)
 
     cmd.append(project_dir)
 
@@ -306,9 +308,6 @@
   parser.add_argument('--android-sdk-version',
                       help='Version (API level) of the Android SDK used for '
                            'building.')
-  parser.add_argument('--create-cache', action='store_true',
-                      help='Mark the lint cache file as an output rather than '
-                      'an input.')
   parser.add_argument('--can-fail-build', action='store_true',
                       help='If set, script will exit with nonzero exit status'
                            ' if lint errors are present')
@@ -342,7 +341,11 @@
   parser.add_argument('--srcjars',
                       help='GN list of included srcjars.')
   parser.add_argument(
-      '--min-sdk-version', help='Minimal SDK version to lint against.')
+      '--min-sdk-version',
+      required=True,
+      help='Minimal SDK version to lint against.')
+  parser.add_argument(
+      '--manifest-package', help='Package name of the AndroidManifest.xml.')
 
   args = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:]))
 
@@ -417,6 +420,7 @@
                           args.android_sdk_version,
                           args.srcjars,
                           args.min_sdk_version,
+                          args.manifest_package,
                           resource_sources,
                           disable=disable,
                           classpath=classpath,
diff --git a/build/android/gyp/merge_manifest.py b/build/android/gyp/merge_manifest.py
index 4804148..a7b2eff1 100755
--- a/build/android/gyp/merge_manifest.py
+++ b/build/android/gyp/merge_manifest.py
@@ -29,20 +29,24 @@
 
 
 @contextlib.contextmanager
-def _ProcessManifest(manifest_path, allow_uses_sdk):
+def _ProcessManifest(manifest_path, min_sdk_version, target_sdk_version,
+                     manifest_package):
   """Patches an Android manifest to always include the 'tools' namespace
   declaration, as it is not propagated by the manifest merger from the SDK.
 
   See https://issuetracker.google.com/issues/63411481
   """
   doc, manifest, _ = manifest_utils.ParseManifest(manifest_path)
-  package = manifest_utils.GetPackage(manifest)
-  if not allow_uses_sdk:
-    manifest_utils.AssertNoUsesSdk(manifest)
+  manifest_utils.AssertUsesSdk(manifest, min_sdk_version, target_sdk_version)
+  assert manifest_utils.GetPackage(manifest) or manifest_package, \
+            'Must set manifest package in GN or in AndroidManifest.xml'
+  manifest_utils.AssertPackage(manifest, manifest_package)
+  if manifest_package:
+    manifest.set('package', manifest_package)
   tmp_prefix = os.path.basename(manifest_path)
   with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest:
     manifest_utils.SaveManifest(doc, patched_manifest.name)
-    yield patched_manifest.name, package
+    yield patched_manifest.name, manifest_utils.GetPackage(manifest)
 
 
 def _BuildManifestMergerClasspath(build_vars):
@@ -76,10 +80,8 @@
       required=True,
       help='android:targetSdkVersion for merging.')
   parser.add_argument(
-      '--allow-uses-sdk',
-      action='store_true',
-      help='Use only for third party code. '
-      'Don\'t fail if input manifest contains a <uses-sdk> element.')
+      '--manifest-package',
+      help='Package name of the merged AndroidManifest.xml.')
   args = parser.parse_args(argv)
 
   classpath = _BuildManifestMergerClasspath(
@@ -99,7 +101,9 @@
     if extras:
       cmd += ['--libs', ':'.join(extras)]
 
-    with _ProcessManifest(args.root_manifest, args.allow_uses_sdk) as tup:
+    with _ProcessManifest(args.root_manifest, args.min_sdk_version,
+                          args.target_sdk_version,
+                          args.manifest_package) as tup:
       root_manifest, package = tup
       cmd += [
           '--main',
@@ -117,18 +121,11 @@
         fail_func=lambda returncode, stderr: returncode != 0 or
           build_utils.IsTimeStale(output.name, [root_manifest] + extras))
 
-    # Subsequent build system steps expect uses-sdk tag does not exist.
-    # Therefore, check it has the expected attribute values and remove it.
-    doc, manifest, _ = manifest_utils.ParseManifest(output.name)
-    uses_sdk = manifest.find('./uses-sdk')
-    assert uses_sdk.get(
-        '{%s}minSdkVersion' %
-        manifest_utils.ANDROID_NAMESPACE) == args.min_sdk_version
-    assert uses_sdk.get(
-        '{%s}targetSdkVersion' %
-        manifest_utils.ANDROID_NAMESPACE) == args.target_sdk_version
-    manifest.remove(uses_sdk)
-    manifest_utils.SaveManifest(doc, output.name)
+    # Check for correct output.
+    _, manifest, _ = manifest_utils.ParseManifest(output.name)
+    manifest_utils.AssertUsesSdk(manifest, args.min_sdk_version,
+                                 args.target_sdk_version)
+    manifest_utils.AssertPackage(manifest, package)
 
   if args.depfile:
     inputs = extras + classpath.split(':')
diff --git a/build/android/gyp/util/manifest_utils.py b/build/android/gyp/util/manifest_utils.py
index 4171d3d..93a367c 100644
--- a/build/android/gyp/util/manifest_utils.py
+++ b/build/android/gyp/util/manifest_utils.py
@@ -56,18 +56,6 @@
   return doc, manifest_node, app_node
 
 
-def MakeElement(name, attributes=None):
-  _RegisterElementTreeNamespaces()
-  element = ElementTree.Element(name)
-  if attributes:
-    for attribute_name, attribute_val in attributes:
-      if attribute_name.startswith('android:'):
-        attribute_name = '{%s}%s' % (
-            ANDROID_NAMESPACE, attribute_name[attribute_name.find(':') + 1:])
-      element.set(attribute_name, attribute_val)
-  return element
-
-
 def SaveManifest(doc, path):
   with build_utils.AtomicOutput(path) as f:
     f.write(ElementTree.tostring(doc.getroot(), encoding='UTF-8'))
@@ -77,9 +65,46 @@
   return manifest_node.get('package')
 
 
-def AssertNoUsesSdk(manifest_node):
-  """Asserts that manifest has no <uses-sdk> element."""
-  assert manifest_node.find('./uses-sdk') is None, 'Must define uses-sdk in GN'
+def AssertUsesSdk(manifest_node,
+                  min_sdk_version,
+                  target_sdk_version=None,
+                  max_sdk_version=None):
+  """Asserts values of attributes of <uses-sdk> element.
+
+  Will only assert if both the passed value is not None and the value of
+  attribute exist.
+  """
+  # TODO(crbug.com/891996): Activate once all dependency repos have been
+  # updated.
+  # pylint: disable=unreachable
+  return
+
+  uses_sdk_node = manifest_node.find('./uses-sdk')
+  if uses_sdk_node is None:
+    return
+  for prefix, sdk_version in (('min', min_sdk_version), ('target',
+                                                         target_sdk_version),
+                              ('max', max_sdk_version)):
+    value = uses_sdk_node.get('{%s}%sSdkVersion' % (ANDROID_NAMESPACE, prefix))
+    if not value or not sdk_version:
+      continue
+    assert value == sdk_version, (
+        '%sSdkVersion in Android manifest is %s but we expect %s' %
+        (prefix, value, sdk_version))
+
+
+def AssertPackage(manifest_node, package):
+  """Asserts that manifest package has desired value.
+
+  Will only assert if both |package| is not None and the package is set in the
+  manifest.
+  """
+  package_value = GetPackage(manifest_node)
+  if package_value is None or package is None:
+    return
+  assert package_value == package, (
+      'Package in Android manifest is %s but we expect %s' % (package_value,
+                                                              package))
 
 
 def _SortAndStripElementTree(tree, reverse_toplevel=False):
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 9557296..d20d4e3 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -810,6 +810,10 @@
   android_default_aapt_path = "$android_sdk_build_tools/aapt"
 
   template("android_lint") {
+    _min_sdk_version = 19
+    if (defined(invoker.min_sdk_version)) {
+      _min_sdk_version = invoker.min_sdk_version
+    }
     action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
@@ -869,6 +873,7 @@
         "--result-path",
         rebase_path(_result_path, root_build_dir),
         "--include-unexpected-failures",
+        "--min-sdk-version=$_min_sdk_version",
       ]
       if (defined(invoker.android_manifest)) {
         inputs += [ invoker.android_manifest ]
@@ -883,10 +888,7 @@
       }
 
       if (defined(invoker.create_cache) && invoker.create_cache) {
-        args += [
-          "--create-cache",
-          "--silent",
-        ]
+        args += [ "--silent" ]
       } else {
         inputs += invoker.java_files
         inputs += [ invoker.build_config ]
@@ -912,8 +914,8 @@
         }
       }
 
-      if (defined(invoker.min_sdk_version)) {
-        args += [ "--min-sdk-version=${invoker.min_sdk_version}" ]
+      if (defined(invoker.manifest_package)) {
+        args += [ "--manifest-package=${invoker.manifest_package}" ]
       }
     }
   }
@@ -1763,10 +1765,8 @@
         "--target-sdk-version=${invoker.target_sdk_version}",
       ]
 
-      # TODO(crbug.com/891996): Only activate for non-Chromium code once
-      # downstream has been updated.
-      if ((defined(invoker.chromium_code) && !invoker.chromium_code) || true) {
-        args += [ "--allow-uses-sdk" ]
+      if (defined(invoker.manifest_package)) {
+        args += [ "--manifest-package=${invoker.manifest_package}" ]
       }
     }
   }
@@ -2356,6 +2356,9 @@
           args += [ "--fail-if-unexpected-android-manifest" ]
         }
       }
+      if (defined(invoker.manifest_package)) {
+        args += [ "--manifest-package=${invoker.manifest_package}" ]
+      }
     }
 
     if (defined(invoker.post_process_script)) {
@@ -3431,8 +3434,13 @@
     # TODO(agrieve): Enable lint for _has_sources rather than just _java_files.
     _lint_enabled = _java_files != [] && _supports_android && _chromium_code &&
                     !disable_android_lint
-    if (!_lint_enabled && defined(invoker.min_sdk_version)) {
-      not_needed(invoker, [ "min_sdk_version" ])
+    if (!_lint_enabled) {
+      if (defined(invoker.min_sdk_version)) {
+        not_needed(invoker, [ "min_sdk_version" ])
+      }
+      if (defined(invoker.manifest_package)) {
+        not_needed(invoker, [ "manifest_package" ])
+      }
     }
     if (defined(invoker.enable_errorprone)) {
       _enable_errorprone = invoker.enable_errorprone
@@ -3504,7 +3512,11 @@
       if (_lint_enabled) {
         _android_lint_target = "${_main_target_name}__lint"
         android_lint(_android_lint_target) {
-          forward_variables_from(invoker, [ "min_sdk_version" ])
+          forward_variables_from(invoker,
+                                 [
+                                   "min_sdk_version",
+                                   "manifest_package",
+                                 ])
           if (invoker.type == "android_apk" ||
               invoker.type == "android_app_bundle_module") {
             forward_variables_from(invoker, [ "android_manifest" ])
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index f74548e..e8e54ca 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2029,8 +2029,6 @@
   #     resources with acceptable/non-acceptable optimizations.
   #   verify_manifest: Enables verification of expected merged manifest based
   #     on a golden file.
-  #   verify_proguard_flags: Enables verification of expected merged proguard
-  #     flags based on a golden file.
   #   resource_ids_provider_dep: If passed, this target will use the resource
   #     IDs generated by {resource_ids_provider_dep}__compile_res during
   #     resource compilation.
@@ -2321,7 +2319,7 @@
         "$target_gen_dir/${_template_name}_manifest/AndroidManifest.xml"
     _merge_manifest_target = "${_template_name}__merge_manifests"
     merge_manifests(_merge_manifest_target) {
-      forward_variables_from(invoker, [ "chromium_code" ])
+      forward_variables_from(invoker, [ "manifest_package" ])
       input_manifest = _android_root_manifest
       output_manifest = _android_manifest
       build_config = _build_config
@@ -2380,6 +2378,7 @@
                              [
                                "aapt_locale_whitelist",
                                "app_as_shared_lib",
+                               "manifest_package",
                                "max_sdk_version",
                                "no_xml_namespaces",
                                "package_name",
@@ -2693,11 +2692,13 @@
                                "apk_under_test",
                                "base_module_target",
                                "chromium_code",
-                               "jacoco_never_instrument",
+                               "classpath_deps",
                                "enable_class_deps_output",
+                               "jacoco_never_instrument",
                                "java_files",
                                "javac_args",
                                "loadable_modules",
+                               "manifest_package",
                                "native_lib_placeholders",
                                "no_build_hooks",
                                "secondary_abi_loadable_modules",
@@ -3301,6 +3302,7 @@
                                "keystore_path",
                                "load_library_from_apk",
                                "loadable_modules",
+                               "manifest_package",
                                "max_sdk_version",
                                "min_sdk_version",
                                "native_lib_placeholders",
@@ -3418,6 +3420,7 @@
                                "jni_registration_header",
                                "jni_sources_blacklist",
                                "load_library_from_apk",
+                               "manifest_package",
                                "max_sdk_version",
                                "min_sdk_version",
                                "native_lib_version_arg",
@@ -4279,6 +4282,9 @@
   #      use as a static library APK. When proguard is enabled, the
   #      static_library_provider target will perform the synchronized dex step.
   #
+  #    verify_proguard_flags: Enables verification of expected merged proguard
+  #      flags based on a golden file.
+  #
   # Example:
   #   android_app_bundle("chrome_public_bundle") {
   #      base_module_target = "//chrome/android:chrome_public_apk"
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni
index 71c450d..714bf700 100644
--- a/build/config/mac/rules.gni
+++ b/build/config/mac/rules.gni
@@ -351,6 +351,12 @@
       ":$_shared_library_bundle_data",
     ]
 
+    if (enable_dsyms) {
+      data = [
+        "$root_out_dir/$_output_name.dSYM/",
+      ]
+    }
+
     bundle_root_dir = _framework_base_dir
     bundle_contents_dir = _framework_root_dir
     bundle_resources_dir = "$bundle_contents_dir/Resources"
@@ -551,6 +557,13 @@
     if (_write_pkg_info) {
       deps += [ ":$_pkg_info_bundle_data" ]
     }
+
+    if (enable_dsyms) {
+      data = [
+        "$root_out_dir/$_output_name.dSYM/",
+      ]
+    }
+
     product_type = _product_type
     bundle_root_dir = "$root_out_dir/${_output_name}.${_output_extension}"
     bundle_contents_dir = "$bundle_root_dir/Contents"
@@ -617,6 +630,12 @@
     }
     deps += [ ":$_loadable_module_bundle_data" ]
 
+    if (enable_dsyms) {
+      data = [
+        "$root_out_dir/$_output_name.so.dSYM/",
+      ]
+    }
+
     bundle_root_dir = "$root_out_dir/$_output_name.plugin"
     bundle_contents_dir = "$bundle_root_dir/Contents"
     bundle_executable_dir = "$bundle_contents_dir/MacOS"
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 9c1cff4c..8ded134 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8909774244766161840
\ No newline at end of file
+8909747724204477600
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index a6b5b4f..53b28401 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8909774922283356560
\ No newline at end of file
+8909748353770386640
\ No newline at end of file
diff --git a/buildtools/DEPS b/buildtools/DEPS
index d7a54d4..46c3966 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -14,7 +14,7 @@
   #
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:8c7f49102234f4f4b9349dcb258554675475e596',
+  'gn_version': 'git_revision:972ed755f8e6d31cae9ba15fcd08136ae1a7886f',
 
   # When changing these, also update the svn revisions in deps_revisions.gni
   'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917',
diff --git a/chrome/VERSION b/chrome/VERSION
index fa78515..621aab1 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=77
 MINOR=0
-BUILD=3833
+BUILD=3834
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 593a61c..fed55922 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -43,11 +43,12 @@
   import("//chrome/android/features/devtools/devtools_module_tmpl.gni")
 }
 
-manifest_package = "org.chromium.chrome"
-test_manifest_package = "org.chromium.chrome.tests"
+chrome_public_manifest_package = "org.chromium.chrome"
+chrome_public_test_manifest_package = "org.chromium.chrome.tests"
 
-chrome_public_jinja_variables = default_chrome_public_jinja_variables +
-                                [ "manifest_package=$manifest_package" ]
+chrome_public_jinja_variables =
+    default_chrome_public_jinja_variables +
+    [ "manifest_package=$chrome_public_manifest_package" ]
 chrome_public_android_manifest =
     "$target_gen_dir/chrome_public_apk/AndroidManifest.xml"
 chrome_modern_public_android_manifest =
@@ -422,6 +423,7 @@
     "//components/ntp_tiles:ntp_tiles_enums_java",
     "//components/offline_pages/core:offline_page_model_enums_java",
     "//components/password_manager/core/browser:password_manager_java_enums_srcjar",
+    "//components/payments/content/android:error_strings_generated_srcjar",
     "//components/search_engines:search_engine_type_java",
     "//components/security_state/core:security_state_enums_java",
     "//components/signin/core/browser:signin_enums_javagen",
@@ -705,7 +707,7 @@
     "//url/mojom:url_mojom_gurl_java",
   ]
 
-  package_name = manifest_package
+  package_name = chrome_public_manifest_package
 }
 
 process_version("chrome_version_constants") {
@@ -1119,7 +1121,7 @@
     "java/res_template/xml/syncadapter.xml",
   ]
   res_dir = "java/res_template"
-  variables = [ "manifest_package=$manifest_package" ]
+  variables = [ "manifest_package=$chrome_public_manifest_package" ]
 }
 
 jinja_template_resources("chrome_test_apk_template_resources") {
@@ -1136,7 +1138,7 @@
   deps = [
     ":chrome_public_apk_template_resources",
   ]
-  variables = [ "manifest_package=$test_manifest_package" ]
+  variables = [ "manifest_package=$chrome_public_test_manifest_package" ]
 }
 
 config("orderfile_config") {
@@ -1763,9 +1765,6 @@
     android_manifest = trichrome_library_android_manifest
     android_manifest_dep = ":trichrome_library_android_manifest"
 
-    # TODO(torne): make minsdk=Q once we no longer build hacky P version
-    min_sdk_version = android_sdk_version
-    target_sdk_version = android_sdk_version
     if (trichrome_synchronized_proguard) {
       static_library_dependent_targets = [
         {
@@ -1791,9 +1790,6 @@
     android_manifest = trichrome_library_android_manifest
     android_manifest_dep = ":trichrome_library_android_manifest"
 
-    # TODO(torne): make minsdk=Q once we no longer build hacky P version
-    min_sdk_version = android_sdk_version
-    target_sdk_version = android_sdk_version
     if (trichrome_synchronized_proguard) {
       static_library_dependent_targets = [
         {
@@ -1847,7 +1843,7 @@
   output = chrome_public_test_apk_manifest
   variables = default_chrome_public_jinja_variables
   variables += [
-    "manifest_package=$test_manifest_package",
+    "manifest_package=$chrome_public_test_manifest_package",
     "min_sdk_version=19",
     "target_sdk_version=$android_sdk_version",
   ]
@@ -1877,7 +1873,7 @@
               monochrome_android_manifest_jinja_variables +
               [
                 "target_sdk_version=$android_sdk_version",
-                "test_manifest_package=$test_manifest_package",
+                "test_manifest_package=$chrome_public_test_manifest_package",
                 "webview_library=libmonochrome.so",
                 "include_arcore_manifest_flag=true",
               ]
@@ -2078,13 +2074,14 @@
   }
 }
 
-# Chrome smoke test is a minimal test to ensure Chrome is not DOA.  It is deigned to
-# be runnable against uninstrumented Chrome apks.
+# Chrome smoke test is a minimal test to ensure Chrome is not DOA.  It is
+# designed to be runnable against uninstrumented Chrome apks.
 instrumentation_test_apk("chrome_smoke_test") {
   apk_name = "ChromeSmokeTest"
   apk_under_test = "//chrome/android:chrome_public_apk"
   android_manifest =
       "javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml"
+  target_sdk_version = 28
   testonly = true
   java_files =
       [ "javatests/src/org/chromium/chrome/test/smoke/ChromeSmokeTest.java" ]
@@ -2129,7 +2126,7 @@
 # bundle target template.
 if (enable_vr) {
   vr_module_tmpl("vr_public_bundle_module") {
-    manifest_package = manifest_package
+    manifest_package = chrome_public_manifest_package
     module_name = "VrPublic"
     base_module_target = ":chrome_modern_public_base_bundle_module"
     version_code = chrome_modern_version_code
@@ -2250,7 +2247,7 @@
 
   if (enable_arcore) {
     ar_module_tmpl("${target_name}__ar_bundle_module") {
-      manifest_package = manifest_package
+      manifest_package = chrome_public_manifest_package
       module_name = "Ar" + _bundle_name
       base_module_target = ":$_base_module_target_name"
       native_switches = _native_switches
@@ -2261,7 +2258,7 @@
 
   if (enable_vr) {
     vr_module_tmpl("${target_name}__vr_bundle_module") {
-      manifest_package = manifest_package
+      manifest_package = chrome_public_manifest_package
       module_name = "Vr" + _bundle_name
       base_module_target = ":$_base_module_target_name"
       native_switches = _native_switches
@@ -2273,7 +2270,7 @@
   }
 
   tab_ui_module_tmpl("${target_name}__tab_ui_bundle_module") {
-    manifest_package = manifest_package
+    manifest_package = chrome_public_manifest_package
     module_name = "TabUiMonochromePublic"
     base_module_target = ":$_base_module_target_name"
     uncompress_shared_libraries = true
@@ -2283,7 +2280,7 @@
 
   autofill_assistant_module_tmpl(
       "${target_name}__autofill_assistant_bundle_module") {
-    manifest_package = manifest_package
+    manifest_package = chrome_public_manifest_package
     module_name = "AutofillAssistant" + _bundle_name
     base_module_target = ":$_base_module_target_name"
     uncompress_shared_libraries = true
@@ -2293,7 +2290,7 @@
 
   if (dfmify_devtools) {
     devtools_module_tmpl("${target_name}__devtools_bundle_module") {
-      manifest_package = manifest_package
+      manifest_package = chrome_public_manifest_package
       module_name = "Devtools" + _bundle_name
       base_module_target = ":$_base_module_target_name"
       uncompress_shared_libraries = true
@@ -2319,7 +2316,7 @@
     enable_language_splits = true
     min_sdk_version = _min_sdk_version
 
-    if (trichrome_synchronized_proguard) {
+    if (trichrome_synchronized_proguard && _is_trichrome) {
       static_library_provider = ":trichrome_library_for_bundle_apk"
     }
 
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index d559383a..4c3709a 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -305,6 +305,8 @@
   "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemProperties.java",
   "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemViewBinder.java",
   "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListView.java",
+  "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemProperties.java",
+  "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemViewBinder.java",
   "java/src/org/chromium/chrome/browser/contextmenu/ShareContextMenuItem.java",
   "java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuListAdapter.java",
   "java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuPagerAdapter.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index b7a7e7d..1ebf5160 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -136,7 +136,8 @@
     forward_variables_from(invoker, "*")
 
     if (_is_trichrome) {
-      min_sdk_version = 28
+      # TODO(torne): make minsdk=Q once we no longer build hacky P version
+      min_sdk_version = android_sdk_version
     } else if (_is_monochrome) {
       min_sdk_version = 24
     } else if (_is_modern) {
diff --git a/chrome/android/features/ar/AndroidManifest.xml b/chrome/android/features/ar/AndroidManifest.xml
index f6a69ed6..1ac4da4 100644
--- a/chrome/android/features/ar/AndroidManifest.xml
+++ b/chrome/android/features/ar/AndroidManifest.xml
@@ -5,8 +5,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="ar"
-    package="{{manifest_package}}">
+    featureSplit="ar">
 
     <dist:module
         dist:onDemand="true"
diff --git a/chrome/android/features/ar/ar_module_tmpl.gni b/chrome/android/features/ar/ar_module_tmpl.gni
index b666740..cfce649 100644
--- a/chrome/android/features/ar/ar_module_tmpl.gni
+++ b/chrome/android/features/ar/ar_module_tmpl.gni
@@ -16,25 +16,17 @@
   assert(defined(invoker.module_name))
   assert(defined(invoker.base_module_target))
 
-  _manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
-  _manifest_target = "${target_name}__manifest"
-  jinja_template(_manifest_target) {
-    input = "//chrome/android/features/ar/AndroidManifest.xml"
-    output = _manifest
-    variables = [ "manifest_package=${invoker.manifest_package}" ]
-  }
-
   android_app_bundle_module(target_name) {
     forward_variables_from(invoker,
                            [
                              "base_module_target",
+                             "manifest_package",
                              "module_name",
                              "native_switches",
                              "version_code",
                              "version_name",
                            ])
-    android_manifest = _manifest
-    android_manifest_dep = ":$_manifest_target"
+    android_manifest = "//chrome/android/features/ar/AndroidManifest.xml"
     min_sdk_version = 24
     target_sdk_version = android_sdk_version
     deps = [
diff --git a/chrome/android/features/autofill_assistant/autofill_assistant_module_tmpl.gni b/chrome/android/features/autofill_assistant/autofill_assistant_module_tmpl.gni
index 2f68f5c..03eae7f7 100644
--- a/chrome/android/features/autofill_assistant/autofill_assistant_module_tmpl.gni
+++ b/chrome/android/features/autofill_assistant/autofill_assistant_module_tmpl.gni
@@ -12,26 +12,18 @@
 }
 
 template("autofill_assistant_module_tmpl") {
-  _manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
-  _manifest_target = "${target_name}__manifest"
-  jinja_template(_manifest_target) {
-    input =
-        "//chrome/android/features/autofill_assistant/java/AndroidManifest.xml"
-    output = _manifest
-    variables = [ "manifest_package=${invoker.manifest_package}" ]
-  }
-
   android_app_bundle_module(target_name) {
     forward_variables_from(invoker,
                            [
                              "base_module_target",
+                             "manifest_package",
                              "module_name",
                              "uncompress_shared_libraries",
                              "version_code",
                              "version_name",
                            ])
-    android_manifest = _manifest
-    android_manifest_dep = ":${_manifest_target}"
+    android_manifest =
+        "//chrome/android/features/autofill_assistant/java/AndroidManifest.xml"
     min_sdk_version = 21
     target_sdk_version = android_sdk_version
     proguard_enabled = !is_java_debug
diff --git a/chrome/android/features/autofill_assistant/java/AndroidManifest.xml b/chrome/android/features/autofill_assistant/java/AndroidManifest.xml
index c226c4c..5b3945c0 100644
--- a/chrome/android/features/autofill_assistant/java/AndroidManifest.xml
+++ b/chrome/android/features/autofill_assistant/java/AndroidManifest.xml
@@ -1,7 +1,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="autofill_assistant"
-    package="{{manifest_package}}">
+    featureSplit="autofill_assistant">
 
     <dist:module
         dist:onDemand="true"
diff --git a/chrome/android/features/devtools/java/AndroidManifest.xml b/chrome/android/features/devtools/java/AndroidManifest.xml
index 7e0f92f..ff348b0 100644
--- a/chrome/android/features/devtools/java/AndroidManifest.xml
+++ b/chrome/android/features/devtools/java/AndroidManifest.xml
@@ -5,8 +5,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="devtools"
-    package="{{manifest_package}}">
+    featureSplit="devtools">
 
     <dist:module
         dist:onDemand="true"
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb
index 53253ee3..631f99cc 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
 <translation id="1492646418094134664">Chrome மூலம் உங்கள் கிரெடிட் கார்டு விவரங்களை நிரப்பத் தட்டவும்</translation>
+<translation id="1566281227936819866">சேமித்துள்ள கட்டண முறைகளைக் காட்டுகிறது</translation>
 <translation id="2610239185026711824">கடவுச்சொல்லைப் பரிந்துரை</translation>
 <translation id="2803478378562657435">சேமித்த கடவுச்சொற்களையும் கடவுச்சொல் விருப்பங்களையும் காண்பிக்கிறது</translation>
 <translation id="2903493209154104877">முகவரிகள்</translation>
@@ -12,5 +13,6 @@
 <translation id="6810986916917535017">Chrome மூலம் கடவுச்சொல்லை நிரப்பத் தட்டவும்</translation>
 <translation id="7299100402441711551">முகவரிகளைக் காட்டும்</translation>
 <translation id="7494879913343971937">கடவுச்சொற்களைக் காட்டும்</translation>
+<translation id="8037472847879765671">கட்டண முறைகளைக் காட்டும்</translation>
 <translation id="8507520749471379845">கடவுச்சொற்கள் உள்ளன</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/AndroidManifest.xml b/chrome/android/features/tab_ui/AndroidManifest.xml
index 50f982d..468d7f1 100644
--- a/chrome/android/features/tab_ui/AndroidManifest.xml
+++ b/chrome/android/features/tab_ui/AndroidManifest.xml
@@ -5,8 +5,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="tab_ui"
-    package="{{manifest_package}}">
+    featureSplit="tab_ui">
 
     <application></application>
     <dist:module
diff --git a/chrome/android/features/tab_ui/tab_ui_module_tmpl.gni b/chrome/android/features/tab_ui/tab_ui_module_tmpl.gni
index 6b3fd1b..3fa1337 100644
--- a/chrome/android/features/tab_ui/tab_ui_module_tmpl.gni
+++ b/chrome/android/features/tab_ui/tab_ui_module_tmpl.gni
@@ -11,25 +11,17 @@
   assert(defined(invoker.version_code))
   assert(defined(invoker.version_name))
 
-  _manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
-  _manifest_target = "${target_name}__manifest"
-  jinja_template(_manifest_target) {
-    input = "//chrome/android/features/tab_ui/AndroidManifest.xml"
-    output = _manifest
-    variables = [ "manifest_package=${invoker.manifest_package}" ]
-  }
-
   android_app_bundle_module(target_name) {
     forward_variables_from(invoker,
                            [
                              "base_module_target",
+                             "manifest_package",
                              "module_name",
                              "uncompress_shared_libraries",
                              "version_code",
                              "version_name",
                            ])
-    android_manifest = _manifest
-    android_manifest_dep = ":${_manifest_target}"
+    android_manifest = "//chrome/android/features/tab_ui/AndroidManifest.xml"
     min_sdk_version = 21
     target_sdk_version = android_sdk_version
     proguard_enabled = !is_java_debug
diff --git a/chrome/android/features/vr/java/AndroidManifest.xml b/chrome/android/features/vr/java/AndroidManifest.xml
index e892602..4a2c233 100644
--- a/chrome/android/features/vr/java/AndroidManifest.xml
+++ b/chrome/android/features/vr/java/AndroidManifest.xml
@@ -5,8 +5,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="vr"
-    package="{{manifest_package}}">
+    featureSplit="vr">
 
     <dist:module
         dist:onDemand="true"
diff --git a/chrome/android/features/vr/vr_module_tmpl.gni b/chrome/android/features/vr/vr_module_tmpl.gni
index 422f9b7..a103fb7 100644
--- a/chrome/android/features/vr/vr_module_tmpl.gni
+++ b/chrome/android/features/vr/vr_module_tmpl.gni
@@ -17,26 +17,18 @@
   assert(defined(invoker.module_name))
   assert(defined(invoker.base_module_target))
 
-  _manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
-  _manifest_target = "${target_name}__manifest"
-  jinja_template(_manifest_target) {
-    input = "//chrome/android/features/vr/java/AndroidManifest.xml"
-    output = _manifest
-    variables = [ "manifest_package=${invoker.manifest_package}" ]
-  }
-
   android_app_bundle_module(target_name) {
     forward_variables_from(invoker,
                            [
                              "base_module_target",
+                             "manifest_package",
                              "module_name",
                              "native_switches",
                              "uncompress_shared_libraries",
                              "version_code",
                              "version_name",
                            ])
-    android_manifest = _manifest
-    android_manifest_dep = ":${_manifest_target}"
+    android_manifest = "//chrome/android/features/vr/java/AndroidManifest.xml"
     min_sdk_version = 21
     target_sdk_version = android_sdk_version
     deps = [
diff --git a/chrome/android/java/res/layout/clear_browsing_data_tab_content.xml b/chrome/android/java/res/layout/clear_browsing_data_tab_content.xml
deleted file mode 100644
index e59d7b58..0000000
--- a/chrome/android/java/res/layout/clear_browsing_data_tab_content.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<!-- Used by ClearBrowsingDataPreferences to replace the default layout
-     of a PreferenceFragment and add a footer button. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <ListView
-        android:id="@android:id/list"
-        android:layout_width="match_parent"
-        android:layout_weight="1"
-        android:layout_height="0dp"/>
-
-    <org.chromium.ui.widget.ButtonCompat
-        android:id="@+id/clear_button"
-        android:layout_gravity="end"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="@dimen/clear_browsing_data_button_margin"
-        android:focusable="true"
-        android:text="@string/clear_data_delete"
-        style="@style/FilledButton.Flat" />
-
-</LinearLayout>
diff --git a/chrome/android/java/res/layout/preference_compat.xml b/chrome/android/java/res/layout/preference_compat.xml
index f477b56..b45210d2 100644
--- a/chrome/android/java/res/layout/preference_compat.xml
+++ b/chrome/android/java/res/layout/preference_compat.xml
@@ -4,13 +4,41 @@
      found in the LICENSE file. -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     style="@style/Theme.Chromium.PreferenceLayoutCompat"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:gravity="center_vertical"
+    android:clipToPadding="false"
     android:focusable="true"
     android:baselineAligned="false">
 
+    <!-- The following icon_frame attributes are copied from this previously used framework layout:
+         https://cs.chromium.org/chromium/src/third_party/android_tools/sdk/platforms/android-28/data/res/layout/preference_material.xml
+         TODO(https://crbug.com/971791): Once migration to the support library preferences is done,
+         we should consider removing these attributes in favor of the support library's default
+         material style. -->
+    <LinearLayout
+        android:id="@+id/icon_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="-4dp"
+        android:minWidth="60dp"
+        android:gravity="start|center_vertical"
+        android:orientation="horizontal"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp">
+        <!-- Users of this layout are responsible for setting contentDescription. -->
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:maxWidth="48dp"
+            android:maxHeight="48dp"
+            tools:ignore="ContentDescription" />
+    </LinearLayout>
+
     <RelativeLayout
         style="@style/Theme.Chromium.PreferenceDescriptionCompat"
         android:layout_width="0dp"
diff --git a/chrome/android/java/res/layout/revamped_context_menu.xml b/chrome/android/java/res/layout/revamped_context_menu.xml
index 340bf2e..d4acc0a4 100644
--- a/chrome/android/java/res/layout/revamped_context_menu.xml
+++ b/chrome/android/java/res/layout/revamped_context_menu.xml
@@ -8,6 +8,8 @@
     android:layout_height="match_parent"
     android:background="@color/modal_dialog_scrim_color">
 
+    <!-- Setting listSelector to transparent prevents the list items that have
+         selectableItemBackground from having a double highlight effect. -->
     <org.chromium.chrome.browser.contextmenu.RevampedContextMenuListView
         android:id="@+id/context_menu_list_view"
         android:layout_width="match_parent"
@@ -18,5 +20,6 @@
         android:layout_marginTop="@dimen/revamped_context_menu_vertical_margin"
         android:layout_marginBottom="@dimen/revamped_context_menu_vertical_margin"
         android:background="@drawable/popup_bg_tinted"
-        android:divider="@null" />
+        android:divider="@null"
+        android:listSelector="@android:color/transparent"/>
 </FrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/revamped_context_menu_row.xml b/chrome/android/java/res/layout/revamped_context_menu_row.xml
index afe4792..9471d5a 100644
--- a/chrome/android/java/res/layout/revamped_context_menu_row.xml
+++ b/chrome/android/java/res/layout/revamped_context_menu_row.xml
@@ -7,9 +7,4 @@
     android:id="@+id/menu_row_text"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:textAppearance="@style/TextAppearance.BlackTitle1"
-    android:minHeight="48dp"
-    android:gravity="center_vertical"
-    android:paddingStart="@dimen/revamped_context_menu_list_lateral_padding"
-    android:paddingEnd="@dimen/revamped_context_menu_list_lateral_padding"
-    android:background="?attr/selectableItemBackground"/>
\ No newline at end of file
+    style="@style/RevampedContextMenuItemText" />
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/revamped_context_menu_share_row.xml b/chrome/android/java/res/layout/revamped_context_menu_share_row.xml
new file mode 100644
index 0000000..b4bef6f
--- /dev/null
+++ b/chrome/android/java/res/layout/revamped_context_menu_share_row.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/menu_row_text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        style="@style/RevampedContextMenuItemText" />
+    <!-- We use tools:ignore instead of android:importantForAccessibility="no" here because this
+         view is important for accessibility, but we don't have a content description yet. -->
+    <ImageView
+        android:id="@+id/menu_row_share_icon"
+        android:layout_width="@dimen/list_item_end_icon_width"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter"
+        android:paddingTop="12dp"
+        android:paddingBottom="12dp"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:background="?attr/selectableItemBackground"
+        android:visibility="gone"
+        tools:ignore="contentDescription" />
+</LinearLayout>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index aef87ce..7c788f8 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -1005,4 +1005,15 @@
         <item name="android:layout_height">@dimen/omnibox_suggestion_edit_url_min_height</item>
         <item name="tint">@color/default_icon_color</item>
     </style>
+
+    <!-- Revamped context menu -->
+    <style name="RevampedContextMenuItemText">
+        <item name="android:background">?attr/selectableItemBackground</item>
+        <item name="android:minHeight">@dimen/min_touch_target_size</item>
+        <item name="android:paddingStart">@dimen/revamped_context_menu_list_lateral_padding</item>
+        <item name="android:paddingEnd">@dimen/revamped_context_menu_list_lateral_padding</item>
+        <item name="android:gravity">center_vertical</item>
+        <item name="android:textAlignment">viewStart</item>
+        <item name="android:textAppearance">@style/TextAppearance.BlackTitle1</item>
+    </style>
 </resources>
diff --git a/chrome/android/java/res/xml/clear_browsing_data_button.xml b/chrome/android/java/res/xml/clear_browsing_data_button.xml
new file mode 100644
index 0000000..fc30bc6d
--- /dev/null
+++ b/chrome/android/java/res/xml/clear_browsing_data_button.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<org.chromium.ui.widget.ButtonCompat xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/clear_button"
+    style="@style/FilledButton.Flat"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="end"
+    android:layout_margin="@dimen/clear_browsing_data_button_margin"
+    android:focusable="true"
+    android:text="@string/clear_data_delete" />
diff --git a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
index 7464d13c..a8bfb3b9 100644
--- a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
+++ b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<PreferenceScreen
+<android.support.v7.preference.PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
@@ -44,4 +44,4 @@
         android:key="clear_site_settings_checkbox"
         android:persistent="false"
         android:title="@string/prefs_site_settings" />
-</PreferenceScreen>
+</android.support.v7.preference.PreferenceScreen>
diff --git a/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml b/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
index 7ab07e4e..2e76e9b1 100644
--- a/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
+++ b/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
@@ -3,21 +3,21 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<PreferenceScreen
+<android.support.v7.preference.PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
         android:key="usage_and_crash_reports_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off"
         app:drawDivider="true"/>
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
         android:title="@string/usage_and_crash_reports_description_legacy"/>
 
-    <org.chromium.chrome.browser.preferences.LearnMorePreference
+    <org.chromium.chrome.browser.preferences.LearnMorePreferenceCompat
         android:key="usage_and_crash_reports_learn_more"
         app:helpContext="@string/help_context_usage_reports"/>
 
-</PreferenceScreen>
\ No newline at end of file
+</android.support.v7.preference.PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
index 6dc7ac6..2739342b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
@@ -57,9 +57,6 @@
     private static final String COMMAND_LINE_FILE = "chrome-command-line";
     private static final String TAG = "ChromiumApplication";
 
-    private final GlobalDiscardableReferencePool mReferencePool =
-            new GlobalDiscardableReferencePool();
-
     /** Lock on creation of sComponent. */
     private static final Object sLock = new Object();
     @Nullable
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/GlobalDiscardableReferencePool.java b/chrome/android/java/src/org/chromium/chrome/browser/GlobalDiscardableReferencePool.java
index 8ebb7ee..a9ec8d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/GlobalDiscardableReferencePool.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/GlobalDiscardableReferencePool.java
@@ -9,19 +9,12 @@
 /**
  * A global accessor to the DiscardableReferencePool.
  *
- * The application should instantiate this class and keep it alive until shutdown.
- * Then consumers may find the DiscardableReferencePool through the static API.
+ * This DiscardableReferencePool is created upon first access, and lives forever.
  */
 public class GlobalDiscardableReferencePool {
-    private final DiscardableReferencePool mReferencePool = new DiscardableReferencePool();
-    private static GlobalDiscardableReferencePool sInstance;
+    static final DiscardableReferencePool INSTANCE = new DiscardableReferencePool();
 
     public static DiscardableReferencePool getReferencePool() {
-        return sInstance.mReferencePool;
-    }
-
-    public GlobalDiscardableReferencePool() {
-        assert sInstance == null;
-        sInstance = this;
+        return INSTANCE;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
index 684e216..25e9e77 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
@@ -133,7 +133,8 @@
             }
 
             final RevampedContextMenuCoordinator menuCoordinator =
-                    new RevampedContextMenuCoordinator(topContentOffsetPx);
+                    new RevampedContextMenuCoordinator(
+                            topContentOffsetPx, this::shareImageWithLastShareComponent);
             menuCoordinator.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallback,
                     mOnMenuShown, mOnMenuClosed);
             // TODO(sinansahin): This could be pushed in to the header mediator.
@@ -236,6 +237,13 @@
     }
 
     /**
+     * Share the image that triggered the current context menu with the last app used to share.
+     */
+    private void shareImageWithLastShareComponent() {
+        shareImageDirectly(ShareHelper.getLastShareComponentName(null));
+    }
+
+    /**
      * Share image triggered with the current context menu directly with a specific app.
      * @param name The {@link ComponentName} of the app to share the image directly with.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
index 5a0b441..ea1f996 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
@@ -6,6 +6,7 @@
 
 import android.app.Activity;
 import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 import android.support.annotation.IntDef;
 import android.support.v7.app.AlertDialog;
 import android.util.Pair;
@@ -14,6 +15,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.share.ShareHelper;
+import org.chromium.chrome.browser.share.ShareParams;
 import org.chromium.chrome.browser.widget.ContextMenuDialog;
 import org.chromium.ui.modelutil.ModelListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -29,11 +32,13 @@
  */
 public class RevampedContextMenuCoordinator implements ContextMenuUi {
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({ListItemType.DIVIDER, ListItemType.HEADER, ListItemType.CONTEXT_MENU_ITEM})
+    @IntDef({ListItemType.DIVIDER, ListItemType.HEADER, ListItemType.CONTEXT_MENU_ITEM,
+            ListItemType.CONTEXT_MENU_SHARE_ITEM})
     public @interface ListItemType {
         int DIVIDER = 0;
         int HEADER = 1;
         int CONTEXT_MENU_ITEM = 2;
+        int CONTEXT_MENU_SHARE_ITEM = 3;
     }
 
     private static final int INVALID_ITEM_ID = -1;
@@ -41,14 +46,18 @@
     private RevampedContextMenuHeaderCoordinator mHeaderCoordinator;
 
     private float mTopContentOffsetPx;
+    private ContextMenuDialog mDialog;
+    private Runnable mOnShareImageDirectly;
 
     /**
      * Constructor that also sets the content offset.
      *
      * @param topContentOffsetPx content offset from the top.
+     * @param onShareImageDirectly ContextMenuHelper method to be used to share the image directly.
      */
-    RevampedContextMenuCoordinator(float topContentOffsetPx) {
+    RevampedContextMenuCoordinator(float topContentOffsetPx, Runnable onShareImageDirectly) {
         mTopContentOffsetPx = topContentOffsetPx;
+        mOnShareImageDirectly = onShareImageDirectly;
     }
 
     @Override
@@ -61,13 +70,11 @@
 
         final View view =
                 LayoutInflater.from(activity).inflate(R.layout.revamped_context_menu, null);
-        ContextMenuDialog dialog =
-                createContextMenuDialog(activity, view, touchPointXPx, touchPointYPx);
-        dialog.setOnShowListener(dialogInterface -> onMenuShown.run());
-        dialog.setOnDismissListener(dialogInterface -> onMenuClosed.run());
+        mDialog = createContextMenuDialog(activity, view, touchPointXPx, touchPointYPx);
+        mDialog.setOnShowListener(dialogInterface -> onMenuShown.run());
+        mDialog.setOnDismissListener(dialogInterface -> onMenuClosed.run());
 
-        mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator(
-                activity, params, params.getUrl(), params.isImage());
+        mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator(activity, params);
 
         ModelListAdapter adapter = new ModelListAdapter() {
             @Override
@@ -77,12 +84,14 @@
 
             @Override
             public boolean isEnabled(int position) {
-                return getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM;
+                return getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM
+                        || getItemViewType(position) == ListItemType.CONTEXT_MENU_SHARE_ITEM;
             }
 
             @Override
             public long getItemId(int position) {
-                if (getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM) {
+                if (getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM
+                        || getItemViewType(position) == ListItemType.CONTEXT_MENU_SHARE_ITEM) {
                     return ((Pair<Integer, PropertyModel>) getItem(position))
                             .second.get(RevampedContextMenuItemProperties.MENU_ID);
                 }
@@ -109,20 +118,25 @@
                 () -> LayoutInflater.from(listView.getContext())
                         .inflate(R.layout.revamped_context_menu_row, null),
                 RevampedContextMenuItemViewBinder::bind);
+        adapter.registerType(
+                ListItemType.CONTEXT_MENU_SHARE_ITEM,
+                () -> LayoutInflater.from(listView.getContext())
+                        .inflate(R.layout.revamped_context_menu_share_row, null),
+                RevampedContextMenuShareItemViewBinder::bind);
         // clang-format on
 
         // The Integer here specifies the {@link ListItemType}.
-        List<Pair<Integer, PropertyModel>> itemList = getItemList(activity, items);
+        List<Pair<Integer, PropertyModel>> itemList = getItemList(activity, items, params);
 
         adapter.updateModels(itemList);
         listView.setOnItemClickListener((p, v, pos, id) -> {
             assert id != INVALID_ITEM_ID;
 
-            dialog.dismiss();
+            mDialog.dismiss();
             onItemClicked.onResult((int) id);
         });
 
-        dialog.show();
+        mDialog.show();
     }
 
     /**
@@ -147,8 +161,8 @@
         return dialog;
     }
 
-    private List<Pair<Integer, PropertyModel>> getItemList(
-            Activity activity, List<Pair<Integer, List<ContextMenuItem>>> items) {
+    private List<Pair<Integer, PropertyModel>> getItemList(Activity activity,
+            List<Pair<Integer, List<ContextMenuItem>>> items, ContextMenuParams params) {
         List<Pair<Integer, PropertyModel>> itemList = new ArrayList<>();
 
         // TODO(sinansahin): We should be able to remove this conversion once we can get the items
@@ -160,20 +174,58 @@
             itemList.add(new Pair<>(ListItemType.DIVIDER, new PropertyModel()));
 
             for (ContextMenuItem item : group.second) {
-                PropertyModel itemModel =
-                        new PropertyModel.Builder(RevampedContextMenuItemProperties.ALL_KEYS)
-                                .with(RevampedContextMenuItemProperties.MENU_ID, item.getMenuId())
-                                .with(RevampedContextMenuItemProperties.TEXT,
-                                        item.getTitle(activity))
-                                .build();
-
-                itemList.add(new Pair<>(ListItemType.CONTEXT_MENU_ITEM, itemModel));
+                PropertyModel itemModel;
+                if (item instanceof ShareContextMenuItem) {
+                    final ShareContextMenuItem shareItem = ((ShareContextMenuItem) item);
+                    final Pair<Drawable, CharSequence> shareInfo = shareItem.getShareInfo();
+                    itemModel =
+                            new PropertyModel
+                                    .Builder(RevampedContextMenuShareItemProperties.ALL_KEYS)
+                                    .with(RevampedContextMenuShareItemProperties.MENU_ID,
+                                            item.getMenuId())
+                                    .with(RevampedContextMenuItemProperties.TEXT,
+                                            item.getTitle(activity))
+                                    .with(RevampedContextMenuShareItemProperties.IMAGE,
+                                            shareInfo.first)
+                                    .with(RevampedContextMenuShareItemProperties.CONTENT_DESC,
+                                            shareInfo.second)
+                                    .with(RevampedContextMenuShareItemProperties.CLICK_LISTENER,
+                                            getShareItemClickListener(activity, shareItem, params))
+                                    .build();
+                    itemList.add(new Pair<>(ListItemType.CONTEXT_MENU_SHARE_ITEM, itemModel));
+                } else {
+                    itemModel =
+                            new PropertyModel.Builder(RevampedContextMenuItemProperties.ALL_KEYS)
+                                    .with(RevampedContextMenuItemProperties.MENU_ID,
+                                            item.getMenuId())
+                                    .with(RevampedContextMenuItemProperties.TEXT,
+                                            item.getTitle(activity))
+                                    .build();
+                    itemList.add(new Pair<>(ListItemType.CONTEXT_MENU_ITEM, itemModel));
+                }
             }
         }
 
         return itemList;
     }
 
+    private View.OnClickListener getShareItemClickListener(
+            Activity activity, ShareContextMenuItem item, ContextMenuParams params) {
+        return (v) -> {
+            mDialog.dismiss();
+            if (item.isShareLink()) {
+                final ShareParams shareParams =
+                        new ShareParams.Builder(activity, params.getUrl(), params.getUrl())
+                                .setShareDirectly(true)
+                                .setSaveLastUsed(false)
+                                .build();
+                ShareHelper.share(shareParams);
+            } else {
+                mOnShareImageDirectly.run();
+            }
+        };
+    }
+
     Callback<Bitmap> getOnImageThumbnailRetrievedReference() {
         return mHeaderCoordinator.getOnImageThumbnailRetrievedReference();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
index 0d04e40..b9ed6bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
@@ -21,7 +21,6 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
 class RevampedContextMenuHeaderCoordinator {
     private PropertyModel mModel;
@@ -29,11 +28,11 @@
 
     private Context mContext;
 
-    RevampedContextMenuHeaderCoordinator(
-            Activity activity, ContextMenuParams params, String plainUrl, boolean isImage) {
+    RevampedContextMenuHeaderCoordinator(Activity activity, ContextMenuParams params) {
         mContext = activity;
         mModel = buildModel(getTitle(params), getUrl(activity, params));
-        mMediator = new RevampedContextMenuHeaderMediator(activity, mModel, plainUrl, isImage);
+        mMediator = new RevampedContextMenuHeaderMediator(
+                activity, mModel, params.getUrl(), params.isImage());
     }
 
     private PropertyModel buildModel(String title, CharSequence url) {
@@ -89,12 +88,6 @@
     }
 
     View getView() {
-        View view =
-                LayoutInflater.from(mContext).inflate(R.layout.revamped_context_menu_header, null);
-        // TODO(sinansahin): Remove the work around code when the ModelListAdapter is updated.
-        view.setTag(org.chromium.ui.R.id.view_model, mModel);
-        PropertyModelChangeProcessor.create(
-                mModel, view, RevampedContextMenuHeaderViewBinder::bind);
-        return view;
+        return LayoutInflater.from(mContext).inflate(R.layout.revamped_context_menu_header, null);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemProperties.java
new file mode 100644
index 0000000..33f44f6
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemProperties.java
@@ -0,0 +1,25 @@
+// 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.
+
+package org.chromium.chrome.browser.contextmenu;
+
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
+
+class RevampedContextMenuShareItemProperties extends RevampedContextMenuItemProperties {
+    public static final WritableObjectPropertyKey<Drawable> IMAGE =
+            new WritableObjectPropertyKey<>();
+    public static final WritableObjectPropertyKey<CharSequence> CONTENT_DESC =
+            new WritableObjectPropertyKey<>();
+    public static final WritableObjectPropertyKey<View.OnClickListener> CLICK_LISTENER =
+            new WritableObjectPropertyKey<>();
+
+    public static final PropertyKey[] ALL_KEYS =
+            PropertyModel.concatKeys(RevampedContextMenuItemProperties.ALL_KEYS,
+                    new PropertyKey[] {IMAGE, CONTENT_DESC, CLICK_LISTENER});
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemViewBinder.java
new file mode 100644
index 0000000..17f1383
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuShareItemViewBinder.java
@@ -0,0 +1,41 @@
+// 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.
+
+package org.chromium.chrome.browser.contextmenu;
+
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.widget.ImageView;
+
+import org.chromium.chrome.R;
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+class RevampedContextMenuShareItemViewBinder extends RevampedContextMenuItemViewBinder {
+    public static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
+        RevampedContextMenuItemViewBinder.bind(
+                model, view.findViewById(R.id.menu_row_text), propertyKey);
+        if (propertyKey == RevampedContextMenuShareItemProperties.IMAGE) {
+            Drawable drawable = model.get(RevampedContextMenuShareItemProperties.IMAGE);
+            final ImageView imageView = view.findViewById(R.id.menu_row_share_icon);
+            imageView.setImageDrawable(drawable);
+            imageView.setVisibility(drawable != null ? View.VISIBLE : View.GONE);
+            final int padding = view.getResources().getDimensionPixelSize(
+                    R.dimen.revamped_context_menu_list_lateral_padding);
+            // We don't need extra end padding for the text if the share icon is visible as the icon
+            // already has padding.
+            view.findViewById(R.id.menu_row_text)
+                    .setPaddingRelative(padding, 0, drawable != null ? 0 : padding, 0);
+        } else if (propertyKey == RevampedContextMenuShareItemProperties.CONTENT_DESC) {
+            ((ImageView) view.findViewById(R.id.menu_row_share_icon))
+                    .setContentDescription(view.getContext().getString(
+                            R.string.accessibility_menu_share_via,
+                            model.get(RevampedContextMenuShareItemProperties.CONTENT_DESC)));
+        } else if (propertyKey == RevampedContextMenuShareItemProperties.CLICK_LISTENER) {
+            view.findViewById(R.id.menu_row_share_icon)
+                    .setOnClickListener(
+                            model.get(RevampedContextMenuShareItemProperties.CLICK_LISTENER));
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
index 62d92290..2da59d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
@@ -10,8 +10,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Binder;
-import android.os.StrictMode;
-import android.os.SystemClock;
 import android.support.annotation.WorkerThread;
 import android.text.TextUtils;
 
@@ -21,9 +19,9 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
+import org.chromium.base.StrictModeContext;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.CachedMetrics.SparseHistogramSample;
-import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -43,8 +41,6 @@
 
     private final SparseHistogramSample mConnectionResultHistogramSample =
             new SparseHistogramSample("GooglePlayServices.ConnectionResult");
-    private final TimesHistogramSample mRegistrationTimeHistogramSample =
-            new TimesHistogramSample("Android.StrictMode.CheckGooglePlayServicesTime");
 
     /**
      * Returns the singleton instance of ExternalAuthUtils, creating it if needed.
@@ -267,16 +263,9 @@
      * @return The code produced by calling the external code
      */
     protected int checkGooglePlayServicesAvailable(final Context context) {
-        // Temporarily allowing disk access. TODO: Fix. See http://crbug.com/577190
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
-        try {
-            long time = SystemClock.elapsedRealtime();
-            int isAvailable =
-                    GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
-            mRegistrationTimeHistogramSample.record(SystemClock.elapsedRealtime() - time);
-            return isAvailable;
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
+        // TODO(crbug.com/577190): Temporarily allowing disk access until more permanent fix is in.
+        try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+            return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
index 16d1573..82e4eeda 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -383,7 +383,8 @@
      */
     public void openClearBrowsingDataPreference() {
         recordUserAction("ClearBrowsingData");
-        PreferencesLauncher.launchSettingsPage(mActivity, ClearBrowsingDataTabsFragment.class);
+        PreferencesLauncher.launchSettingsPageCompat(
+                mActivity, ClearBrowsingDataTabsFragment.class);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
index 8bdb60b..abe927a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
@@ -11,6 +11,8 @@
 import org.chromium.base.Log;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -57,17 +59,40 @@
         mDialogCustomView.setSuppressCheckBoxVisibility(mShouldShowSuppressCheckBox);
 
         Resources resources = activity.getResources();
-        mDialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
-                               .with(ModalDialogProperties.CONTROLLER, this)
-                               .with(ModalDialogProperties.TITLE, mTitle)
-                               .with(ModalDialogProperties.MESSAGE, mMessage)
-                               .with(ModalDialogProperties.CUSTOM_VIEW, mDialogCustomView)
-                               .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources,
-                                       mPositiveButtonTextId)
-                               .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources,
-                                       mNegativeButtonTextId)
-                               .with(ModalDialogProperties.TITLE_SCROLLABLE, true)
-                               .build();
+
+        if (FeatureUtilities.isNoTouchModeEnabled()) {
+            TouchlessDialogProperties.ActionNames names =
+                    new TouchlessDialogProperties.ActionNames();
+            names.cancel = mNegativeButtonTextId;
+            names.select = 0;
+            names.alt = mPositiveButtonTextId;
+            mDialogModel = new PropertyModel.Builder(TouchlessDialogProperties.ALL_DIALOG_KEYS)
+                                   .with(TouchlessDialogProperties.IS_FULLSCREEN, false)
+                                   .with(TouchlessDialogProperties.PRIORITY,
+                                           TouchlessDialogProperties.Priority.HIGH)
+                                   .with(TouchlessDialogProperties.ACTION_NAMES, names)
+                                   .with(ModalDialogProperties.MESSAGE, mMessage)
+                                   .with(ModalDialogProperties.TITLE, mTitle)
+                                   .with(ModalDialogProperties.CUSTOM_VIEW, mDialogCustomView)
+                                   .with(ModalDialogProperties.CONTROLLER, this)
+                                   .with(ModalDialogProperties.FILTER_TOUCH_FOR_SECURITY, true)
+                                   .with(ModalDialogProperties.CONTENT_DESCRIPTION, mMessage)
+                                   .build();
+            mDialogModel.set(TouchlessDialogProperties.ALT_ACTION,
+                    (v) -> onDismiss(mDialogModel, DialogDismissalCause.POSITIVE_BUTTON_CLICKED));
+        } else {
+            mDialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                                   .with(ModalDialogProperties.CONTROLLER, this)
+                                   .with(ModalDialogProperties.TITLE, mTitle)
+                                   .with(ModalDialogProperties.MESSAGE, mMessage)
+                                   .with(ModalDialogProperties.CUSTOM_VIEW, mDialogCustomView)
+                                   .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources,
+                                           mPositiveButtonTextId)
+                                   .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources,
+                                           mNegativeButtonTextId)
+                                   .with(ModalDialogProperties.TITLE_SCROLLABLE, true)
+                                   .build();
+        }
 
         mModalDialogManager = activity.getModalDialogManager();
         mModalDialogManager.showDialog(mDialogModel, dialogType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestFactory.java
index 40f7c76..03b6844b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestFactory.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.payments;
 
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.components.payments.ErrorStrings;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.mojo.system.MojoException;
 import org.chromium.payments.mojom.CanMakePaymentQueryResult;
@@ -40,7 +41,8 @@
         @Override
         public void show(boolean isUserGesture, boolean waitForUpdatedDetails) {
             if (mClient != null) {
-                mClient.onError(PaymentErrorReason.USER_CANCEL);
+                mClient.onError(
+                        PaymentErrorReason.USER_CANCEL, ErrorStrings.WEB_PAYMENT_API_DISABLED);
                 mClient.close();
             }
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 42f72837..74a09560 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -52,6 +52,7 @@
 import org.chromium.chrome.browser.widget.prefeditor.Completable;
 import org.chromium.chrome.browser.widget.prefeditor.EditableOption;
 import org.chromium.components.payments.CurrencyFormatter;
+import org.chromium.components.payments.ErrorStrings;
 import org.chromium.components.payments.OriginSecurityChecker;
 import org.chromium.components.payments.PaymentDetailsConverter;
 import org.chromium.components.payments.PaymentHandlerHost;
@@ -402,13 +403,13 @@
             PaymentDetails details, PaymentOptions options) {
         if (mClient != null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Renderer should never call init() twice");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ATTEMPTED_INITIALIZATION_TWICE);
             return;
         }
 
         if (client == null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Invalid mojo client");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_STATE);
             return;
         }
 
@@ -417,7 +418,7 @@
 
         if (!OriginSecurityChecker.isOriginSecure(mWebContents.getLastCommittedUrl())) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Not in a secure context");
+            disconnectFromClientWithDebugMessage(ErrorStrings.NOT_IN_A_SECURE_ORIGIN);
             return;
         }
 
@@ -428,7 +429,8 @@
         mShippingType = options == null ? PaymentShippingType.SHIPPING : options.shippingType;
 
         if (!UrlUtil.isOriginAllowedToUseWebPaymentApis(mWebContents.getLastCommittedUrl())) {
-            Log.d(TAG, "Only localhost, file://, and cryptographic scheme origins allowed");
+            Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN);
+            Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN_OR_INVALID_SSL_EXPLANATION);
             // Don't show any UI. Resolve .canMakePayment() with "false". Reject .show() with
             // "NotSupportedError".
             onAllPaymentAppsCreated();
@@ -440,7 +442,8 @@
 
         if (OriginSecurityChecker.isSchemeCryptographic(mWebContents.getLastCommittedUrl())
                 && !SslValidityChecker.isSslCertificateValid(mWebContents)) {
-            Log.d(TAG, "SSL certificate is not valid");
+            Log.d(TAG, ErrorStrings.INVALID_SSL_CERTIFICATE);
+            Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN_OR_INVALID_SSL_EXPLANATION);
             // Don't show any UI. Resolve .canMakePayment() with "false". Reject .show() with
             // "NotSupportedError".
             onAllPaymentAppsCreated();
@@ -450,7 +453,7 @@
         mMethodData = getValidatedMethodData(methodData, mCardEditor);
         if (mMethodData == null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Invalid payment methods or data");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_PAYMENT_METHODS_OR_DATA);
             return;
         }
 
@@ -458,7 +461,7 @@
 
         if (mRawTotal == null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Missing total");
+            disconnectFromClientWithDebugMessage(ErrorStrings.TOTAL_REQUIRED);
             return;
         }
         mId = details.id;
@@ -530,8 +533,7 @@
         // Only the currently selected tab is allowed to show the payment UI.
         if (TabModelUtils.getCurrentWebContents(mObservedTabModel) != mWebContents) {
             mJourneyLogger.setNotShown(NotShownReason.OTHER);
-            disconnectFromClientWithDebugMessage(
-                    "Background tab is not allowed to show PaymentRequest UI");
+            disconnectFromClientWithDebugMessage(ErrorStrings.CANNOT_SHOW_IN_BACKGROUND_TAB);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return false;
         }
@@ -541,7 +543,7 @@
             mOverviewModeBehavior = ((ChromeTabbedActivity) activity).getOverviewModeBehavior();
             if (mOverviewModeBehavior.overviewVisible()) {
                 mJourneyLogger.setNotShown(NotShownReason.OTHER);
-                disconnectFromClientWithDebugMessage("In tab overview mode");
+                disconnectFromClientWithDebugMessage(ErrorStrings.TAB_OVERVIEW_MODE);
                 if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
                 return false;
             }
@@ -658,7 +660,7 @@
             // twice on the same instance of PaymentRequest in JavaScript is rejected at the
             // renderer level.
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Renderer should never invoke show() twice");
+            disconnectFromClientWithDebugMessage(ErrorStrings.CANNOT_SHOW_TWICE);
             return;
         }
 
@@ -668,7 +670,7 @@
             // from showing PaymentRequest UI at the same time.
             mJourneyLogger.setNotShown(NotShownReason.CONCURRENT_REQUESTS);
             disconnectFromClientWithDebugMessage(
-                    "A PaymentRequest UI is already showing", PaymentErrorReason.ALREADY_SHOWING);
+                    ErrorStrings.ANOTHER_UI_SHOWING, PaymentErrorReason.ALREADY_SHOWING);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return;
         }
@@ -679,7 +681,7 @@
         ChromeActivity chromeActivity = ChromeActivity.fromWebContents(mWebContents);
         if (chromeActivity == null) {
             mJourneyLogger.setNotShown(NotShownReason.OTHER);
-            disconnectFromClientWithDebugMessage("Unable to find Chrome activity");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ACTIVITY_NOT_FOUND);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return;
         }
@@ -907,8 +909,7 @@
 
         if (mUI == null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage(
-                    "PaymentRequestUpdateEvent.updateWith() called without PaymentRequest.show()");
+            disconnectFromClientWithDebugMessage(ErrorStrings.CANNOT_UPDATE_WITHOUT_SHOW);
             return;
         }
 
@@ -916,10 +917,7 @@
                 && (mInvokedPaymentInstrument == null
                         || !mInvokedPaymentInstrument.isChangingPaymentMethod())) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage(
-                    "PaymentRequestUpdateEvent.updateWith() called without passing a promise into "
-                    + "PaymentRequest.show(), without a payment method change event, and without"
-                    + "payment options (e.g. requestShipping: true)");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_STATE);
             return;
         }
 
@@ -958,7 +956,7 @@
         ChromeActivity chromeActivity = ChromeActivity.fromWebContents(mWebContents);
         if (chromeActivity == null) {
             mJourneyLogger.setNotShown(NotShownReason.OTHER);
-            disconnectFromClientWithDebugMessage("Unable to find Chrome activity");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ACTIVITY_NOT_FOUND);
             return;
         }
 
@@ -966,9 +964,7 @@
 
         if (!TextUtils.isEmpty(details.error)) {
             mJourneyLogger.setNotShown(NotShownReason.OTHER);
-            disconnectFromClientWithDebugMessage(
-                    "PaymentRequestUpdateEvent.updateWith() called with an error when resolving "
-                    + "the promise passed into PaymentRequest.show()");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_STATE);
             return;
         }
 
@@ -997,8 +993,7 @@
 
         if (mUI == null) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage(
-                    "PaymentRequestUpdateEvent fired without PaymentRequest.show()");
+            disconnectFromClientWithDebugMessage(ErrorStrings.CANNOT_UPDATE_WITHOUT_SHOW);
             return;
         }
 
@@ -1034,7 +1029,7 @@
     private boolean parseAndValidateDetailsOrDisconnectFromClient(PaymentDetails details) {
         if (!PaymentValidator.validatePaymentDetails(details)) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Invalid payment details");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_PAYMENT_DETAILS);
             return false;
         }
 
@@ -1597,7 +1592,7 @@
     @Override
     public void onDismiss() {
         mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER);
-        disconnectFromClientWithDebugMessage("Dialog dismissed");
+        disconnectFromClientWithDebugMessage(ErrorStrings.USER_CANCELLED);
     }
 
     private void disconnectFromClientWithDebugMessage(String debugMessage) {
@@ -1606,7 +1601,7 @@
 
     private void disconnectFromClientWithDebugMessage(String debugMessage, int reason) {
         Log.d(TAG, debugMessage);
-        if (mClient != null) mClient.onError(reason);
+        if (mClient != null) mClient.onError(reason, debugMessage);
         closeClient();
         closeUIAndDestroyNativeObjects(/*immediateClose=*/true);
     }
@@ -1668,7 +1663,7 @@
 
         if (!PaymentValidator.validatePaymentValidationErrors(errors)) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
-            disconnectFromClientWithDebugMessage("Invalid payment validation errors");
+            disconnectFromClientWithDebugMessage(ErrorStrings.INVALID_VALIDATION_ERRORS);
             return;
         }
 
@@ -1725,7 +1720,7 @@
         Context context = ChromeActivity.fromWebContents(mWebContents);
         if (context == null) {
             mJourneyLogger.setAborted(AbortReason.OTHER);
-            disconnectFromClientWithDebugMessage("Unable to find Chrome activity");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ACTIVITY_NOT_FOUND);
             return;
         }
 
@@ -2000,7 +1995,7 @@
         ChromeActivity chromeActivity = ChromeActivity.fromWebContents(mWebContents);
         if (chromeActivity == null) {
             mJourneyLogger.setNotShown(NotShownReason.OTHER);
-            disconnectFromClientWithDebugMessage("Unable to find Chrome activity");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ACTIVITY_NOT_FOUND);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return;
         }
@@ -2051,7 +2046,9 @@
             mJourneyLogger.setNotShown(mArePaymentMethodsSupported
                             ? NotShownReason.NO_MATCHING_PAYMENT_METHOD
                             : NotShownReason.NO_SUPPORTED_PAYMENT_METHOD);
-            disconnectFromClientWithDebugMessage("Requested payment methods have no instruments",
+            disconnectFromClientWithDebugMessage(mIsIncognito
+                            ? ErrorStrings.USER_CANCELLED
+                            : ErrorStrings.GENERIC_PAYMENT_METHOD_NOT_SUPPORTED_MESSAGE,
                     mIsIncognito ? PaymentErrorReason.USER_CANCEL
                                  : PaymentErrorReason.NOT_SUPPORTED);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
@@ -2142,7 +2139,7 @@
         // Can happen if the tab is closed during the normalization process.
         if (chromeActivity == null) {
             mJourneyLogger.setAborted(AbortReason.OTHER);
-            disconnectFromClientWithDebugMessage("Unable to find Chrome activity");
+            disconnectFromClientWithDebugMessage(ErrorStrings.ACTIVITY_NOT_FOUND);
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
index 1d65db3..35b1291b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
@@ -4,16 +4,15 @@
 
 package org.chromium.chrome.browser.preferences;
 
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.support.v4.view.ViewCompat;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ClickableSpan;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -27,7 +26,7 @@
  * A preference representing one browsing data type in ClearBrowsingDataPreferences.
  * This class allows clickable links inside the checkbox summary.
  */
-public class ClearBrowsingDataCheckBoxPreference extends ChromeBaseCheckBoxPreference {
+public class ClearBrowsingDataCheckBoxPreference extends ChromeBaseCheckBoxPreferenceCompat {
     private View mView;
     private Runnable mLinkClickDelegate;
     private boolean mHasClickableSpans;
@@ -47,12 +46,11 @@
         mLinkClickDelegate = linkClickDelegate;
     }
 
-    @SuppressLint("ClickableViewAccessibility")
     @Override
-    public View onCreateView(ViewGroup parent) {
-        if (mView != null) return mView;
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
 
-        mView = super.onCreateView(parent);
+        mView = holder.itemView;
         setupLayout(mView);
 
         final TextView textView = (TextView) mView.findViewById(android.R.id.summary);
@@ -86,8 +84,6 @@
                 return false;
             }
         });
-
-        return mView;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java
index 71512f88..88a11f619 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java
@@ -6,10 +6,10 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
-import android.preference.Preference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.util.AttributeSet;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
@@ -24,7 +24,6 @@
     private Spinner mSpinner;
     private ArrayAdapter<Object> mAdapter;
     private int mSelectedIndex;
-    private View mView;
     private final boolean mSingleLine;
 
     /**
@@ -87,12 +86,11 @@
     }
 
     @Override
-    public View onCreateView(ViewGroup parent) {
-        if (mView != null) return mView;
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
 
-        mView = super.onCreateView(parent);
-        ((TextView) mView.findViewById(R.id.title)).setText(getTitle());
-        mSpinner = (Spinner) mView.findViewById(R.id.spinner);
+        ((TextView) holder.findViewById(R.id.title)).setText(getTitle());
+        mSpinner = (Spinner) holder.findViewById(R.id.spinner);
         mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(
@@ -110,13 +108,6 @@
             }
         });
 
-        return mView;
-    }
-
-    @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
-
         // Screen readers notice the setAdapter() call and announce it. We do not want the spinner
         // to be announced every time the view is bound (e.g. when the user scrolls away from it
         // and then back). Therefore, only update the adapter if it has actually changed.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
index 2d8c13f..65f1d73 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
@@ -10,17 +10,17 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.SystemClock;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.v4.util.ArraySet;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
-import android.widget.ListView;
+import android.widget.LinearLayout;
 
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.VisibleForTesting;
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.preferences.SpinnerPreference;
 import org.chromium.chrome.browser.preferences.privacy.BrowsingDataCounterBridge.BrowsingDataCounterCallback;
+import org.chromium.ui.widget.ButtonCompat;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -51,7 +52,7 @@
  * The user can choose which types of data to clear (history, cookies, etc), and the time range
  * from which to clear data.
  */
-public abstract class ClearBrowsingDataPreferences extends PreferenceFragment
+public abstract class ClearBrowsingDataPreferences extends PreferenceFragmentCompat
         implements BrowsingDataBridge.OnClearBrowsingDataListener,
                    Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
     /**
@@ -520,22 +521,14 @@
         clearButton.setEnabled(isEnabled);
     }
 
-    /**
-     * @return The id of the preference xml that should be displayed.
-     */
-    private int getPreferenceXmlId() {
-        return R.xml.clear_browsing_data_preferences_tab;
-    }
-
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         if (savedInstanceState != null) {
             mFetcher = savedInstanceState.getParcelable(CLEAR_BROWSING_DATA_FETCHER);
         }
         mDialogOpened = SystemClock.elapsedRealtime();
         getActivity().setTitle(R.string.clear_browsing_data_title);
-        PreferenceUtils.addPreferencesFromResource(this, getPreferenceXmlId());
+        PreferenceUtils.addPreferencesFromResource(this, R.xml.clear_browsing_data_preferences_tab);
         List<Integer> options = getDialogOptions();
         mItems = new Item[options.size()];
         for (int i = 0; i < options.size(); i++) {
@@ -596,11 +589,14 @@
     @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        // Replace default preferences view with custom XML that contains a footer.
-        View view = inflater.inflate(R.layout.clear_browsing_data_tab_content, container, false);
+        LinearLayout view =
+                (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);
 
-        Button clearButton = (Button) view.findViewById(R.id.clear_button);
+        // Add button to bottom of the preferences view.
+        ButtonCompat clearButton =
+                (ButtonCompat) inflater.inflate(R.xml.clear_browsing_data_button, view, false);
         clearButton.setOnClickListener((View v) -> onClearButtonClicked());
+        view.addView(clearButton);
 
         return view;
     }
@@ -611,11 +607,8 @@
         // Now that the dialog's view has been created, update the button state.
         updateButtonState();
 
-        // Remove the dividers between checkboxes, and make sure the individual widgets can be
-        // focused.
-        ListView view = (ListView) getView().findViewById(android.R.id.list);
-        view.setDivider(null);
-        view.setItemsCanFocus(true);
+        // Remove the dividers between checkboxes.
+        setDivider(null);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
index f75b651..7a4abb69 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
@@ -4,13 +4,13 @@
 
 package org.chromium.chrome.browser.preferences.privacy;
 
-import android.app.Fragment;
-import android.app.FragmentManager;
 import android.content.Context;
 import android.os.Bundle;
 import android.support.design.widget.TabLayout;
 import android.support.graphics.drawable.VectorDrawableCompat;
-import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
 import android.support.v4.text.TextUtilsCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewPager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java
index 43718caf..6bd9d2c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java
@@ -7,7 +7,6 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -16,6 +15,7 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
 import android.support.v7.app.AlertDialog;
 import android.view.LayoutInflater;
 import android.view.View;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
index 4f320d9e..2777f5b2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
@@ -5,13 +5,11 @@
 package org.chromium.chrome.browser.preferences.privacy;
 
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
@@ -19,31 +17,27 @@
  * Fragment to manage the Usage and crash reports preference and to explain to
  * the user what it does.
  */
-public class UsageAndCrashReportsPreferenceFragment extends PreferenceFragment {
+public class UsageAndCrashReportsPreferenceFragment extends PreferenceFragmentCompat {
     private static final String PREF_USAGE_AND_CRASH_REPORTS_SWITCH =
             "usage_and_crash_reports_switch";
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         PreferenceUtils.addPreferencesFromResource(this, R.xml.usage_and_crash_reports_preferences);
         getActivity().setTitle(R.string.usage_and_crash_reports_title_legacy);
         initUsageAndCrashReportsSwitch();
     }
 
     private void initUsageAndCrashReportsSwitch() {
-        ChromeSwitchPreference usageAndCrashReportsSwitch =
-                (ChromeSwitchPreference) findPreference(PREF_USAGE_AND_CRASH_REPORTS_SWITCH);
+        ChromeSwitchPreferenceCompat usageAndCrashReportsSwitch =
+                (ChromeSwitchPreferenceCompat) findPreference(PREF_USAGE_AND_CRASH_REPORTS_SWITCH);
         boolean enabled =
                 PrivacyPreferencesManager.getInstance().isUsageAndCrashReportingPermittedByUser();
         usageAndCrashReportsSwitch.setChecked(enabled);
 
-        usageAndCrashReportsSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                UmaSessionStats.changeMetricsReportingConsent((boolean) newValue);
-                return true;
-            }
+        usageAndCrashReportsSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+            UmaSessionStats.changeMetricsReportingConsent((boolean) newValue);
+            return true;
         });
 
         usageAndCrashReportsSwitch.setManagedPreferenceDelegate(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
index b280c64..ae38a9eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -47,6 +47,7 @@
 import org.chromium.base.metrics.CachedMetrics;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
+import org.chromium.content_public.browser.RenderWidgetHostView;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.UiUtils;
 
@@ -417,10 +418,12 @@
      */
     public static void captureScreenshotForContents(
             WebContents contents, int width, int height, Callback<Uri> callback) {
+        RenderWidgetHostView rwhv = contents.getRenderWidgetHostView();
+        if (rwhv == null) callback.onResult(null);
         try {
             String path = UiUtils.getDirectoryForImageCapture(ContextUtils.getApplicationContext())
                     + File.separator + SHARE_IMAGES_DIRECTORY_NAME;
-            contents.writeContentBitmapToDiskAsync(
+            rwhv.writeContentBitmapToDiskAsync(
                     width, height, path, new ExternallyVisibleUriCallback(callback));
         } catch (IOException e) {
             Log.e(TAG, "Error getting content bitmap: ", e);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index 6222404..7ec6ecfd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -64,6 +64,7 @@
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content_public.browser.ChildProcessImportance;
 import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.content_public.browser.RenderWidgetHostView;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsAccessibility;
 import org.chromium.content_public.common.ResourceRequestBody;
@@ -498,7 +499,12 @@
      * @return Whether or not the tab has something valid to render.
      */
     public boolean isReady() {
-        return mNativePage != null || (getWebContents() != null && getWebContents().isReady());
+        if (mNativePage != null) return true;
+        WebContents webContents = getWebContents();
+        if (webContents == null) return false;
+
+        RenderWidgetHostView rwhv = webContents.getRenderWidgetHostView();
+        return rwhv != null && rwhv.isReady();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
index 61a5050..605662c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
@@ -12,6 +12,8 @@
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content_public.browser.NavigationHandle;
+import org.chromium.content_public.browser.RenderWidgetHostView;
+import org.chromium.content_public.browser.WebContents;
 
 /**
  * Manages theme color used for {@link Tab}. Destroyed together with the tab.
@@ -165,9 +167,15 @@
     public int getBackgroundColor() {
         if (mTab.isNativePage()) return mTab.getNativePage().getBackgroundColor();
 
-        final int backgroundColor = mTab.getWebContents() != null
-                ? mTab.getWebContents().getBackgroundColor()
-                : Color.TRANSPARENT;
+        WebContents tabWebContents = mTab.getWebContents();
+        RenderWidgetHostView rwhv =
+                tabWebContents == null ? null : tabWebContents.getRenderWidgetHostView();
+        final int backgroundColor = rwhv != null ? rwhv.getBackgroundColor() : Color.TRANSPARENT;
+        // TODO(donnd): remove this and support for WebContents#getBackgroundColor when
+        // addressing https://crbug.com/968150.
+        assert backgroundColor
+                == (mTab.getWebContents() != null ? mTab.getWebContents().getBackgroundColor()
+                                                  : Color.TRANSPARENT);
         return backgroundColor == Color.TRANSPARENT ? mDefaultBackgroundColor : backgroundColor;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
index 93b7d64..d4767859 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
@@ -67,14 +67,18 @@
      */
     @Override
     public void onFinishNativeInitialization() {
-        mSigninManager = SigninManager.get();
-        mSigninManager.addSignInStateObserver(this);
-
-        mProfileSyncService = ProfileSyncService.get();
-        mProfileSyncService.addSyncStateChangedListener(this);
-
         mActivityLifecycleDispatcher.unregister(this);
         mActivityLifecycleDispatcher = null;
+
+        mProfileSyncService = ProfileSyncService.get();
+        // ProfileSyncService being null means sync is disabled and won't be initialized. This means
+        // Identity Disc will never get shown so we don't need to register for other notifications.
+        if (mProfileSyncService == null) return;
+
+        mProfileSyncService.addSyncStateChangedListener(this);
+
+        mSigninManager = SigninManager.get();
+        mSigninManager.addSignInStateObserver(this);
     }
 
     /**
@@ -82,11 +86,13 @@
      */
     void updateButtonState(boolean isNTPVisible) {
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.IDENTITY_DISC)) return;
+        // Sync is disabled. IdentityDisc will never be shown.
+        if (mProfileSyncService == null) return;
 
         mIsNTPVisible = isNTPVisible;
         String accountName = ChromeSigninController.get().getSignedInAccountName();
-        boolean shouldShowIdentityDisc = isNTPVisible && accountName != null
-                && ProfileSyncService.get().canSyncFeatureStart();
+        boolean shouldShowIdentityDisc =
+                isNTPVisible && accountName != null && mProfileSyncService.canSyncFeatureStart();
 
         if (shouldShowIdentityDisc == mIsIdentityDiscVisible) return;
 
@@ -169,6 +175,11 @@
      * Call to tear down dependencies.
      */
     void destroy() {
+        if (mActivityLifecycleDispatcher != null) {
+            mActivityLifecycleDispatcher.unregister(this);
+            mActivityLifecycleDispatcher = null;
+        }
+
         if (mProfileDataCache != null) {
             mProfileDataCache.removeObserver(this);
             mProfileDataCache = null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
index 737e9c76..6deb896 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -2320,7 +2320,8 @@
 
     @Override
     public void handleFindLocationBarStateChange(boolean showing) {
-        setVisibility(showing ? View.GONE : View.VISIBLE);
+        setVisibility(showing ? View.GONE
+                              : mTabSwitcherState == STATIC_TAB ? View.VISIBLE : View.INVISIBLE);
     }
 
     private boolean isLocationBarShownInNTP() {
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 2cd4be10..7fdb240c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">የሚወርድበት ቦታ</translation>
 <translation id="8274165955039650276">ውርዶችን ይመልከቱ</translation>
 <translation id="8283853025636624853">ከ<ph name="SYNC_ACCOUNT_USER_NAME" /> ጋር ማሥመር</translation>
+<translation id="8284326494547611709">መግለጫ ጽሑፎች</translation>
 <translation id="8300705686683892304">በመተግበሪያ የሚተዳደር</translation>
 <translation id="8310344678080805313">መደበኛ ትሮች</translation>
 <translation id="8313455859591948645">የጅምር መነሻ ገጽን ያርትዑ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index f18b19bf..dc31673 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">موقع التنزيل</translation>
 <translation id="8274165955039650276">الاطِّلاع على التنزيلات</translation>
 <translation id="8283853025636624853">تتم المزامنة مع <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">الترجمة والشرح</translation>
 <translation id="8300705686683892304">تتم الإدارة من خلال التطبيق</translation>
 <translation id="8310344678080805313">علامات التبويب القياسية</translation>
 <translation id="8313455859591948645">تعديل صفحة بدء التشغيل</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 33332d7..452a04b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Местоположение за изтеглянията</translation>
 <translation id="8274165955039650276">Преглед на изтеглянията</translation>
 <translation id="8283853025636624853">Синхронизира се със: <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Надписи</translation>
 <translation id="8300705686683892304">Управлявани от приложение</translation>
 <translation id="8310344678080805313">Стандартни раздели</translation>
 <translation id="8313455859591948645">Редактиране на страницата при стартиране</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
index 676f7b3c..3760e13 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -1018,6 +1018,7 @@
 <translation id="8266862848225348053">যেখানে ডাউনলোড হবে</translation>
 <translation id="8274165955039650276">ডাউনলোড দেখুন</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> এ সিঙ্ক হচ্ছে</translation>
+<translation id="8284326494547611709">পরিচয়লিপিগুলি</translation>
 <translation id="8300705686683892304">অ্যাপ ম্যানেজ করে</translation>
 <translation id="8310344678080805313">স্ট্যান্ডার্ড ট্যাব</translation>
 <translation id="8313455859591948645">শুরুর পৃষ্ঠা এডিট করুন</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index a8eaee15..6a51ce10 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Ubicació de baixada</translation>
 <translation id="8274165955039650276">Mostra les baixades</translation>
 <translation id="8283853025636624853">Se sincronitza amb <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtítols</translation>
 <translation id="8300705686683892304">Gestionats per aplicacions</translation>
 <translation id="8310344678080805313">Pestanyes estàndard</translation>
 <translation id="8313455859591948645">Edita la pàgina d'inici</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 1099232..ad703ce 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -269,7 +269,7 @@
 <translation id="2893180576842394309">Google vaši historii může používat k personalizaci Vyhledávání a dalších služeb Google</translation>
 <translation id="2900528713135656174">Vytvořit událost</translation>
 <translation id="2902702728133930130">Spuštění Chromu se nezdařilo kvůli neočekávané chybě.</translation>
-<translation id="290376772003165898">Není stránka v jazyce <ph name="LANGUAGE" />?</translation>
+<translation id="290376772003165898">Stránka není v jazyce <ph name="LANGUAGE" />?</translation>
 <translation id="2910701580606108292">Před povolením spuštění chráněného obsahu na webu se zeptat</translation>
 <translation id="2913331724188855103">Povolit webům ukládat a číst data souborů cookie (doporučeno)</translation>
 <translation id="2923908459366352541">Název je neplatný</translation>
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Umístění stažených souborů</translation>
 <translation id="8274165955039650276">Zobrazit stažený obsah</translation>
 <translation id="8283853025636624853">Data se synchronizují do účtu <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Titulky</translation>
 <translation id="8300705686683892304">Spravováno aplikací</translation>
 <translation id="8310344678080805313">Standardní karty</translation>
 <translation id="8313455859591948645">Úprava počáteční stránky</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index 836dc3b..4702c639 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -483,7 +483,7 @@
 <translation id="4561979708150884304">Der er ingen forbindelse</translation>
 <translation id="4565377596337484307">Skjul adgangskode</translation>
 <translation id="4570913071927164677">Info</translation>
-<translation id="4572422548854449519">Log ind på administreret konto</translation>
+<translation id="4572422548854449519">Log ind på mangerstyret konto</translation>
 <translation id="4583164079174244168">{MINUTES,plural, =1{For # minut siden}one{For # minut siden}other{For # minutter siden}}</translation>
 <translation id="4587589328781138893">Websites</translation>
 <translation id="4594952190837476234">Denne offlineside er fra <ph name="CREATION_TIME" /> og kan afvige fra onlineversionen.</translation>
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Downloadplacering</translation>
 <translation id="8274165955039650276">Se downloads</translation>
 <translation id="8283853025636624853">Synkroniserer til <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Undertekster</translation>
 <translation id="8300705686683892304">Administreres af en app</translation>
 <translation id="8310344678080805313">Standardfaner</translation>
 <translation id="8313455859591948645">Rediger opstartsside</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index a1390f49..0298917 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Downloadpfad</translation>
 <translation id="8274165955039650276">Downloads aufrufen</translation>
 <translation id="8283853025636624853">Synchronisierung mit <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Untertitel</translation>
 <translation id="8300705686683892304">Von App verwaltet</translation>
 <translation id="8310344678080805313">Standard-Tabs</translation>
 <translation id="8313455859591948645">"Beim Start"-Seite bearbeiten</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 98f22919..976fb59 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Τοποθεσία λήψης</translation>
 <translation id="8274165955039650276">Εμφάνιση λήψεων</translation>
 <translation id="8283853025636624853">Συγχρονισμός με <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Υπότιτλοι</translation>
 <translation id="8300705686683892304">Διαχείριση από εφαρμογή</translation>
 <translation id="8310344678080805313">Τυπικές καρτέλες</translation>
 <translation id="8313455859591948645">Επεξεργασία σελίδας εκκίνησης</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index ca6978d5..9887081 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Download location</translation>
 <translation id="8274165955039650276">See downloads</translation>
 <translation id="8283853025636624853">Syncing to <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Captions</translation>
 <translation id="8300705686683892304">Managed by app</translation>
 <translation id="8310344678080805313">Standard tabs</translation>
 <translation id="8313455859591948645">Edit startup page</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 6ad5db8..3e33a3a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Ubicación de las descargas</translation>
 <translation id="8274165955039650276">Ver las descargas</translation>
 <translation id="8283853025636624853">Sincronizando con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtítulos</translation>
 <translation id="8300705686683892304">Administrados por una app</translation>
 <translation id="8310344678080805313">Pestañas estándar</translation>
 <translation id="8313455859591948645">Editar la página de inicio</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 872dfe5..3099b3a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Herramientas para desarrolladores</translation>
 <translation id="1692118695553449118">La sincronización está activada</translation>
 <translation id="169515064810179024">No permitir que los sitios web accedan a los sensores de movimiento</translation>
+<translation id="1697480839793160072">Teléfonos</translation>
+<translation id="1698058317516161971">Correos electrónicos</translation>
 <translation id="1717218214683051432">Sensores de movimiento</translation>
 <translation id="1718835860248848330">Última hora</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> (actualizado hace <ph name="TIME_SINCE_UPDATE" />)</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Ubicación de las descargas</translation>
 <translation id="8274165955039650276">Ver descargas</translation>
 <translation id="8283853025636624853">Sincronizando con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtítulos</translation>
 <translation id="8300705686683892304">Administrados por una aplicación</translation>
 <translation id="8310344678080805313">Pestañas estándar</translation>
 <translation id="8313455859591948645">Editar página de inicio</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
index 8373cff..2a43d76 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Allalaadimise asukoht</translation>
 <translation id="8274165955039650276">Kuva allalaadimised</translation>
 <translation id="8283853025636624853">Sünkroonimine kontoga <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtiitrid</translation>
 <translation id="8300705686683892304">Neid haldab rakendus</translation>
 <translation id="8310344678080805313">Tavapärased vahekaardid</translation>
 <translation id="8313455859591948645">Käivitamisel avatava lehe muutmine</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 8a8c2fdb..c0067c68 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">مکان بارگیری</translation>
 <translation id="8274165955039650276">مشاهده بارگیری‌ها</translation>
 <translation id="8283853025636624853">در حال همگام‌سازی در <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">زیرنویس‌ها</translation>
 <translation id="8300705686683892304">مدیریت‌شده توسط برنامه</translation>
 <translation id="8310344678080805313">برگه‌های استاندارد</translation>
 <translation id="8313455859591948645">ویرایش صفحه شروع</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 849b787..97690b4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Kehittäjän työkalut</translation>
 <translation id="1692118695553449118">Synkronointi on käytössä.</translation>
 <translation id="169515064810179024">Estä sivustoja käyttämästä liiketunnistimien lukemia</translation>
+<translation id="1697480839793160072">Puhelimet</translation>
+<translation id="1698058317516161971">Sähköpostiviestit</translation>
 <translation id="1717218214683051432">Liiketunnistimet</translation>
 <translation id="1718835860248848330">Viimeinen tunti</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> – päivitettiin <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Lataussijainti</translation>
 <translation id="8274165955039650276">Näytä lataukset</translation>
 <translation id="8283853025636624853">Synkronoidaan tietoja tilille <ph name="SYNC_ACCOUNT_USER_NAME" />.</translation>
+<translation id="8284326494547611709">Tekstitykset</translation>
 <translation id="8300705686683892304">Sovelluksen ylläpitämät</translation>
 <translation id="8310344678080805313">Tavalliset välilehdet</translation>
 <translation id="8313455859591948645">Muokkaa aloitussivua</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 3a656f5..533fab3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Mga Tool ng Developer</translation>
 <translation id="1692118695553449118">Naka-on ang pag-sync</translation>
 <translation id="169515064810179024">I-block ang mga site sa pag-access sa mga sensor ng paggalaw</translation>
+<translation id="1697480839793160072">Mga Telepono</translation>
+<translation id="1698058317516161971">Mga Email</translation>
 <translation id="1717218214683051432">Mga sensor ng paggalaw</translation>
 <translation id="1718835860248848330">Huling oras</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - Na-update <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Lokasyon ng download</translation>
 <translation id="8274165955039650276">Tingnan ang mga download</translation>
 <translation id="8283853025636624853">Sini-sync sa <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Mga Caption</translation>
 <translation id="8300705686683892304">Pinapamahalaan ng app</translation>
 <translation id="8310344678080805313">Mga karaniwang tab</translation>
 <translation id="8313455859591948645">I-edit ang page sa pagsisimula</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index e266110..7525a7d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Emplacement de téléchargement</translation>
 <translation id="8274165955039650276">Voir les téléchargements</translation>
 <translation id="8283853025636624853">Synchronisation avec <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation>
+<translation id="8284326494547611709">Sous-titres</translation>
 <translation id="8300705686683892304">Gérés par l'application</translation>
 <translation id="8310344678080805313">Onglets standards</translation>
 <translation id="8313455859591948645">Modifier la page de démarrage</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
index 830d35a33..7c07906 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">સ્થાન ડાઉનલોડ કરો</translation>
 <translation id="8274165955039650276">ડાઉનલોડ જુઓ</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> પર સમન્વયિત કરી રહ્યાં છે</translation>
+<translation id="8284326494547611709">કૅપ્શન્સ</translation>
 <translation id="8300705686683892304">ઍપ દ્વારા મેનેજ થતી</translation>
 <translation id="8310344678080805313">માનક ટેબ્સ</translation>
 <translation id="8313455859591948645">સ્ટાર્ટઅપ પેજમાં ફેરફાર કરો</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 2437dda..48183af 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">डेवलपर टूल</translation>
 <translation id="1692118695553449118">समन्वयन चालू है</translation>
 <translation id="169515064810179024">साइटों को हलचल पकड़ने वाले सेंसर एक्सेस करने से रोकें</translation>
+<translation id="1697480839793160072">टेलीफ़ोन</translation>
+<translation id="1698058317516161971">ईमेल</translation>
 <translation id="1717218214683051432">मोशन सेंसर</translation>
 <translation id="1718835860248848330">अंतिम घंटा</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> अपडेट किया गया</translation>
@@ -227,7 +229,7 @@
 <translation id="257931822824936280">बड़ा किया गया - छोटा करने के लिए क्‍लिक करें.</translation>
 <translation id="2581165646603367611">यह साइट की कुकी, कैश और अन्य डेटा निकाल देगा जो Chrome के विचार में महत्वपूर्ण नहीं है.</translation>
 <translation id="2586657967955657006">क्लिपबोर्ड</translation>
-<translation id="2587052924345400782">ज़्यादा नया वर्शन उपलब्ध है</translation>
+<translation id="2587052924345400782">नया वर्शन उपलब्ध है</translation>
 <translation id="2593272815202181319">मोनोस्पेस</translation>
 <translation id="2612676031748830579">कार्ड संख्या</translation>
 <translation id="2613747923081026172">समूह बनाएं</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">डाउनलोड सेव करने की जगह</translation>
 <translation id="8274165955039650276">डाउनलोड देखें</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> से समन्वयित हो रहा है</translation>
+<translation id="8284326494547611709">कैप्शन</translation>
 <translation id="8300705686683892304">ऐप्लिकेशन प्रबंधित करता है</translation>
 <translation id="8310344678080805313">मानक टैब</translation>
 <translation id="8313455859591948645">शुरुआती पन्ने में बदलाव करें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index 9892d5f..04a03469 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Lokacija za preuzimanje</translation>
 <translation id="8274165955039650276">Pregled preuzimanja</translation>
 <translation id="8283853025636624853">Sinkronizira se s računom <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Titlovi</translation>
 <translation id="8300705686683892304">Upravlja aplikacija</translation>
 <translation id="8310344678080805313">Standardne kartice</translation>
 <translation id="8313455859591948645">Uređivanje početne stranice</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index d8ddc23..d2bc5be 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Letöltés helye</translation>
 <translation id="8274165955039650276">Letöltések megtekintése</translation>
 <translation id="8283853025636624853">Szinkronizálás a következővel: <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Feliratok</translation>
 <translation id="8300705686683892304">Alkalmazás által kezelt</translation>
 <translation id="8310344678080805313">Szabványos lapok</translation>
 <translation id="8313455859591948645">Kezdőoldal szerkesztése</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index d71fed2..e15b2d05 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Lokasi download</translation>
 <translation id="8274165955039650276">Lihat hasil download</translation>
 <translation id="8283853025636624853">Menyinkronkan dengan <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Teks</translation>
 <translation id="8300705686683892304">Dikelola oleh aplikasi</translation>
 <translation id="8310344678080805313">Tab standar</translation>
 <translation id="8313455859591948645">Edit halaman awal</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index add7f53..e72bec88 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Percorso di download</translation>
 <translation id="8274165955039650276">Visualizza i download</translation>
 <translation id="8283853025636624853">Sincronizzazione con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Sottotitoli</translation>
 <translation id="8300705686683892304">Gestiti dall'app</translation>
 <translation id="8310344678080805313">Schede standard</translation>
 <translation id="8313455859591948645">Modifica la pagina iniziale</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 434f5a6..044e395 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">כלים עבור מפתחים</translation>
 <translation id="1692118695553449118">סנכרון מופעל</translation>
 <translation id="169515064810179024">חסימת הגישה של אתרים אל חיישני תנועה</translation>
+<translation id="1697480839793160072">טלפונים</translation>
+<translation id="1698058317516161971">הודעות אימייל</translation>
 <translation id="1717218214683051432">חיישני תנועה</translation>
 <translation id="1718835860248848330">מהשעה האחרונה</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - עודכן <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">מיקום ההורדה</translation>
 <translation id="8274165955039650276">הצגת הורדות</translation>
 <translation id="8283853025636624853">מסנכרן עם <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">כתוביות</translation>
 <translation id="8300705686683892304">מנוהלים על-ידי אפליקציה</translation>
 <translation id="8310344678080805313">כרטיסיות רגילות</translation>
 <translation id="8313455859591948645">עריכת דף הפתיחה</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 32374bf3..4118780b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">デベロッパー ツール</translation>
 <translation id="1692118695553449118">同期は有効です</translation>
 <translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation>
+<translation id="1697480839793160072">電話</translation>
+<translation id="1698058317516161971">メール</translation>
 <translation id="1717218214683051432">モーション センサー</translation>
 <translation id="1718835860248848330">1 時間以内</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" />に更新</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">ダウンロード場所</translation>
 <translation id="8274165955039650276">ダウンロードを表示</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> に同期しています</translation>
+<translation id="8284326494547611709">字幕</translation>
 <translation id="8300705686683892304">アプリによる管理</translation>
 <translation id="8310344678080805313">標準のタブ</translation>
 <translation id="8313455859591948645">起動ページの編集</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
index 1c98605..f09bd46 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -101,6 +101,8 @@
 <translation id="1679068421605151609">ಡೆವಲಪರ್ ಟೂಲ್ಸ್</translation>
 <translation id="1692118695553449118">ಸಿಂಕ್‌ ಆನ್‌ ಆಗಿದೆ</translation>
 <translation id="169515064810179024">ಚಲನಾ ಸೆನ್ಸರ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸದಂತೆ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
+<translation id="1697480839793160072">ಟೆಲಿಫೋನ್‌ಗಳು</translation>
+<translation id="1698058317516161971">ಇಮೇಲ್‌ಗಳು</translation>
 <translation id="1717218214683051432">ಮೋಷನ್ ಸೆನ್ಸಾರ್‌ಗಳು</translation>
 <translation id="1718835860248848330">ಕೊನೆಯ ಗಂಟೆ</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> ಸಮಯದ ಹಿಂದೆ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ</translation>
@@ -1015,6 +1017,7 @@
 <translation id="8266862848225348053">ಡೌನ್‌ಲೋಡ್ ಸ್ಥಳ</translation>
 <translation id="8274165955039650276">ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ನೋಡಿ</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> ಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
+<translation id="8284326494547611709">ಶೀರ್ಷಿಕೆಗಳು</translation>
 <translation id="8300705686683892304">ಆ್ಯಪ್ ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation>
 <translation id="8310344678080805313">ಪ್ರಮಾಣಿತ ಟ್ಯಾಬ್‌ಗಳು</translation>
 <translation id="8313455859591948645">ಆರಂಭಿಕ ಪುಟವನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index e9260c9..0fd3a66 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">개발자 도구</translation>
 <translation id="1692118695553449118">동기화 사용 중</translation>
 <translation id="169515064810179024">사이트에서 움직임 감지 센서에 액세스하지 못하도록 차단</translation>
+<translation id="1697480839793160072">전화</translation>
+<translation id="1698058317516161971">이메일</translation>
 <translation id="1717218214683051432">움직임 감지 센서</translation>
 <translation id="1718835860248848330">지난 1시간</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" />: <ph name="TIME_SINCE_UPDATE" />에 업데이트됨</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">다운로드 위치</translation>
 <translation id="8274165955039650276">다운로드 항목 보기</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" />에 동기화 중</translation>
+<translation id="8284326494547611709">자막</translation>
 <translation id="8300705686683892304">앱에서 관리함</translation>
 <translation id="8310344678080805313">일반 탭</translation>
 <translation id="8313455859591948645">시작 페이지 수정</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index b782483d..ad30b86 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Atsisiuntimo vieta</translation>
 <translation id="8274165955039650276">Peržiūrėti atsisiuntimus</translation>
 <translation id="8283853025636624853">Sinchronizuojama su <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtitrai</translation>
 <translation id="8300705686683892304">Valdo programa</translation>
 <translation id="8310344678080805313">Įprasti skirtukai</translation>
 <translation id="8313455859591948645">Paleidimo puslapio redagavimas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 62db33d..a9fbd528 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Lejupielādes atrašanās vieta</translation>
 <translation id="8274165955039650276">Skatīt lejupielādes</translation>
 <translation id="8283853025636624853">Sinhronizēšana ar <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Paraksti</translation>
 <translation id="8300705686683892304">Pārvalda lietotne</translation>
 <translation id="8310344678080805313">Standarta cilnes</translation>
 <translation id="8313455859591948645">Sākumlapas rediģēšana</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
index 192e0c8..b08c250 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">ഡെവലപ്പർ ഉപകരണങ്ങൾ</translation>
 <translation id="1692118695553449118">സമന്വയം ഓണാണ്</translation>
 <translation id="169515064810179024">ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
+<translation id="1697480839793160072">ടെലിഫോണുകൾ</translation>
+<translation id="1698058317516161971">ഇമെയിലുകൾ</translation>
 <translation id="1717218214683051432">ചലന സെൻസറുകൾ</translation>
 <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്‍‌</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> അപ്‌ഡേറ്റ് ചെയ്‌തു</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">ഡൗൺലോഡ് ലൊക്കേഷൻ</translation>
 <translation id="8274165955039650276">ഡൗൺലോഡുകൾ കാണുക</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നു</translation>
+<translation id="8284326494547611709">അടിക്കുറിപ്പുകൾ</translation>
 <translation id="8300705686683892304">ആപ്പ് മാനേജ് ചെയ്യുന്നത്</translation>
 <translation id="8310344678080805313">സ്റ്റാൻഡേർഡ് ടാബുകൾ</translation>
 <translation id="8313455859591948645">ആരംഭ പേജ് എഡിറ്റ് ചെയ്യുക</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
index 8d4623c..2d2d940 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">डेव्हलपर टूल</translation>
 <translation id="1692118695553449118">संकालन चालू आहे</translation>
 <translation id="169515064810179024">साइटना मोशन सेन्सर ॲक्सेसपासून ब्लॉक करा</translation>
+<translation id="1697480839793160072">टेलिफोन</translation>
+<translation id="1698058317516161971">ईमेल</translation>
 <translation id="1717218214683051432">मोशन सेन्सर</translation>
 <translation id="1718835860248848330">शेवटच्या तासामधील</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> रोजी अपडेट केले</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">डाउनलोड करण्याचे स्थान</translation>
 <translation id="8274165955039650276">डाउनलोड पाहा</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> वर संकालित करीत आहे</translation>
+<translation id="8284326494547611709">मथळे</translation>
 <translation id="8300705686683892304">अॅपद्वारे व्यवस्थापित</translation>
 <translation id="8310344678080805313">मानक टॅब</translation>
 <translation id="8313455859591948645">स्टार्टअप पेज संपादित करा</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
index a8cd35f5..a7206021 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Lokasi muat turun</translation>
 <translation id="8274165955039650276">Lihat muat turun</translation>
 <translation id="8283853025636624853">Menyegerakkan ke <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Kapsyen</translation>
 <translation id="8300705686683892304">Diurus oleh apl</translation>
 <translation id="8310344678080805313">Tab standard</translation>
 <translation id="8313455859591948645">Edit halaman permulaan</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 08dc311..95e23d0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Downloadlocatie</translation>
 <translation id="8274165955039650276">Downloads bekijken</translation>
 <translation id="8283853025636624853">Synchroniseren met <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Ondertiteling</translation>
 <translation id="8300705686683892304">Beheerd door app</translation>
 <translation id="8310344678080805313">Standaardtabbladen</translation>
 <translation id="8313455859591948645">Startpagina bewerken</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 584776f..9aa308c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Utviklerverktøy</translation>
 <translation id="1692118695553449118">Synkronisering er slått på.</translation>
 <translation id="169515064810179024">Blokkér nettsteder fra å få tilgang til bevegelsessensorer</translation>
+<translation id="1697480839793160072">Telefoner</translation>
+<translation id="1698058317516161971">E-poster</translation>
 <translation id="1717218214683051432">Bevegelsessensorer</translation>
 <translation id="1718835860248848330">Siste time</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> – oppdatert <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Nedlastingssted</translation>
 <translation id="8274165955039650276">Se nedlastinger</translation>
 <translation id="8283853025636624853">Synkroniserer til <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Teksting</translation>
 <translation id="8300705686683892304">Administreres av app</translation>
 <translation id="8310344678080805313">Standardfaner</translation>
 <translation id="8313455859591948645">Endre oppstartssiden</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 731b1f9d..d9a282c8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Miejsce zapisywania pobranych plików</translation>
 <translation id="8274165955039650276">Zobacz pobrane</translation>
 <translation id="8283853025636624853">Synchronizacja z kontem <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Napisy</translation>
 <translation id="8300705686683892304">Zarządzane przez aplikację</translation>
 <translation id="8310344678080805313">Karty standardowe</translation>
 <translation id="8313455859591948645">Zmiana strony startowej</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index cd1b94a..ff0d8e8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -1017,6 +1017,7 @@
 <translation id="8266862848225348053">Local de download</translation>
 <translation id="8274165955039650276">Ver downloads</translation>
 <translation id="8283853025636624853">Sincronizando com <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Legendas</translation>
 <translation id="8300705686683892304">Gerenciados por app</translation>
 <translation id="8310344678080805313">Guias padrão</translation>
 <translation id="8313455859591948645">Editar página de inicialização</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 3512324..3793340 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Localização da transferência</translation>
 <translation id="8274165955039650276">Ver transferências</translation>
 <translation id="8283853025636624853">A sincronizar com <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Legendas</translation>
 <translation id="8300705686683892304">Geridos por aplicação</translation>
 <translation id="8310344678080805313">Separadores padrão</translation>
 <translation id="8313455859591948645">Editar página inicial</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index c87a3bb..0e399b6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Instrumente pentru dezvoltatori</translation>
 <translation id="1692118695553449118">Sincronizarea este activată</translation>
 <translation id="169515064810179024">Împiedică site-urile să acceseze senzorii de mișcare</translation>
+<translation id="1697480839793160072">Telefoane</translation>
+<translation id="1698058317516161971">E-mailuri</translation>
 <translation id="1717218214683051432">Senzori de mișcare</translation>
 <translation id="1718835860248848330">Ultima oră</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> – actualizat <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Locația de descărcare</translation>
 <translation id="8274165955039650276">Vezi descărcările</translation>
 <translation id="8283853025636624853">Se sincronizează cu <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Subtitrări</translation>
 <translation id="8300705686683892304">Gestionate de aplicație</translation>
 <translation id="8310344678080805313">File standard</translation>
 <translation id="8313455859591948645">Editează pagina de pornire</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 6fe4b26a..32f5a41 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Инструменты разработчика</translation>
 <translation id="1692118695553449118">Синхронизация включена</translation>
 <translation id="169515064810179024">Закрыть сайтам доступ к датчикам движения</translation>
+<translation id="1697480839793160072">Номера телефонов</translation>
+<translation id="1698058317516161971">Адреса эл. почты</translation>
 <translation id="1717218214683051432">Датчики движения</translation>
 <translation id="1718835860248848330">Последний час</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" />. Обновление <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Расположение скачиваемых файлов</translation>
 <translation id="8274165955039650276">Показать скачанные файлы</translation>
 <translation id="8283853025636624853">Синхронизация с аккаунтом <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation>
+<translation id="8284326494547611709">Титры</translation>
 <translation id="8300705686683892304">Под управлением приложения</translation>
 <translation id="8310344678080805313">Обычные вкладки</translation>
 <translation id="8313455859591948645">Изменение стартовой страницы</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 843aa4b..5e6400f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Umiestnenie sťahovaných súborov</translation>
 <translation id="8274165955039650276">Zobraziť stiahnuté</translation>
 <translation id="8283853025636624853">Synchronizácia do účtu <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Titulky</translation>
 <translation id="8300705686683892304">Spravované aplikáciou</translation>
 <translation id="8310344678080805313">Štandardné karty</translation>
 <translation id="8313455859591948645">Úprava stránky pri spustení</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index b56022e..37d79494 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Mesto za prenos</translation>
 <translation id="8274165955039650276">Ogled prenosov</translation>
 <translation id="8283853025636624853">Sinhronizacija z računom <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Napisi</translation>
 <translation id="8300705686683892304">Upravlja aplikacija</translation>
 <translation id="8310344678080805313">Standardni zavihki</translation>
 <translation id="8313455859591948645">Urejanje začetne strani</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index a3f3dc3..4108475 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Локација за преузимање</translation>
 <translation id="8274165955039650276">Погледајте преузимања</translation>
 <translation id="8283853025636624853">Синхронизује се са <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Титл</translation>
 <translation id="8300705686683892304">Управља апликација</translation>
 <translation id="8310344678080805313">Стандардне картице</translation>
 <translation id="8313455859591948645">Измените почетну страницу</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 4e3b8ec..d861539f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Nedladdningsplats</translation>
 <translation id="8274165955039650276">Visa nedladdningar</translation>
 <translation id="8283853025636624853">Synkroniseras med <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Textning</translation>
 <translation id="8300705686683892304">Hanteras av app</translation>
 <translation id="8310344678080805313">Standardflikar</translation>
 <translation id="8313455859591948645">Redigera startfliken</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 7eeaf43..e3d9b2e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -1015,6 +1015,7 @@
 <translation id="8266862848225348053">Sehemu ya kuweka vipakuliwa</translation>
 <translation id="8274165955039650276">Angalia vipakuliwa</translation>
 <translation id="8283853025636624853">Inasawazisha kwenye <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Manukuu</translation>
 <translation id="8300705686683892304">Zinazodhibitiwa na programu</translation>
 <translation id="8310344678080805313">Vichupo muundo-msingi</translation>
 <translation id="8313455859591948645">Badilisha ukurasa unaoanza</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index c55ecb0..6260ba1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">டெவலப்பர் கருவிகள்</translation>
 <translation id="1692118695553449118">ஒத்திசைவு இயக்கத்தில்</translation>
 <translation id="169515064810179024">தளங்கள் மோஷன் சென்சார்களை அணுகுவதைத் தடுக்கும்</translation>
+<translation id="1697480839793160072">மொபைல்கள்</translation>
+<translation id="1698058317516161971">மின்னஞ்சல்கள்</translation>
 <translation id="1717218214683051432">மோஷன் சென்சார்கள்</translation>
 <translation id="1718835860248848330">கடந்த ஒரு மணிநேரம்</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> புதுப்பிக்கப்பட்டது</translation>
@@ -357,6 +359,7 @@
 <translation id="363596933471559332">சேமிக்கப்பட்டுள்ள நற்சான்றிதழ்களைப் பயன்படுத்தி, இணையதளங்களில் தானாகவே உள்நுழையவும். இந்த அம்சம் முடக்கப்பட்டிருக்கும் போது, ஒவ்வொரு முறையும் இணையதளத்தில் உள்நுழைவதற்கு முன்பும் சரிபார்க்கும்படி கேட்கப்படுவீர்கள்.</translation>
 <translation id="3658159451045945436">மீட்டமைத்தால், பார்வையிட்ட தளங்களின் பட்டியல் உட்பட டேட்டா சேமிப்புகளின் வரலாறு அழிக்கப்படும்.</translation>
 <translation id="3662546969139119822">இங்கே வரலாறு எதுவுமில்லை</translation>
+<translation id="3663367437272849150"><ph name="NUM_SELECTED" /> தாவல்களை குழுவாக்கும்.</translation>
 <translation id="3672452749423051839">வழிநடத்தல் பிழை பரிந்துரைகள்</translation>
 <translation id="3692944402865947621">சேமிப்பிடம் இல்லாததால், <ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை.</translation>
 <translation id="3714981814255182093">கண்டறி பட்டியைத் திறக்கும்</translation>
@@ -630,6 +633,7 @@
 <translation id="557283862590186398">இந்தத் தளத்திற்காக மைக்ரோஃபோனை அணுக, Chromeமுக்கு அனுமதி தேவை.</translation>
 <translation id="55737423895878184">இருப்பிடமும் அறிவிப்புகளும் அனுமதிக்கப்படுகின்றன</translation>
 <translation id="5578795271662203820">இந்தப் படத்திற்கு <ph name="SEARCH_ENGINE" /> இல் தேடவும்</translation>
+<translation id="5580090775658607195"><ph name="TAB_COUNT" /> தாவல்கள் குழுவாக்கப்பட்டுள்ளன</translation>
 <translation id="5581519193887989363">எவற்றை ஒத்திசைக்க வேண்டும் என்பதை <ph name="BEGIN_LINK1" />அமைப்புகளில்<ph name="END_LINK1" /> எப்போது வேண்டுமானாலும் தேர்வுசெய்யலாம்.</translation>
 <translation id="5595485650161345191">முகவரியைத் திருத்து</translation>
 <translation id="5596627076506792578">கூடுதல் விருப்பங்கள்</translation>
@@ -708,6 +712,7 @@
 <translation id="6181444274883918285">தள விதிவிலக்கைச் சேர்</translation>
 <translation id="6192333916571137726">கோப்பைப் பதிவிறக்கவும்</translation>
 <translation id="6192792657125177640">விதிவிலக்குகள்</translation>
+<translation id="6193448654517602979">தாவல்களைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="6194112207524046168">உங்கள் கேமராவை அணுக Chromeமை அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> கேமராவை இயக்கவும்.</translation>
 <translation id="6196640612572343990">மூன்றாம் தரப்புக் குக்கீகளைத் தடு</translation>
 <translation id="6206551242102657620">பாதுகாப்பான இணைப்பு. தளத் தகவல்</translation>
@@ -849,6 +854,7 @@
 <translation id="7141896414559753902">தளங்கள் பாப்-அப்களையும் திசைதிருப்புதல்களையும் காட்டாமல் தடு (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> இலிருந்து <ph name="BEGIN_LINK" />அசல் பக்கத்தை ஏற்று<ph name="END_LINK" /></translation>
 <translation id="7149893636342594995">கடந்த 24 மணிநேரம்</translation>
+<translation id="7161892015146974550"><ph name="TAB_TITLE" /> தாவலைத் தேர்ந்தெடுக்கும்.</translation>
 <translation id="7176368934862295254"><ph name="KILOBYTES" /> கி.பை.</translation>
 <translation id="7177466738963138057">இதைப் பிறகு அமைப்புகளில் மாற்றலாம்</translation>
 <translation id="7180611975245234373">புதுப்பி</translation>
@@ -881,6 +887,7 @@
 <translation id="7403691278183511381">Chrome முதல் இயக்க அனுபவம்</translation>
 <translation id="741204030948306876">ஏற்கிறேன்</translation>
 <translation id="7413229368719586778">தொடக்கத் தேதி: <ph name="DATE" /></translation>
+<translation id="7418565925463285788">தாவல்களைக் குழுவாக்கு...</translation>
 <translation id="7423098979219808738">முதலில் கேள்</translation>
 <translation id="7423538860840206698">கிளிப்போர்டைப் படிப்பது தடுக்கப்பட்டுள்ளது</translation>
 <translation id="7431991332293347422">தேடல் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation>
@@ -1009,6 +1016,7 @@
 <translation id="8266862848225348053">பதிவிறக்க இருப்பிடம்</translation>
 <translation id="8274165955039650276">பதிவிறக்கங்களைக் காட்டு</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> உடன் ஒத்திசைக்கிறது</translation>
+<translation id="8284326494547611709">வசனங்கள்</translation>
 <translation id="8300705686683892304">ஆப்ஸ் நிர்வகிப்பவை</translation>
 <translation id="8310344678080805313">நிலையான தாவல்கள்</translation>
 <translation id="8313455859591948645">துவக்கப் பக்கத்தைத் திருத்தவும்</translation>
@@ -1017,6 +1025,7 @@
 <translation id="8339163506404995330"><ph name="LANGUAGE" /> மொழியில் உள்ள பக்கங்கள் மொழிபெயர்க்கப்படாது</translation>
 <translation id="8349013245300336738">பயன்படுத்திய தரவு அளவின்படி வரிசைப்படுத்தும்</translation>
 <translation id="8364299278605033898">பிரபல இணையதளங்களைப் பாருங்கள்</translation>
+<translation id="8364603787714420828"><ph name="TAB_TITLE" /> தாவலைத் தேர்வுநீக்கும்.</translation>
 <translation id="8372893542064058268">குறிப்பிட்ட தளத்திற்கு, பின்னணி ஒத்திசைவை அனுமதி.</translation>
 <translation id="8374821112118309944">நீங்கள் TalkBack ஐப் புதிய பதிப்பிற்குப் புதுப்பிக்க வேண்டும்.</translation>
 <translation id="8378714024927312812">உங்கள் நிறுவனத்தால் நிர்வகிக்கப்படுகிறது</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index ca5a211..141176e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">డెవలపర్ సాధనాలు</translation>
 <translation id="1692118695553449118">సమకాలీకరణ ఆన్‌లో ఉంది</translation>
 <translation id="169515064810179024">మోషన్ సెన్సార్‌లను యాక్సెస్ చేయనీయకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
+<translation id="1697480839793160072">టెలిఫోన్‌లు</translation>
+<translation id="1698058317516161971">ఇమెయిల్‌లు</translation>
 <translation id="1717218214683051432">మోషన్ సెన్సార్‌లు</translation>
 <translation id="1718835860248848330">చివరి గంట</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> అప్‌డేట్ అయింది</translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">డౌన్‌లోడ్‌ల ఫోల్డర్</translation>
 <translation id="8274165955039650276">డౌన్‌లోడ్‌లు చూడండి</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" />కు సమకాలీకరిస్తోంది</translation>
+<translation id="8284326494547611709">ఉపశీర్షికలు</translation>
 <translation id="8300705686683892304">యాప్ ద్వారా నిర్వహించబడుతున్నవి</translation>
 <translation id="8310344678080805313">ప్రామాణిక ట్యాబ్‌లు</translation>
 <translation id="8313455859591948645">ప్రారంభ పేజీని సవరించండి</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 0383ac3..e2887897 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation>
 <translation id="1692118695553449118">การซิงค์เปิดอยู่</translation>
 <translation id="169515064810179024">บล็อกไม่ให้เว็บไซต์เข้าถึงเซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation>
+<translation id="1697480839793160072">โทรศัพท์</translation>
+<translation id="1698058317516161971">อีเมล</translation>
 <translation id="1717218214683051432">เซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation>
 <translation id="1718835860248848330">ชั่วโมงที่แล้ว</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - อัปเดตเมื่อ <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">ตำแหน่งที่ดาวน์โหลด</translation>
 <translation id="8274165955039650276">ดูการดาวน์โหลด</translation>
 <translation id="8283853025636624853">กำลังซิงค์กับ <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">คำบรรยาย</translation>
 <translation id="8300705686683892304">จัดการโดยแอป</translation>
 <translation id="8310344678080805313">แท็บมาตรฐาน</translation>
 <translation id="8313455859591948645">แก้ไขหน้าเริ่มต้นใช้งาน</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index da32e97c..493a9d76 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Geliştirici Araçları</translation>
 <translation id="1692118695553449118">Senkronizasyon açık.</translation>
 <translation id="169515064810179024">Sitelerin hareket sensörlerine erişimini engelle</translation>
+<translation id="1697480839793160072">Telefonlar</translation>
+<translation id="1698058317516161971">E-postalar</translation>
 <translation id="1717218214683051432">Hareket sensörleri</translation>
 <translation id="1718835860248848330">Son saat</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - Son Güncellenme: <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">İndirme konumu</translation>
 <translation id="8274165955039650276">İndirilenleri göster</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> ile senkronize ediliyor</translation>
+<translation id="8284326494547611709">Altyazılar</translation>
 <translation id="8300705686683892304">Uygulama tarafından yönetiliyor</translation>
 <translation id="8310344678080805313">Standart sekmeler</translation>
 <translation id="8313455859591948645">Başlangıç sayfasını düzenle</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index 6df96ed..6730aca 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -1016,6 +1016,7 @@
 <translation id="8266862848225348053">Папка для завантажень</translation>
 <translation id="8274165955039650276">Переглянути завантаження</translation>
 <translation id="8283853025636624853">Синхронізація з обліковим записом <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Субтитри</translation>
 <translation id="8300705686683892304">Керуються додатком</translation>
 <translation id="8310344678080805313">Стандартні вкладки</translation>
 <translation id="8313455859591948645">Редагувати стартову сторінку</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index d68013f..3b56151 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">Công cụ dành cho nhà phát triển</translation>
 <translation id="1692118695553449118">Đồng bộ hóa đang bật</translation>
 <translation id="169515064810179024">Chặn không cho các trang web sử dụng cảm biến chuyển động</translation>
+<translation id="1697480839793160072">Điện thoại</translation>
+<translation id="1698058317516161971">Email</translation>
 <translation id="1717218214683051432">Cảm biến chuyển động</translation>
 <translation id="1718835860248848330">Giờ vừa qua</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - Đã cập nhật <ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">Vị trí tải xuống</translation>
 <translation id="8274165955039650276">Xem tệp đã tải xuống</translation>
 <translation id="8283853025636624853">Đang đồng bộ hóa với <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">Phụ đề</translation>
 <translation id="8300705686683892304">Do ứng dụng quản lý</translation>
 <translation id="8310344678080805313">Tab chuẩn</translation>
 <translation id="8313455859591948645">Chỉnh sửa trang khởi động</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 159630f5..72e3e619 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">开发者工具</translation>
 <translation id="1692118695553449118">同步功能已开启</translation>
 <translation id="169515064810179024">禁止网站使用动态传感器</translation>
+<translation id="1697480839793160072">电话</translation>
+<translation id="1698058317516161971">电子邮件</translation>
 <translation id="1717218214683051432">动态传感器</translation>
 <translation id="1718835860248848330">过去一小时</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - 更新时间:<ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">下载内容保存位置</translation>
 <translation id="8274165955039650276">查看下载内容</translation>
 <translation id="8283853025636624853">正在同步到 <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">字幕</translation>
 <translation id="8300705686683892304">由应用管理</translation>
 <translation id="8310344678080805313">标准标签页</translation>
 <translation id="8313455859591948645">修改启动页</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index f1d2eab..ff8708e4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -100,6 +100,8 @@
 <translation id="1679068421605151609">開發人員工具</translation>
 <translation id="1692118695553449118">同步功能已啟用</translation>
 <translation id="169515064810179024">禁止網站存取動作感應器</translation>
+<translation id="1697480839793160072">電話</translation>
+<translation id="1698058317516161971">電子郵件</translation>
 <translation id="1717218214683051432">動作感應器</translation>
 <translation id="1718835860248848330">過去 1 小時</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - 上次更新時間:<ph name="TIME_SINCE_UPDATE" /></translation>
@@ -1014,6 +1016,7 @@
 <translation id="8266862848225348053">下載位置</translation>
 <translation id="8274165955039650276">查看已下載的內容</translation>
 <translation id="8283853025636624853">同步的帳戶:<ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8284326494547611709">字幕</translation>
 <translation id="8300705686683892304">由應用程式管理</translation>
 <translation id="8310344678080805313">標準分頁</translation>
 <translation id="8313455859591948645">編輯起始網頁</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
index a6a460e..39ba99ea 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -78,7 +78,8 @@
                 () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest()
                         .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the canMakePayment events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.CAN_MAKE_PAYMENT_TRUE
@@ -244,7 +245,8 @@
                 () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest()
                         .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure no canMakePayment events were logged.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_METHOD_BASIC_CARD
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
index 4b19815..de2aaaf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
@@ -104,7 +104,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add new payer name, phone number and email address and provide that to the merchant. */
@@ -157,7 +158,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on [X] and then "add contact info" should not crash. */
@@ -184,7 +186,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Test that going into the editor and cancelling will leave the row checked. */
@@ -257,7 +260,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "cancel" and then "add contact info" should not crash. */
@@ -284,7 +288,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
index b97339e..980d5392 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
@@ -179,7 +179,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -240,7 +241,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing [X] and then "add address" should not crash. */
@@ -267,7 +269,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing "add address" and then "cancel" should not crash. */
@@ -298,7 +301,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "cancel" and then "add address" should not crash. */
@@ -325,6 +329,7 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
index 0e551a23..8da1ff10 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
@@ -84,7 +84,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL
@@ -115,6 +116,7 @@
                 R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
index 16ca916..cd72b71f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
@@ -103,7 +103,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add a new email address and phone number and provide that to the merchant. */
@@ -153,7 +154,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
index 38889c599..c0aabb6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
@@ -102,7 +102,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add a new email address and provide that to the merchant. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFieldTrialTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFieldTrialTest.java
index 4ef683b..c7c5250 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFieldTrialTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFieldTrialTest.java
@@ -59,7 +59,7 @@
     public void testAbortIfNoCard_Enabled_NoApp() throws InterruptedException, TimeoutException {
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"The payment method", "not supported"});
+                new String[] {"Payment method not supported"});
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
index 968e9c7..c22e1a8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
@@ -97,7 +97,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add a valid address and complete the transaction. */
@@ -182,7 +183,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on [X] and then "add address" should not crash. */
@@ -209,7 +211,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "add address" and then "cancel" should not crash. */
@@ -241,7 +244,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "cancel" and then "add address" should not crash. */
@@ -268,7 +272,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -283,7 +288,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
index b19b0811..4c60fc8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
@@ -82,7 +82,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Attempt to add invalid contact info alongside the already invalid info, and cancel. */
@@ -113,7 +114,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Update the contact information with valid data and provide that to the merchant. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
index ef67fa1..4c5b123 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
@@ -81,7 +81,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Attempt to add an invalid email alongside the already invalid data and cancel. */
@@ -112,7 +113,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Update the email with valid data and provide that to the merchant. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
index d23c75d1..0407185 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
@@ -81,7 +81,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Attempt to add an invalid phone alongside the already invalid data and cancel. */
@@ -112,7 +113,8 @@
 
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Update the phone with valid data and provide that to the merchant. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
index 24d30bb..200c980 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
@@ -77,6 +77,7 @@
                 ModalDialogProperties.ButtonType.NEGATIVE, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.button_secondary, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
index 4d4d26b..622c53c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
@@ -578,7 +578,8 @@
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -612,7 +613,8 @@
                 "ccBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -645,7 +647,8 @@
                 "ccBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -679,7 +682,8 @@
                 "ccBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
@@ -711,7 +715,8 @@
                 "ccBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
@@ -743,7 +748,8 @@
                 "cardsAndBobPayBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
@@ -774,7 +780,8 @@
                 "cardsAndBobPayBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -808,7 +815,8 @@
                 "cardsAndBobPayBuy", mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -843,7 +851,8 @@
         // The user cancels the Payment Request (trigger the logs).
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -876,7 +885,8 @@
         // The user cancels the Payment Request (trigger the logs).
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -912,7 +922,8 @@
         // The user cancels the Payment Request (trigger the logs).
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -944,7 +955,8 @@
         // The user cancels the Payment Request (trigger the logs).
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
@@ -1072,7 +1084,7 @@
         mPaymentRequestTestRule.openPageAndClickNodeAndWait(
                 "androidPayBuy", mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"The payment method", "not supported"});
+                new String[] {"Payment method not supported"});
 
         // Make sure that no journey metrics were logged.
         Assert.assertEquals(0,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
index 2cf5934..7cdcd237 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -118,7 +118,8 @@
                                    .findViewById(R.id.button_secondary)
                                    .performClick());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         mPaymentRequestTestRule.assertOnlySpecificAbortMetricLogged(AbortReason.ABORTED_BY_USER);
 
@@ -148,7 +149,8 @@
         // Press the [X] button.
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         mPaymentRequestTestRule.assertOnlySpecificAbortMetricLogged(AbortReason.ABORTED_BY_USER);
 
@@ -182,7 +184,8 @@
                                    .getDialogForTest()
                                    .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         mPaymentRequestTestRule.assertOnlySpecificAbortMetricLogged(AbortReason.ABORTED_BY_USER);
 
@@ -272,7 +275,7 @@
         mPaymentRequestTestRule.openPageAndClickNodeAndWait(
                 "androidPayBuy", mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"The payment method", "not supported"});
+                new String[] {"Payment method not supported"});
 
         // Make sure that it is not logged as an abort.
         mPaymentRequestTestRule.assertOnlySpecificAbortMetricLogged(-1 /* none */);
@@ -305,7 +308,7 @@
         mPaymentRequestTestRule.openPageAndClickNodeAndWait(
                 "noSupported", mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"The payment method", "not supported"});
+                new String[] {"Payment method not supported"});
 
         // Make sure that it is not logged as an abort.
         mPaymentRequestTestRule.assertOnlySpecificAbortMetricLogged(-1 /* none */);
@@ -424,7 +427,8 @@
         // Close the payment Request.
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
@@ -460,7 +464,8 @@
         // Close the payment Request.
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
index af749e2..196cc58 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
@@ -36,6 +36,6 @@
     public void testNoCrash() throws InterruptedException, TimeoutException {
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"The payment method", "not supported"});
+                new String[] {"Payment method not supported"});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
index d81c8cb6..f368f6c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
@@ -84,7 +84,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
index a119282..32f41a1f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
@@ -107,7 +107,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add a new payer name and provide that to the merchant. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
index d4ad91a..729c6c6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -68,7 +68,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Click [EDIT] to expand the dialog, then click [X] to cancel payment. */
@@ -81,7 +82,8 @@
                 R.id.button_secondary, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Click [EDIT] to expand the dialog, then click [CANCEL] to cancel payment. */
@@ -94,7 +96,8 @@
                 R.id.button_secondary, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.button_secondary, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Click [PAY] and dismiss the card unmask dialog. */
@@ -147,7 +150,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Attempt to add a credit card with an empty name on card and cancel payment. */
@@ -163,7 +167,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Save a new card on disk and pay. */
@@ -290,7 +295,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on [X] and then "add card" should not crash. */
@@ -317,7 +323,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "add card" and then "cancel" should not crash. */
@@ -348,7 +355,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Quickly pressing on "cancel" and then "add card" should not crash. */
@@ -375,7 +383,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -400,7 +409,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -425,7 +435,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -450,7 +461,8 @@
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /**
@@ -466,7 +478,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
index df5991a..372e9c8ec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
@@ -50,7 +50,7 @@
     public void testNoSupportedPaymentMethods() throws InterruptedException, TimeoutException {
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     /**
@@ -64,7 +64,7 @@
         mPaymentRequestTestRule.installPaymentApp(NO_INSTRUMENTS, IMMEDIATE_RESPONSE);
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     /**
@@ -78,7 +78,7 @@
         mPaymentRequestTestRule.installPaymentApp(NO_INSTRUMENTS, DELAYED_RESPONSE);
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     /**
@@ -101,7 +101,7 @@
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
         TestThreadUtils.runOnUiThreadBlocking(() -> app.respond());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "Request cancelled"});
+                new String[] {"show() rejected", "User closed the Payment Request UI."});
     }
 
     /**
@@ -122,7 +122,7 @@
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         TestThreadUtils.runOnUiThreadBlocking(() -> app.respond());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
index e09d0e3..7b7f369 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
@@ -102,7 +102,8 @@
                 R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 
     /** Add a new phone number and provide that to the merchant. */
@@ -151,7 +152,8 @@
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
index 7e6a923..ce408c9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
@@ -66,6 +66,7 @@
                 ModalDialogProperties.ButtonType.NEGATIVE, mPaymentRequestTestRule.getReadyToPay());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
+        mPaymentRequestTestRule.expectResultContains(
+                new String[] {"User closed the Payment Request UI."});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
index 4318ccb..34f39a5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -87,7 +87,7 @@
 
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     @Test
@@ -349,7 +349,7 @@
 
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
         mPaymentRequestTestRule.expectResultContains(
-                new String[] {"show() rejected", "The payment method", "not supported"});
+                new String[] {"show() rejected", "Payment method not supported"});
     }
 
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
index 70dff38..90c089c4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
@@ -43,6 +43,6 @@
     public void testReject() throws InterruptedException, TimeoutException {
         mRule.openPageAndClickNodeAndWait("buy", mRule.getDismissed());
         mRule.expectResultContains(
-                new String[] {"NotSupportedError: The payment method \"foo\" is not supported"});
+                new String[] {"NotSupportedError: Payment method not supported"});
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
index 65295c7b..ab60d66 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
@@ -9,10 +9,10 @@
 import static org.junit.Assert.assertThat;
 
 import android.content.Context;
-import android.preference.CheckBoxPreference;
-import android.preference.PreferenceScreen;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
+import android.support.v7.preference.CheckBoxPreference;
+import android.support.v7.preference.PreferenceScreen;
 
 import org.junit.After;
 import org.junit.Before;
@@ -111,7 +111,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
@@ -142,7 +142,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
@@ -173,7 +173,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
index a8bebd26..16be2ea 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
@@ -12,13 +12,13 @@
 
 import android.content.Intent;
 import android.os.Build;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.v4.util.ArraySet;
 import android.support.v7.app.AlertDialog;
+import android.support.v7.preference.CheckBoxPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 import android.widget.Button;
 import android.widget.ListView;
 
@@ -126,7 +126,7 @@
                 ClearBrowsingDataPreferencesAdvanced.class.getName());
         ClearBrowsingDataFetcher fetcher = new ClearBrowsingDataFetcher();
         ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragment();
+                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
         fragment.setClearBrowsingDataFetcher(fetcher);
         TestThreadUtils.runOnUiThreadBlocking(fetcher::fetchImportantSites);
         return preferences;
@@ -147,7 +147,7 @@
         setDataTypesToClear(
                 new ArraySet<>(Arrays.asList(DialogOption.CLEAR_COOKIES_AND_SITE_DATA)));
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
@@ -173,7 +173,7 @@
 
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
@@ -198,7 +198,7 @@
         setDataTypesToClear(ClearBrowsingDataPreferences.getAllOptions());
 
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             PreferenceScreen screen = preferences.getPreferenceScreen();
@@ -236,11 +236,11 @@
         @Override
         public void run() {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) mPreferences.getMainFragment();
+                    (ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             // Enable the dialog and click the "Clear" button.
-            ((ClearBrowsingDataPreferences) mPreferences.getMainFragment())
+            ((ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat())
                     .getClearBrowsingDataFetcher()
                     .enableDialogAboutOtherFormsOfBrowsingHistory();
             clickClearButton(fragment);
@@ -266,7 +266,7 @@
         @Override
         public boolean isSatisfied() {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) mPreferences.getMainFragment();
+                    (ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat();
             return fragment == null || !fragment.isVisible();
         }
     }
@@ -306,7 +306,7 @@
             @Override
             public boolean isSatisfied() {
                 ClearBrowsingDataPreferences fragment =
-                        (ClearBrowsingDataPreferences) preferences2.getMainFragment();
+                        (ClearBrowsingDataPreferences) preferences2.getMainFragmentCompat();
                 OtherFormsOfHistoryDialogFragment dialog =
                         fragment.getDialogAboutOtherFormsOfBrowsingHistory();
                 return dialog != null && dialog.getActivity() != null;
@@ -316,7 +316,7 @@
         // Close that dialog.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) preferences2.getMainFragment();
+                    (ClearBrowsingDataPreferences) preferences2.getMainFragmentCompat();
             fragment.getDialogAboutOtherFormsOfBrowsingHistory().onClick(
                     null, AlertDialog.BUTTON_POSITIVE);
         });
@@ -423,7 +423,7 @@
                 "true", mActivityTestRule.runJavaScriptCodeInCurrentTab("hasAllStorage()"));
 
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
 
         // Clear in root preference.
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(preferences));
@@ -470,7 +470,7 @@
 
         Preferences preferences = startPreferences();
         ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragment();
+                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment));
         // Check that the important sites dialog is shown, and the list is visible.
         waitForImportantDialogToShow(fragment, 2);
@@ -513,7 +513,7 @@
 
         final Preferences preferences = startPreferences();
         final ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragment();
+                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
 
         // Uncheck the first item (our internal web server).
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment));
@@ -565,7 +565,7 @@
         // Clear history.
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
 
@@ -608,7 +608,7 @@
         // Delete history.
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml
index 31c50061..55bab38 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml
@@ -8,8 +8,6 @@
       xmlns:android="http://schemas.android.com/apk/res/android"
       package="org.chromium.chrome.test.smoke">
 
-    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
-
     <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
diff --git a/chrome/android/touchless/java/res/layout/dino_splash_view.xml b/chrome/android/touchless/java/res/layout/dino_splash_view.xml
index 30981d5a0..54a2a95 100644
--- a/chrome/android/touchless/java/res/layout/dino_splash_view.xml
+++ b/chrome/android/touchless/java/res/layout/dino_splash_view.xml
@@ -3,35 +3,18 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                xmlns:tools="http://schemas.android.com/tools"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="@android:color/white"
-                tools:ignore="contentDescription,UselessParent">
-
-    <LinearLayout android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:layout_centerInParent="true"
-                  android:orientation="vertical">
-
-        <ImageView android:id="@+id/dino_animation_image"
-                   android:layout_width="wrap_content"
-                   android:layout_height="wrap_content"
-                   android:layout_gravity="center_horizontal"
-                   android:src="@drawable/dino_splash_animation"/>
+                android:background="@android:color/white">
 
         <TextView style="@style/TextAppearance.BlackTitle1"
+                  android:id="@+id/dino_splash_text_image"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
+                  android:layout_centerInParent="true"
+                  android:drawablePadding="35dp"
+                  android:gravity="center"
+                  android:drawableTop="@drawable/dino_splash_animation"
                   android:layout_gravity="center_horizontal"
-                  android:layout_marginTop="35dp"
                   android:text="@string/dino_game_title"/>
-
-        <TextView style="@style/TextAppearance.DinoSubtitle"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:layout_gravity="center_horizontal"
-                  android:layout_marginTop="4dp"
-                  android:text="@string/twa_running_in_chrome"/>
-    </LinearLayout>
 </RelativeLayout>
\ No newline at end of file
diff --git a/chrome/android/touchless/java/res/values-v17/styles.xml b/chrome/android/touchless/java/res/values-v17/styles.xml
index 0a7a125..eac946a 100644
--- a/chrome/android/touchless/java/res/values-v17/styles.xml
+++ b/chrome/android/touchless/java/res/values-v17/styles.xml
@@ -24,11 +24,6 @@
         <item name="android:textColor">@android:color/white</item>
     </style>
 
-    <style name="TextAppearance.DinoSubtitle">
-        <item name="android:textSize">14sp</item>
-        <item name="android:textColor">@color/default_text_color_secondary</item>
-    </style>
-
     <style name="PreferenceActionBarModern.Touchless">
         <item name="titleTextStyle">@style/TextAppearance.BlackTitle1</item>
     </style>
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/DinoActivity.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/DinoActivity.java
index ea1b91c3..7d437b60 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/DinoActivity.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/DinoActivity.java
@@ -11,7 +11,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
+import android.widget.TextView;
 
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.SingleTabActivity;
@@ -39,8 +39,9 @@
         mSplashView = LayoutInflater.from(this).inflate(R.layout.dino_splash_view, null);
         mSplashView.addOnLayoutChangeListener(
                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
-                    ImageView dinoImage = v.findViewById(R.id.dino_animation_image);
-                    AnimationDrawable dinoAnimation = (AnimationDrawable) dinoImage.getDrawable();
+                    TextView dinoImage = v.findViewById(R.id.dino_splash_text_image);
+                    AnimationDrawable dinoAnimation =
+                            (AnimationDrawable) dinoImage.getCompoundDrawables()[1];
                     dinoAnimation.start();
                 });
         ViewGroup coordinatorLayout = (ViewGroup) findViewById(R.id.coordinator);
diff --git a/chrome/android/touchless/java/strings/touchless_strings.grd b/chrome/android/touchless/java/strings/touchless_strings.grd
index 8971a9c..5636a9a 100644
--- a/chrome/android/touchless/java/strings/touchless_strings.grd
+++ b/chrome/android/touchless/java/strings/touchless_strings.grd
@@ -130,7 +130,7 @@
         Add to My apps
       </message>
       <message name="IDS_DINO_GAME_TITLE" desc="Title for the offline dino game that will appear as an icon in the launcher" translateable="false">
-        Chrome Game
+        Chrome Fun
       </message>
     </messages>
   </release>
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni
index 246abb6..f6e2a4a 100644
--- a/chrome/android/trichrome.gni
+++ b/chrome/android/trichrome.gni
@@ -65,7 +65,10 @@
     uncompress_dex = use_uncompressed_dex
     version_name = chrome_version_name
     version_code = trichrome_version_code
-    min_sdk_version = 28
+
+    # TODO(torne): make minsdk=Q once we no longer build hacky P version
+    min_sdk_version = android_sdk_version
+    target_sdk_version = android_sdk_version
     if (!enable_trichrome_synchronized_proguard) {
       generate_buildconfig_java = false
     } else {
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index 2322927..8e6d144 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -75,6 +75,7 @@
       "//chrome/android/webapk/libs/common:common_java",
       "//chrome/android/webapk/libs/common:splash_java",
     ]
+    min_sdk_version = 16
   }
 }
 
@@ -91,6 +92,7 @@
       "src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java",
     ]
     deps += [ ":compiled_in_runtime_library_java" ]
+    min_sdk_version = 16
   }
 }
 
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index 267a542..6617f33 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -23,7 +23,7 @@
 <translation id="1779356040007214683">For at gøre Chromium sikrere har vi slået nogle udvidelser fra, som ikke er anført i <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> og muligvis er blevet tilføjet, uden at du vidste det.</translation>
 <translation id="1808667845054772817">Geninstaller Chromium</translation>
 <translation id="1869480248812203386">Du kan hjælpe med at gøre Chromium sikrere og nemmere at bruge ved automatisk at rapportere oplysninger om mulige sikkerhedshændelser til Google.</translation>
-<translation id="1881322772814446296">Du er ved at logge ind med en administreret konto og give dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. Du kan eventuelt oprette en ny profil for at holde dine Chromium-data adskilt. <ph name="LEARN_MORE" /></translation>
+<translation id="1881322772814446296">Du er ved at logge ind med en mangerstyret konto og give dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. Du kan eventuelt oprette en ny profil for at holde dine Chromium-data adskilt. <ph name="LEARN_MORE" /></translation>
 <translation id="1911763535808217981">Når du deaktiverer denne indstilling, kan du logge ind på Google-websites som f.eks. Gmail uden at logge ind i Chromium</translation>
 <translation id="1929939181775079593">Chromium svarer ikke. Vil du genstarte nu?</translation>
 <translation id="1966382378801805537">Chromium kan ikke fastlægge eller angive standardbrowseren</translation>
@@ -116,7 +116,7 @@
 <translation id="5045248521775609809">Tag Chromium med overalt</translation>
 <translation id="5181952534059945058">Denne side anvender for meget hukommelse, så Chromium har fjernet noget indhold.</translation>
 <translation id="5277894862589591112">Åbn Chromium igen for at anvende ændringerne</translation>
-<translation id="5358375970380395591">Du er ved at logge ind med en administreret konto og giver dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. <ph name="LEARN_MORE" /></translation>
+<translation id="5358375970380395591">Du er ved at logge ind med en mangerstyret konto og giver dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. <ph name="LEARN_MORE" /></translation>
 <translation id="5386450000063123300">Opdaterer Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="538767207339317086">Tillad login via Chromium</translation>
 <translation id="5398878173008909840">Der er en ny version af Chromium til rådighed.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 0e9cb1ba..e4e8cc2 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1620,7 +1620,6 @@
 <translation id="3454157711543303649">ማግበር ተጠናቋል</translation>
 <translation id="3454213325559396544">ይህ ለዚህ <ph name="DEVICE_TYPE" /> የመጨረሻው ራስሰር ሶፍትዌር እና የደህንነት ዝማኔ ነው። የወደፊት ዝማኔዎችን ለማግኘት፣ ወደ በጣም አዲሱ ሞዴል ደረጃ ያሻሽሉ።</translation>
 <translation id="345693547134384690">&amp;ምስል በአዲስ ትር ውስጥ ክፈት</translation>
-<translation id="3457500881955698515">የእርስዎ ኩባንያ ወይም ድርጅት በዚህ መሣሪያ ላይ ወዲያውኑ ዝማኔ ያስፈልገዋል</translation>
 <translation id="3459509316159669723">ማተም</translation>
 <translation id="3459697287128633276">የእርስዎ መለያ የGoogle Play መደብርን እንዲደርስ ለማንቃት እባክዎ በእርስዎ የማንነት አቅራቢ በኩል ያረጋግጡ።</translation>
 <translation id="3459774175445953971">ለመጨረሻ ጊዜ የተሻሻለው፦</translation>
@@ -2235,7 +2234,6 @@
 <translation id="4364327530094270451">ሐብሐብ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> አንድ መስኮት እያጋራ ነው።</translation>
 <translation id="4364830672918311045">ማሳወቂያዎችን አሳይ</translation>
-<translation id="4365673000813822030">ውይ፣ ማመሳሰል መስራት አቁሟል።</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> ከ<ph name="APP_NAME" /> ጋር።</translation>
 <translation id="4370975561335139969">ያስገቧቸው ኢሜይል እና የይለፍ ቃል አይዛመዱም።</translation>
 <translation id="437184764829821926">የላቁ የቅርጸ-ቁምፊ ቅንብሮች</translation>
@@ -2517,7 +2515,6 @@
 <translation id="4830502475412647084">የስርዓተ ክወና ዝማኔን በመጫን ላይ</translation>
 <translation id="4830573902900904548">የእርስዎ <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" />ን ተጠቅሞ ከበይነመረብ ጋር መገናኘት አልቻልም። እባክዎ ሌላ አውታረ መረብ ይምረጡ። <ph name="LEARN_MORE_LINK_START" />ተጨማሪ ለመረዳት<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome የተጠየቀው ግብዓት መዳረሻ የለውም።</translation>
-<translation id="4835836146030131423">በመግባት ጊዜ ስህተት።</translation>
 <translation id="4837926214103741331">ይህን መሣሪያ ለመጠቀም ስልጣን አልተሰጠዎትም። የመግባት ፍቃድ ለማግኘት የመሣሪያውን ባለቤት ያነጋግሩ።</translation>
 <translation id="4837952862063191349">የእርስዎን የአካባቢ ውሂብ ለማስከፈት እና እንደነበረ ለመመለስ፣ የእርስዎን አሮጌ የ<ph name="DEVICE_TYPE" /> የይለፍ ቃል እባክዎ ያስገቡ።</translation>
 <translation id="4838836835474292213">የቅንጥብ ሰሌዳ ንባብ መዳረሻ ተፈቅዷል</translation>
@@ -2652,7 +2649,6 @@
 <translation id="5029568752722684782">ቅጂን አጽዳ</translation>
 <translation id="5030338702439866405">የቀረበው</translation>
 <translation id="5033266061063942743">ጆሜትሪያዊ ቅርጾች</translation>
-<translation id="5033619151015094114">የእርስዎ ኩባንያ ወይም ድርጅት በዚህ መሣሪያ ላይ ዝማኔ ያስፈልገዋል</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን መጠቀም ይፈልጋል</translation>
 <translation id="5036662165765606524">ማንኛውንም ጣቢያ በርካታ ፋይሎችን በራስ ሰር እንዲያወርድ አትፍቀድ</translation>
 <translation id="5037676449506322593">ሁሉንም ምረጥ</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">የይዘት ቅንብሮች</translation>
 <translation id="8872155268274985541">የማይሰራ የKiosk ውጫዊ ዝማኔ አንጸባራቂ ፋይል ተገኝቷል። የKiosk መተግበሪያን ማዘመን አልተሳካም። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation>
 <translation id="8874184842967597500">አልተገናኘም</translation>
-<translation id="887550310442005096">የእርስዎ ኩባንያ ወይም ድርጅት ወይም ይህን መሣሪያ እንዲያዘምኑት ጠይቀዎታል</translation>
 <translation id="8876307312329369159">ይህ ቅንብር በማሳያ ክፍለ-ጊዜ ላይ ሊቀየር አይችልም።</translation>
 <translation id="8877448029301136595">[ወላጅ ማውጫ]</translation>
 <translation id="8879284080359814990">&amp;በትር አሳይ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index b898b34c..b4b1f2d 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1619,7 +1619,6 @@
 <translation id="3454157711543303649">اكتمل التفعيل</translation>
 <translation id="3454213325559396544">هذا هو آخر تحديث تلقائي للبرنامج والأمان للجهاز <ph name="DEVICE_TYPE" />. وللحصول على التحديثات المستقبلية، يمكنك الترقية إلى طراز أحدث.</translation>
 <translation id="345693547134384690">فتح &amp;الصورة في علامة تبويب جديدة</translation>
-<translation id="3457500881955698515">تتطلب شركتك أو مؤسستك تحديث هذا الجهاز في الحال.</translation>
 <translation id="3459509316159669723">الطباعة</translation>
 <translation id="3459697287128633276">‏لتمكين حسابك من الوصول إلى متجر Google Play، يُرجى المصادقة مع موفّر الهوية.</translation>
 <translation id="3459774175445953971">آخر تعديل:</translation>
@@ -2233,7 +2232,6 @@
 <translation id="4364327530094270451">شمام</translation>
 <translation id="4364567974334641491">يشارك <ph name="APP_NAME" /> نافذة.</translation>
 <translation id="4364830672918311045">عرض الإشعارات</translation>
-<translation id="4365673000813822030">عذرًا، توقفت المزامنة.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> مع <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">البريد الإلكتروني وكلمة المرور اللذان أدخلتهما غير متطابقين</translation>
 <translation id="437184764829821926">الإعدادات المتقدمة للخط</translation>
@@ -2515,7 +2513,6 @@
 <translation id="4830502475412647084">جارٍ تثبيت تحديث لنظام التشغيل</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> غير قادر على الاتصال بالإنترنت باستخدام <ph name="NETWORK_NAME" />. يُرجى اختيار شبكة أخرى. <ph name="LEARN_MORE_LINK_START" />مزيد من المعلومات<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">‏لا تتوفر لمتصفح Chrome إمكانية الوصول إلى المورد المطلوب.</translation>
-<translation id="4835836146030131423">حدث خطأ أثناء تسجيل الدخول.</translation>
 <translation id="4837926214103741331">لا يصرح لك باستخدام هذا الجهاز. يُرجى الاتصال بمالك الجهاز، للحصول على إذن تسجيل الدخول.</translation>
 <translation id="4837952862063191349">لإلغاء قفل بياناتك المحلية واستعادتها، يُرجى إدخال كلمة مرور <ph name="DEVICE_TYPE" /> القديمة.</translation>
 <translation id="4838836835474292213">تم السماح بالوصول لقراءة الحافظة</translation>
@@ -2650,7 +2647,6 @@
 <translation id="5029568752722684782">محو النسخة</translation>
 <translation id="5030338702439866405">جهة الإصدار</translation>
 <translation id="5033266061063942743">الأشكال الهندسية</translation>
-<translation id="5033619151015094114">تتطلب شركتك أو مؤسستك تحديث هذا الجهاز.</translation>
 <translation id="503498442187459473">يريد <ph name="HOST" /> استخدام الكاميرا والميكروفون.</translation>
 <translation id="5036662165765606524">عدم السماح لأي موقع بتنزيل عدة ملفات تلقائيًا</translation>
 <translation id="5037676449506322593">تحديد الكل</translation>
@@ -5197,7 +5193,6 @@
 <translation id="8871974300055371298">إعدادات المحتوى</translation>
 <translation id="8872155268274985541">‏يوجد ملف غير صالح لبيان التحديث الخارجي لتطبيق Kiosk. اخفق تحديث تطبيق Kiosk. يُرجى إزالة جهاز USB.</translation>
 <translation id="8874184842967597500">غير متصل</translation>
-<translation id="887550310442005096">تطلب منك شركتك أو مؤسستك تحديث هذا الجهاز.</translation>
 <translation id="8876307312329369159">لا يمكن تغيير هذا الإعداد في جلسة تجريبية.</translation>
 <translation id="8877448029301136595">[الدليل الأصل]</translation>
 <translation id="8879284080359814990">إ&amp;ظهار كعلامة تبويب</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index b3590fd14..3e1b495 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1618,7 +1618,6 @@
 <translation id="3454157711543303649">Активирането завърши</translation>
 <translation id="3454213325559396544">Това е последната автоматична актуализация на софтуера и сигурността за устройството <ph name="DEVICE_TYPE" />. За да получавате бъдещи актуализации, надстройте до по-нов модел.</translation>
 <translation id="345693547134384690">Отваряне на &amp;изображението в нов раздел</translation>
-<translation id="3457500881955698515">Фирмата или организацията ви изискват това устройство да бъде актуализирано веднага</translation>
 <translation id="3459509316159669723">Отпечатване</translation>
 <translation id="3459697287128633276">За да имате достъп до Google Play Магазин с профила си, моля, въведете идентификационните данни за използвания от вас доставчик на удостоверителни услуги.</translation>
 <translation id="3459774175445953971">Последна промяна:</translation>
@@ -2237,7 +2236,6 @@
 <translation id="4364327530094270451">Пъпеш</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation>
 <translation id="4364830672918311045">Показване на известия</translation>
-<translation id="4365673000813822030">Ами сега! Синхронизирането спря да работи.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> чрез <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Въведените имейл адрес и парола не съвпадат</translation>
 <translation id="437184764829821926">Разширени настройки за шрифтовете</translation>
@@ -2519,7 +2517,6 @@
 <translation id="4830502475412647084">Актуализацията на операционната система се инсталира</translation>
 <translation id="4830573902900904548">Устройството ви <ph name="DEVICE_TYPE" /> не може да се свърже с интернет през „<ph name="NETWORK_NAME" />“. Моля, изберете друга мрежа. <ph name="LEARN_MORE_LINK_START" />Научете повече<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome няма достъп до заявения ресурс.</translation>
-<translation id="4835836146030131423">Грешка при влизането.</translation>
 <translation id="4837926214103741331">Не сте упълномощени да използвате това устройство. За разрешение за вход се свържете със собственика му.</translation>
 <translation id="4837952862063191349">За отключване и възстановяване на локалните си данни, моля, въведете старата си парола за <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Разрешен е достъп за четене на съдържанието на буферната памет</translation>
@@ -2654,7 +2651,6 @@
 <translation id="5029568752722684782">Изчистване на копието</translation>
 <translation id="5030338702439866405">Издаден от</translation>
 <translation id="5033266061063942743">Геометрични фигури</translation>
-<translation id="5033619151015094114">Фирмата или организацията ви изискват това устройство да бъде актуализирано</translation>
 <translation id="503498442187459473"><ph name="HOST" /> иска да използва камерата и микрофона ви</translation>
 <translation id="5036662165765606524">Да не се разрешава на сайтовете да изтеглят автоматично няколко файла</translation>
 <translation id="5037676449506322593">Избиране на всички</translation>
@@ -5201,7 +5197,6 @@
 <translation id="8871974300055371298">Настройки за съдържанието</translation>
 <translation id="8872155268274985541">Намерен е невалиден файл на манифест за външно актуализиране на павилионното приложение. Актуализирането не бе успешно. Моля, извадете USB паметта.</translation>
 <translation id="8874184842967597500">Няма връзка</translation>
-<translation id="887550310442005096">Фирмата или организацията ви искат да актуализирате това устройство</translation>
 <translation id="8876307312329369159">Тази настройка не може да бъде променена по време на демонстрационна сесия.</translation>
 <translation id="8877448029301136595">[главна директория]</translation>
 <translation id="8879284080359814990">&amp;Показване като раздел</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 04e5347..bed6645 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1617,7 +1617,6 @@
 <translation id="3454157711543303649">সক্রিয়করণ সমাপ্ত</translation>
 <translation id="3454213325559396544">এই <ph name="DEVICE_TYPE" />-এর জন্য এটি হল সফ্টওয়্যার এবং নিরাপত্তা সংক্রান্ত শেষ অটোমেটিক আপডেট। ভবিষ্যতে আপডেট পেতে আরও কোনও একটি নতুন মডেলে আপগ্রেড করুন।</translation>
 <translation id="345693547134384690">&amp;ছবি নতুন ট্যাবে খুলুন</translation>
-<translation id="3457500881955698515">আপনার কোম্পানি বা সংস্থার প্রয়োজন অনুযায়ী আপনাকে এখনই এই ডিভাইস আপডেট করতে হবে</translation>
 <translation id="3459509316159669723">প্রিন্ট হচ্ছে</translation>
 <translation id="3459697287128633276">আপনার অ্যাকাউন্ট থেকে Google Play স্টোর অ্যাক্সেস করার জন্য অনুগ্রহ করে পরিচয় প্রদানকারীর মাধ্যমে প্রমাণীকরণ দিন।</translation>
 <translation id="3459774175445953971">সর্বশেষ সংশোধিত:</translation>
@@ -2233,7 +2232,6 @@
 <translation id="4364327530094270451">ফুটি</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> একটি উইন্ডো শেয়ার করছে।</translation>
 <translation id="4364830672918311045">বিজ্ঞপ্তিগুলি প্রদর্শন করুন</translation>
-<translation id="4365673000813822030">উপস, সিঙ্ক কাজ করা বন্ধ করে দিয়েছে৷</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" />-এর মাধ্যমে <ph name="ACTION_NAME" />।</translation>
 <translation id="4370975561335139969">আপনার লেখা ইমেল আইডি এবং পাসওয়ার্ড মিলছে না</translation>
 <translation id="437184764829821926">উন্নত ফন্ট সেটিংস</translation>
@@ -2515,7 +2513,6 @@
 <translation id="4830502475412647084">OS আপডেট ইনস্টল করা হচ্ছে</translation>
 <translation id="4830573902900904548">আপনার <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" /> ব্যবহার করে ইন্টারনেটে সংযুক্ত হতে অক্ষম। দয়া করে অন্য নেটওয়ার্ক বেছে নিন। <ph name="LEARN_MORE_LINK_START" />আরও জানুন<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">অনুরোধকৃত সম্পদে Chrome এর অ্যাক্সেস নেই।</translation>
-<translation id="4835836146030131423">প্রবেশ করার সময় ত্রুটি৷</translation>
 <translation id="4837926214103741331">আপনার কাছে এই ডিভাইস ব্যবহারের অনুমতি নেই৷ অনুগ্রহ করে সাইন-ইন করার অনুমতির জন্য ডিভাইসের মালিকের সঙ্গে যোগাযোগ করুন৷</translation>
 <translation id="4837952862063191349">আপনার স্থানীয় ডেটা আনলক এবং পুনরুদ্ধার করতে, অনুগ্রহ করে আপনার পুরানো <ph name="DEVICE_TYPE" /> পাসওয়ার্ড লিখুন৷</translation>
 <translation id="4838836835474292213">ক্লিপবোর্ড পড়ার অ্যাক্সেস দেওয়া হয়েছে</translation>
@@ -2650,7 +2647,6 @@
 <translation id="5029568752722684782">কপি সাফ করুন</translation>
 <translation id="5030338702439866405">দ্বারা ইস্যু করা</translation>
 <translation id="5033266061063942743">জ্যামিতিক আকৃতি</translation>
-<translation id="5033619151015094114">আপনার কোম্পানি বা সংস্থার প্রয়োজন অনুযায়ী আপনাকে এই ডিভাইস আপডেট করতে হবে</translation>
 <translation id="503498442187459473"><ph name="HOST" /> আপনার ক্যামেরা ও মাইক্রোফোন ব্যবহার করতে চায়</translation>
 <translation id="5036662165765606524">কোনো সাইটকে অটোমেটিক একাধিক ফাইল ডাউনলোড করার জন্য মঞ্জুরি দেবেন না</translation>
 <translation id="5037676449506322593">সকল বেছে নিন</translation>
@@ -5197,7 +5193,6 @@
 <translation id="8871974300055371298">কন্টেন্ট সেটিংস</translation>
 <translation id="8872155268274985541">ভুল এক্সটার্নাল কিয়স্ক আপডেট ম্যানিফেস্ট ফাইল পাওয়া গেছে৷ কিয়স্ক অ্যাপ আপডেট করা যায়নি৷ অনুগ্রহ করে USB স্টিক সরিয়ে দিন৷</translation>
 <translation id="8874184842967597500">সংযুক্ত নয়</translation>
-<translation id="887550310442005096">আপনার কোম্পানি বা সংস্থা চাইছে যে আপনি এই ডিভাইস আপডেট করুন</translation>
 <translation id="8876307312329369159">ডেমো সেশনে এই সেটিংটি পরিবর্তন করা যাবে না।</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">ট্যাব রূপে &amp;দেখান</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index fb6abc8..3cdaa61 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1616,7 +1616,6 @@
 <translation id="3454157711543303649">S'ha completat l'activació</translation>
 <translation id="3454213325559396544">Aquesta actualització de programari i seguretat és l'última que rebràs per a aquest dispositiu de tipus <ph name="DEVICE_TYPE" />. Per obtenir actualitzacions en el futur, canvia el dispositiu per un model més nou.</translation>
 <translation id="345693547134384690">Obre la &amp;imatge en una pestanya nova</translation>
-<translation id="3457500881955698515">La teva empresa o organització requereix que s'actualitzi immediatament aquest dispositiu</translation>
 <translation id="3459509316159669723">Imprimeix</translation>
 <translation id="3459697287128633276">Per poder accedir a Google Play Store amb el teu compte, autentica't amb el teu proveïdor d'identitat.</translation>
 <translation id="3459774175445953971">Darrera modificació:</translation>
@@ -2233,7 +2232,6 @@
 <translation id="4364327530094270451">Meló</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> està compartint una finestra.</translation>
 <translation id="4364830672918311045">Mostra les notificacions</translation>
-<translation id="4365673000813822030">La sincronització ha deixat de funcionar.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> amb <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">El correu electrònic i la contrasenya indicats no coincideixen</translation>
 <translation id="437184764829821926">Configuració avançada de tipus de lletra</translation>
@@ -2515,7 +2513,6 @@
 <translation id="4830502475412647084">S'està instal·lant l'actualització del sistema operatiu</translation>
 <translation id="4830573902900904548">El vostre dispositiu <ph name="DEVICE_TYPE" /> no es pot connectar a Internet mitjançant <ph name="NETWORK_NAME" />. Trieu una altra xarxa. <ph name="LEARN_MORE_LINK_START" />Més informació<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome no té accés al recurs sol·licitat.</translation>
-<translation id="4835836146030131423">S'ha produït un error en iniciar la sessió.</translation>
 <translation id="4837926214103741331">No teniu autorització per fer servir aquest dispositiu. Contacteu amb el propietari del dispositiu per obtenir el permís d'inici de sessió.</translation>
 <translation id="4837952862063191349">Per desbloquejar i restaurar les dades locals, introduïu la contrasenya antiga de: <ph name="DEVICE_TYPE" /></translation>
 <translation id="4838836835474292213">S'ha permès l'accés de lectura al porta-retalls</translation>
@@ -2650,7 +2647,6 @@
 <translation id="5029568752722684782">Esborra la còpia</translation>
 <translation id="5030338702439866405">Emès per</translation>
 <translation id="5033266061063942743">Formes geomètriques</translation>
-<translation id="5033619151015094114">La teva empresa o organització requereix que s'actualitzi aquest dispositiu</translation>
 <translation id="503498442187459473"><ph name="HOST" /> vol utilitzar la càmera i el micròfon</translation>
 <translation id="5036662165765606524">No permetis que cap lloc baixi diversos fitxers automàticament</translation>
 <translation id="5037676449506322593">Selecciona-ho tot</translation>
@@ -5195,7 +5191,6 @@
 <translation id="8871974300055371298">Configuració del contingut</translation>
 <translation id="8872155268274985541">S'ha trobat un fitxer de manifest d'actualització extern per a Quiosc no vàlid. No s'ha pogut actualitzar l'aplicació Quiosc. Extraieu la memòria USB.</translation>
 <translation id="8874184842967597500">No connectat</translation>
-<translation id="887550310442005096">La teva empresa o organització et demana que actualitzis aquest dispositiu</translation>
 <translation id="8876307312329369159">Aquesta opció de configuració no es pot canviar durant una sessió de demostració.</translation>
 <translation id="8877448029301136595">[directori del nivell superior]</translation>
 <translation id="8879284080359814990">&amp;Mostra com a pestanya</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 25f8183..b394341 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1618,7 +1618,6 @@
 <translation id="3454157711543303649">Aktivace dokončena</translation>
 <translation id="3454213325559396544">Toto je poslední automatická aktualizace softwaru a zabezpečení pro toto zařízení typu <ph name="DEVICE_TYPE" />. Chcete-li dostávat budoucí aktualizace, upgradujte na novější model.</translation>
 <translation id="345693547134384690">Otevřít o&amp;brázek na nové kartě</translation>
-<translation id="3457500881955698515">Vaše společnost nebo organizace vyžaduje okamžitou aktualizaci tohoto zařízení</translation>
 <translation id="3459509316159669723">Tisk</translation>
 <translation id="3459697287128633276">Chcete-li získat přístup k Obchodu Google Play, proveďte ověření u svého poskytovatele identity.</translation>
 <translation id="3459774175445953971">Naposledy upraveno:</translation>
@@ -2234,7 +2233,6 @@
 <translation id="4364327530094270451">Meloun</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> sdílí okno.</translation>
 <translation id="4364830672918311045">Zobrazování oznámení</translation>
-<translation id="4365673000813822030">Jejda, synchronizace přestala fungovat.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> pomocí aplikace <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Zadaný e-mail a heslo se neshodují.</translation>
 <translation id="437184764829821926">Rozšířené nastavení písma</translation>
@@ -2516,7 +2514,6 @@
 <translation id="4830502475412647084">Instalace aktualizace operačního systému</translation>
 <translation id="4830573902900904548">Váš <ph name="DEVICE_TYPE" /> se pomocí sítě <ph name="NETWORK_NAME" /> nemůže připojit k internetu. Zkuste prosím jinou síť. <ph name="LEARN_MORE_LINK_START" />Další informace<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome k požadovanému zdroji nemá přístup.</translation>
-<translation id="4835836146030131423">Chyba přihlašování.</translation>
 <translation id="4837926214103741331">Nemáte oprávnění používat toto zařízení. Kontaktujte vlastníka zařízení a požádejte jej o oprávnění k přihlášení.</translation>
 <translation id="4837952862063191349">Chcete-li zařízení odemknout a obnovit svá místní data, zadejte staré heslo zařízení <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Byl povolen přístup ke čtení schránky</translation>
@@ -2651,7 +2648,6 @@
 <translation id="5029568752722684782">Vymazat kopii</translation>
 <translation id="5030338702439866405">Vydal:</translation>
 <translation id="5033266061063942743">Geometrické obrazce</translation>
-<translation id="5033619151015094114">Vaše firma nebo organizace vyžaduje aktualizaci tohoto zařízení</translation>
 <translation id="503498442187459473">Web <ph name="HOST" /> chce použít váš mikrofon a kameru</translation>
 <translation id="5036662165765606524">Nepovolovat žádnému webu automatické stahování několika souborů</translation>
 <translation id="5037676449506322593">Vybrat vše</translation>
@@ -5194,7 +5190,6 @@
 <translation id="8871974300055371298">Nastavení obsahu</translation>
 <translation id="8872155268274985541">Byl nalezen neplatný soubor manifestu externí aktualizace terminálové aplikace. Aktualizace terminálové aplikace se nezdařila. Vyjměte jednotku USB.</translation>
 <translation id="8874184842967597500">Nepřipojeno</translation>
-<translation id="887550310442005096">Vaše firma nebo organizace vás žádá o aktualizaci tohoto zařízení</translation>
 <translation id="8876307312329369159">Toto nastavení v ukázkové relaci nelze změnit.</translation>
 <translation id="8877448029301136595">[nadřazený adresář]</translation>
 <translation id="8879284080359814990">Zobrazit jako &amp;kartu</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 159e719..3296cfe 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1619,7 +1619,6 @@
 <translation id="3454157711543303649">Aktivering fuldført</translation>
 <translation id="3454213325559396544">Dette er den sidste automatiske software- og sikkerhedsopdatering for denne <ph name="DEVICE_TYPE" />. Opgrader til en nyere model for at få fremtidige opdateringer.</translation>
 <translation id="345693547134384690">Åbn &amp;billede på ny fane</translation>
-<translation id="3457500881955698515">Din virksomhed eller organisation kræver, at denne enhed opdateres med det samme</translation>
 <translation id="3459509316159669723">Udskrivning</translation>
 <translation id="3459697287128633276">Du skal godkende hos din identitetsudbyder, før du kan give din konto adgang til Google Play Butik.</translation>
 <translation id="3459774175445953971">Sidst ændret:</translation>
@@ -2236,7 +2235,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindue.</translation>
 <translation id="4364830672918311045">Vis notifikationer</translation>
-<translation id="4365673000813822030">Ups, synkroniseringen fungerer ikke.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> med <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Den mail og adgangskode, du indtastede, stemmer ikke overens</translation>
 <translation id="437184764829821926">Avancerede indstillinger for skrifttype</translation>
@@ -2518,7 +2516,6 @@
 <translation id="4830502475412647084">Installerer OS-opdateringen</translation>
 <translation id="4830573902900904548">Din <ph name="DEVICE_TYPE" /> kan ikke oprette forbindelse til internettet via <ph name="NETWORK_NAME" />. Vælg et andet netværk. <ph name="LEARN_MORE_LINK_START" />Få flere oplysninger<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome har ikke adgang til den ressource, du anmoder om.</translation>
-<translation id="4835836146030131423">Fejl under login.</translation>
 <translation id="4837926214103741331">Du har ikke tilladelse til at bruge denne enhed. Kontakt enhedsejeren for at få tilladelse til at logge ind.</translation>
 <translation id="4837952862063191349">Angiv din gamle <ph name="DEVICE_TYPE" /> adgangskode for at låse op for og gendanne dine lokale data.</translation>
 <translation id="4838836835474292213">Der blev givet læseadgang til udklipsholderen</translation>
@@ -2653,7 +2650,6 @@
 <translation id="5029568752722684782">Slet kopi</translation>
 <translation id="5030338702439866405">Udstedt af</translation>
 <translation id="5033266061063942743">Geometriske former</translation>
-<translation id="5033619151015094114">Din virksomhed eller organisation kræver, at denne enhed opdateres</translation>
 <translation id="503498442187459473"><ph name="HOST" /> anmoder om at bruge dit kamera og din mikrofon</translation>
 <translation id="5036662165765606524">Tillad ikke, at nogen websites kan downloade flere filer automatisk</translation>
 <translation id="5037676449506322593">Vælg alle</translation>
@@ -5200,7 +5196,6 @@
 <translation id="8871974300055371298">Indstillinger for indhold</translation>
 <translation id="8872155268274985541">Den eksterne opdateringsmanifestfil for terminalen er ugyldig. Terminalappen kunne ikke opdateres. Fjern USB-stikket.</translation>
 <translation id="8874184842967597500">Ikke tilsluttet</translation>
-<translation id="887550310442005096">Din virksomhed eller organisation beder dig om at opdatere denne enhed</translation>
 <translation id="8876307312329369159">Denne indstilling kan ikke ændres i en demosession.</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Vis som fane</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index c809a8f..9e87063 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -526,7 +526,7 @@
 <translation id="1781502536226964113">"Neuer Tab"-Seite öffnen</translation>
 <translation id="1781771911845953849">Konten und Synchronisierung</translation>
 <translation id="1782196717298160133">Mein Telefon finden</translation>
-<translation id="1784707308176068866">Im Hintergrund ausführen, wenn dies von einer zusammenarbeitenden nativen Anwendung angefordert wird</translation>
+<translation id="1784707308176068866">Im Hintergrund ausführen, wenn dies von einer nativen Anwendung angefordert wird</translation>
 <translation id="1784849162047402014">Gerät verfügt über wenig Speicherplatz</translation>
 <translation id="1790194216133135334">Link an <ph name="DEVICE_NAME" /> senden</translation>
 <translation id="1792619191750875668">Erweiterter Bildschirm</translation>
@@ -1616,7 +1616,6 @@
 <translation id="3454157711543303649">Aktivierung abgeschlossen</translation>
 <translation id="3454213325559396544">Das ist das letzte automatische Software- und Sicherheitsupdate für dieses <ph name="DEVICE_TYPE" />. Wenn Sie weiter Updates erhalten möchten, ist ein neueres Modell erforderlich.</translation>
 <translation id="345693547134384690">Bil&amp;d in neuem Tab öffnen</translation>
-<translation id="3457500881955698515">Ihr Unternehmen bzw. Ihre Organisation verlangt, dass dieses Gerät umgehend aktualisiert wird</translation>
 <translation id="3459509316159669723">Drucken</translation>
 <translation id="3459697287128633276">Damit Ihr Konto Zugriff auf den Google Play Store hat, müssen Sie sich bei Ihrem Identitätsanbieter authentifizieren.</translation>
 <translation id="3459774175445953971">Zuletzt geändert am:</translation>
@@ -2233,7 +2232,6 @@
 <translation id="4364327530094270451">Melone</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation>
 <translation id="4364830672918311045">Benachrichtigungen einblenden</translation>
-<translation id="4365673000813822030">Hoppla, die Synchronisierung funktioniert nicht mehr.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> mit <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Die E-Mail-Adresse und das Passwort, die Sie eingegeben haben, stimmen nicht überein.</translation>
 <translation id="437184764829821926">Erweiterte Schriftarteinstellungen</translation>
@@ -2515,7 +2513,6 @@
 <translation id="4830502475412647084">Betriebssystem-Update wird installiert</translation>
 <translation id="4830573902900904548">Ihr Gerät (<ph name="DEVICE_TYPE" />) kann über <ph name="NETWORK_NAME" /> keine Internetverbindung herstellen. Bitte wählen Sie ein anderes Netzwerk aus. <ph name="LEARN_MORE_LINK_START" />Weitere Informationen<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome hat keinen Zugriff auf die angeforderte Ressource.</translation>
-<translation id="4835836146030131423">Fehler bei Anmeldung</translation>
 <translation id="4837926214103741331">Sie sind nicht zur Verwendung dieses Geräts berechtigt. Bitten Sie den Geräteinhaber um eine Anmeldeberechtigung.</translation>
 <translation id="4837952862063191349">Geben Sie Ihr altes <ph name="DEVICE_TYPE" />-Passwort ein, um Ihre lokalen Daten zu entsperren und wiederherzustellen.</translation>
 <translation id="4838836835474292213">Lesezugriff auf Zwischenablage erlaubt</translation>
@@ -2650,7 +2647,6 @@
 <translation id="5029568752722684782">Kopie löschen</translation>
 <translation id="5030338702439866405">Ausgestellt von</translation>
 <translation id="5033266061063942743">Geometrische Formen</translation>
-<translation id="5033619151015094114">Ihr Unternehmen bzw. Ihre Organisation verlangt, dass dieses Gerät aktualisiert wird</translation>
 <translation id="503498442187459473"><ph name="HOST" /> möchte Ihre Kamera und Ihr Mikrofon verwenden</translation>
 <translation id="5036662165765606524">Keiner Website gestatten, automatisch mehrere Dateien herunterzuladen</translation>
 <translation id="5037676449506322593">Alle auswählen</translation>
@@ -5196,7 +5192,6 @@
 <translation id="8871974300055371298">Inhaltseinstellungen</translation>
 <translation id="8872155268274985541">Ungültige Manifestdatei für externes Kiosk-Update gefunden. Die Kiosk-App konnte nicht aktualisiert werden. Bitte entfernen Sie den USB-Stick.</translation>
 <translation id="8874184842967597500">Nicht verbunden</translation>
-<translation id="887550310442005096">Ihr Unternehmen bzw. Ihre Organisation verlangt, dass Sie dieses Gerät aktualisieren</translation>
 <translation id="8876307312329369159">Diese Einstellung kann nicht in einer Demositzung geändert werden.</translation>
 <translation id="8877448029301136595">[übergeordnetes Verzeichnis]</translation>
 <translation id="8879284080359814990">Tab "Anzeigen al&amp;s"</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 43e962bc..c212e56 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Η ενεργοποίηση ολοκληρώθηκε</translation>
 <translation id="3454213325559396544">Αυτή είναι η τελευταία αυτόματη ενημέρωση λογισμικού και ασφαλείας για αυτήν τη συσκευή <ph name="DEVICE_TYPE" />. Για να λαμβάνετε μελλοντικές ενημερώσεις, αναβαθμίστε σε νεότερο μοντέλο.</translation>
 <translation id="345693547134384690">Άνοιγμα ε&amp;ικόνας σε νέα καρτέλα</translation>
-<translation id="3457500881955698515">Η εταιρεία ή ο οργανισμός σας απαιτεί άμεση ενημέρωση αυτής της συσκευής</translation>
 <translation id="3459509316159669723">Εκτύπωση</translation>
 <translation id="3459697287128633276">Για να είναι δυνατή η πρόσβαση του λογαριασμού σας στο Google Play Store, πραγματοποιήστε έλεγχο ταυτότητας με τον Πάροχο ταυτότητας.</translation>
 <translation id="3459774175445953971">Τελευταία τροποποίηση:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Πεπόνι</translation>
 <translation id="4364567974334641491">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται ένα παράθυρο.</translation>
 <translation id="4364830672918311045">Εμφάνιση ειδοποιήσεων</translation>
-<translation id="4365673000813822030">Ωχ, ο συγχρονισμός σταμάτησε να λειτουργεί.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> με την εφαρμογή <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Η διεύθυνση ηλεκτρονικού ταχυδρομείου και ο κωδικός πρόσβασης δεν ταιριάζουν</translation>
 <translation id="437184764829821926">Σύνθετες ρυθμίσεις γραμματοσειράς</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Εγκατάσταση ενημέρωσης λειτουργικού συστήματος</translation>
 <translation id="4830573902900904548">Η συσκευή σας <ph name="DEVICE_TYPE" /> δεν μπορεί να συνδεθεί στο διαδίκτυο χρησιμοποιώντας το δίκτυο <ph name="NETWORK_NAME" />. Επιλέξτε κάποιο άλλο δίκτυο. <ph name="LEARN_MORE_LINK_START" />Μάθετε περισσότερα<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Το Chrome δεν έχει πρόσβαση στον πόρο που ζητήθηκε</translation>
-<translation id="4835836146030131423">Σφάλμα κατά τη σύνδεση.</translation>
 <translation id="4837926214103741331">Δεν έχετε εξουσιοδότηση για χρήση αυτής της συσκευής. Για να λάβετε άδεια σύνδεσης, επικοινωνήστε με τον κάτοχο της συσκευής.</translation>
 <translation id="4837952862063191349">Για να ξεκλειδώσετε και να επαναφέρετε τα τοπικά δεδομένα σας, πληκτρολογήστε τον προηγούμενο κωδικό πρόσβασής σας για <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Επιτρέπεται η πρόσβαση ανάγνωσης στο πρόχειρο</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Διαγραφή αντιγράφου</translation>
 <translation id="5030338702439866405">Έκδοση από</translation>
 <translation id="5033266061063942743">Γεωμετρικά σχήματα</translation>
-<translation id="5033619151015094114">Η εταιρεία ή ο οργανισμός σας απαιτούν ενημέρωση για αυτήν τη συσκευή</translation>
 <translation id="503498442187459473">Ο ιστότοπος <ph name="HOST" /> επιθυμεί να χρησιμοποιήσει την κάμερα και το μικρόφωνο σας</translation>
 <translation id="5036662165765606524">Να μην επιτρέπεται σε κανέναν ιστότοπο να κατεβάζει αυτόματα πολλά αρχεία</translation>
 <translation id="5037676449506322593">Επιλογή Όλων</translation>
@@ -5200,7 +5196,6 @@
 <translation id="8871974300055371298">Ρυθμίσεις περιεχομένου</translation>
 <translation id="8872155268274985541">Βρέθηκε μη έγκυρο εξωτερικό αρχείο μανιφέστο ενημέρωσης kiosk. Αποτυχία ενημέρωσης εφαρμογής kiosk. Αφαιρέστε τη μονάδα αποθήκευσης USB.</translation>
 <translation id="8874184842967597500">Δεν υπάρχει σύνδεση</translation>
-<translation id="887550310442005096">Η εταιρεία ή ο οργανισμός σας ζητά να ενημερώσετε αυτήν τη συσκευή</translation>
 <translation id="8876307312329369159">Δεν είναι δυνατή η αλλαγή αυτής της ρύθμισης σε μια περίοδο σύνδεσης επίδειξης.</translation>
 <translation id="8877448029301136595">[γονικός κατάλογος]</translation>
 <translation id="8879284080359814990">&amp;Εμφάνιση ως καρτέλα</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 7ba360b..9e241c3 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1620,7 +1620,6 @@
 <translation id="3454157711543303649">Activation complete</translation>
 <translation id="3454213325559396544">This is the last automatic software and security update for this <ph name="DEVICE_TYPE" />. To get future updates, upgrade to a newer model.</translation>
 <translation id="345693547134384690">Open &amp;image in new tab</translation>
-<translation id="3457500881955698515">Your company or organisation requires an update to this device straight away</translation>
 <translation id="3459509316159669723">Printing</translation>
 <translation id="3459697287128633276">To enable your account to access the Google Play Store, please authenticate with your Identity Provider.</translation>
 <translation id="3459774175445953971">Last modified:</translation>
@@ -2237,7 +2236,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> is sharing a window.</translation>
 <translation id="4364830672918311045">Display notifications</translation>
-<translation id="4365673000813822030">Whoops, Sync has stopped working.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> with <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">The email and password that you entered don't match.</translation>
 <translation id="437184764829821926">Advanced font settings</translation>
@@ -2519,7 +2517,6 @@
 <translation id="4830502475412647084">Installing OS update</translation>
 <translation id="4830573902900904548">Your <ph name="DEVICE_TYPE" /> is unable to connect to the Internet using <ph name="NETWORK_NAME" />. Please choose another network. <ph name="LEARN_MORE_LINK_START" />Find out more<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome does not have access to the requested resource.</translation>
-<translation id="4835836146030131423">Error signing in.</translation>
 <translation id="4837926214103741331">You are not authorised to use this device. Please contact the device owner for sign-in permission.</translation>
 <translation id="4837952862063191349">To unlock and restore your local data, please enter your old <ph name="DEVICE_TYPE" /> password.</translation>
 <translation id="4838836835474292213">Clipboard read access allowed</translation>
@@ -2654,7 +2651,6 @@
 <translation id="5029568752722684782">Clear copy</translation>
 <translation id="5030338702439866405">Issued By</translation>
 <translation id="5033266061063942743">Geometric shapes</translation>
-<translation id="5033619151015094114">Your company or organisation requires an update to this device</translation>
 <translation id="503498442187459473"><ph name="HOST" /> wants to use your camera and microphone</translation>
 <translation id="5036662165765606524">Do not allow any site to download multiple files automatically</translation>
 <translation id="5037676449506322593">Select All</translation>
@@ -5200,7 +5196,6 @@
 <translation id="8871974300055371298">Content Settings ...</translation>
 <translation id="8872155268274985541">Invalid Kiosk external update manifest file found. Failed to update Kiosk app. Please remove the USB stick.</translation>
 <translation id="8874184842967597500">Not connected</translation>
-<translation id="887550310442005096">Your company or organisation asks that you update this device</translation>
 <translation id="8876307312329369159">This setting can't be changed in a demo session.</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Show As Tab</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index fdc8c748..ce3f650 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1618,7 +1618,6 @@
 <translation id="3454157711543303649">Activación completa</translation>
 <translation id="3454213325559396544">Esta es la última actualización automática de software y seguridad para el dispositivo <ph name="DEVICE_TYPE" />. Para recibir futuras actualizaciones, obtén un modelo más nuevo.</translation>
 <translation id="345693547134384690">Abrir &amp;imagen en una pestaña nueva</translation>
-<translation id="3457500881955698515">Tu organización o empresa necesita actualizar este dispositivo de inmediato</translation>
 <translation id="3459509316159669723">Impresión</translation>
 <translation id="3459697287128633276">A fin de habilitar tu cuenta para acceder a Google Play Store, autentícala con el Proveedor de identidad.</translation>
 <translation id="3459774175445953971">Última modificación:</translation>
@@ -2235,7 +2234,6 @@
 <translation id="4364327530094270451">Melón</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> comparte una ventana.</translation>
 <translation id="4364830672918311045">Mostrar notificaciones</translation>
-<translation id="4365673000813822030">¡Vaya! La sincronización ha dejado de funcionar.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> con <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">El correo electrónico y la contraseña que ingresaste no coinciden.</translation>
 <translation id="437184764829821926">Configuración de fuentes avanzadas</translation>
@@ -2517,7 +2515,6 @@
 <translation id="4830502475412647084">Instalando la actualización del SO</translation>
 <translation id="4830573902900904548">Tu <ph name="DEVICE_TYPE" /> no puede conectarse a Internet a través de <ph name="NETWORK_NAME" />. Debes elegir otra red. <ph name="LEARN_MORE_LINK_START" />Más información<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome no tiene acceso al recurso solicitado.</translation>
-<translation id="4835836146030131423">Error al acceder</translation>
 <translation id="4837926214103741331">No tienes autorización para utilizar este dispositivo. Para obtener permiso de acceso, comunícate con el propietario del dispositivo.</translation>
 <translation id="4837952862063191349">Para desbloquear y restaurar los datos locales, ingresa la contraseña anterior de <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Se permitió el acceso de lectura al portapapeles</translation>
@@ -2652,7 +2649,6 @@
 <translation id="5029568752722684782">Borrar la copia</translation>
 <translation id="5030338702439866405">Proporcionada por</translation>
 <translation id="5033266061063942743">Formas geométricas</translation>
-<translation id="5033619151015094114">Tu organización o empresa necesita actualizar este dispositivo</translation>
 <translation id="503498442187459473"><ph name="HOST" /> desea usar tu cámara y micrófono</translation>
 <translation id="5036662165765606524">No permitir que ningún sitio descargue varios archivos automáticamente</translation>
 <translation id="5037676449506322593">Seleccionar todo</translation>
@@ -5199,7 +5195,6 @@
 <translation id="8871974300055371298">Configuración de contenido</translation>
 <translation id="8872155268274985541">Se encontró un archivo de manifiesto de actualización externa de la aplicación de kiosco no válido. No se pudo actualizar la aplicación de kiosco. Desconecta el dispositivo USB.</translation>
 <translation id="8874184842967597500">No conectado</translation>
-<translation id="887550310442005096">Tu organización o empresa te solicita que actualices este dispositivo</translation>
 <translation id="8876307312329369159">No se puede cambiar esta configuración en la sesión de demostración.</translation>
 <translation id="8877448029301136595">[directorio principal]</translation>
 <translation id="8879284080359814990">Mo&amp;strar como pestaña</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index f2376eb..977ae95 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Ha habido un problema con las licencias del modo de demostración del dispositivo.</translation>
 <translation id="126710816202626562">Idioma de traducción:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Configuración avanzada</translation>
 <translation id="1272079795634619415">Interrumpir</translation>
 <translation id="1272978324304772054">Esta cuenta de usuario no pertenece al dominio en el que se ha registrado el dispositivo. Si quieres registrarlo en un dominio diferente, primero debes llevar a cabo el proceso de recuperación de dispositivo.</translation>
 <translation id="1274977772557788323">Configuración de almacenamiento de Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">Elementos seleccionados: <ph name="NUMBER_OF_ITEMS_SELECTED" /></translation>
 <translation id="1444628761356461360">Esta opción está administrada por el propietario del dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">No se ha podido cargar la ruta "<ph name="IMAGE_PATH" />" del tema.</translation>
+<translation id="1445693676523799095">Este proceso puede tardar un poco</translation>
 <translation id="1451375123200651445">Página web (un único archivo)</translation>
 <translation id="1451917004835509682">Añadir persona supervisada</translation>
 <translation id="1454223536435069390">H&amp;acer captura de pantalla</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">Este elemento solo se puede añadir desde <ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">No se ha podido obtener el token de autenticación. Cierra la sesión y vuelve a iniciarla para intentarlo de nuevo.</translation>
 <translation id="1877860345998737529">Asignación de interruptores a acciones</translation>
+<translation id="1878541307036593717">Configurar permisos</translation>
 <translation id="1879000426787380528">Iniciar sesión como</translation>
 <translation id="1880905663253319515">¿Quieres eliminar el certificado "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="1886996562706621347">Permitir que los sitios web se conviertan en controladores de protocolos predeterminados (recomendado)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">Tiempo restante: <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">Cierre del navegador</translation>
 <translation id="1895934970388272448">Debes confirmar el registro de tu impresora para finalizar este proceso. Compruébalo ahora.</translation>
+<translation id="1899826437968063457">El complemento de VM necesita permiso para ejecutarse</translation>
 <translation id="1901303067676059328">Seleccionar &amp;todo</translation>
 <translation id="1902576642799138955">Período de validez</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Silenciar pestaña}other{Silenciar pestañas}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Sesión de incógnito actual (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Encabezado y pie de página</translation>
 <translation id="2322318151094136999">Preguntar cuando un sitio web quiera acceder a los puertos serie (recomendado)</translation>
+<translation id="2325444234681128157">Recordar contraseña</translation>
 <translation id="2326931316514688470">&amp;Volver a cargar aplicación</translation>
 <translation id="2327492829706409234">Habilitar aplicación</translation>
 <translation id="2329597144923131178">Accede para ver marcadores, historial, contraseñas y otros en dispos.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Añade un parámetro de consulta en la URL para actualizar la página de forma automática: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Aspecto</translation>
 <translation id="2433836460518180625">Solo bloquear dispositivo</translation>
+<translation id="2434449159125086437">No se ha podido configurar la impresora. Comprueba la configuración e inténtalo de nuevo.</translation>
 <translation id="2435248616906486374">Red desconectada</translation>
 <translation id="2435457462613246316">Mostrar contraseña</translation>
 <translation id="2436186046335138073">¿Quieres permitir que <ph name="HANDLER_HOSTNAME" /> abra todos los enlaces de <ph name="PROTOCOL" />?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">ASCII codificado en Base64, cadena de certificados</translation>
 <translation id="2653033005692233957">No se ha podido completar la búsqueda</translation>
 <translation id="2653266418988778031">Si eliminas el certificado de CA, el navegador ya no podrá confiar en ningún certificado emitido por esa entidad emisora de certificados.</translation>
+<translation id="2653275834716714682">Reemplazo de texto</translation>
 <translation id="2653659639078652383">Enviar</translation>
 <translation id="265390580714150011">Valor de campo</translation>
 <translation id="2654166010170466751">Permitir a los sitios web instalar controladores de pago</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Un navegador web rápido, seguro y fácil de usar creado para la Web actual.</translation>
 <translation id="2949289451367477459">Usar ubicación. Permite que los servicios y aplicaciones con permiso de ubicación utilicen la ubicación de este dispositivo. Es posible que Google recopile datos de ubicación periódicamente y que los utilice de forma anónima para mejorar la precisión de la ubicación y los servicios basados en la ubicación. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Advertencia sobre el empaquetado de extensión</translation>
+<translation id="2959842337402130152">No se ha podido restablecer porque falta espacio de almacenamiento. Libera <ph name="SPACE_REQUIRED" /> de espacio del dispositivo e inténtalo de nuevo.</translation>
 <translation id="296026337010986570">Se ha eliminado el software dañino. Para volver a activar las extensiones, ve a &lt;a href="chrome://extensions"&gt;Extensiones&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (extensión proporcionada)</translation>
 <translation id="2961695502793809356">Haz clic para avanzar una página o pulsa unos segundos para ver el historial</translation>
@@ -1611,7 +1619,6 @@
 <translation id="3454157711543303649">Activación completa</translation>
 <translation id="3454213325559396544">Esta es la última actualización automática de software y seguridad que recibirá este <ph name="DEVICE_TYPE" />. Para recibir las actualizaciones posteriores, cambia este modelo por otro más reciente.</translation>
 <translation id="345693547134384690">Abrir &amp;imagen en una pestaña nueva</translation>
-<translation id="3457500881955698515">Tu empresa u organización necesita que actualices este dispositivo inmediatamente</translation>
 <translation id="3459509316159669723">Imprimir</translation>
 <translation id="3459697287128633276">Para permitir que tu cuenta acceda a Google Play Store, debes autenticarte con tu proveedor de identidades.</translation>
 <translation id="3459774175445953971">Última modificación:</translation>
@@ -1987,6 +1994,7 @@
 <translation id="3966072572894326936">Seleccionar otra carpeta...</translation>
 <translation id="3967822245660637423">Descarga completa</translation>
 <translation id="3967919079500697218">Tu administrador ha inhabilitado la función para realizar capturas de pantalla.</translation>
+<translation id="3969092967100188979">Activado, con itinerancia</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">Calculando...</translation>
 <translation id="3975565978598857337">Se ha producido un error al contactar con el servidor del dominio</translation>
@@ -2048,6 +2056,7 @@
 <translation id="4068776064906523561">Huellas digitales guardadas</translation>
 <translation id="407173827865827707">Al hacer clic</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{No fijar pestaña}other{No fijar pestañas}}</translation>
+<translation id="4072805772816336153">Inténtalo de nuevo más tarde</translation>
 <translation id="4074900173531346617">Certificado de firma de correo electrónico</translation>
 <translation id="407520071244661467">Escala</translation>
 <translation id="4075639477629295004">No se puede enviar <ph name="FILE_NAME" />.</translation>
@@ -2136,6 +2145,7 @@
 <translation id="4209092469652827314">Grande</translation>
 <translation id="4209251085232852247">Desactivado</translation>
 <translation id="4209464433672152343">Los documentos <ph name="BEGIN_LINK_HELP" />se envían a Google<ph name="END_LINK_HELP" />, que los prepara para su impresión. Consulta, edita y gestiona tus impresoras y su historial en el <ph name="BEGIN_LINK_DASHBOARD" />panel de control de Google Cloud Print<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Descargando la máquina virtual</translation>
 <translation id="421182450098841253">&amp;Mostrar barra de marcadores</translation>
 <translation id="4211851069413100178">Enviar datos de uso y diagnóstico. Contribuye a mejorar tu experiencia de Android enviando automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos servirán para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos recogidos también ayudarán a las aplicaciones y los colaboradores de Google, como los desarrolladores de Android. El propietario ha aplicado este <ph name="BEGIN_LINK1" />ajuste<ph name="END_LINK1" />. El propietario puede elegir si se envían a Google datos de uso y diagnóstico de este dispositivo. Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en tu cuenta de Google. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Exportar</translation>
@@ -2224,7 +2234,6 @@
 <translation id="4364327530094270451">Melón</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartiendo una ventana.</translation>
 <translation id="4364830672918311045">Mostrar notificaciones</translation>
-<translation id="4365673000813822030">¡Ups! La sincronización ha dejado de funcionar.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> con <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">La dirección de correo electrónico y la contraseña que has introducido no coinciden</translation>
 <translation id="437184764829821926">Configuración de fuentes avanzada</translation>
@@ -2235,6 +2244,7 @@
 <translation id="4378551569595875038">Conectando...</translation>
 <translation id="4378556263712303865">Solicitud de dispositivo</translation>
 <translation id="4380648069038809855">Has iniciado el modo de pantalla completa</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> y 1 cuenta más}other{<ph name="EMAIL" /> y <ph name="EXTRA_ACCOUNTS" /> cuentas más}}</translation>
 <translation id="4384312707950789900">Añadir a las redes preferidas</translation>
 <translation id="4384652540891215547">Activar la extensión</translation>
 <translation id="438503109373656455">Rocinante</translation>
@@ -2365,6 +2375,7 @@
 <translation id="4596295440756783523">Tienes certificados registrados que identifican a estos servidores</translation>
 <translation id="4598556348158889687">Gestión del almacenamiento</translation>
 <translation id="4598776695426288251">Wi-Fi disponible a través de varios dispositivos</translation>
+<translation id="4599134080475764833">Ya puedes usar el complemento de VM</translation>
 <translation id="4602466770786743961">Permitir que <ph name="HOST" /> acceda siempre a la cámara y al micrófono</translation>
 <translation id="4608500690299898628">&amp;Buscar...</translation>
 <translation id="4608520674724523647">Ilustración de registro completado</translation>
@@ -2402,6 +2413,7 @@
 <translation id="4662788913887017617">Compartir este marcador con tu iPhone</translation>
 <translation id="4663373278480897665">Cámara permitida</translation>
 <translation id="4664482161435122549">Error de exportación de archivos PKCS #12</translation>
+<translation id="4664736447097490764">Edita el archivo de configuración de Kerberos aquí.</translation>
 <translation id="4665014895760275686">Fabricante</translation>
 <translation id="4665446389743427678">Se eliminarán todos los datos guardados por <ph name="SITE" />.</translation>
 <translation id="4668721319092543482">Haz clic para habilitar <ph name="PLUGIN_NAME" /></translation>
@@ -2503,7 +2515,6 @@
 <translation id="4830502475412647084">Instalando actualización del SO</translation>
 <translation id="4830573902900904548">Tu <ph name="DEVICE_TYPE" /> no puede conectarse a Internet con <ph name="NETWORK_NAME" />. Selecciona otra red. <ph name="LEARN_MORE_LINK_START" />Más información<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome no tiene acceso al recurso solicitado.</translation>
-<translation id="4835836146030131423">Se ha producido un error al acceder.</translation>
 <translation id="4837926214103741331">No tienes autorización para utilizar este dispositivo. Ponte en contacto con su propietario para obtener permiso de inicio de sesión.</translation>
 <translation id="4837952862063191349">Para desbloquear y restaurar tus datos locales, introduce la antigua contraseña de tu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Se ha permitido el acceso de lectura al portapapeles</translation>
@@ -2638,7 +2649,6 @@
 <translation id="5029568752722684782">Borrar copia</translation>
 <translation id="5030338702439866405">Emitido por</translation>
 <translation id="5033266061063942743">Formas geométricas</translation>
-<translation id="5033619151015094114">Tu empresa u organización necesita que actualices este dispositivo</translation>
 <translation id="503498442187459473"><ph name="HOST" /> quiere utilizar la cámara y el micrófono</translation>
 <translation id="5036662165765606524">No permitir que ningún sitio descargue varios archivos automáticamente</translation>
 <translation id="5037676449506322593">Seleccionar todo</translation>
@@ -2775,6 +2785,7 @@
 <translation id="5255859108402770436">Vuelve a iniciar sesión</translation>
 <translation id="5256861893479663409">En todos los sitios web</translation>
 <translation id="5258992782919386492">Instalar en este dispositivo</translation>
+<translation id="5260334392110301220">Comillas tipográficas</translation>
 <translation id="5260508466980570042">Tu dirección de correo electrónico y tu contraseña no se han podido verificar. Vuelve a intentarlo.</translation>
 <translation id="5261683757250193089">Abrir en Web Store</translation>
 <translation id="5264148714798105376">Este proceso puede durar aproximadamente un minuto.</translation>
@@ -2809,6 +2820,7 @@
 <translation id="5301751748813680278">Iniciando sesión de invitado</translation>
 <translation id="5301954838959518834">Entendido</translation>
 <translation id="5302048478445481009">Idioma</translation>
+<translation id="5302932258331363306">Mostrar sustituciones</translation>
 <translation id="5305688511332277257">No hay certificados instalados</translation>
 <translation id="5307030433605830021">Fuente no admitida</translation>
 <translation id="5308380583665731573">Conectar</translation>
@@ -2908,6 +2920,7 @@
 <translation id="5457113250005438886">No válido</translation>
 <translation id="5457459357461771897">Leer y eliminar fotos, música y otros archivos multimedia de tu ordenador</translation>
 <translation id="5457599981699367932">Navegar como invitado</translation>
+<translation id="5457991019809708398">Activado, sin itinerancia</translation>
 <translation id="5458998536542739734">Notas en la pantalla de bloqueo</translation>
 <translation id="5463275305984126951">Índice de <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Menú con marcadores ocultos</translation>
@@ -3079,7 +3092,7 @@
 <translation id="5709557627224531708">Establecer Google Chrome como navegador predeterminado</translation>
 <translation id="5711983031544731014">No se puede realizar el desbloqueo. Introduce tu contraseña.</translation>
 <translation id="5715711091495208045">Agente de complementos: <ph name="PLUGIN_NAME" /></translation>
-<translation id="5719603411793408026">Motores de búsqueda predeterminados</translation>
+<translation id="5719603411793408026">Buscadores predeterminados</translation>
 <translation id="5720705177508910913">Usuario actual</translation>
 <translation id="572155275267014074">Configuración de Android</translation>
 <translation id="5722930212736070253">¡Vaya! Zip Archiver ha detectado un error.</translation>
@@ -3133,6 +3146,7 @@
 <translation id="5799508265798272974">Máquina virtual de Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">El archivo de destino está truncado o se ha eliminado desde la última descarga.</translation>
 <translation id="5801568494490449797">Preferencias</translation>
+<translation id="5804175651771201311">Itinerancia desactivada</translation>
 <translation id="5804241973901381774">Permisos</translation>
 <translation id="5805697420284793859">Administrador de ventanas</translation>
 <translation id="5811750797187914944">Listo</translation>
@@ -3480,6 +3494,7 @@
 <translation id="6317318380444133405">Ya no es compatible.</translation>
 <translation id="6317369057005134371">Esperando ventana de la aplicación...</translation>
 <translation id="6318407754858604988">Se ha iniciado la descarga</translation>
+<translation id="6318944945640833942">No se ha podido detectar la impresora. Vuelve a introducir la dirección de la impresora.</translation>
 <translation id="6322653941595359182">Envía y recibe mensajes de texto desde tu Chromebook</translation>
 <translation id="6324916366299863871">Editar acceso directo</translation>
 <translation id="6325191661371220117">Inhabilitar inicio automático</translation>
@@ -3736,6 +3751,7 @@
 <translation id="6725073593266469338">Servicio de UI</translation>
 <translation id="6725206449694821596">Protocolo de impresión en Internet (IPP)</translation>
 <translation id="67269783048918309">Enviar datos de uso y diagnóstico. Este dispositivo envía automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos no se usarán para identificar a tu hijo, sino para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos recogidos también ayudarán a las aplicaciones y los colaboradores de Google, como los desarrolladores de Android. El propietario ha aplicado este <ph name="BEGIN_LINK1" />ajuste<ph name="END_LINK1" />. Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en la cuenta de Google de tu hijo. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Conectado, <ph name="BATTERY_PERCENTAGE" /> % de batería</translation>
 <translation id="6732801395666424405">No se han cargado los certificados</translation>
 <translation id="6732900235521116609">No se ha podido retirar el acceso directo</translation>
 <translation id="6735304988756581115">Mostrar cookies y datos de otros sitios...</translation>
@@ -3828,6 +3844,7 @@
 <translation id="6876155724392614295">Bici</translation>
 <translation id="6877460900831874810">Permitir que Chrome reproduzca contenido multimedia en la pantalla de bloqueo</translation>
 <translation id="6878422606530379992">Sensores permitidos</translation>
+<translation id="6878665006737889642">Prueba a instalarlo de nuevo</translation>
 <translation id="6880587130513028875">Se han bloqueado las imágenes en esta página.</translation>
 <translation id="6883319974225028188">¡Vaya! El sistema no ha podido guardar la configuración del dispositivo.</translation>
 <translation id="6885771755599377173">Vista previa de información del sistema</translation>
@@ -3996,6 +4013,7 @@
 <translation id="7120865473764644444">No se ha podido conectar con el servidor de sincronización. Reintentando...</translation>
 <translation id="7121362699166175603">Borra el historial y los autocompletados de la barra de direcciones. Es posible que tu cuenta de Google tenga otros tipos de historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Enviar datos de uso y diagnóstico. Este dispositivo envía automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos no se usarán para identificar a tu hijo, sino para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos recogidos también ayudarán a las aplicaciones y los colaboradores de Google, como los desarrolladores de Android. Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en la cuenta de Google de tu hijo. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Guiones inteligentes</translation>
 <translation id="7123360114020465152">Ya no es compatible</translation>
 <translation id="7124929488592184705">Error al imprimir <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Historial de descargas</translation>
@@ -4144,6 +4162,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> se muestra ahora en pantalla completa.</translation>
 <translation id="7340650977506865820">El sitio web está compartiendo tu pantalla</translation>
 <translation id="7341834142292923918">Quiere acceder a este sitio web</translation>
+<translation id="7344488796804562294">Configuración avanzada de Kerberos</translation>
 <translation id="7345706641791090287">Confirma tu contraseña</translation>
 <translation id="7346909386216857016">Entendido</translation>
 <translation id="7347751611463936647">Para utilizar esta extensión, escribe "<ph name="EXTENSION_KEYWORD" />", pulsa el tabulador e introduce el comando o la búsqueda que desees.</translation>
@@ -4755,6 +4774,7 @@
 <translation id="8227119283605456246">Adjuntar archivo</translation>
 <translation id="8230134520748321204">¿Quieres guardar la contraseña de <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Ayuda a nuestros ingenieros a solucionar este problema. Indícanos lo que ha ocurrido justo antes de que apareciera el mensaje de error del perfil:</translation>
+<translation id="8236917170563564587">Compartir esta pestaña</translation>
 <translation id="8241040075392580210">Nublado</translation>
 <translation id="8241806945692107836">Determinando la configuración del dispositivo...</translation>
 <translation id="8241868517363889229">Leer y modificar tus marcadores</translation>
@@ -4766,6 +4786,7 @@
 <translation id="8249048954461686687">Carpeta OEM</translation>
 <translation id="8249615410597138718">Enviar a tus dispositivos</translation>
 <translation id="8249672078237421304">Preguntar si quieres traducir páginas web que no están escritas en un idioma que entiendas</translation>
+<translation id="8251441930213048644">Actualizar ahora</translation>
 <translation id="8251578425305135684">Miniatura eliminada</translation>
 <translation id="8252569384384439529">Subiendo...</translation>
 <translation id="8253198102038551905">Haz clic en + para consultar las propiedades de la red</translation>
@@ -5143,6 +5164,7 @@
 <translation id="8827752199525959199">Más acciones (contraseña de <ph name="USERNAME" /> en <ph name="DOMAIN" />)</translation>
 <translation id="882854468542856424">No permitir que ningún sitio web busque dispositivos Bluetooth cercanos</translation>
 <translation id="8828933418460119530">Nombre de DNS</translation>
+<translation id="883062543841130884">Sustituciones</translation>
 <translation id="8830796635868321089">La búsqueda de actualizaciones no ha podido utilizar la configuración de proxy actual. Ajusta la <ph name="PROXY_SETTINGS_LINK_START" />configuración de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Abrir ajustes de extensiones</translation>
 <translation id="8834039744648160717"><ph name="USER_EMAIL" /> controla la configuración de red.</translation>
@@ -5163,6 +5185,7 @@
 <translation id="8862003515646449717">Cambia a un navegador rápido</translation>
 <translation id="8863753581171631212">Abrir enlace en una ventana nueva de <ph name="APP" /></translation>
 <translation id="8864055848767439877">Compartiendo <ph name="TAB_NAME" /> con <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512">Se ha eliminado <ph name="EMAIL" /> del dispositivo</translation>
 <translation id="8868626022555786497">En uso</translation>
 <translation id="8870318296973696995">Página de inicio</translation>
 <translation id="8870413625673593573">Cerrado recientemente</translation>
@@ -5171,7 +5194,6 @@
 <translation id="8871974300055371298">Configuración de contenido</translation>
 <translation id="8872155268274985541">El archivo de manifiesto de la actualización externa de kiosco no es válido. Se ha producido un error al actualizar la aplicación de kiosco. Extrae el dispositivo USB.</translation>
 <translation id="8874184842967597500">No conectado</translation>
-<translation id="887550310442005096">Tu empresa u organización pide que actualices este dispositivo</translation>
 <translation id="8876307312329369159">Este ajuste no se puede cambiar en una sesión de demostración.</translation>
 <translation id="8877448029301136595">[directorio principal]</translation>
 <translation id="8879284080359814990">&amp;Mostrar como pestaña</translation>
@@ -5286,6 +5308,7 @@
 <translation id="9044646465488564462">Error al establecer conexión con la red: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Envía la dirección web de la página a la que intentas acceder a Google</translation>
 <translation id="9046895021617826162">Error de conexión</translation>
+<translation id="9047391224416514812">Ya existe una cuenta con este nombre de usuario</translation>
 <translation id="9050666287014529139">Frase de contraseña</translation>
 <translation id="9052208328806230490">Has registrado tus impresoras en <ph name="CLOUD_PRINT_NAME" /> con la cuenta <ph name="EMAIL" />.</translation>
 <translation id="9052404922357793350">Seguir bloqueando</translation>
@@ -5333,6 +5356,7 @@
 <translation id="9121814364785106365">Abrir como pestaña fija</translation>
 <translation id="9124003689441359348">Las contraseñas guardadas aparecerán aquí</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (restantes: <ph name="LICENSE_COUNT" />)</translation>
+<translation id="9128317794749765148">No se ha podido completar la configuración</translation>
 <translation id="9128870381267983090">Conectarse a la red</translation>
 <translation id="9130015405878219958">Modo no válido introducido</translation>
 <translation id="9131487537093447019">Enviar y recibir mensajes desde dispositivos Bluetooth.</translation>
@@ -5401,6 +5425,7 @@
 <translation id="939598580284253335">Introducir frase de contraseña</translation>
 <translation id="939736085109172342">Nueva carpeta</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> está compartiendo audio y una pestaña de Chrome.</translation>
+<translation id="945166830402967374">Ponte en contacto con el administrador del dispositivo de tu organización</translation>
 <translation id="945522503751344254">Enviar comentarios</translation>
 <translation id="947329552760389097">&amp;Inspeccionar elementos</translation>
 <translation id="952992212772159698">Sin activar</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index e3fa009..b6f0622 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktiveerimine lõpetatud</translation>
 <translation id="3454213325559396544">See on seadme <ph name="DEVICE_TYPE" /> viimane automaatne tarkvara- ja turbevärskendus. Tulevaste värskenduste hankimiseks võtke kasutusele uuem mudel.</translation>
 <translation id="345693547134384690">Ava pilt uuel &amp;vahelehel</translation>
-<translation id="3457500881955698515">Teie ettevõte või organisatsioon nõuab selle seadme kohest värskendamist</translation>
 <translation id="3459509316159669723">Printimine</translation>
 <translation id="3459697287128633276">Oma kontol Google Play poele juurdepääsu lubamiseks autentige ennast teenuse Identiteedi pakkuja abil.</translation>
 <translation id="3459774175445953971">Viimati muudetud:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491">Rakendus <ph name="APP_NAME" /> jagab akent.</translation>
 <translation id="4364830672918311045">Kuva märguanded</translation>
-<translation id="4365673000813822030">Vabandust, sünkroonimine on lakanud töötamast.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> rakendusega <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Sisestatud e-posti aadress ja parool ei ühildu</translation>
 <translation id="437184764829821926">Täiustatud fondiseaded</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">OS-i värskenduse installimine</translation>
 <translation id="4830573902900904548">Seade <ph name="DEVICE_TYPE" /> ei saa võrgu <ph name="NETWORK_NAME" /> kaudu Internetiga ühendust. Valige mõni teine võrk. <ph name="LEARN_MORE_LINK_START" />Lisateave<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome'il pole soovitud allikale juurdepääsu.</translation>
-<translation id="4835836146030131423">Sisselogimisel ilmnes viga.</translation>
 <translation id="4837926214103741331">Teil ei ole seadme kasutamiseks volitust. Sisselogimisloa saamiseks võtke ühendust omanikuga.</translation>
 <translation id="4837952862063191349">Kohalike andmete avamiseks ja taastamiseks sisestage oma seadme <ph name="DEVICE_TYPE" /> vana parool.</translation>
 <translation id="4838836835474292213">Lubati juurdepääs lõikelaua lugemiseks</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Kustuta koopia</translation>
 <translation id="5030338702439866405">Väljaandja</translation>
 <translation id="5033266061063942743">Geomeetrilised kujundid</translation>
-<translation id="5033619151015094114">Teie ettevõte või organisatsioon nõuab, et värskendaksite seda seadet</translation>
 <translation id="503498442187459473"><ph name="HOST" /> soovib kasutada teie kaamerat ja mikrofoni</translation>
 <translation id="5036662165765606524">Ära luba ühelgi saidil automaatselt mitut faili alla laadida</translation>
 <translation id="5037676449506322593">Vali kõik</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">Sisu seaded</translation>
 <translation id="8872155268274985541">Leiti kioski kehtetu väline värskendamise manifesti fail. Kioski rakendust ei saanud värskendada. Eemaldage USB-mälupulk.</translation>
 <translation id="8874184842967597500">Ühendus puudub</translation>
-<translation id="887550310442005096">Teie ettevõte või organisatsioon palub teil seda seadet värskendada</translation>
 <translation id="8876307312329369159">Seda seadet ei saa demoseansis muuta.</translation>
 <translation id="8877448029301136595">[emakataloog]</translation>
 <translation id="8879284080359814990">&amp;Kuva vahelehena</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index e0b2630..e53127a 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1617,7 +1617,6 @@
 <translation id="3454157711543303649">فعالسازی کامل شد</translation>
 <translation id="3454213325559396544">این آخرین به‌روزرسانی خودکار نرم‌افزار و امنیتی برای این <ph name="DEVICE_TYPE" /> است. برای دریافت به‌روزرسانی‌های بعدی، به مدل جدیدتری ارتقا دهید.</translation>
 <translation id="345693547134384690">باز کردن &amp;تصویر در برگهٔ جدید</translation>
-<translation id="3457500881955698515">شرکت یا سازمانتان از شما می‌خواهد همین حالا این دستگاه را به‌روزرسانی کنید</translation>
 <translation id="3459509316159669723">درحال چاپ</translation>
 <translation id="3459697287128633276">‏برای فعال کردن حسابتان جهت دسترسی به «فروشگاه Google Play»، لطفاً با استفاده از «ارائه‌دهنده هویت» احراز هویت کنید.</translation>
 <translation id="3459774175445953971">آخرین تغییر:</translation>
@@ -2234,7 +2233,6 @@
 <translation id="4364327530094270451">خربزه</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> در حال اشتراک‌گذاری یک پنجره است.</translation>
 <translation id="4364830672918311045">نمایش اعلان‌ها</translation>
-<translation id="4365673000813822030">وای، همگام‌سازی متوقف شده است.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> با <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">ایمیل و گذرواژه‌ای که وارد کرده‌اید، مطابقت ندارند</translation>
 <translation id="437184764829821926">تنظیمات پیشرفته قلم</translation>
@@ -2516,7 +2514,6 @@
 <translation id="4830502475412647084">درحال نصب به‌روزرسانی سیستم‌عامل</translation>
 <translation id="4830573902900904548">دستگاه <ph name="DEVICE_TYPE" /> شما نمی‌تواند با استفاده از <ph name="NETWORK_NAME" /> به اینترنت متصل شود. لطفاً شبکه دیگری انتخاب کنید. <ph name="LEARN_MORE_LINK_START" />بیشتر بدانید<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">‏Chrome به منبع درخواستی دسترسی ندارد.</translation>
-<translation id="4835836146030131423">خطای ورود به سیستم.</translation>
 <translation id="4837926214103741331">مجاز به استفاده از این دستگاه نیستید. لطفاً برای دریافت اجازه ورود به سیستم با مالک دستگاه تماس بگیرید.</translation>
 <translation id="4837952862063191349">برای باز کردن قفل و بازیابی داده‌های محلی‌تان، لطفاً گذرواژه <ph name="DEVICE_TYPE" /> قدیمی‌تان را وارد کنید.</translation>
 <translation id="4838836835474292213">دسترسی برای خواندن محتوای بریده‌دان مجاز شد</translation>
@@ -2651,7 +2648,6 @@
 <translation id="5029568752722684782">پاک کردن نسخه کپی</translation>
 <translation id="5030338702439866405">صدور توسط</translation>
 <translation id="5033266061063942743">شکل‌های هندسی</translation>
-<translation id="5033619151015094114">شرکت یا سازمانتان از شما می‌خواهند این دستگاه را به‌روزرسانی کنید</translation>
 <translation id="503498442187459473"><ph name="HOST" /> می‌خواهد از دوربین و میکروفن شما استفاده کند</translation>
 <translation id="5036662165765606524">به هیچ سایتی اجازه داده نشود چند فایل را به‌طور خودکار بارگیری کند</translation>
 <translation id="5037676449506322593">انتخاب همه</translation>
@@ -2804,7 +2800,7 @@
 <translation id="5280174558369304332">افزونه‌هایی که برداشته می‌شود:</translation>
 <translation id="5280426389926346830">میان‌بر ایجاد شود؟</translation>
 <translation id="528208740344463258">‏برای بارگیری و استفاده از برنامه‌های Android، ابتدا باید این به‌روزرسانی الزامی را نصب کنید. وقتی <ph name="DEVICE_TYPE" /> شما درحال به‌روزرسانی است، نمی‌توانید از آن استفاده کنید. پس از تکمیل نصب، <ph name="DEVICE_TYPE" /> بازراه‌اندازی می‌شود.</translation>
-<translation id="5282733140964383898">فعال کردن «ردیابی نشود» بدین معناست که درخواستی در ترافیک مرور شما لحاظ خواهد شد. هر گونه تأثیر به این بستگی دارد که وب‌سایت به درخواست پاسخ می‌دهد یا خیر و درخواست چگونه تفسیر می‌شود. به‌عنوان مثال، ممکن است برخی از وب‌سایت‌ها با نشان دادن آگهی‌هایی که براساس وب‌سایت‌های دیگری که بازدید کرده‌اید، نیستند به این درخواست پاسخ دهند. بسیاری از وب‌سایت‌ها همچنان داده‌های مرور شما را جمع‌آوری و استفاده خواهند کرد، به‌عنوان مثال برای بهبود ایمنی، برای ارائه محتوا، سرویس‌ها، آگهی‌ها و توصیه‌های مربوط به وب‌سایت‌هایشان و برای تولید آمار گزارش. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
+<translation id="5282733140964383898">فعال کردن «ردیابی نشود» به این معنی است که درخواستی به ترافیک مرور شما اضافه خواهد شد. نتیجه به این بستگی دارد که وب‌سایت به درخواست پاسخ بدهد یا نه و درخواست چگونه تفسیر شود. مثلاً ممکن است برخی از وب‌سایت‌ها با نشان دادن آگهی‌هایی که براساس وب‌سایت‌های دیگری نیستند که بازدید کرده‌اید به این درخواست پاسخ دهند. بسیاری از وب‌سایت‌ها همچنان داده‌های مرور شما را جمع‌آوری و استفاده خواهند کرد، مثلاً برای بهبود امنیت، برای ارائه محتوا، سرویس‌ها، آگهی‌ها و توصیه‌های مربوط به وب‌سایت‌هایشان و برای تولید آمار گزارش. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="5283049351426079445">مطمئن هستید می‌خواهید<ph name="APP_NAME" /> را نصب کنید؟</translation>
 <translation id="5283677936944177147">متأسفیم! سیستم مدل دستگاه یا شماره سریال را تعیین نکرد.</translation>
 <translation id="5284445933715251131">ادامه بارگیری</translation>
@@ -5197,7 +5193,6 @@
 <translation id="8871974300055371298">تنظیمات محتوا</translation>
 <translation id="8872155268274985541">‏فایل مانیفست به‌روزرسانی خارجی کیوسک نامعتبری پیدا شد. به‌روزرسانی برنامه کیوسک انجام نشد. لطفاً فلش USB را خارج کنید.</translation>
 <translation id="8874184842967597500">متصل نیست</translation>
-<translation id="887550310442005096">شرکت یا سازمانتان از شما می‌خواهند این دستگاه را به‌روزرسانی کنید</translation>
 <translation id="8876307312329369159">این تنظیم در جلسه نمایشی قابل‌تغییر نیست.</translation>
 <translation id="8877448029301136595">[دایرکتوری والد]</translation>
 <translation id="8879284080359814990">&amp;نمایش به‌صورت برگه</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index b9db500..7707081 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Esittelytilan laitelisenssien kanssa tapahtui ongelma.</translation>
 <translation id="126710816202626562">Käännöksen kieli:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Lisämääritykset</translation>
 <translation id="1272079795634619415">Pysäytä</translation>
 <translation id="1272978324304772054">Tämä käyttäjätili ei kuulu verkkotunnukselle, jossa laite on otettu käyttöön. Jos haluat ottaa laitteen käyttöön eri verkkotunnuksessa, sinun tulee ensin suorittaa laitteen palauttaminen.</translation>
 <translation id="1274977772557788323">Adobe Flash Playerin tallennusasetukset</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">Valittu: <ph name="NUMBER_OF_ITEMS_SELECTED" /></translation>
 <translation id="1444628761356461360">Tätä asetusta hallinnoi laitteen omistaja <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Polun <ph name="IMAGE_PATH" /> lataaminen teemalle ei onnistunut.</translation>
+<translation id="1445693676523799095">Tämä voi kestää hetken</translation>
 <translation id="1451375123200651445">Verkkosivu, yksi tiedosto</translation>
 <translation id="1451917004835509682">Lisää valvottu käyttäjä</translation>
 <translation id="1454223536435069390">Ot&amp;a kuvakaappaus</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> on ainoa lähde, josta tämä voidaan lisätä.</translation>
 <translation id="1877520246462554164">Todennustunnisteen hakeminen epäonnistui. Kirjaudu ulos ja uudelleen sisään, niin voit yrittää uudelleen.</translation>
 <translation id="1877860345998737529">Kytkintoiminnon määritys</translation>
+<translation id="1878541307036593717">Määritä käyttöoikeudet</translation>
 <translation id="1879000426787380528">Kirjaa sisään</translation>
 <translation id="1880905663253319515">Poistetaanko varmenne <ph name="CERTIFICATE_NAME" />?</translation>
 <translation id="1886996562706621347">Anna sivustojen ehdottaa protokollien oletuskäsittelypalveluiden määrittämistä (suositus)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> jäljellä</translation>
 <translation id="1895658205118569222">Sulkeminen</translation>
 <translation id="1895934970388272448">Sinun on vahvistettava  tulostimesi rekisteröinti, jotta voit suorittaa tämän prosessin loppuun – tarkista se nyt.</translation>
+<translation id="1899826437968063457">Plugin VM tarvitsee luvan toimiakseen</translation>
 <translation id="1901303067676059328">Valitse &amp;kaikki</translation>
 <translation id="1902576642799138955">Voimassaoloaika</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Mykistä välilehti}other{Mykistä välilehdet}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Nykyinen incognito-istunto (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Ylä- ja alatunnisteet</translation>
 <translation id="2322318151094136999">Kysy aina, kun sivusto pyytää sarjaportin käyttölupaa (suositus)</translation>
+<translation id="2325444234681128157">Muista salasana</translation>
 <translation id="2326931316514688470">&amp;Lataa sovellus uudelleen</translation>
 <translation id="2327492829706409234">Ota sovellus käyttöön</translation>
 <translation id="2329597144923131178">Kirjaudu ja käytä kirjanm., historiaa, salasan. ja muita asetuksia kaikissa laitteissasi.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Lisää kyselyparametri URL-osoitteeseen, jos haluat päivittää sivun automaattisesti: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Ulkonäkö</translation>
 <translation id="2433836460518180625">Avaa vain laitteen lukitus</translation>
+<translation id="2434449159125086437">Tulostimen määritys epäonnistui Tarkista määritykset ja yritä uudelleen.</translation>
 <translation id="2435248616906486374">Verkkoyhteys katkaistu</translation>
 <translation id="2435457462613246316">Näytä salasana</translation>
 <translation id="2436186046335138073">Haluatko tahon <ph name="HANDLER_HOSTNAME" /> avaavan kaikki <ph name="PROTOCOL" />-linkit?</translation>
@@ -1099,6 +1105,7 @@
 <translation id="2649045351178520408">Base64-koodattu ASCII, varmenneketju</translation>
 <translation id="2653033005692233957">Haku epäonnistui</translation>
 <translation id="2653266418988778031">Jos poistat varmenteen myöntäjän varmenteen, selaimesi ei enää luota tämän myöntäjän varmenteisiin.</translation>
+<translation id="2653275834716714682">Korvaava teksti</translation>
 <translation id="2653659639078652383">Lähetä</translation>
 <translation id="265390580714150011">Kentän arvo</translation>
 <translation id="2654166010170466751">Salli sivustojen asentaa maksujen käsittelijöitä</translation>
@@ -1307,6 +1314,7 @@
 <translation id="29488703364906173">Nopea, yksinkertainen ja turvallinen verkkoselain, joka on suunniteltu nykypäivän verkon tarpeisiin.</translation>
 <translation id="2949289451367477459">Käytä sijaintia. Salli laitteen sijainnin käyttäminen sovelluksille ja palveluille, joilla on sijainnin käyttöoikeus. Google voi ajoittain kerätä sijaintitietoja ja käyttää niitä ei-yksilöivästi sijainnin tarkkuuden ja sijaintiin perustuvien palvelujen kehittämiseen. <ph name="BEGIN_LINK1" />Lue lisää<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Varoitus: pakattu laajennus</translation>
+<translation id="2959842337402130152">Palauttaminen ei onnistu, koska tallennustila ei riitä. Vapauta laitteelta <ph name="SPACE_REQUIRED" /> ja yritä uudelleen.</translation>
 <translation id="296026337010986570">Valmista. Haittaohjelmat poistettiin. Voit ottaa laajennukset taas käyttöön avaamalla &lt;a href="chrome://extensions"&gt;Laajennukset&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (voimassaoloaikaa pidennetty)</translation>
 <translation id="2961695502793809356">Siirry eteenpäin klikkaamalla, tarkastele historiaa pitämällä alhaalla</translation>
@@ -1614,7 +1622,6 @@
 <translation id="3454157711543303649">Aktivointi valmis</translation>
 <translation id="3454213325559396544">Tämä on viimeinen automaattinen ohjelmisto- ja tietoturvapäivitys, jonka <ph name="DEVICE_TYPE" /> saa. Vaihda uudempaan malliin, jos haluat jatkossa päivityksiä.</translation>
 <translation id="345693547134384690">Avaa &amp;kuva uudessa välilehdessä</translation>
-<translation id="3457500881955698515">Yritys tai organisaatio edellyttää laitteen päivittämistä heti</translation>
 <translation id="3459509316159669723">Tulostaminen</translation>
 <translation id="3459697287128633276">Tunnistustietojen tarjoajan on todennettava henkilöllisyytesi, ennen kuin Google Play Kaupan käyttö tilillä on mahdollista.</translation>
 <translation id="3459774175445953971">Viimeksi muokattu:</translation>
@@ -1988,6 +1995,7 @@
 <translation id="3966072572894326936">Valitse toinen kansio...</translation>
 <translation id="3967822245660637423">Lataus on valmis</translation>
 <translation id="3967919079500697218">Järjestelmänvalvoja on poistanut käytöstä mahdollisuuden ottaa kuvakaappauksia.</translation>
+<translation id="3969092967100188979">Päällä, roaming-tilassa</translation>
 <translation id="3970114302595058915">Tunnus</translation>
 <translation id="397105322502079400">Lasketaan...</translation>
 <translation id="3975565978598857337">Alueen hakeminen palvelimelta epäonnistui</translation>
@@ -2049,6 +2057,7 @@
 <translation id="4068776064906523561">Tallennetut sormenjäljet</translation>
 <translation id="407173827865827707">Klikkaamalla</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Irrota välilehti}other{Irrota välilehdet}}</translation>
+<translation id="4072805772816336153">Yritä myöhemmin uudelleen</translation>
 <translation id="4074900173531346617">Sähköpostin allekirjoitusvarmenne</translation>
 <translation id="407520071244661467">Asteikko</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> ei ole suoratoistettavissa.</translation>
@@ -2137,6 +2146,7 @@
 <translation id="4209092469652827314">Suuri</translation>
 <translation id="4209251085232852247">Poistettu käytöstä</translation>
 <translation id="4209464433672152343">Dokumentit <ph name="BEGIN_LINK_HELP" />lähetetään Googlelle<ph name="END_LINK_HELP" /> tulostamisen valmistelua varten. Voit katsella, muokata ja hallinnoida tulostimia ja tulostushistoriaa <ph name="BEGIN_LINK_DASHBOARD" />Google Cloud Printin hallintapaneelissa<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Ladataan virtuaalikonetta</translation>
 <translation id="421182450098841253">Näytä kirjanmerkkipalkki</translation>
 <translation id="4211851069413100178">Lähetä käyttö- ja diagnostiikkadataa. Auta parantamaan Android-käyttökokemusta lähettämällä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Datan avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Omistaja on ottanut tämän <ph name="BEGIN_LINK1" />asetuksen<ph name="END_LINK1" /> käyttöön. Omistaja voi lähettää tätä laitetta koskevaa diagnostiikka- ja käyttödataa Googlelle. Jos olet ottanut käyttöön muun verkko- ja sovellustoiminnan asetuksen, tätä dataa voidaan tallentaa Google-tilillesi. <ph name="BEGIN_LINK2" />Lue lisää<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Vie</translation>
@@ -2225,7 +2235,6 @@
 <translation id="4364327530094270451">Meloni</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> jakaa ikkunan.</translation>
 <translation id="4364830672918311045">Näytä ilmoitukset</translation>
-<translation id="4365673000813822030">Hups, synkronointi on lakannut toimimasta.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> (<ph name="APP_NAME" />)</translation>
 <translation id="4370975561335139969">Antamasi sähköpostiosoite ja salasana eivät vastaa toisiaan.</translation>
 <translation id="437184764829821926">Kirjasimen lisäasetukset</translation>
@@ -2236,6 +2245,7 @@
 <translation id="4378551569595875038">Yhdistetään…</translation>
 <translation id="4378556263712303865">Laitepyyntö</translation>
 <translation id="4380648069038809855">Siirryttiin koko näytön tilaan</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 muu tili}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> muuta tiliä}}</translation>
 <translation id="4384312707950789900">Lisää ensisijaisiin</translation>
 <translation id="4384652540891215547">Aktivoi laajennus</translation>
 <translation id="438503109373656455">V5</translation>
@@ -2366,6 +2376,7 @@
 <translation id="4596295440756783523">Olet tallentanut seuraavat palvelimet tunnistavat varmenteet</translation>
 <translation id="4598556348158889687">Tallennustilan hallinta</translation>
 <translation id="4598776695426288251">Wi-Fi käytettävissä useilla laitteilla</translation>
+<translation id="4599134080475764833">Plugin VM on valmis käyttöön</translation>
 <translation id="4602466770786743961">Anna sivuston <ph name="HOST" /> aina käyttää kameraasi ja mikrofoniasi</translation>
 <translation id="4608500690299898628">&amp;Haku...</translation>
 <translation id="4608520674724523647">Onnistuneen rekisteröinnin kuvitus</translation>
@@ -2403,6 +2414,7 @@
 <translation id="4662788913887017617">Jaa tämä kirjanmerkki iPhonellesi</translation>
 <translation id="4663373278480897665">Kamera sallittu</translation>
 <translation id="4664482161435122549">PKCS #12 -vientivirhe</translation>
+<translation id="4664736447097490764">Muokkaa Kerberos-määritystiedostoa täällä.</translation>
 <translation id="4665014895760275686">Valmistaja</translation>
 <translation id="4665446389743427678">Kaikki data, jonka <ph name="SITE" /> tallentaa, poistetaan.</translation>
 <translation id="4668721319092543482">Ota <ph name="PLUGIN_NAME" /> käyttöön klikkaamalla.</translation>
@@ -2504,7 +2516,6 @@
 <translation id="4830502475412647084">Asennetaan käyttöjärjestelmäpäivitystä</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ei voi muodostaa internetyhteyttä verkon <ph name="NETWORK_NAME" /> kautta. Valitse toinen verkko. <ph name="LEARN_MORE_LINK_START" />Lisätietoja<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chromella ei ole pyydetyn resurssin käyttöoikeutta.</translation>
-<translation id="4835836146030131423">Virhe kirjautumisessa.</translation>
 <translation id="4837926214103741331">Sinulla ei ole tämän laitteen käyttölupaa. Pyydä laitteen omistajalta kirjautumislupa.</translation>
 <translation id="4837952862063191349">Jos haluat avata paikallisten tietojesi lukituksen ja palauttaa ne, anna vanhan laitteen <ph name="DEVICE_TYPE" /> salasana.</translation>
 <translation id="4838836835474292213">Leikepöydän lukuoikeus myönnetty</translation>
@@ -2639,7 +2650,6 @@
 <translation id="5029568752722684782">Poista kopio</translation>
 <translation id="5030338702439866405">Myöntänyt</translation>
 <translation id="5033266061063942743">Geometriset kuviot</translation>
-<translation id="5033619151015094114">Yritys tai organisaatio edellyttää laitteen päivittämistä</translation>
 <translation id="503498442187459473"><ph name="HOST" /> haluaa käyttää kameraasi ja mikrofoniasi.</translation>
 <translation id="5036662165765606524">Älä anna sivustojen ladata useita tiedostoja automaattisesti</translation>
 <translation id="5037676449506322593">Valitse kaikki</translation>
@@ -2776,6 +2786,7 @@
 <translation id="5255859108402770436">Kirjaudu uudelleen sisään</translation>
 <translation id="5256861893479663409">Kaikilla sivustoilla</translation>
 <translation id="5258992782919386492">Asenna tälle laitteelle</translation>
+<translation id="5260334392110301220">Älykkäät lainaukset</translation>
 <translation id="5260508466980570042">Sähköpostiosoitteesi tai salasanasi vahvistaminen epäonnistui. Yritä uudelleen.</translation>
 <translation id="5261683757250193089">Avaa Web Storessa</translation>
 <translation id="5264148714798105376">Tämä voi kestää hetken.</translation>
@@ -2810,6 +2821,7 @@
 <translation id="5301751748813680278">Vierailijakäyttö.</translation>
 <translation id="5301954838959518834">Selvä</translation>
 <translation id="5302048478445481009">Kieli</translation>
+<translation id="5302932258331363306">Näytä korvaavat</translation>
 <translation id="5305688511332277257">Yhtään ei ole asennettu</translation>
 <translation id="5307030433605830021">Lähdettä ei tueta</translation>
 <translation id="5308380583665731573">Muodosta yhteys</translation>
@@ -2909,6 +2921,7 @@
 <translation id="5457113250005438886">Virheellinen</translation>
 <translation id="5457459357461771897">Käyttää ja poistaa valokuvia, musiikkia ja muuta tietokoneesi mediaa</translation>
 <translation id="5457599981699367932">Selaa vierailijana</translation>
+<translation id="5457991019809708398">Päällä, ei roaming-tilassa</translation>
 <translation id="5458998536542739734">Muistiinpanot lukitusnäytöllä</translation>
 <translation id="5463275305984126951">Sijainnin <ph name="LOCATION" /> hakemisto</translation>
 <translation id="5463856536939868464">Piilotetut kirjanmerkit sisältävä valikko</translation>
@@ -3134,6 +3147,7 @@
 <translation id="5799508265798272974">Linux-virtuaalikone: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Kohdetiedosto on katkaistu tai poistettu edellisen latauksen jälkeen.</translation>
 <translation id="5801568494490449797">Asetukset</translation>
+<translation id="5804175651771201311">Roaming pois päältä</translation>
 <translation id="5804241973901381774">Käyttöoikeudet</translation>
 <translation id="5805697420284793859">Ikkunat</translation>
 <translation id="5811750797187914944">Valmis</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">Ei enää tueta</translation>
 <translation id="6317369057005134371">Odotetaan sovellusikkunaa…</translation>
 <translation id="6318407754858604988">Lataus aloitettu</translation>
+<translation id="6318944945640833942">Tulostinta ei havaittu. Syötä tulostimen osoite uudelleen.</translation>
 <translation id="6322653941595359182">Lähetä ja vastaanota tekstiviestejä Chromebookilla</translation>
 <translation id="6324916366299863871">Muokkaa pikanäppäintä</translation>
 <translation id="6325191661371220117">Poista automaattinen käynnistys käytöstä</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">UI-palvelu</translation>
 <translation id="6725206449694821596">Internet-tulostusprotokolla (IPP)</translation>
 <translation id="67269783048918309">Lähetä käyttö- ja diagnostiikkadataa. Laite lähettää tällä hetkellä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Omistaja on ottanut tämän <ph name="BEGIN_LINK1" />asetuksen<ph name="END_LINK1" /> käyttöön. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK2" />Lue lisää<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Yhdistetty, akun taso <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6732801395666424405">Varmenteita ei ole ladattu</translation>
 <translation id="6732900235521116609">Pikakuvakkeen poistaminen epäonnistui</translation>
 <translation id="6735304988756581115">Näytä evästeet ja muut sivuston tiedot...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">Pyörä</translation>
 <translation id="6877460900831874810">Ota käyttöön Chrome-median toisto lukitusnäytöllä</translation>
 <translation id="6878422606530379992">Tunnistimet sallittu</translation>
+<translation id="6878665006737889642">Yritä asentaa uudelleen</translation>
 <translation id="6880587130513028875">Kuvat estettiin tällä sivulla.</translation>
 <translation id="6883319974225028188">Hups – laitteen kokoonpanon tallentaminen epäonnistui.</translation>
 <translation id="6885771755599377173">Järjestelmätietojen esikatselu</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">Synkronointipalvelimeen ei saada yhteyttä. Yritetään uudelleen…</translation>
 <translation id="7121362699166175603">Tyhjentää historian ja osoitekentän automaattiset täydennykset. Google-tililläsi voi olla muita selaushistoriatietoja osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Lähetä käyttö- ja diagnostiikkadataa. Laite lähettää tällä hetkellä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK1" />Lue lisää<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Älykkäät väliviivat</translation>
 <translation id="7123360114020465152">Ei enää tueta</translation>
 <translation id="7124929488592184705">Tulostusvirhe: <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Lataushistoria</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> on nyt koko näytöllä.</translation>
 <translation id="7340650977506865820">Sivusto jakaa näyttösi</translation>
 <translation id="7341834142292923918">Haluaa toimia tällä sivustolla</translation>
+<translation id="7344488796804562294">Kerberos-lisämääritys</translation>
 <translation id="7345706641791090287">Vahvista salasanasi</translation>
 <translation id="7346909386216857016">Selvä</translation>
 <translation id="7347751611463936647">Voit käyttää tätä laajennusta kirjoittamalla <ph name="EXTENSION_KEYWORD" />, sitten TAB ja sitten komentosi tai hakusi</translation>
@@ -4757,6 +4776,7 @@
 <translation id="8227119283605456246">Liitä tiedosto</translation>
 <translation id="8230134520748321204">Tallennetaanko salasanat: <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Auta tiimiämme ongelman korjaamisessa. Kerro meille, mitä tapahtui juuri ennen profiilivirheviestiä:</translation>
+<translation id="8236917170563564587">Jaa sen sijaan tämä välilehti</translation>
 <translation id="8241040075392580210">Paiste</translation>
 <translation id="8241806945692107836">Selvitetään laitteen kokoonpanoa…</translation>
 <translation id="8241868517363889229">Lukea ja muokata kirjanmerkkejä</translation>
@@ -4768,6 +4788,7 @@
 <translation id="8249048954461686687">Alkuperäisten laitevalmistajien kansio</translation>
 <translation id="8249615410597138718">Lähetä laitteillesi</translation>
 <translation id="8249672078237421304">Tarjoa käännöstä muunkielisille sivuille</translation>
+<translation id="8251441930213048644">Päivitä nyt</translation>
 <translation id="8251578425305135684">Pikkukuva poistettu.</translation>
 <translation id="8252569384384439529">Ladataan…</translation>
 <translation id="8253198102038551905">Tarkastele verkon ominaisuuksia klikkaamalla +</translation>
@@ -5145,6 +5166,7 @@
 <translation id="8827752199525959199">Lisää toimintoja, käyttäjän <ph name="USERNAME" /> salasana verkkotunnuksessa <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Älä anna sivustojen löytää lähellä olevia Bluetooth-laitteita</translation>
 <translation id="8828933418460119530">DNS-nimi</translation>
+<translation id="883062543841130884">Vastikkeet</translation>
 <translation id="8830796635868321089">Päivitystarkistus epäonnistui nykyisillä välityspalvelinasetuksilla. Muuta <ph name="PROXY_SETTINGS_LINK_START" />välityspalvelinasetuksia<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Avaa laajennusasetukset</translation>
 <translation id="8834039744648160717"><ph name="USER_EMAIL" /> ohjaa verkon määritystä.</translation>
@@ -5165,6 +5187,7 @@
 <translation id="8862003515646449717">Siirry käyttämään nopeaa selainta.</translation>
 <translation id="8863753581171631212">Avaa linkki uudessa ikkunassa (<ph name="APP" />)</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> jaetaan, vastaanottaja: <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> poistettiin tältä laitteelta</translation>
 <translation id="8868626022555786497">Käytössä</translation>
 <translation id="8870318296973696995">Etusivu</translation>
 <translation id="8870413625673593573">Hiljattain suljetut</translation>
@@ -5173,7 +5196,6 @@
 <translation id="8871974300055371298">Sisältöasetukset</translation>
 <translation id="8872155268274985541">Löytyi virheellinen kioskisovelluksen ulkoisen päivityksen luettelotiedosto. Kioskisovelluksen päivitys epäonnistui. Irrota USB-tikku.</translation>
 <translation id="8874184842967597500">Ei yhdistetty</translation>
-<translation id="887550310442005096">Yritys tai organisaatio pyytää päivittämään tämän laitteen</translation>
 <translation id="8876307312329369159">Tätä asetusta ei voi muuttaa demo-käyttökerralla.</translation>
 <translation id="8877448029301136595">[emohakemisto]</translation>
 <translation id="8879284080359814990">&amp;Näytä välilehtenä</translation>
@@ -5288,6 +5310,7 @@
 <translation id="9044646465488564462">Yhteyden muodostaminen verkkoon epäonnistui: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Lähettää Googlelle etsimäsi sivun verkko-osoitteen</translation>
 <translation id="9046895021617826162">Yhdistäminen epäonnistui</translation>
+<translation id="9047391224416514812">Tällä käyttäjänimellä on jo tili</translation>
 <translation id="9050666287014529139">Tunnuslause</translation>
 <translation id="9052208328806230490">Olet rekisteröinyt tulostimesi palveluun <ph name="CLOUD_PRINT_NAME" /> tilin <ph name="EMAIL" /> avulla</translation>
 <translation id="9052404922357793350">Estä edelleen</translation>
@@ -5335,6 +5358,7 @@
 <translation id="9121814364785106365">Avaa kiinnitetyllä välilehdellä</translation>
 <translation id="9124003689441359348">Tässä näytetään tallennetut salasanasi.</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> jäljellä)</translation>
+<translation id="9128317794749765148">Määritystä ei voitu suorittaa loppuun</translation>
 <translation id="9128870381267983090">Yhdistä verkkoon</translation>
 <translation id="9130015405878219958">Annoit virheellisen tilan.</translation>
 <translation id="9131487537093447019">Lähettää viestejä Bluetooth-laitteisiin ja vastaanottaa viestejä Bluetooth-laitteilta.</translation>
@@ -5403,6 +5427,7 @@
 <translation id="939598580284253335">Anna tunnuslause</translation>
 <translation id="939736085109172342">Uusi kansio</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> jakaa Chrome-välilehden ja ääntä.</translation>
+<translation id="945166830402967374">Ota yhteyttä organisaatiosi järjestelmänvalvojaan</translation>
 <translation id="945522503751344254">Lähetä palautetta</translation>
 <translation id="947329552760389097">Tutk&amp;i elementtejä</translation>
 <translation id="952992212772159698">Ei aktivoitu</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index ee6c850..1da60f7 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Nagkaproblema sa mga lisensya ng device sa demo mode.</translation>
 <translation id="126710816202626562">Wika ng pagsasalin</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Advanced na configuration</translation>
 <translation id="1272079795634619415">Stop</translation>
 <translation id="1272978324304772054">Ang user account na ito ay hindi pagmamay-ari ng domain kung saan nakatala ang device.  Kung nais mong magpatala sa ibang domain, kailangan mo munang sumailalim sa pagbawi ng device.</translation>
 <translation id="1274977772557788323">Mga setting ng Storage ng Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> ang napili</translation>
 <translation id="1444628761356461360">Ang setting na ito ay pinamamahalaan ng may-ari ng device, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Maaaring hindi mai-load ang '<ph name="IMAGE_PATH" />' para sa tema.</translation>
+<translation id="1445693676523799095">Puwede itong magtagal nang ilang sandali</translation>
 <translation id="1451375123200651445">Webpage, Iisang File</translation>
 <translation id="1451917004835509682">Magdagdag ng Pinapangasiwaang Tao</translation>
 <translation id="1454223536435069390">Kumuha ng screenshot</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">Maaari lang itong idagdag mula sa <ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">Hindi nakuha ang token sa pag-authenticate. Mag-sign out at muling mag-sign in upang subukang muli.</translation>
 <translation id="1877860345998737529">Pagtatakda ng switch sa pagkilos</translation>
+<translation id="1878541307036593717">Mag-set up ng mga pahintulot</translation>
 <translation id="1879000426787380528">Mag-sign in bilang</translation>
 <translation id="1880905663253319515">Tanggalin ang certificate na "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="1886996562706621347">Payagan ang mga site na hilinging maging default na mga handler para sa mga protocol (inirerekomenda)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> ang natitira</translation>
 <translation id="1895658205118569222">Shutdown</translation>
 <translation id="1895934970388272448">Dapat mong kumpirmahin ang pagpaparehistro sa iyong printer upang tapusin ang prosesong ito - tingnan ito ngayon.</translation>
+<translation id="1899826437968063457">Kailangan ng Plugin VM ng pahintulot para tumakbo</translation>
 <translation id="1901303067676059328">Piliin ang &amp;lahat</translation>
 <translation id="1902576642799138955">Takdang Petsa ng Pagkakabisa</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{I-mute ang tab}one{I-mute ang mga tab}other{I-mute ang mga tab}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Kasalukuyang incognito na session (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Mga header at footer</translation>
 <translation id="2322318151094136999">Magtanong kapag gustong i-access ng isang site ang mga serial port (inirerekomenda)</translation>
+<translation id="2325444234681128157">Tandaan ang password</translation>
 <translation id="2326931316514688470">I-&amp;reload ang app</translation>
 <translation id="2327492829706409234">Paganahin ang app</translation>
 <translation id="2329597144923131178">Mag-sign in upang makuha ang iyong mga bookmark, history, password at ibang mga setting sa lahat ng iyong device.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Magdagdag ng query param sa URL upang i-auto-refresh ang pahina: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Hitsura</translation>
 <translation id="2433836460518180625">I-unlock lang ang device</translation>
+<translation id="2434449159125086437">Hindi na-set up ang printer. Pakisuri ang configuration at subukang muli.</translation>
 <translation id="2435248616906486374">Nadiskonekta ang network</translation>
 <translation id="2435457462613246316">Ipakita ang password</translation>
 <translation id="2436186046335138073">Papayagan ang <ph name="HANDLER_HOSTNAME" /> na buksan ang lahat ng link ng <ph name="PROTOCOL" />?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64-encoded ASCII, certificate chain</translation>
 <translation id="2653033005692233957">Hindi nahanap</translation>
 <translation id="2653266418988778031">Kapag nagtanggal ka ng certificate ng Certification Authority (CA), hindi na pagkakatiwalaan ng iyong browser ang anumang mga certificate na ibinigay ng CA na iyon.</translation>
+<translation id="2653275834716714682">Kapalit ng Text</translation>
 <translation id="2653659639078652383">Isumite</translation>
 <translation id="265390580714150011">Field Value</translation>
 <translation id="2654166010170466751">Payagan ang mga site na mag-install ng mga tagapangasiwa ng pagbabayad</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Isang mabilis, simple at secure na web browser na ginawa para sa modernong web.</translation>
 <translation id="2949289451367477459">Gamitin ang lokasyon. Payagan ang mga app at serbisyong may pahintulot sa lokasyon na gamitin ang lokasyon ng device na ito. Ang Google ay maaaring pana-panahong mangolekta ng data ng lokasyon at gamitin ang data na ito nang anonymous para maging mas tumpak ang lokasyon at ang mga serbisyong batay sa lokasyon. <ph name="BEGIN_LINK1" />Matuto Pa<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Babala sa extension ng pack</translation>
+<translation id="2959842337402130152">Hindi ma-restore dahil kulang ang storage space. Magbakante ng <ph name="SPACE_REQUIRED" /> sa device at subukang muli.</translation>
 <translation id="296026337010986570">Tapos na! Naalis na ang mapanganib na software. Para i-on muli ang mga extension, bisitahin ang &lt;a href="chrome://extensions"&gt;Mga Extension&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ibinigay ang extension)</translation>
 <translation id="2961695502793809356">I-click upang sumulong, pindutin nang matagal upang makita ang history</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">Kumpleto na ang pag-activate</translation>
 <translation id="3454213325559396544">Ito ang huling pag-update ng software at seguridad para sa ganitong <ph name="DEVICE_TYPE" />. Para makakuha ng mga update sa hinaharap, mag-upgrade sa mas bagong modelo.</translation>
 <translation id="345693547134384690">Buksan ang &amp;imahe sa bagong tab</translation>
-<translation id="3457500881955698515">Humihingi kaagad ang iyong kumpanya o organisasyon ng update sa device na ito</translation>
 <translation id="3459509316159669723">Pagpi-print</translation>
 <translation id="3459697287128633276">Upang i-enable ang iyong account na i-access ang Google Play Store, paki-authenticate gamit ang Identity Provider mo.</translation>
 <translation id="3459774175445953971">Huling binago:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">Pumili ng isa pang folder...</translation>
 <translation id="3967822245660637423">Tapos na ang pag-download</translation>
 <translation id="3967919079500697218">Na-disable ng iyong administrator ang kakayahang kumuha ng mga screenshot.</translation>
+<translation id="3969092967100188979">Naka-on, roaming</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">Kinakalkula...</translation>
 <translation id="3975565978598857337">Hindi nagawang makipag-ugnayan sa server para sa realm</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">Mga naka-save na fingerprint</translation>
 <translation id="407173827865827707">Sa pag-click</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{I-unpin ang tab}one{I-unpin ang mga tab}other{I-unpin ang mga tab}}</translation>
+<translation id="4072805772816336153">Subukang muli sa ibang pagkakataon</translation>
 <translation id="4074900173531346617">Certificate ng Email Signer</translation>
 <translation id="407520071244661467">Scale</translation>
 <translation id="4075639477629295004">Hindi ma-cast ang <ph name="FILE_NAME" />.</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">Malaki</translation>
 <translation id="4209251085232852247">Naka-off</translation>
 <translation id="4209464433672152343"><ph name="BEGIN_LINK_HELP" />Ipapadala sa Google<ph name="END_LINK_HELP" /> ang mga dokumento para ihanda ang mga ito sa pag-print. Tingnan, i-edit, at pamahalaan ang iyong mga printer at history ng printer sa <ph name="BEGIN_LINK_DASHBOARD" />dashboard ng Google Cloud Print<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Dina-download ang virtual machine</translation>
 <translation id="421182450098841253">&amp;Ipakita ang Bookmarks Bar</translation>
 <translation id="4211851069413100178">Magpadala ng data ng paggamit at diagnostic na data. Tumulong sa pagpapaganda ng iyong karanasan sa Android sa pamamagitan ng awtomatikong pagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito. Maaaring piliin ng may-aring magpadala ng diagnostic na data at data ng paggamit para sa device na ito sa Google. Kung naka-on ang iyong karagdagang setting ng Aktibidad sa Web at App, maaaring ma-save ang data na ito sa Google account mo. <ph name="BEGIN_LINK2" />Matuto Pa<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">I-export</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491">Nagbabahagi ng window ang <ph name="APP_NAME" />.</translation>
 <translation id="4364830672918311045">Ipakita ang mga notification</translation>
-<translation id="4365673000813822030">Oops, tumigil sa paggana ang Sync.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> sa <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Hindi nagtutugma ang inilagay mong email at password</translation>
 <translation id="437184764829821926">Mga advanced na setting ng font</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">Kumokonekta...</translation>
 <translation id="4378556263712303865">Requisition ng device</translation>
 <translation id="4380648069038809855">Pumasok sa full screen</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 pang account}one{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> pang account}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> pang account}}</translation>
 <translation id="4384312707950789900">Idagdag sa mga gustong network</translation>
 <translation id="4384652540891215547">I-activate ang extension</translation>
 <translation id="438503109373656455">Petra</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">Mayroon kang mga certificate sa file na tutukoy sa mga server na ito</translation>
 <translation id="4598556348158889687">Pamamahala sa storage</translation>
 <translation id="4598776695426288251">Available ang Wi-Fi sa pamamagitan ng maraming device</translation>
+<translation id="4599134080475764833">Handa nang gamitin ang Plugin VM</translation>
 <translation id="4602466770786743961">Palaging payagan ang <ph name="HOST" /> na i-access ang iyong camera at mikropono</translation>
 <translation id="4608500690299898628">&amp;Hanapin...</translation>
 <translation id="4608520674724523647">Paglalarawan ng matagumpay na pag-enroll</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">Ibahagi ang bookmark na ito sa iyong iPhone</translation>
 <translation id="4663373278480897665">Pinapayagan ang camera</translation>
 <translation id="4664482161435122549">Error sa Pag-export ng PKCS #12</translation>
+<translation id="4664736447097490764">I-edit ang file ng configuration ng Kerberos dito.</translation>
 <translation id="4665014895760275686">Manufacturer</translation>
 <translation id="4665446389743427678">Ide-delete ang lahat ng data na naka-store sa <ph name="SITE" />.</translation>
 <translation id="4668721319092543482">I-click upang i-enable ang <ph name="PLUGIN_NAME" /></translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">Ini-install ang update sa OS</translation>
 <translation id="4830573902900904548">Hindi makakonekta sa Internet ang iyong <ph name="DEVICE_TYPE" /> gamit ang <ph name="NETWORK_NAME" />. Mangyaring pumili ng ibang network. <ph name="LEARN_MORE_LINK_START" />Matuto pa<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Walang access ang Chrome sa hiniling na mapagkukunan.</translation>
-<translation id="4835836146030131423">Error sa pag-sign in.</translation>
 <translation id="4837926214103741331">Wala kang pahintulot na gamitin ang device na ito. Mangyaring makipag-ugnayan sa may-ari ng device upang makakuha ng pahintulot sa pag-sign in.</translation>
 <translation id="4837952862063191349">Upang i-unlock at ibalik ang iyong lokal na data, pakilagay ang iyong lumang password sa <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Pinapayagan ang read access sa clipboard</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">I-clear ang kopya</translation>
 <translation id="5030338702439866405">Ibinigay Ni</translation>
 <translation id="5033266061063942743">Mga geometric na hugis</translation>
-<translation id="5033619151015094114">Humihingi ang iyong kumpanya o organisasyon ng update sa device na ito</translation>
 <translation id="503498442187459473">Gustong gamitin ng <ph name="HOST" /> ang iyong camera at mikropono</translation>
 <translation id="5036662165765606524">Huwag payagan ang anumang site na awtomatikong mag-download ng maraming file</translation>
 <translation id="5037676449506322593">Select All</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">Muling mag-sign in</translation>
 <translation id="5256861893479663409">Sa Lahat ng Site</translation>
 <translation id="5258992782919386492">I-install sa device na ito</translation>
+<translation id="5260334392110301220">Mga Smart na Panipi</translation>
 <translation id="5260508466980570042">Paumanhin, hindi ma-verify ang iyong email o password. Pakisubukang muli.</translation>
 <translation id="5261683757250193089">Buksan sa Web Store</translation>
 <translation id="5264148714798105376">Maaari itong abutin nang isang minuto o higit pa.</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">Pumapasok bilang Bisita.</translation>
 <translation id="5301954838959518834">OK, nakuha ko</translation>
 <translation id="5302048478445481009">Wika</translation>
+<translation id="5302932258331363306">Ipakita ang Mga Kahalili</translation>
 <translation id="5305688511332277257">Walang naka-install</translation>
 <translation id="5307030433605830021">Hindi sinusuportahan ang source</translation>
 <translation id="5308380583665731573">Kumonekta</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">Di-wasto</translation>
 <translation id="5457459357461771897">Basahin at i-delete ang mga larawan, musika at iba pang media sa iyong computer</translation>
 <translation id="5457599981699367932">Mag-browse bilang Bisita</translation>
+<translation id="5457991019809708398">Naka-on, hindi roaming</translation>
 <translation id="5458998536542739734">Mga tala sa lock screen</translation>
 <translation id="5463275305984126951">Index ng <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Menu na naglalaman ng mga nakatagong bookmark</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">Linux Virtual Machine: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Naputol o natanggal ang patutunguhang file simula noong huling pag-download.</translation>
 <translation id="5801568494490449797">Mga Kagustuhan</translation>
+<translation id="5804175651771201311">Naka-off ang roaming</translation>
 <translation id="5804241973901381774">Mga Pahintulot</translation>
 <translation id="5805697420284793859">Window manager</translation>
 <translation id="5811750797187914944">Handa na ang lahat</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">Hindi na sinusuportahan.</translation>
 <translation id="6317369057005134371">Hinihintay ang application window...</translation>
 <translation id="6318407754858604988">Nagsimula ang pag-download</translation>
+<translation id="6318944945640833942">Walang matukoy na printer. Pakilagay muli ang address ng printer.</translation>
 <translation id="6322653941595359182">Magpadala at makatanggap ng mga text message mula sa iyong Chromebook</translation>
 <translation id="6324916366299863871">I-edit ang shortcut</translation>
 <translation id="6325191661371220117">I-disable ang awtomatikong paglulunsad</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">Serbisyo sa UI</translation>
 <translation id="6725206449694821596">Internet Printing Protocol (IPP)</translation>
 <translation id="67269783048918309">Magpadala ng data ng paggamit at diagnostic na data. Sa kasalukuyan, ang device na ito ay awtomatikong nagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google account. <ph name="BEGIN_LINK2" />Matuto Pa<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Nakakonekta, <ph name="BATTERY_PERCENTAGE" />% ang baterya</translation>
 <translation id="6732801395666424405">Hindi na-load ang mga certificate</translation>
 <translation id="6732900235521116609">Hindi maalis ang shortcut</translation>
 <translation id="6735304988756581115">Magpakita ng cookies at iba pang data ng site...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">Bisikleta</translation>
 <translation id="6877460900831874810">I-enable ang pag-playback ng media ng Chrome sa lock screen</translation>
 <translation id="6878422606530379992">Pinapayagan ang mga sensor</translation>
+<translation id="6878665006737889642">Subukang i-install muli</translation>
 <translation id="6880587130513028875">Hinarangan ang mga larawan sa pahinang ito.</translation>
 <translation id="6883319974225028188">Oops!  Hindi na-save ng system ang configuration ng device.</translation>
 <translation id="6885771755599377173">Preview ng Impormasyon ng System</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">Hindi makakonekta sa server ng pag-sync. Muling sinusubukan...</translation>
 <translation id="7121362699166175603">Kini-clear ang history at mga autocompletion sa address bar. Maaaring may iba pang anyo ng history ng pag-browse ang iyong Google Account sa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Magpadala ng data ng paggamit at diagnostic na data. Sa kasalukuyan, ang device na ito ay awtomatikong nagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google Account. <ph name="BEGIN_LINK1" />Matuto Pa<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Mga Smart na Gitling</translation>
 <translation id="7123360114020465152">Hindi na sinusuportahan</translation>
 <translation id="7124929488592184705">Error sa pag-print ng <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Kasaysayan ng pag-download</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413">Full screen na ngayon ang <ph name="FULLSCREEN_ORIGIN" />.</translation>
 <translation id="7340650977506865820">Ibinabahagi ng site ang iyong screen</translation>
 <translation id="7341834142292923918">Gusto ng access sa site na ito</translation>
+<translation id="7344488796804562294">Advanced na configuration ng Kerberos</translation>
 <translation id="7345706641791090287">Kumpirmahin ang iyong password</translation>
 <translation id="7346909386216857016">Ok, nakuha ko</translation>
 <translation id="7347751611463936647">Upang gamitin ang extension na ito, i-type ang "<ph name="EXTENSION_KEYWORD" />", pagkatapos ay ang TAB, pagkatapos ay ang iyong command o paghahanap.</translation>
@@ -4758,6 +4777,7 @@
 <translation id="8227119283605456246">Mag-attach ng file</translation>
 <translation id="8230134520748321204">I-save ang password para sa <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Pakitulungan ang aming mga engineer na ayusin ang problemang ito. Sabihin sa amin kung ano ang nangyari bago mo nakuha ang mensahe ng error sa profile:</translation>
+<translation id="8236917170563564587">Ibahagi sa halip ang tab na ito</translation>
 <translation id="8241040075392580210">Makulimlim</translation>
 <translation id="8241806945692107836">Tinutukoy ang configuration ng device...</translation>
 <translation id="8241868517363889229">Basahin at baguhin ang iyong mga bookmark</translation>
@@ -4769,6 +4789,7 @@
 <translation id="8249048954461686687">Folder ng OEM</translation>
 <translation id="8249615410597138718">Ipadala sa Iyong Mga Device</translation>
 <translation id="8249672078237421304">Mag-alok na isalin ang mga page na wala sa wikang nababasa mo</translation>
+<translation id="8251441930213048644">I-refresh ngayon</translation>
 <translation id="8251578425305135684">Naalis ang thumbnail.</translation>
 <translation id="8252569384384439529">Ina-upload...</translation>
 <translation id="8253198102038551905">I-click '+' upang makita ang mga property ng network</translation>
@@ -5147,6 +5168,7 @@
 <translation id="8827752199525959199">Higit pang pagkilos, password para sa <ph name="USERNAME" /> sa <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Huwag payagan ang anumang site na tumuklas ng mga Bluetooth device na nasa malapit</translation>
 <translation id="8828933418460119530">Pangalan ng DNS</translation>
+<translation id="883062543841130884">Mga Kahalili</translation>
 <translation id="8830796635868321089">Nabigo ang pagsusuri sa update gamit ang mga kasalukuyang setting ng proxy. Mangyaring isaayos ang iyong <ph name="PROXY_SETTINGS_LINK_START" />mga setting ng proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Buksan ang mga setting ng Mga Extension</translation>
 <translation id="8834039744648160717">Ang configuration ng network ay kinokontrol ng <ph name="USER_EMAIL" />.</translation>
@@ -5167,6 +5189,7 @@
 <translation id="8862003515646449717">Lumipat sa isang mabilis na browser</translation>
 <translation id="8863753581171631212">Buksan ang link sa bagong <ph name="APP" /></translation>
 <translation id="8864055848767439877">Ibinabahagi ang <ph name="TAB_NAME" /> sa <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512">Inalis ang <ph name="EMAIL" /> sa device na ito</translation>
 <translation id="8868626022555786497">Ginagamit</translation>
 <translation id="8870318296973696995">Home page</translation>
 <translation id="8870413625673593573">Recently Closed</translation>
@@ -5176,7 +5199,6 @@
 </translation>
 <translation id="8872155268274985541">May nahanap na di-wastong manifest file ng external na pag-update ng Kiosk. Hindi na-update ang Kiosk app. Mangyaring alisin ang USB stick.</translation>
 <translation id="8874184842967597500">Hindi nakakonekta</translation>
-<translation id="887550310442005096">Hinihiling ng iyong kumpanya o organisasyon na i-update mo ang device na ito</translation>
 <translation id="8876307312329369159">Hindi mababago ang setting na ito sa demo session.</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Ipakita Bilang Tab</translation>
@@ -5291,6 +5313,7 @@
 <translation id="9044646465488564462">Nabigong kumonekta sa network: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Ipinapadala sa Google ang address ng web ng page na sinusubukan mong puntahan</translation>
 <translation id="9046895021617826162">Nabigo ang pagkonekta</translation>
+<translation id="9047391224416514812">Mayroon nang account na may ganitong username</translation>
 <translation id="9050666287014529139">Passphrase</translation>
 <translation id="9052208328806230490">Inirehistro mo ang iyong mga printer sa <ph name="CLOUD_PRINT_NAME" /> gamit ang account na <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">Patuloy na i-block</translation>
@@ -5338,6 +5361,7 @@
 <translation id="9121814364785106365">Binuksan bilang na-pin na tab</translation>
 <translation id="9124003689441359348">Lalabas dito ang mga na-save na password</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ang natitira)</translation>
+<translation id="9128317794749765148">Hindi makumpleto ang pag-set up</translation>
 <translation id="9128870381267983090">Kumonekta sa network</translation>
 <translation id="9130015405878219958">Di-wastong mode ang ipinasok.</translation>
 <translation id="9131487537093447019">Magpadala ng mga mensahe sa at makatanggap ng mga mensahe mula sa mga Bluetooth device.</translation>
@@ -5406,6 +5430,7 @@
 <translation id="939598580284253335">Ilagay ang passphrase</translation>
 <translation id="939736085109172342">Bagong folder</translation>
 <translation id="942532530371314860">Nagbabahagi ng tab ng Chrome at audio ang <ph name="APP_NAME" />.</translation>
+<translation id="945166830402967374">Makipag-ugnayan sa admin ng device ng iyong organisasyon</translation>
 <translation id="945522503751344254">Magpadala ng feedback...</translation>
 <translation id="947329552760389097">&amp;Siyasatin ang Mga Element</translation>
 <translation id="952992212772159698">Hindi na-activate</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index dc3ea48..fcd6948 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Activation effectuée</translation>
 <translation id="3454213325559396544">C'est la dernière mise à jour logicielle de sécurité automatique pour votre <ph name="DEVICE_TYPE" />. Pour bénéficier des futures mises à jour, passez à un modèle plus récent.</translation>
 <translation id="345693547134384690">Ouvrir l'&amp;image dans un nouvel onglet</translation>
-<translation id="3457500881955698515">Votre entreprise ou organisation exige que cet appareil soit mis à jour immédiatement</translation>
 <translation id="3459509316159669723">Impression</translation>
 <translation id="3459697287128633276">Pour accéder au Google Play Store avec votre compte, authentifiez-vous à l'aide de votre fournisseur d'identité.</translation>
 <translation id="3459774175445953971">Dernière modification :</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation>
 <translation id="4364830672918311045">Afficher les notifications</translation>
-<translation id="4365673000813822030">Petit problème… La synchronisation s'est arrêtée.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> avec <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">L'adresse e-mail et le mot de passe saisis ne correspondent pas.</translation>
 <translation id="437184764829821926">Paramètres de police avancés</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Installation de la mise à jour du système d'exploitation</translation>
 <translation id="4830573902900904548">Votre <ph name="DEVICE_TYPE" /> ne parvient pas à se connecter à Internet via le réseau <ph name="NETWORK_NAME" />. Veuillez sélectionner un autre réseau. <ph name="LEARN_MORE_LINK_START" />En savoir plus<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome n'a pas accès à la ressource demandée.</translation>
-<translation id="4835836146030131423">Erreur lors de la connexion</translation>
 <translation id="4837926214103741331">Vous n'êtes pas autorisé à utiliser cet appareil. Pour obtenir l'autorisation de vous y connecter, veuillez contacter son propriétaire.</translation>
 <translation id="4837952862063191349">Pour déverrouiller et restaurer vos données locales, veuillez saisir l'ancien mot de passe de votre <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Accès en lecture au presse-papiers autorisé</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Effacer la copie</translation>
 <translation id="5030338702439866405">Émis par</translation>
 <translation id="5033266061063942743">Formes géométriques</translation>
-<translation id="5033619151015094114">Votre entreprise ou organisation exige que cet appareil soit mis à jour</translation>
 <translation id="503498442187459473"><ph name="HOST" /> souhaite utiliser votre appareil photo et votre micro</translation>
 <translation id="5036662165765606524">N'autoriser le téléchargement automatique de plusieurs fichiers pour aucun site</translation>
 <translation id="5037676449506322593">Tout sélectionner</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">Paramètres du contenu</translation>
 <translation id="8872155268274985541">Fichier manifeste de mise à jour externe de kiosque non valide. Échec de la mise à jour de l'application kiosque. Veuillez débrancher la clé USB.</translation>
 <translation id="8874184842967597500">Non connecté</translation>
-<translation id="887550310442005096">Votre entreprise ou organisation vous demande de mettre à jour cet appareil</translation>
 <translation id="8876307312329369159">Impossible de modifier ce paramètre dans une session de démonstration.</translation>
 <translation id="8877448029301136595">[répertoire parent]</translation>
 <translation id="8879284080359814990">Afficher dan&amp;s un onglet</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 31aa5487..fb64a0a 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1617,7 +1617,6 @@
 <translation id="3454157711543303649">સક્રિયતા પૂર્ણ</translation>
 <translation id="3454213325559396544">આ <ph name="DEVICE_TYPE" /> માટે આ છેલ્લું ઑટોમૅટિક સૉફ્ટવેર અને સુરક્ષા અપડેટ છે. ભાવિ અપડેટ મેળવવા માટે, નવા મૉડલ પર અપગ્રેડ કરો.</translation>
 <translation id="345693547134384690">નવા ટૅબમાં &amp;છબી ખોલો</translation>
-<translation id="3457500881955698515">તમારી કંપની અથવા સંસ્થા માટે આ ડિવાઇસનું અત્યારે જ એક અપડેટ જરૂરી છે</translation>
 <translation id="3459509316159669723">છાપવું</translation>
 <translation id="3459697287128633276">તમારું એકાઉન્ટ Google Play સ્ટોરને ઍક્સેસ કરી શકે તે માટે, કૃપા કરીને તમારા ઓળખ પ્રદાતા દ્વારા પ્રમાણિત થાઓ.</translation>
 <translation id="3459774175445953971">છેલ્લું સંપાદન:</translation>
@@ -2234,7 +2233,6 @@
 <translation id="4364327530094270451">ટેટી</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, એક વિંડો શેર કરી રહી છે.</translation>
 <translation id="4364830672918311045">નોટિફિકેશન બતાવો</translation>
-<translation id="4365673000813822030">ઊફ્ફ, સમન્વયન કામ કરતું બંધ થઈ ગયું છે. </translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> સાથે <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">તમે દાખલ કરેલ ઇમેઇલ અને પાસવર્ડ મેળ ખાતા નથી</translation>
 <translation id="437184764829821926">વિગતવાર ફોન્ટ સેટિંગ્સ</translation>
@@ -2516,7 +2514,6 @@
 <translation id="4830502475412647084">OS અપડેટ ઇન્સ્ટૉલ કરી રહ્યા છીએ</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> નો ઉપયોગ કરીને ઇન્ટરનેટથી કનેક્ટ થવામાં તમારી <ph name="DEVICE_TYPE" /> અસમર્થ છે. કૃપા કરીને બીજું નેટવર્ક પસંદ કરો. <ph name="LEARN_MORE_LINK_START" />વધુ જાણો<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome ને વિનંતી કરેલ સંસાધનની ઍક્સેસ નથી.</translation>
-<translation id="4835836146030131423">સાઇનિંગ ઇન કરવામાં ભૂલ.</translation>
 <translation id="4837926214103741331">તમે આ ઉપકરણ વાપરવા માટે અધિકૃત નથી. કૃપા કરીને સાઇન ઇન કરવાની પરવાનગી માટે ઉપકરણના માલિકનો સંપર્ક કરો.</translation>
 <translation id="4837952862063191349">તમારો સ્થાનિક ડેટા અનલૉક અને પુનઃસ્થાપિત કરવા માટે, કૃપા કરીને તમારા જૂના <ph name="DEVICE_TYPE" /> નો પાસવર્ડ દાખલ કરો.</translation>
 <translation id="4838836835474292213">ક્લિપબોર્ડ વાંચવાના ઍક્સેસની મંજૂરી આપેલ છે</translation>
@@ -2651,7 +2648,6 @@
 <translation id="5029568752722684782">કૉપિ સાફ કરો</translation>
 <translation id="5030338702439866405">આના દ્વારા રજૂ કરાયું</translation>
 <translation id="5033266061063942743">ભૌમિતિક આકાર</translation>
-<translation id="5033619151015094114">તમારી કંપની અથવા સંસ્થા માટે આ ડિવાઇસનું એક અપડેટ જરૂરી છે</translation>
 <translation id="503498442187459473"><ph name="HOST" /> તમારા કૅમેરા અને માઇક્રોફોનનો ઉપયોગ કરવા માગે છે</translation>
 <translation id="5036662165765606524">કોઈપણ સાઇટને આપમેળે બહુવિધ ફાઇલો ડાઉનલોડ કરવાની મંજૂરી આપશો નહીં</translation>
 <translation id="5037676449506322593">બધા પસંદ કરો</translation>
@@ -5193,7 +5189,6 @@
 <translation id="8871974300055371298">કન્ટેન્ટ સેટિંગ</translation>
 <translation id="8872155268274985541">અમાન્ય કિઓસ્ક બાહ્ય અપડેટ મેનિફેસ્ટ ફાઇલ મળી. કિઓસ્ક ઍપ્લિકેશન અપડેટ કરવામાં નિષ્ફળ થયાં. કૃપા કરીને USB સ્ટીક દૂર કરો.</translation>
 <translation id="8874184842967597500">કનેક્ટેડ નથી</translation>
-<translation id="887550310442005096">તમારી કંપની અથવા સંસ્થાએ તમને આ ડિવાઇસ અપડેટ કરવા માટે કહ્યું છે</translation>
 <translation id="8876307312329369159">ડેમો સત્રમાં આ સેટિંગ બદલી શકાતી નથી.</translation>
 <translation id="8877448029301136595">[માતાપિતાની ડિરેક્ટરી]</translation>
 <translation id="8879284080359814990">ટૅબ તરીકે &amp;બતાવો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index bbfa0a4..bae265f 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">डेमो मोड डिवाइस के लाइसेंस में कोई परेशानी हुई.</translation>
 <translation id="126710816202626562">अनुवाद की भाषा:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">बेहतर कॉन्फ़िगरेशन</translation>
 <translation id="1272079795634619415">रोकें</translation>
 <translation id="1272978324304772054">यह उपयोगकर्ता खाता उस डोमेन से संबंधित नहीं है जिसमें डिवाइस का नाम दर्ज है.  अगर आप किसी दूसरे डोमेन में नाम दर्ज करना चाहते हैं तो, आपको पहले डिवाइस बहाल करना होगा.</translation>
 <translation id="1274977772557788323">Adobe Flash Player जगह सेटिंग</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> चयनित</translation>
 <translation id="1444628761356461360">यह सेटिंग डिवाइस मालिक, <ph name="OWNER_EMAIL" /> द्वारा प्रबंधित है.</translation>
 <translation id="144518587530125858">थीम के लिए '<ph name="IMAGE_PATH" />' को लोड नहीं कर सका.</translation>
+<translation id="1445693676523799095">इसमें कुछ समय लग सकता है</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फ़ाइल</translation>
 <translation id="1451917004835509682">पर्यवेक्षित व्‍यक्‍ति जोड़ें</translation>
 <translation id="1454223536435069390">स्क्रीन&amp;शॉट लें</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">इसे केवल <ph name="CHROME_WEB_STORE" /> से ही जोड़ा जा सकता है</translation>
 <translation id="1877520246462554164">प्रमाणीकरण टोकन नहीं पा सके. दोबारा कोशिश करने के लिए, कृपया साइन आउट करें और फिर से साइन इन करें.</translation>
 <translation id="1877860345998737529">स्विच की कार्रवाई तय करना</translation>
+<translation id="1878541307036593717">अनुमतियां सेट अप करें</translation>
 <translation id="1879000426787380528">इस रूप में साइन इन करें</translation>
 <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" मिटाएं?</translation>
 <translation id="1886996562706621347">साइटों को प्रोटोकॉल के लिए डिफ़ॉल्‍ट हैंडलर बनने के लिए पूछने देने की अनुमति दें (सुझाव)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> बाकी है</translation>
 <translation id="1895658205118569222">बंद करें</translation>
 <translation id="1895934970388272448">यह प्रोसेस पूरा करने के लिए आपको अपने प्रिंटर पर रजिस्ट्रेशन की पुष्टि करनी होगी - इसे अभी चुनें.</translation>
+<translation id="1899826437968063457">प्लग इन VM को चालू होने के लिए अनुमति चाहिए</translation>
 <translation id="1901303067676059328">&amp;सभी को चुनें</translation>
 <translation id="1902576642799138955">मान्यता अवधि</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{टैब म्यूट करें}one{टैब म्यूट करें}other{टैब म्यूट करें}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">वर्तमान गुप्त सत्र (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">शीर्षलेख और पादलेख</translation>
 <translation id="2322318151094136999">जब कोई साइट सीरियल पाेर्ट (सुझाया गया) एक्सेस करना चाहे, तो इसके लिए पूछें</translation>
+<translation id="2325444234681128157">पासवर्ड याद रखें</translation>
 <translation id="2326931316514688470">और ऐप्लिकेशन रीलोड करें</translation>
 <translation id="2327492829706409234">ऐप्लिकेशन चालू करें</translation>
 <translation id="2329597144923131178">अपने सभी डिवाइस पर बुकमार्क, इतिहास, पासवर्ड और दूसरी तरह की सेटिंग पाने के लिए साइन इन करें</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">पेज को अपने आप रीफ्रेश करने के लिए URL में क्वेरी पैरामीटर जोड़ें: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">प्रकटन</translation>
 <translation id="2433836460518180625">सिर्फ़ डिवाइस अनलॉक करें</translation>
+<translation id="2434449159125086437">प्रिंटर सेट अप नहीं किया जा सका. कृपया कॉन्फ़िगरेशन की जाँच करें और फिर से कोशिश करें.</translation>
 <translation id="2435248616906486374">नेटवर्क डिस्‍कनेक्‍ट है</translation>
 <translation id="2435457462613246316">पासवर्ड दिखाएं</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> को सभी <ph name="PROTOCOL" /> लिंक खोलने दें?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64 में एन्कोड किया गया ASCII प्रमाणपत्र चेन</translation>
 <translation id="2653033005692233957">नहीं खोजा जा सका</translation>
 <translation id="2653266418988778031">अगर आप किसी सर्टिफ़िकेशन अधिकारी (CA) प्रमाणपत्र को मिटाते हैं, तो आपका ब्राउज़र ऐसे किसी भी प्रमाणपत्र पर भरोसा नहीं करेगा, जिसे CA ने जारी किया है.</translation>
+<translation id="2653275834716714682">टेक्स्ट में बदलाव</translation>
 <translation id="2653659639078652383">सबमिट करें</translation>
 <translation id="265390580714150011">फ़ील्ड मान</translation>
 <translation id="2654166010170466751">साइटों को भुगतान हैंडलर इंस्टॉल करने की अनुमति दें</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Chrome, आधुनिक वेब के लिए बनाया गया एक तेज़, आसान, और सुरक्षि‍त वेब ब्राउज़र है.</translation>
 <translation id="2949289451367477459">जगह की जानकारी का इस्तेमाल करें. जगह की जानकारी देखने की मंज़ूरी वाले ऐप्लिकेशन और सेवाओं को इस डिवाइस की जगह की जानकारी का इस्तेमाल करने दें. Google, जगह की जानकारी को ज़्यादा बेहतर बनाने और उससे जुड़ी सेवाओं में सुधार करने के लिए समय-समय पर जगह की जानकारी का डेटा इकट्ठा कर सकता है. साथ ही, वह आपकी पहचान ज़ाहिर किए बिना इस डेटा का इस्तेमाल भी कर सकता है. <ph name="BEGIN_LINK1" />ज़्यादा जानें<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">पैक एक्‍सटेंशन चेतावनी</translation>
+<translation id="2959842337402130152">स्टोरेज के लिए कम जगह बची है, इसलिए कंटेनर बहाल नहीं किया जा सका. डिवाइस से <ph name="SPACE_REQUIRED" /> खाली करें और फिर से कोशिश करें.</translation>
 <translation id="296026337010986570">हो गया! नुकसान पहुंचाने वाला सॉफ़्टवेयर हटा दिया गया है. एक्सटेंशन वापस चालू करने के लिए &lt;a href="chrome://extensions"&gt;एक्सटेंशन&lt;/a&gt; पर जाएं.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (एक्सटेंशन प्रदान किया गया)</translation>
 <translation id="2961695502793809356">आगे जाने के लिए क्लिक करें, इतिहास देखने के लिए दबाकर रखें</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">चालू करना पूरा हुआ</translation>
 <translation id="3454213325559396544">यह इस <ph name="DEVICE_TYPE" /> के लिए अपने आप होने वाला आखिरी साॅफ़्टवेयर और सुरक्षा अपडेट था. आने वाले समय में और अपडेट पाने के लिए, नए माॅडल पर अपग्रेड करें.</translation>
 <translation id="345693547134384690">नए टैब में &amp;छवि खोलें</translation>
-<translation id="3457500881955698515">आपकी कंपनी या संगठन को इस डिवाइस के अपडेट की तुरंत ज़रुरत है</translation>
 <translation id="3459509316159669723">प्रिंट करना</translation>
 <translation id="3459697287128633276">Google Play स्टोर एक्सेस करने को अपना खाता चालू करने के लिए, कृपया अपनी पहचान देने वाली सेवा के ज़रिए पुष्टि करें.</translation>
 <translation id="3459774175445953971">अंतिम बार संशोधित:</translation>
@@ -1989,6 +1996,7 @@
 <translation id="3966072572894326936">कोई अन्य फ़ोल्डर चुनें</translation>
 <translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation>
 <translation id="3967919079500697218">स्क्रीनशॉट लेने की क्षमता को आपके व्यवस्थापक द्वारा अक्षम कर दिया गया है.</translation>
+<translation id="3969092967100188979">चालू है, रोमिंग में है</translation>
 <translation id="3970114302595058915">आईडी</translation>
 <translation id="397105322502079400">गणना की जा रही है...</translation>
 <translation id="3975565978598857337">दिए गए क्षेत्र के लिए सर्वर से संपर्क नहीं हो पाया</translation>
@@ -2050,6 +2058,7 @@
 <translation id="4068776064906523561">सहेजे गए फ़िंगरप्रिंट</translation>
 <translation id="407173827865827707">क्लिक करने पर</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{टैब बड़ा करें}one{टैब बड़े करें}other{टैब बड़े करें}}</translation>
+<translation id="4072805772816336153">कुछ समय बाद कोशिश करें</translation>
 <translation id="4074900173531346617">ईमेल हस्ताक्षरकर्ता प्रमाणपत्र</translation>
 <translation id="407520071244661467">स्केल</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> कास्ट नहीं हो पा रहा है.</translation>
@@ -2138,6 +2147,7 @@
 <translation id="4209092469652827314">बड़ा</translation>
 <translation id="4209251085232852247">सूचनाएं बंद की गई हैं</translation>
 <translation id="4209464433672152343">दस्तावेज़ <ph name="BEGIN_LINK_HELP" />Google को भेजे जाते हैं<ph name="END_LINK_HELP" /> ताकि उन्हें प्रिंट करने के लिए तैयार किया जा सके. <ph name="BEGIN_LINK_DASHBOARD" />Google क्लाउड प्रिंट डैशबोर्ड<ph name="END_LINK_DASHBOARD" /> पर जाकर अपना प्रिंटर और प्रिंटर इतिहास देखें, उसमें बदलाव करें और उसे प्रबंधित करें.</translation>
+<translation id="4210048056321123003">वर्चुअल मशीन डाउनलोड हो रही है</translation>
 <translation id="421182450098841253">बुकमार्क बार &amp;दिखाएं</translation>
 <translation id="4211851069413100178">इस्तेमाल और निदान से जुड़ा डेटा भेजें. Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेजकर, अपने Android अनुभव को बेहतर बनाने में मदद करें. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. यह <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> डिवाइस के मालिक ने लागू की है. डिवाइस का मालिक यह चुन सकता है कि निदान और इस डिवाइस के इस्तेमाल से जुड़ा डेटा Google को भेजना है. अगर आपकी दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा आपके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK2" />ज़्यादा जानें<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">निर्यात करें</translation>
@@ -2226,7 +2236,6 @@
 <translation id="4364327530094270451">खरबूजा</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> किसी विंडो को शेयर कर रहा है.</translation>
 <translation id="4364830672918311045">डिसप्ले नोटिफ़िकेशन</translation>
-<translation id="4365673000813822030">ओह, सिंक काम करना बंद कर दिया.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> के ज़रिए <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">  डाले गए ईमेल और पासवर्ड का मिलान नहीं हो रहा</translation>
 <translation id="437184764829821926">बेहतर फ़ॉन्ट सेटिंग</translation>
@@ -2237,6 +2246,7 @@
 <translation id="4378551569595875038">कनेक्ट हो रहा है...</translation>
 <translation id="4378556263712303865">डिवाइस मांग</translation>
 <translation id="4380648069038809855">फ़ुल-स्क्रीन किया गया</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 और खाता}one{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> और खाते}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> और खाते}}</translation>
 <translation id="4384312707950789900">पसंदीदा में जोड़ें</translation>
 <translation id="4384652540891215547">एक्सटेंशन सक्रिय करें</translation>
 <translation id="438503109373656455">साराटोगा</translation>
@@ -2367,6 +2377,7 @@
 <translation id="4596295440756783523">इन सर्वर की पहचान करने वाले प्रमाणपत्र आपके रिकॉर्ड में हैं</translation>
 <translation id="4598556348158889687">डिवाइस की मेमोरी का प्रबंधन</translation>
 <translation id="4598776695426288251">एक से ज़्यादा डिवाइस के ज़रिए वाई-फ़ाई उपलब्ध है</translation>
+<translation id="4599134080475764833">प्लग इन VM इस्तेमाल के लिए तैयार है</translation>
 <translation id="4602466770786743961"><ph name="HOST" /> को अपना कैमरा और माइक्रोफ़ोन हमेशा एक्सेस करने दें</translation>
 <translation id="4608500690299898628">&amp;ढूंढें...</translation>
 <translation id="4608520674724523647">सफल नामांकन का चित्र</translation>
@@ -2404,6 +2415,7 @@
 <translation id="4662788913887017617">इस बुकमार्क को अपने iPhone से शेयर करें</translation>
 <translation id="4663373278480897665">कैमरे की अनुमति है</translation>
 <translation id="4664482161435122549">PKCS #12 निर्यात गड़बड़ी</translation>
+<translation id="4664736447097490764">Kerberos कॉन्फ़िगरेशन फ़ाइल में बदलाव यहां से करें.</translation>
 <translation id="4665014895760275686">निर्माता</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> ने जो भी डेटा सेव किया है उसे मिटा दिया जाएगा.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> को चालू करने के लिए क्लिक करें</translation>
@@ -2505,7 +2517,6 @@
 <translation id="4830502475412647084">OS अपडेट इंस्टॉल किया जा रहा है</translation>
 <translation id="4830573902900904548">आपका <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" /> का उपयोग करके इंटरनेट से कनेक्ट करने में असमर्थ है. कृपया कोई अन्य नेटवर्क चुनें. <ph name="LEARN_MORE_LINK_START" />और जानें<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome के पास अनुरोध किए गए संसाधन का एक्सेस नहीं है.</translation>
-<translation id="4835836146030131423">प्रवेश करने में गड़बड़ी.</translation>
 <translation id="4837926214103741331">आपको इस डिवाइस का इस्तेमाल करने का अधिकार नहीं हैं. कृपया साइन इन की अनुमति के लिए डिवाइस के मालिक से संपर्क करें.</translation>
 <translation id="4837952862063191349">अपने स्थानीय डेटा को अनलॉक और पुनर्स्थापित करने के लिए, कृपया अपना पुराना <ph name="DEVICE_TYPE" /> पासवर्ड डालें.</translation>
 <translation id="4838836835474292213">क्लिपबोर्ड की सामग्री पढ़ने का एक्सेस दिया गया</translation>
@@ -2640,7 +2651,6 @@
 <translation id="5029568752722684782">स्‍पष्‍ट कॉपी</translation>
 <translation id="5030338702439866405">जारीकर्ता</translation>
 <translation id="5033266061063942743">जियोमेट्री (रेखागणित) के आकार</translation>
-<translation id="5033619151015094114">आपकी कंपनी या संगठन को इस डिवाइस के अपडेट की ज़रुरत है</translation>
 <translation id="503498442187459473"><ph name="HOST" /> आपके कैमरा और माइक्रोफ़ोन का उपयोग करना चाहता है</translation>
 <translation id="5036662165765606524">किसी भी साइट को स्वचालित रूप से एकाधिक फ़ाइलें डाउनलोड न करने दें</translation>
 <translation id="5037676449506322593">सभी को चुनें</translation>
@@ -2777,6 +2787,7 @@
 <translation id="5255859108402770436">फिर से साइन इन करें</translation>
 <translation id="5256861893479663409">सभी साइट पर</translation>
 <translation id="5258992782919386492">इस डिवाइस पर इंस्टॉल करें</translation>
+<translation id="5260334392110301220">स्मार्ट कोट</translation>
 <translation id="5260508466980570042">क्षमा करें, आपका ईमेल या पासवर्ड सत्‍यापित नहीं हो सका. कृपया फिर से प्रयास करें.</translation>
 <translation id="5261683757250193089">वेब स्टोर में खोलें</translation>
 <translation id="5264148714798105376">इसमें एक मिनट या कुछ ज़्यादा समय लग सकता है.</translation>
@@ -2811,6 +2822,7 @@
 <translation id="5301751748813680278">अतिथि के रूप में प्रवेश कर रहा है.</translation>
 <translation id="5301954838959518834">ठीक है, समझ लिया</translation>
 <translation id="5302048478445481009">भाषा</translation>
+<translation id="5302932258331363306">विकल्प दिखाएं</translation>
 <translation id="5305688511332277257">कुछ भी इंस्टॉल नहीं है</translation>
 <translation id="5307030433605830021">स्रोत काम नहीं करता है</translation>
 <translation id="5308380583665731573">कनेक्ट करें</translation>
@@ -2910,6 +2922,7 @@
 <translation id="5457113250005438886">अमान्य</translation>
 <translation id="5457459357461771897">अपने कंप्यूटर से फ़ोटो, संगीत और दूसरे मीडिया पढ़ें और मिटाएं</translation>
 <translation id="5457599981699367932">मेहमान के रूप में ब्राउज़ करें</translation>
+<translation id="5457991019809708398">चालू है , रोमिंग में नहीं है</translation>
 <translation id="5458998536542739734">लॉक स्क्रीन नोट</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> का इंडेक्स</translation>
 <translation id="5463856536939868464">मेन्यू में बुकमार्क छुपे हुए हैं</translation>
@@ -3135,6 +3148,7 @@
 <translation id="5799508265798272974">Linux वर्चुअल मशीन: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">अंतिम डाउनलोड के बाद से गंतव्य फ़ाइल छोटी हो गई थी या निकाल दी गई थी.</translation>
 <translation id="5801568494490449797">प्राथमिकताएं</translation>
+<translation id="5804175651771201311">रोमिंग बंद है</translation>
 <translation id="5804241973901381774">अनुमतियां</translation>
 <translation id="5805697420284793859">विंडो मैनेजर</translation>
 <translation id="5811750797187914944">पूरी तरह तैयार है</translation>
@@ -3482,6 +3496,7 @@
 <translation id="6317318380444133405">अब काम नहीं करता है.</translation>
 <translation id="6317369057005134371">ऐप्लिकेशन विंडो की प्रतीक्षा की जा रही है...</translation>
 <translation id="6318407754858604988">डाउनलोड शुरू हो गया</translation>
+<translation id="6318944945640833942">प्रिंटर नहीं मिला. कृपया प्रिंटर का पता फिर से डालें.</translation>
 <translation id="6322653941595359182">अपने Chromebook से मैसेज भेजें और पाएं</translation>
 <translation id="6324916366299863871">शॉर्टकट में बदलाव करें</translation>
 <translation id="6325191661371220117">ऑटो-लॉन्च बंद करें</translation>
@@ -3738,6 +3753,7 @@
 <translation id="6725073593266469338">यूज़र इंटरफ़ेस (यूआई) सेवा</translation>
 <translation id="6725206449694821596">इंटरनेट प्रिंटिंग प्रोटोकॉल (IPP)</translation>
 <translation id="67269783048918309">इस्तेमाल और निदान से जुड़ा डेटा भेजें. यह डिवाइस फ़िलहाल Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेज रहा है. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. यह <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> डिवाइस के मालिक ने लागू की है. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK2" />ज़्यादा जानें<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">कनेक्ट किया गया, <ph name="BATTERY_PERCENTAGE" /> % बैटरी बची है</translation>
 <translation id="6732801395666424405">प्रमाणपत्र लोड नहीं किए गए हैं</translation>
 <translation id="6732900235521116609">शॉर्टकट नहीं हटाया जा सकता</translation>
 <translation id="6735304988756581115">कुकी और साइट के अन्य डेटा दिखाएं...</translation>
@@ -3830,6 +3846,7 @@
 <translation id="6876155724392614295">बाइक</translation>
 <translation id="6877460900831874810">लॉक स्क्रीन पर Chrome की मीडिया चलाने की सुविधा चालू करें</translation>
 <translation id="6878422606530379992">सेंसर को मंज़ूरी दी गई है</translation>
+<translation id="6878665006737889642">फिर से इंस्टॉल करने की कोशिश करें</translation>
 <translation id="6880587130513028875">इस पेज पर चित्र अवरोधित कर दी गई थीं.</translation>
 <translation id="6883319974225028188">ओह!  यह सिस्टम, डिवाइस कॉन्फ़िगरेशन को सेव नहीं कर सका.</translation>
 <translation id="6885771755599377173">सिस्टम जानकारी की झलक</translation>
@@ -3998,6 +4015,7 @@
 <translation id="7120865473764644444">सिंक सर्वर से कनेक्ट नहीं किया जा सका. पुनः प्रयास किया जा रहा है...</translation>
 <translation id="7121362699166175603">पता बार मेंअपने-आपपूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
 <translation id="7121389946694989825">इस्तेमाल और निदान से जुड़ा डेटा भेजें. यह डिवाइस फ़िलहाल Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेज रहा है. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK1" />ज़्यादा जानें<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">स्मार्ट डैश</translation>
 <translation id="7123360114020465152">अब काम नहीं करता है</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> को प्रिंट करने में गड़बड़ी</translation>
 <translation id="7127980134843952133">डाउनलोड इतिहास</translation>
@@ -4146,6 +4164,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> अब फ़ुल स्‍क्रीन है.</translation>
 <translation id="7340650977506865820">साइट आपकी स्क्रीन शेयर कर रही है</translation>
 <translation id="7341834142292923918">इस साइट का एक्सेस चाहिए</translation>
+<translation id="7344488796804562294">Kerberos के लिए बेहतर कॉन्फ़िगरेशन</translation>
 <translation id="7345706641791090287">अपने पासवर्ड की पुष्टि करें</translation>
 <translation id="7346909386216857016">ठीक है, समझ लिया</translation>
 <translation id="7347751611463936647">इस एक्सटेंशन का इस्तेमाल करने के लिए, "<ph name="EXTENSION_KEYWORD" />" टाइप करें, फिर TAB टाइप करें, फिर आदेश या खोज टाइप करें.</translation>
@@ -4756,6 +4775,7 @@
 <translation id="8227119283605456246">फ़ाइल अटैच करें</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> के लिए पासवर्ड सेव करें?</translation>
 <translation id="8234795456569844941">कृपया इस समस्या को ठीक करने में हमारे इंजीनियरों की मदद करें. हमें बताएं कि प्रोफ़ाइल से जुड़ी गड़बड़ी का मैसेज मिलने से ठीक पहले क्या हुआ था:</translation>
+<translation id="8236917170563564587">उसके बजाय यह टैब शेयर करें</translation>
 <translation id="8241040075392580210">शेडी</translation>
 <translation id="8241806945692107836">डिवाइस कॉन्फ़िगरेशन निर्धारित किया जा रहा है...</translation>
 <translation id="8241868517363889229">अपने बुकमार्क पढ़ें और बदलें</translation>
@@ -4767,6 +4787,7 @@
 <translation id="8249048954461686687">OEM फ़ोल्डर</translation>
 <translation id="8249615410597138718">अपने डिवाइस पर भेजें</translation>
 <translation id="8249672078237421304">ऐसे पेजों का अनुवाद करना ऑफ़र करें जो उस भाषा में नहीं हैं जिसे आप पढ़ते हैं</translation>
+<translation id="8251441930213048644">अभी रीफ़्रेश करें</translation>
 <translation id="8251578425305135684">थंबनेल निकाला गया.</translation>
 <translation id="8252569384384439529">अपलोड हो रही है...</translation>
 <translation id="8253198102038551905">नेटवर्क प्रॉपर्टी पाने के लिए '+' बटन पर क्‍लिक करें</translation>
@@ -5144,6 +5165,7 @@
 <translation id="8827752199525959199">ज़्यादा कार्रवाइयां, <ph name="DOMAIN" /> पर <ph name="USERNAME" /> के लिए पासवर्ड</translation>
 <translation id="882854468542856424">किसी भी साइट को आस-पास के ब्लूटूथ डिवाइस खोजने न दें</translation>
 <translation id="8828933418460119530">DNS नाम</translation>
+<translation id="883062543841130884">विकल्प</translation>
 <translation id="8830796635868321089">वर्तमान प्रॉक्सी सेटिंग के उपयोग से अपडेट जाँच पूरी नहीं हो सकी. कृपया अपनी <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग<ph name="PROXY_SETTINGS_LINK_END" /> में बदलाव करें.</translation>
 <translation id="8831664945713891930">एक्सटेंशन सेटिंग खोलें</translation>
 <translation id="8834039744648160717">नेटवर्क कॉन्फ़िगरेशन को <ph name="USER_EMAIL" /> नियंत्रित करता है.</translation>
@@ -5164,6 +5186,7 @@
 <translation id="8862003515646449717">किसी तेज़ ब्राउज़र पर जाएं</translation>
 <translation id="8863753581171631212">नए <ph name="APP" /> में लिंक खोलें</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> को <ph name="APP_NAME" /> के साथ शेयर किया जा रहा है</translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> को इस डिवाइस से हटा दिया गया</translation>
 <translation id="8868626022555786497">उपयोग में है</translation>
 <translation id="8870318296973696995">होम पेज</translation>
 <translation id="8870413625673593573">हाल ही में बंद किए गए</translation>
@@ -5172,7 +5195,6 @@
 <translation id="8871974300055371298">सामग्री सेटिंग</translation>
 <translation id="8872155268274985541">गलत कियोस्‍क बाहरी अपडेट मेनिफ़ेस्‍ट फ़ाइल मिली. कियोस्‍क ऐप्लिकेशन अपडेट नहीं हो सकी. कृपया 'यूएसबी स्‍टिक' को निकालें.</translation>
 <translation id="8874184842967597500">कनेक्ट नहीं है</translation>
-<translation id="887550310442005096">आपकी कंपनी या संगठन ने कहा है कि आप इस डिवाइस को अपडेट करें</translation>
 <translation id="8876307312329369159">यह सेटिंग किसी डेमो सत्र में बदली नहीं जा सकती है.</translation>
 <translation id="8877448029301136595">[मूल निर्देशिका]</translation>
 <translation id="8879284080359814990">टैब के रूप में &amp;दिखाएं</translation>
@@ -5287,6 +5309,7 @@
 <translation id="9044646465488564462">नेटवर्क से कनेक्ट करने में विफल रहा: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">आप जिस पेज पर जाने की कोशिश कर रहे हैं उसका वेब पता Google को भेजती है</translation>
 <translation id="9046895021617826162">कनेक्ट करना विफल</translation>
+<translation id="9047391224416514812">इस उपयोगकर्ता नाम से पहले ही एक उपयोगकर्ता खाता मौजूद है</translation>
 <translation id="9050666287014529139">पासफ़्रेज़ (लंबा पासवर्ड)</translation>
 <translation id="9052208328806230490">आपने अपने प्रिंटर को खाता <ph name="EMAIL" /> का उपयोग करके <ph name="CLOUD_PRINT_NAME" /> के साथ पंजीकृत किया है </translation>
 <translation id="9052404922357793350">ब्लॉक करना जारी रखें</translation>
@@ -5334,6 +5357,7 @@
 <translation id="9121814364785106365">छोटे टैब के रूप में खोलें</translation>
 <translation id="9124003689441359348">सहेजे गए पासवर्ड यहां दिखाई देंगे</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> rem.)</translation>
+<translation id="9128317794749765148">सेटअप पूरा नहीं हो सका</translation>
 <translation id="9128870381267983090">नेटवर्क से कनेक्ट करें</translation>
 <translation id="9130015405878219958">गलत मोड डाला गया.</translation>
 <translation id="9131487537093447019">ब्लूटूथ डिवाइस को संदेश भेजें और उनसे संदेश प्राप्त करें.</translation>
@@ -5402,6 +5426,7 @@
 <translation id="939598580284253335">'पासफ़्रेज़' दर्ज करें</translation>
 <translation id="939736085109172342">नया फ़ोल्डर</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> एक Chrome टैब और ऑडियो शेयर कर रहा है.</translation>
+<translation id="945166830402967374">अपने संगठन के डिवाइस एडमिन से संपर्क करें</translation>
 <translation id="945522503751344254">सुझाव भेजें</translation>
 <translation id="947329552760389097">&amp;एलिमेंट जाँचें</translation>
 <translation id="952992212772159698">सक्रिय नहीं किया गया</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 1d93ce7b..01903f7 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktivacija dovršena</translation>
 <translation id="3454213325559396544">To je posljednje automatsko ažuriranje softvera i sigurnosno ažuriranje za taj <ph name="DEVICE_TYPE" />. Za buduća ažuriranja potrebna je nadogradnja na noviji model.</translation>
 <translation id="345693547134384690">Otvori &amp;sliku u novoj &amp;kartici</translation>
-<translation id="3457500881955698515">Vaša tvrtka ili organizacija zahtijeva trenutačno ažuriranje ovog uređaja</translation>
 <translation id="3459509316159669723">Ispis</translation>
 <translation id="3459697287128633276">Da biste omogućili računu pristup Trgovini Google Play, autentificirajte se pri Davatelju identiteta.</translation>
 <translation id="3459774175445953971">Zadnje izmjene:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Dinja</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> dijeli prozor.</translation>
 <translation id="4364830672918311045">Prikaži obavijesti</translation>
-<translation id="4365673000813822030">Ups, sinkronizacija je prekinuta.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> pomoću aplikacije <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Unijeli ste e-adresu i zaporku koje se ne podudaraju</translation>
 <translation id="437184764829821926">Napredne postavke fonta</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Instaliranje ažuriranja OS-a</translation>
 <translation id="4830573902900904548">Vaš uređaj <ph name="DEVICE_TYPE" /> ne može se povezati s internetom putem mreže <ph name="NETWORK_NAME" />. Odaberite drugu mrežu. <ph name="LEARN_MORE_LINK_START" />Saznajte više<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome nema pristup zatraženom resursu.</translation>
-<translation id="4835836146030131423">Pogreška u prijavi.</translation>
 <translation id="4837926214103741331">Niste ovlašteni za upotrebu ovog uređaja. Zamolite vlasnika da vam dopusti prijavu.</translation>
 <translation id="4837952862063191349">Da biste otključali i pohranili lokalne podatke, unesite staru zaporku za uređaj <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Dopušten pristup za čitanje međuspremnika</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Izbriši kopiju</translation>
 <translation id="5030338702439866405">Izdaje</translation>
 <translation id="5033266061063942743">Geometrijski likovi</translation>
-<translation id="5033619151015094114">Vaša tvrtka ili organizacija zahtijeva ažuriranje ovog uređaja</translation>
 <translation id="503498442187459473"><ph name="HOST" /> želi upotrijebiti vašu kameru i mikrofon</translation>
 <translation id="5036662165765606524">Ne dozvoli nijednoj web-lokaciji automatsko preuzimanje više datoteka</translation>
 <translation id="5037676449506322593">Odaberi sve</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">Postavke sadržaja</translation>
 <translation id="8872155268274985541">Pronađena je nevažeća datoteka manifesta vanjskog ažuriranja kioska. Aplikacija kioska nije ažurirana. Uklonite USB privjesak.</translation>
 <translation id="8874184842967597500">Niste povezani</translation>
-<translation id="887550310442005096">Vaša tvrtka ili organizacija zahtijeva od vas da ažurirate ovaj uređaj</translation>
 <translation id="8876307312329369159">Ta se postavka ne može promijeniti u demo sesiji.</translation>
 <translation id="8877448029301136595">[matični direktorij]</translation>
 <translation id="8879284080359814990">&amp;Prikaži kao karticu</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index abfe9810..eef7f85 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1622,7 +1622,6 @@
 <translation id="3454157711543303649">Aktiválás befejezve</translation>
 <translation id="3454213325559396544">Ez az utolsó automatikus szoftver- és biztonsági frissítés ehhez a <ph name="DEVICE_TYPE" /> eszközhöz. Ha a jövőben is szeretne frissítéseket kapni, váltson újabb modellre.</translation>
 <translation id="345693547134384690">Kép &amp;megnyitása új lapon</translation>
-<translation id="3457500881955698515">Vállalata vagy szervezete megköveteli az eszköz azonnali frissítését</translation>
 <translation id="3459509316159669723">Nyomtatás</translation>
 <translation id="3459697287128633276">A Google Play Áruházhoz való hozzáférés engedélyezéséhez hitelesítse fiókját az identitásszolgáltatóján keresztül.</translation>
 <translation id="3459774175445953971">Utolsó módosítás:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Dinnye</translation>
 <translation id="4364567974334641491">A(z) <ph name="APP_NAME" /> megoszt egy ablakot.</translation>
 <translation id="4364830672918311045">Értesítések megjelenítése</translation>
-<translation id="4365673000813822030">Hoppá, a szinkronizálás leállt.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> a következővel: <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">A megadott e-mail-cím és jelszó nem egyezik</translation>
 <translation id="437184764829821926">Speciális betűtípus-beállítások</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Az operációs rendszer frissítésének telepítése folyamatban</translation>
 <translation id="4830573902900904548">A(z) <ph name="DEVICE_TYPE" /> nem tud csatlakozni az internethez a következő hálózaton: <ph name="NETWORK_NAME" />. Kérjük, válasszon másik hálózatot. <ph name="LEARN_MORE_LINK_START" />További információ<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">A Chrome nem fér hozzá a kért forráshoz.</translation>
-<translation id="4835836146030131423">Hiba a bejelentkezéskor.</translation>
 <translation id="4837926214103741331">Nem jogosult ennek az eszköznek a használatára. Bejelentkezési engedély kéréséhez vegye fel a kapcsolatot az eszköz tulajdonosával.</translation>
 <translation id="4837952862063191349">Helyi adatainak feloldásához és helyreállításához adja meg régi <ph name="DEVICE_TYPE" />-jelszavát.</translation>
 <translation id="4838836835474292213">A vágólap olvasásához szükséges hozzáférés megadva</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Példány törlése</translation>
 <translation id="5030338702439866405">Kiállította:</translation>
 <translation id="5033266061063942743">Geometriai alakzatok</translation>
-<translation id="5033619151015094114">Vállalata vagy szervezete megköveteli az eszköz frissítését</translation>
 <translation id="503498442187459473">A(z) <ph name="HOST" /> webhely használni szeretné a kamerát és a mikrofont</translation>
 <translation id="5036662165765606524">Ne engedélyezze a webhelyeknek több fájl automatikus letöltését</translation>
 <translation id="5037676449506322593">Összes kiválasztása</translation>
@@ -5203,7 +5199,6 @@
 <translation id="8871974300055371298">Tartalombeállítások</translation>
 <translation id="8872155268274985541">A rendszer által talált, külső frissítésre szolgáló kioszkjegyzékfájl érvénytelen. A kioszkalkalmazás frissítése nem sikerült. Kérjük, távolítsa el az USB-meghatjtót.</translation>
 <translation id="8874184842967597500">Nincs csatlakozva</translation>
-<translation id="887550310442005096">Vállalata vagy szervezete az eszköz frissítésére kéri</translation>
 <translation id="8876307312329369159">Ezt a beállítást nem lehet módosítani demó munkamenetben.</translation>
 <translation id="8877448029301136595">[szülőkönyvtár]</translation>
 <translation id="8879284080359814990">Megjeleníté&amp;s lapként</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 87b90ce..f65a0a0 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1619,7 +1619,6 @@
 <translation id="3454157711543303649">Aktivasi selesai</translation>
 <translation id="3454213325559396544">Ini adalah update otomatis keamanan dan software terakhir untuk <ph name="DEVICE_TYPE" /> ini. Untuk mendapatkan update mendatang, upgrade ke model yang lebih baru.</translation>
 <translation id="345693547134384690">Buka gambar d&amp;i tab baru</translation>
-<translation id="3457500881955698515">Perusahaan atau organisasi Anda meminta agar perangkat ini segera diupdate</translation>
 <translation id="3459509316159669723">Pencetakan</translation>
 <translation id="3459697287128633276">Agar akun Anda dapat mengakses Google Play Store, harap lakukan autentikasi dengan Penyedia Identitas Anda.</translation>
 <translation id="3459774175445953971">Terakhir diubah:</translation>
@@ -2236,7 +2235,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> membagikan jendela.</translation>
 <translation id="4364830672918311045">Tampilkan notifikasi</translation>
-<translation id="4365673000813822030">Ups, Sinkronisasi berhenti bekerja.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> dengan <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Email dan sandi yang Anda masukkan tidak cocok</translation>
 <translation id="437184764829821926">Setelan font lanjutan</translation>
@@ -2518,7 +2516,6 @@
 <translation id="4830502475412647084">Menginstal update OS</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> Anda tidak dapat menyambung ke internet menggunakan <ph name="NETWORK_NAME" />. Pilih jaringan lainnya. <ph name="LEARN_MORE_LINK_START" />Pelajari lebih lanjut<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome tidak memiliki akses ke sumber daya yang diminta.</translation>
-<translation id="4835836146030131423">Kesalahan masuk ke sistem.</translation>
 <translation id="4837926214103741331">Anda tidak diizinkan untuk menggunakan perangkat ini. Untuk izin masuk, hubungi pemilik perangkat.</translation>
 <translation id="4837952862063191349">Untuk membuka kunci dan memulihkan data lokal, masukkan sandi <ph name="DEVICE_TYPE" /> lama.</translation>
 <translation id="4838836835474292213">Akses baca papan klip diizinkan</translation>
@@ -2653,7 +2650,6 @@
 <translation id="5029568752722684782">Hapus salinan</translation>
 <translation id="5030338702439866405">Diterbitkan Oleh</translation>
 <translation id="5033266061063942743">Bentuk geometris</translation>
-<translation id="5033619151015094114">Perusahaan atau organisasi Anda meminta agar perangkat ini diupdate</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ingin menggunakan kamera dan mikrofon Anda</translation>
 <translation id="5036662165765606524">Jangan izinkan situs apa pun mendownload beberapa file secara otomatis</translation>
 <translation id="5037676449506322593">Pilih Semua</translation>
@@ -5199,7 +5195,6 @@
 <translation id="8871974300055371298">Setelan konten</translation>
 <translation id="8872155268274985541">File manifes pembaruan eksternal Kios yang tidak valid ditemukan. Gagal memperbarui aplikasi Kios. Lepaskan stik USB.</translation>
 <translation id="8874184842967597500">Tidak tersambung</translation>
-<translation id="887550310442005096">Perusahaan atau organisasi meminta Anda mengupdate perangkat ini</translation>
 <translation id="8876307312329369159">Setelan ini tidak dapat diubah dalam sesi demo.</translation>
 <translation id="8877448029301136595">[direktori induk]</translation>
 <translation id="8879284080359814990">Tampilkan &amp;Sebagai Tab</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 5e84c408..63e62821 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1617,7 +1617,6 @@
 <translation id="3454157711543303649">Attivazione completata</translation>
 <translation id="3454213325559396544">Questo è l'ultimo aggiornamento software e di sicurezza automatico per il dispositivo <ph name="DEVICE_TYPE" />. Per ricevere gli aggiornamenti futuri, esegui l'upgrade a un modello più recente.</translation>
 <translation id="345693547134384690">Apri &amp;immagine in un'altra scheda</translation>
-<translation id="3457500881955698515">La tua organizzazione o azienda richiede un aggiornamento immediato di questo dispositivo</translation>
 <translation id="3459509316159669723">Stampa</translation>
 <translation id="3459697287128633276">Per accedere al Google Play Store con il tuo account, esegui l'autenticazione con il tuo provider di identità.</translation>
 <translation id="3459774175445953971">Ultima modifica:</translation>
@@ -2234,7 +2233,6 @@
 <translation id="4364327530094270451">Melone</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> condivide una finestra.</translation>
 <translation id="4364830672918311045">Mostra notifiche</translation>
-<translation id="4365673000813822030">Spiacenti, la sincronizzazione si è interrotta.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> con <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">L'indirizzo email e la password non corrispondono</translation>
 <translation id="437184764829821926">Impostazioni avanzate carattere</translation>
@@ -2516,7 +2514,6 @@
 <translation id="4830502475412647084">Installazione dell'aggiornamento del sistema operativo in corso</translation>
 <translation id="4830573902900904548">Il <ph name="DEVICE_TYPE" /> non è in grado di connettersi a Internet utilizzando <ph name="NETWORK_NAME" />. Scegli un'altra rete. <ph name="LEARN_MORE_LINK_START" />Ulteriori informazioni<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome non ha accesso alla risorsa richiesta.</translation>
-<translation id="4835836146030131423">Errore durante l'accesso.</translation>
 <translation id="4837926214103741331">Non sei autorizzato a utilizzare questo dispositivo. Per ottenere l'autorizzazione di accesso contatta il proprietario del dispositivo.</translation>
 <translation id="4837952862063191349">Per sbloccare e ripristinare i dati locali, inserisci la vecchia password del dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Accesso alla lettura degli appunti consentito</translation>
@@ -2651,7 +2648,6 @@
 <translation id="5029568752722684782">Cancella copia</translation>
 <translation id="5030338702439866405">Emesso da</translation>
 <translation id="5033266061063942743">Forme geometriche</translation>
-<translation id="5033619151015094114">La tua organizzazione o azienda richiede un aggiornamento di questo dispositivo</translation>
 <translation id="503498442187459473"><ph name="HOST" /> vuole usare la fotocamera e il microfono</translation>
 <translation id="5036662165765606524">Non consentire ai siti di scaricare automaticamente più file</translation>
 <translation id="5037676449506322593">Seleziona tutto</translation>
@@ -5194,7 +5190,6 @@
 <translation id="8871974300055371298">Impostazioni contenuti</translation>
 <translation id="8872155268274985541">È stato trovato un file manifest di aggiornamento esterno delle app kiosk non valido. Impossibile aggiornare l'app kiosk. Rimuovi la chiavetta USB.</translation>
 <translation id="8874184842967597500">Non connessa</translation>
-<translation id="887550310442005096">La tua organizzazione o azienda richiede l'aggiornamento di questo dispositivo</translation>
 <translation id="8876307312329369159">Questa impostazione non può essere modificata in una sessione demo.</translation>
 <translation id="8877448029301136595">[directory principale]</translation>
 <translation id="8879284080359814990">Mostra come &amp;scheda</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 89937f1..e921f8e6 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">התרחשה בעיה שקשורה להרשאות המכשירים של מצב ההדגמה.</translation>
 <translation id="126710816202626562">שפת תרגום:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">הגדרה מתקדמת</translation>
 <translation id="1272079795634619415">הפסק</translation>
 <translation id="1272978324304772054">חשבון משתמש זה אינו שייך לדומיין שאליו רשום המכשיר. אם ברצונך להירשם לדומיין אחר, ראשית עליך לבצע שחזור מכשיר.</translation>
 <translation id="1274977772557788323">‏הגדרות אחסון של Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> פריטים נבחרו</translation>
 <translation id="1444628761356461360">ההגדרה הזו מנוהלת על ידי בעל המכשיר, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">לא ניתן להעלות את '<ph name="IMAGE_PATH" />' עבור עיצוב.</translation>
+<translation id="1445693676523799095">הפעולה עשויה להימשך זמן מה</translation>
 <translation id="1451375123200651445">דף אינטרנט, קובץ אחד</translation>
 <translation id="1451917004835509682">הוספת משתמש בפיקוח</translation>
 <translation id="1454223536435069390">צלם מסך</translation>
@@ -591,6 +593,7 @@
 <translation id="1875387611427697908">ניתן להוסיף את הפריט הזה רק מ-<ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">לא ניתן לקבל אסימון אימות. עליך לצאת ולאחר מכן להיכנס מחדש ולנסות שוב.</translation>
 <translation id="1877860345998737529">הקצאת מתגים לפעולות</translation>
+<translation id="1878541307036593717">הרשאות הגדרה</translation>
 <translation id="1879000426787380528">כניסה בתור</translation>
 <translation id="1880905663253319515">למחוק את האישור "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="1886996562706621347">אפשר לאתרים לבקש להפוך למטפלי ברירת המחדל עבור פרוטוקולים (מומלץ)</translation>
@@ -603,6 +606,7 @@
 <translation id="1895252664692693738">זמן נותר - <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">כיבוי</translation>
 <translation id="1895934970388272448">עליך לאשר את הרישום במדפסת כדי לסיים תהליך זה - בדוק את המדפסת כעת.</translation>
+<translation id="1899826437968063457">‏Plugin VM זקוק להרשאה כדי לפעול</translation>
 <translation id="1901303067676059328">בחר &amp;הכל</translation>
 <translation id="1902576642799138955">תקופת תוקף</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{השתקת הכרטיסייה}two{השתקת הכרטיסיות}many{השתקת הכרטיסיות}other{השתקת הכרטיסיות}}</translation>
@@ -876,6 +880,7 @@
 <translation id="2318923050469484167">הפעלה נוכחית במצב גלישה בסתר (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">כותרות עליונות ותחתונות</translation>
 <translation id="2322318151094136999">תוצג שאלה כשאתר רוצה לגשת אל יציאות טוריות (מומלץ)</translation>
+<translation id="2325444234681128157">שמירת סיסמה</translation>
 <translation id="2326931316514688470">&amp;טען אפליקציה מחדש</translation>
 <translation id="2327492829706409234">הפעל יישום</translation>
 <translation id="2329597144923131178">יש להיכנס כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך.</translation>
@@ -943,6 +948,7 @@
 <translation id="2433452467737464329">‏הוסף פרמטר שאילתה בכתובת אתר לרענון אוטומטי של הדף: chrome://network/?refresh=&lt;sec&gt;‎</translation>
 <translation id="2433507940547922241">מראה</translation>
 <translation id="2433836460518180625">ביטול הנעילה של המכשיר בלבד</translation>
+<translation id="2434449159125086437">לא ניתן להגדיר את המדפסת. יש לבדוק את התצורה ולנסות שוב.</translation>
 <translation id="2435248616906486374">הרשת מנותקת</translation>
 <translation id="2435457462613246316">הצג סיסמה</translation>
 <translation id="2436186046335138073">האם לאפשר ל-<ph name="HANDLER_HOSTNAME" /> לפתוח את כל קישורי <ph name="PROTOCOL" />?</translation>
@@ -1095,6 +1101,7 @@
 <translation id="2649045351178520408">‏ASCII בקידוד Base64, שרשרת אישורים</translation>
 <translation id="2653033005692233957">החיפוש נכשל</translation>
 <translation id="2653266418988778031">‏אם תמחק אישור של רשות אישורים (CA), הדפדפן שלך לא יוכל לתת אמון באף אישור שהונפק על ידי רשות אישורים זו.</translation>
+<translation id="2653275834716714682">החלפת טקסט</translation>
 <translation id="2653659639078652383">שלח</translation>
 <translation id="265390580714150011">ערך שדה </translation>
 <translation id="2654166010170466751">‏מתן הרשאה לאתרים להתקין מעבדי handler לתשלומים</translation>
@@ -1303,6 +1310,7 @@
 <translation id="29488703364906173">דפדפן אינטרנט מהיר, פשוט ובטוח, המותאם לאינטרנט המודרני.</translation>
 <translation id="2949289451367477459">‏שימוש במיקום. מתן רשות לשירותים עם הרשאות מיקום להשתמש במיקום המכשיר הזה. Google עשויה לאסוף מדי פעם נתוני מיקום ולהשתמש בהם באופן אנונימי כדי לשפר את דיוק המיקום ושירותים מבוססי-מיקום. <ph name="BEGIN_LINK1" />מידע נוסף<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">אזהרת 'ארוז תוסף'</translation>
+<translation id="2959842337402130152">לא ניתן לשחזר מפני שאין מספיק מקום אחסון. צריך לפנות <ph name="SPACE_REQUIRED" /> במכשיר ולנסות שוב.</translation>
 <translation id="296026337010986570">‏סיימנו! התוכנות המזיקות הוסרו. כדי להפעיל מחדש את התוספים, צריך לעבור אל &lt;a href="chrome://extensions"&gt;תוספים&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ניתנה הארכה)</translation>
 <translation id="2961695502793809356">לחץ כדי לעבור קדימה, לחץ והחזק כדי לראות את ההיסטוריה</translation>
@@ -1610,7 +1618,6 @@
 <translation id="3454157711543303649">ההפעלה הושלמה</translation>
 <translation id="3454213325559396544">זהו העדכון האוטומטי האחרון של התוכנה והאבטחה עבור מכשיר ה-<ph name="DEVICE_TYPE" /> הזה. כדי לקבל עדכונים עתידיים, יש לשדרג לדגם חדש יותר.</translation>
 <translation id="345693547134384690">פתיחת &amp;תמונה בכרטיסייה חדשה</translation>
-<translation id="3457500881955698515">החברה או הארגון שלך דורשים לעדכן את המכשיר הזה מיד</translation>
 <translation id="3459509316159669723">הדפסה</translation>
 <translation id="3459697287128633276">‏כדי לאפשר לחשבונך לגשת אל חנות Google Play, עליך לבצע אימות אצל ספק הזהות שלך.</translation>
 <translation id="3459774175445953971">שונה לאחרונה:</translation>
@@ -1987,6 +1994,7 @@
 <translation id="3966072572894326936">בחר תיקייה אחרת...</translation>
 <translation id="3967822245660637423">ההורדה הושלמה</translation>
 <translation id="3967919079500697218">היכולת לצלם צילומי מסך הושבתה על-ידי מנהל המערכת שלך.</translation>
+<translation id="3969092967100188979">פועל, בנדידה</translation>
 <translation id="3970114302595058915">מזהה</translation>
 <translation id="397105322502079400">מחשב...</translation>
 <translation id="3975565978598857337">יצירת הקשר עם השרת של התחום נכשלה</translation>
@@ -2048,6 +2056,7 @@
 <translation id="4068776064906523561">טביעות אצבע שמורות</translation>
 <translation id="407173827865827707">בזמן לחיצה</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{ביטול הצמדת הכרטיסייה}two{ביטול הצמדת הכרטיסיות}many{ביטול הצמדת הכרטיסיות}other{ביטול הצמדת הכרטיסיות}}</translation>
+<translation id="4072805772816336153">יש לנסות שוב מאוחר יותר</translation>
 <translation id="4074900173531346617">אישור חותם אימייל</translation>
 <translation id="407520071244661467">שנה קנה מידה</translation>
 <translation id="4075639477629295004">לא ניתן להעביר את <ph name="FILE_NAME" />.</translation>
@@ -2136,6 +2145,7 @@
 <translation id="4209092469652827314">גדול</translation>
 <translation id="4209251085232852247">מושבת</translation>
 <translation id="4209464433672152343">‏מסמכים <ph name="BEGIN_LINK_HELP" />נשלחים אל Google<ph name="END_LINK_HELP" /> כדי להכין אותם להדפסה. ב<ph name="BEGIN_LINK_DASHBOARD" />מרכז השליטה של Google Cloud Print<ph name="END_LINK_DASHBOARD" /> אפשר להציג, לערוך ולנהל את המדפסות ואת היסטוריית ההדפסות.</translation>
+<translation id="4210048056321123003">מתבצעת הורדה של המכונה הווירטואלית</translation>
 <translation id="421182450098841253">&amp;הצג את סרגל הסימניות</translation>
 <translation id="4211851069413100178">‏שליחה של נתוני אבחון ונתונים על השימוש. אפשר לעזור בשיפור החוויה ב-Android. לשם כך יש לשלוח אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו נאכפת על-ידי הבעלים. ייתכן שהבעלים יבחרו לשלוח אל Google נתוני אבחון ונתונים לגבי אופן השימוש במכשיר הזה. אם הופעלה האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלך. <ph name="BEGIN_LINK2" />מידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">יצא</translation>
@@ -2224,7 +2234,6 @@
 <translation id="4364327530094270451">מלון</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> משתף חלון.</translation>
 <translation id="4364830672918311045">הצגת הודעות</translation>
-<translation id="4365673000813822030">אופס, הסינכרון הפסיק לפעול.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> באמצעות <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">כתובת האימייל והסיסמה שהזנת אינן תואמות</translation>
 <translation id="437184764829821926">הגדרות גופן מתקדמות</translation>
@@ -2235,6 +2244,7 @@
 <translation id="4378551569595875038">מתחבר...</translation>
 <translation id="4378556263712303865">דרישה למכשיר</translation>
 <translation id="4380648069038809855">התבצע מעבר למסך מלא</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, ועוד חשבון אחד}two{<ph name="EMAIL" />, ועוד <ph name="EXTRA_ACCOUNTS" /> חשבונות}many{<ph name="EMAIL" />, ועוד <ph name="EXTRA_ACCOUNTS" /> חשבונות}other{<ph name="EMAIL" />, ועוד <ph name="EXTRA_ACCOUNTS" /> חשבונות}}</translation>
 <translation id="4384312707950789900">הוספה לרשתות המועדפות</translation>
 <translation id="4384652540891215547">הפעל את התוסף</translation>
 <translation id="438503109373656455">אביר</translation>
@@ -2365,6 +2375,7 @@
 <translation id="4596295440756783523">יש לך אישורים בקובץ המזהים שרתים אלה</translation>
 <translation id="4598556348158889687">ניהול אחסון</translation>
 <translation id="4598776695426288251">‏יש אפשרויות חיבור ל-Wi-Fi ממספר מכשירים</translation>
+<translation id="4599134080475764833">‏Plugin VM מוכן לשימוש</translation>
 <translation id="4602466770786743961">התר תמיד ל-<ph name="HOST" /> לגשת למצלמה ולמיקרופון</translation>
 <translation id="4608500690299898628">&amp;מצא...</translation>
 <translation id="4608520674724523647">איור של הרשמה מוצלחת</translation>
@@ -2402,6 +2413,7 @@
 <translation id="4662788913887017617">‏שיתוף הסימניה באמצעות ה-iPhone</translation>
 <translation id="4663373278480897665">ניתן להשתמש במצלמה בדף זה</translation>
 <translation id="4664482161435122549">‏שגיאת ייצוא של PKCS #12</translation>
+<translation id="4664736447097490764">‏כאן אפשר לערוך את קובץ התצורה של Kerberos.</translation>
 <translation id="4665014895760275686">יצרן</translation>
 <translation id="4665446389743427678">כל הנתונים שמאוחסנים על ידי <ph name="SITE" /> יימחקו.</translation>
 <translation id="4668721319092543482">לחץ כדי להפעיל את <ph name="PLUGIN_NAME" /></translation>
@@ -2503,7 +2515,6 @@
 <translation id="4830502475412647084">‏מתקין עדכון OS</translation>
 <translation id="4830573902900904548">ה-<ph name="DEVICE_TYPE" /> לא מצליח להתחבר אל האינטרנט באמצעות <ph name="NETWORK_NAME" />. בחר רשת אחרת. <ph name="LEARN_MORE_LINK_START" />למידע נוסף<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">‏ל-Chrome אין גישה למשאב המבוקש.</translation>
-<translation id="4835836146030131423">שגיאת כניסה.</translation>
 <translation id="4837926214103741331">אין לך אישור להשתמש במכשיר הזה. צור קשר עם בעל המכשיר כדי לקבל הרשאת כניסה.</translation>
 <translation id="4837952862063191349">כדי לבטל את הנעילה של הנתונים המקומיים ולשחזר אותם, הזן את הסיסמה הקודמת שלך עבור <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">גישת הקריאה אל הלוח מותרת</translation>
@@ -2638,7 +2649,6 @@
 <translation id="5029568752722684782">מחיקת העותק</translation>
 <translation id="5030338702439866405">הונפק על ידי</translation>
 <translation id="5033266061063942743">צורות גיאומטריות</translation>
-<translation id="5033619151015094114">החברה או הארגון שלך דורשים לעדכן את המכשיר הזה</translation>
 <translation id="503498442187459473"><ph name="HOST" /> רוצה להשתמש במצלמה ובמיקרופון שלך</translation>
 <translation id="5036662165765606524">אל תאפשר לאף אתר להוריד קבצים מרובים באופן אוטומטי</translation>
 <translation id="5037676449506322593">בחר הכל</translation>
@@ -2775,6 +2785,7 @@
 <translation id="5255859108402770436">כניסה חוזרת</translation>
 <translation id="5256861893479663409">בכל האתרים</translation>
 <translation id="5258992782919386492">התקנה במכשיר זה</translation>
+<translation id="5260334392110301220">מירכאות חכמות</translation>
 <translation id="5260508466980570042">מצטערים, לא ניתן לאמת את האימייל או את הסיסמה שלך. נסה שוב.</translation>
 <translation id="5261683757250193089">פתח בחנות האינטרנט</translation>
 <translation id="5264148714798105376">הפעולה יכולה להימשך כדקה.</translation>
@@ -2809,6 +2820,7 @@
 <translation id="5301751748813680278">נכנס כאורח.</translation>
 <translation id="5301954838959518834">בסדר, הבנתי</translation>
 <translation id="5302048478445481009">שפה</translation>
+<translation id="5302932258331363306">הצגת התחליפים</translation>
 <translation id="5305688511332277257">לא מותקנים אישורים</translation>
 <translation id="5307030433605830021">המקור אינו נתמך</translation>
 <translation id="5308380583665731573">התחברות</translation>
@@ -2908,6 +2920,7 @@
 <translation id="5457113250005438886">לא חוקי</translation>
 <translation id="5457459357461771897">קריאה ומחיקה של קובצי תמונות, מוזיקה ומדיה מסוגים נוספים מהמחשב שלך</translation>
 <translation id="5457599981699367932">גלוש כאורח</translation>
+<translation id="5457991019809708398">פועל, ללא נדידה</translation>
 <translation id="5458998536542739734">הערות במסך הנעילה</translation>
 <translation id="5463275305984126951">אינדקס של <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">התפריט מכיל סימניות נסתרות</translation>
@@ -3133,6 +3146,7 @@
 <translation id="5799508265798272974">‏מכונה וירטואלית של Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">קובץ היעד נקטע או הוסר מאז ההורדה האחרונה.</translation>
 <translation id="5801568494490449797">העדפות</translation>
+<translation id="5804175651771201311">נדידה מושבתת</translation>
 <translation id="5804241973901381774">הרשאות</translation>
 <translation id="5805697420284793859">מנהל החלונות</translation>
 <translation id="5811750797187914944">סיימת</translation>
@@ -3480,6 +3494,7 @@
 <translation id="6317318380444133405">התמיכה הופסקה.</translation>
 <translation id="6317369057005134371">ממתין לחלון היישום...</translation>
 <translation id="6318407754858604988">ההורדה התחילה</translation>
+<translation id="6318944945640833942">לא אותרה מדפסת. יש להזין שוב את כתובת המדפסת.</translation>
 <translation id="6322653941595359182">‏אפשר לשלוח ולקבל הודעות טקסט דרך ה-Chromebook</translation>
 <translation id="6324916366299863871">עריכת קיצור דרך</translation>
 <translation id="6325191661371220117">השבת הפעלה אוטומטית</translation>
@@ -3736,6 +3751,7 @@
 <translation id="6725073593266469338">שירות ממשק המשתמש</translation>
 <translation id="6725206449694821596">‏פרוטוקול הדפסה באינטרנט (IPP)</translation>
 <translation id="67269783048918309">‏שליחה של נתוני אבחון ונתונים על השימוש. המכשיר הזה שולח עכשיו אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה לא ישמשו כדי לזהות את הילד/ה שלך, והם יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו נאכפת על-ידי הבעלים. אם הופעלה בשביל הילד/ה שלך האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלו/ה. <ph name="BEGIN_LINK2" />מידע נוסף<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">‏מחובר, ‎<ph name="BATTERY_PERCENTAGE" />%‎ סוללה</translation>
 <translation id="6732801395666424405">האישורים לא נטענו</translation>
 <translation id="6732900235521116609">לא ניתן להסיר את קיצור הדרך</translation>
 <translation id="6735304988756581115">‏הצג קובצי Cookie ונתוני אתר אחרים...</translation>
@@ -3828,6 +3844,7 @@
 <translation id="6876155724392614295">אופניים</translation>
 <translation id="6877460900831874810">‏התרת ההפעלה של מדיה ב-Chrome דרך מסך הנעילה</translation>
 <translation id="6878422606530379992">השימוש בחיישנים מותר</translation>
+<translation id="6878665006737889642">יש לנסות להתקין שוב</translation>
 <translation id="6880587130513028875">תמונות נחסמו בדף זה</translation>
 <translation id="6883319974225028188">אופס! המערכת לא הצליחה לשמור את תצורת המכשיר.</translation>
 <translation id="6885771755599377173">תצוגה מקדימה של מידע מערכת</translation>
@@ -3996,6 +4013,7 @@
 <translation id="7120865473764644444">לא ניתן היה להתחבר אל שרת הסנכרון. מנסה שוב...</translation>
 <translation id="7121362699166175603">‏ניקוי ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">‏שליחה של נתוני אבחון ונתונים על השימוש. המכשיר הזה שולח עכשיו אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה לא ישמשו כדי לזהות את הילד/ה שלך, והם יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. אם הופעלה בשביל הילד/ה שלך האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלו/ה. <ph name="BEGIN_LINK1" />מידע נוסף<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">מקפים חכמים</translation>
 <translation id="7123360114020465152">התמיכה הופסקה</translation>
 <translation id="7124929488592184705">שגיאה במהלך ההדפסה של <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">היסטוריית הורדות</translation>
@@ -4144,6 +4162,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> הוא במסך מלא כעת.</translation>
 <translation id="7340650977506865820">האתר משתף את המסך שלך</translation>
 <translation id="7341834142292923918">רוצה גישה לאתר הזה</translation>
+<translation id="7344488796804562294">‏הגדרה מתקדמת של Kerberos</translation>
 <translation id="7345706641791090287">אשר את הסיסמה שלך</translation>
 <translation id="7346909386216857016">בסדר, הבנתי</translation>
 <translation id="7347751611463936647">‏כדי להשתמש בתוסף זה, הקלד "<ph name="EXTENSION_KEYWORD" />", לאחר מכן הקש TAB ולאחר מכן הקלד את הפקודה או מונח החיפוש.</translation>
@@ -4754,6 +4773,7 @@
 <translation id="8227119283605456246">צירוף קובץ</translation>
 <translation id="8230134520748321204">האם לשמור את הסיסמה של <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">עזור למהנדסים שלנו לפתור את הבעיה הזו. ספר לנו מה קרה לפני שהוצגה לך הודעת השגיאה לגבי הפרופיל:</translation>
+<translation id="8236917170563564587">שיתוף הכרטיסייה הזו במקומה</translation>
 <translation id="8241040075392580210">מוצל</translation>
 <translation id="8241806945692107836">קובע את תצורת המכשיר...</translation>
 <translation id="8241868517363889229">לקרוא ולשנות את הסימניות שלך</translation>
@@ -4765,6 +4785,7 @@
 <translation id="8249048954461686687">‏תיקיית OEM</translation>
 <translation id="8249615410597138718">שליחה אל המכשירים שלך</translation>
 <translation id="8249672078237421304">הצע לתרגם דפים שאינם בשפה שאני קורא</translation>
+<translation id="8251441930213048644">יש לרענן עכשיו</translation>
 <translation id="8251578425305135684">התמונה הממוזערת הוסרה.</translation>
 <translation id="8252569384384439529">מעלה...</translation>
 <translation id="8253198102038551905">לחץ על '+' כדי לקבל מאפייני רשת</translation>
@@ -5142,6 +5163,7 @@
 <translation id="8827752199525959199">עוד פעולות, הסיסמה של <ph name="USERNAME" /> ב-<ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">‏אף אתר לא יכול לאתר התקני Bluetooth קרובים.</translation>
 <translation id="8828933418460119530">‏שם DNS</translation>
+<translation id="883062543841130884">תחליפים</translation>
 <translation id="8830796635868321089">‏בדיקת העדכון נכשלה עם ההגדרות הנוכחיות של שרת ה-proxy‏. התאם את <ph name="PROXY_SETTINGS_LINK_START" />הגדרות שרת ה-proxy שלך<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">פתיחת הגדרות התוספים</translation>
 <translation id="8834039744648160717">הגדרת הרשת היא בשליטת <ph name="USER_EMAIL" />.</translation>
@@ -5162,6 +5184,7 @@
 <translation id="8862003515646449717">החלף לדפדפן מהיר</translation>
 <translation id="8863753581171631212">פתח את הקישור ב-<ph name="APP" /></translation>
 <translation id="8864055848767439877">המערכת משתפת את <ph name="TAB_NAME" /> עם <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> הוסר מהמכשיר הזה</translation>
 <translation id="8868626022555786497">בשימוש</translation>
 <translation id="8870318296973696995">דף הבית</translation>
 <translation id="8870413625673593573">נסגרו לאחרונה</translation>
@@ -5170,7 +5193,6 @@
 <translation id="8871974300055371298">הגדרות תוכן</translation>
 <translation id="8872155268274985541">נמצא קובץ מניפסט לא חוקי לעדכון חיצוני של קיוסק. העדכון של אפליקצית הקיוסק נכשל. הסר את הדיסק און קי.</translation>
 <translation id="8874184842967597500">לא מחובר</translation>
-<translation id="887550310442005096">החברה או הארגון שלך מבקשים ממך לעדכן את המכשיר הזה</translation>
 <translation id="8876307312329369159">לא ניתן לשנות את ההגדרה הזו בסשן להדגמה.</translation>
 <translation id="8877448029301136595">[ספריית אב]</translation>
 <translation id="8879284080359814990">הצ&amp;ג ככרטיסייה</translation>
@@ -5285,6 +5307,7 @@
 <translation id="9044646465488564462">ההתחברות לרשת נכשלה: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">‏שליחת כתובת האינטרנט של הדף שאליו ניסית להגיע אל Google</translation>
 <translation id="9046895021617826162">החיבור נכשל</translation>
+<translation id="9047391224416514812">כבר קיים חשבון עם שם המשתמש הזה</translation>
 <translation id="9050666287014529139">משפט-סיסמה</translation>
 <translation id="9052208328806230490">רשמת את המדפסות שלך ב-<ph name="CLOUD_PRINT_NAME" /> באמצעות החשבון <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">המשך חסימה</translation>
@@ -5332,6 +5355,7 @@
 <translation id="9121814364785106365">פתח ככרטיסייה מוצמדת</translation>
 <translation id="9124003689441359348">כאן יופיעו הסיסמאות ששמרת</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (נותרו <ph name="LICENSE_COUNT" />)</translation>
+<translation id="9128317794749765148">לא ניתן היה להשלים את ההגדרה</translation>
 <translation id="9128870381267983090">התחבר לרשת</translation>
 <translation id="9130015405878219958">הוזן מצב לא חוקי.</translation>
 <translation id="9131487537093447019">‏שליחת הודעות למכשירי Bluetooth וקבלת הודעות מהם.</translation>
@@ -5400,6 +5424,7 @@
 <translation id="939598580284253335">הזן משפט-סיסמה</translation>
 <translation id="939736085109172342">תיקייה חדשה</translation>
 <translation id="942532530371314860">‏<ph name="APP_NAME" /> משתף כרטיסייה ואודיו של Chrome.</translation>
+<translation id="945166830402967374">עליך לפנות למנהל המכשיר בארגון</translation>
 <translation id="945522503751344254"> שליחת משוב</translation>
 <translation id="947329552760389097">&amp;בדיקת רכיבים</translation>
 <translation id="952992212772159698">לא פעיל</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index a7f2e94..73db456 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">デモモードデバイスライセンスで問題が発生しました。</translation>
 <translation id="126710816202626562">翻訳言語:</translation>
 <translation id="126768002343224824">16 倍</translation>
+<translation id="1269405567167332785">詳細設定</translation>
 <translation id="1272079795634619415">中止</translation>
 <translation id="1272978324304772054">このユーザー アカウントは、デバイスが登録されているドメインに属していません。別のドメインに登録する場合は、まず、デバイス リカバリ操作を行う必要があります。</translation>
 <translation id="1274977772557788323">Adobe Flash Player のストレージ設定</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> 個のアイテムを選択しました</translation>
 <translation id="1444628761356461360">この設定はデバイスの所有者 <ph name="OWNER_EMAIL" /> が管理しています。</translation>
 <translation id="144518587530125858">テーマの「<ph name="IMAGE_PATH" />」を読み込むことができませんでした。</translation>
+<translation id="1445693676523799095">しばらくお待ちください</translation>
 <translation id="1451375123200651445">ウェブページ、1 つのファイル</translation>
 <translation id="1451917004835509682">監視対象ユーザーを追加</translation>
 <translation id="1454223536435069390">スクリーンショットを撮る(&amp;A)</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">これは <ph name="CHROME_WEB_STORE" /> からのみ追加できます</translation>
 <translation id="1877520246462554164">認証トークンを取得できませんでした。いったんログアウトして再度ログインし、もう一度お試しください。</translation>
 <translation id="1877860345998737529">スイッチの操作割り当て</translation>
+<translation id="1878541307036593717">権限を設定します</translation>
 <translation id="1879000426787380528">次のアカウントでログイン</translation>
 <translation id="1880905663253319515">証明書「<ph name="CERTIFICATE_NAME" />」を削除しますか?</translation>
 <translation id="1886996562706621347">サイトからのプロトコルのデフォルト ハンドラとしての登録要求を許可する(推奨)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">あと <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">シャットダウン</translation>
 <translation id="1895934970388272448">この処理を終了するには、プリンタ上で登録を確認する必要があります。今すぐ確認してください。</translation>
+<translation id="1899826437968063457">プラグイン VM を実行する権限が必要です</translation>
 <translation id="1901303067676059328">すべて選択(&amp;A)</translation>
 <translation id="1902576642799138955">有効期間</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{タブをミュート}other{タブをミュート}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">現在のシークレット モード セッション(<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">ヘッダーとフッター</translation>
 <translation id="2322318151094136999">サイトからシリアルポートへのアクセス許可を求められたときに確認する(推奨)</translation>
+<translation id="2325444234681128157">パスワードを保存する</translation>
 <translation id="2326931316514688470">アプリを再読み込み(&amp;R)</translation>
 <translation id="2327492829706409234">アプリを有効にする</translation>
 <translation id="2329597144923131178">ログインすると、お使いのどのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できるようになります。</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">ページを自動更新するには URL に次のようなクエリ パラメータを追加してください: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">デザイン</translation>
 <translation id="2433836460518180625">デバイスのロック解除のみ</translation>
+<translation id="2434449159125086437">プリンタをセットアップできません。設定を確認してもう一度お試しください。</translation>
 <translation id="2435248616906486374">ネットワークが切断されました</translation>
 <translation id="2435457462613246316">パスワードを表示</translation>
 <translation id="2436186046335138073">すべての <ph name="PROTOCOL" /> リンクを <ph name="HANDLER_HOSTNAME" /> で開きますか?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64 エンコード ASCII 形式の証明書チェーン</translation>
 <translation id="2653033005692233957">検索できませんでした</translation>
 <translation id="2653266418988778031">認証局(CA)の証明書を削除すると、ブラウザはその CA が発行するどの証明書も信頼しなくなります。</translation>
+<translation id="2653275834716714682">テキストの置換</translation>
 <translation id="2653659639078652383">送信</translation>
 <translation id="265390580714150011">フィールド値</translation>
 <translation id="2654166010170466751">サイトに支払いハンドラのインストールを許可</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">最新のウェブ環境に対応した高速、シンプル、安全なウェブブラウザです。</translation>
 <translation id="2949289451367477459">位置情報を使用するとともに、位置情報の利用を許可されているアプリやサービスがこのデバイスの位置情報を使用することを許可します。Google は位置情報を定期的に収集し、これを匿名のデータとして、位置情報の精度向上や位置情報に基づくサービスの改善に使用することがあります。<ph name="BEGIN_LINK1" />詳細<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">拡張機能のパッケージ化に関する警告</translation>
+<translation id="2959842337402130152">ストレージの空き容量が不足しているため復元できません。デバイスの空き容量を <ph name="SPACE_REQUIRED" /> 確保して、もう一度お試しください。</translation>
 <translation id="296026337010986570">有害なソフトウェアが削除されました。拡張機能をもう一度使用するには、&lt;a href="chrome://extensions"&gt;拡張機能&lt;/a&gt;のページにアクセスしてください。</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" />(期限延長済み)</translation>
 <translation id="2961695502793809356">クリックすると次に進みます。押したまま待つと履歴が表示されます。</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">起動を完了</translation>
 <translation id="3454213325559396544">この <ph name="DEVICE_TYPE" /> でソフトウェアとセキュリティの自動アップデートが行われるのは今回が最後です。今後もアップデートを取得するには、新しいモデルにアップグレードしてください。</translation>
 <translation id="345693547134384690">新しいタブで画像を開く(&amp;I)</translation>
-<translation id="3457500881955698515">あなたの会社または組織がこのデバイスを今すぐ更新するよう求めています</translation>
 <translation id="3459509316159669723">印刷</translation>
 <translation id="3459697287128633276">お使いのアカウントで Google Play ストアにアクセスするには、ID プロバイダの認証を受けてください。</translation>
 <translation id="3459774175445953971">最終更新日:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">別のフォルダを選択...</translation>
 <translation id="3967822245660637423">ダウンロード完了</translation>
 <translation id="3967919079500697218">スクリーンショットを撮る機能は、管理者によって無効にされています。</translation>
+<translation id="3969092967100188979">オン(ローミングあり)</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">計算しています...</translation>
 <translation id="3975565978598857337">レルムのサーバーに接続できませんでした</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">保存した指紋</translation>
 <translation id="407173827865827707">クリックされた場合のみ</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{タブの固定を解除}other{タブの固定を解除}}</translation>
+<translation id="4072805772816336153">しばらくしてからもう一度お試しください</translation>
 <translation id="4074900173531346617">メール署名者の証明書</translation>
 <translation id="407520071244661467">倍率</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> をキャストできません。</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">大</translation>
 <translation id="4209251085232852247">オフになっています</translation>
 <translation id="4209464433672152343">ドキュメントは印刷準備のため <ph name="BEGIN_LINK_HELP" />Google に送信<ph name="END_LINK_HELP" />されます。<ph name="BEGIN_LINK_DASHBOARD" />Google クラウド プリントのダッシュボード<ph name="END_LINK_DASHBOARD" />でプリンタとプリンタの履歴を表示、編集、管理できます。</translation>
+<translation id="4210048056321123003">仮想マシンをダウンロードしています</translation>
 <translation id="421182450098841253">ブックマーク バーを表示(&amp;S)</translation>
 <translation id="4211851069413100178">使用状況データや診断データを送信します。診断データやデバイスとアプリの使用状況データを Google に自動送信して、Android の機能向上にご協力ください。この情報は、システムとアプリの安定性の向上やその他の機能の改善に役立てられます。また、Google のアプリやパートナー(Android デベロッパーなど)も、集計データとしてこの情報を活用します。この<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />は所有者によって管理されています。このデバイスの診断データや使用状況データを Google に送信するよう所有者が設定している可能性があります。[その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータは Google アカウントに保存されます。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">エクスポート</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">メロン</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> がウィンドウを共有しています。</translation>
 <translation id="4364830672918311045">通知を表示</translation>
-<translation id="4365673000813822030">同期は停止されました。</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> で<ph name="ACTION_NAME" />します。</translation>
 <translation id="4370975561335139969">入力したメールアドレスとパスワードが一致しません</translation>
 <translation id="437184764829821926">フォントの詳細設定</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">接続中...</translation>
 <translation id="4378556263712303865">デバイスの登録</translation>
 <translation id="4380648069038809855">全画面表示に切り替えました</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />、他 1 件のアカウント}other{<ph name="EMAIL" />、他 <ph name="EXTRA_ACCOUNTS" /> 件のアカウント}}</translation>
 <translation id="4384312707950789900">優先ネットワークに追加</translation>
 <translation id="4384652540891215547">拡張機能を有効にする</translation>
 <translation id="438503109373656455">サラトガ</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">これらのサーバーを識別する証明書がファイルに格納されています</translation>
 <translation id="4598556348158889687">ストレージ管理</translation>
 <translation id="4598776695426288251">複数のデバイスから Wi-Fi に接続できます</translation>
+<translation id="4599134080475764833">プラグイン VM を使用する準備が整いました</translation>
 <translation id="4602466770786743961"><ph name="HOST" /> によるカメラとマイクへのアクセスを常に許可する</translation>
 <translation id="4608500690299898628">検索(&amp;F)...</translation>
 <translation id="4608520674724523647">登録が完了したことを示す画像</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">このブックマークは iPhone と共有できます</translation>
 <translation id="4663373278480897665">カメラを使用できます</translation>
 <translation id="4664482161435122549">PKCS #12 エクスポート エラー</translation>
+<translation id="4664736447097490764">Kerberos 設定ファイルをここで編集します。</translation>
 <translation id="4665014895760275686">メーカー</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> で保存されたすべてのデータが削除されます。</translation>
 <translation id="4668721319092543482">クリックして <ph name="PLUGIN_NAME" /> を有効にします</translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">OS アップデートのインストール中</translation>
 <translation id="4830573902900904548">お使いの <ph name="DEVICE_TYPE" /> から <ph name="NETWORK_NAME" /> を使用してインターネットに接続できません。別のネットワークを選択してください。<ph name="LEARN_MORE_LINK_START" />詳細<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome はリクエストされたリソースにアクセスできません。</translation>
-<translation id="4835836146030131423">ログイン中にエラーが発生しました。</translation>
 <translation id="4837926214103741331">このデバイスを使用する権限がありません。ログイン権限については、デバイスの所有者にお問い合わせください。</translation>
 <translation id="4837952862063191349">ロックを解除してローカルデータを復元するには、<ph name="DEVICE_TYPE" /> の以前のパスワードを入力してください。</translation>
 <translation id="4838836835474292213">クリップボードへの読み取りアクセスが許可されています</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">コピーを消去</translation>
 <translation id="5030338702439866405">発行元</translation>
 <translation id="5033266061063942743">幾何学模様</translation>
-<translation id="5033619151015094114">あなたの会社または組織がこのデバイスを更新するよう求めています</translation>
 <translation id="503498442187459473"><ph name="HOST" /> から、カメラとマイクの使用許可を求められています</translation>
 <translation id="5036662165765606524">複数ファイルの自動ダウンロードをどのサイトにも許可しない</translation>
 <translation id="5037676449506322593">すべてを選択</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">もう一度ログインする</translation>
 <translation id="5256861893479663409">すべてのサイト</translation>
 <translation id="5258992782919386492">このデバイスにインストール</translation>
+<translation id="5260334392110301220">スマート引用符</translation>
 <translation id="5260508466980570042">メールまたはパスワードを確認できませんでした。もう一度お試しください。</translation>
 <translation id="5261683757250193089">ウェブストアで開く</translation>
 <translation id="5264148714798105376">これには 1 分ほどかかる場合があります。</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">ゲストとしてログインしています。</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">言語</translation>
+<translation id="5302932258331363306">置換するテキストを表示</translation>
 <translation id="5305688511332277257">インストールされていません</translation>
 <translation id="5307030433605830021">サポートされていないソースです</translation>
 <translation id="5308380583665731573">接続</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">無効</translation>
 <translation id="5457459357461771897">パソコンからの写真、音楽、その他のメディアの読み取りと削除</translation>
 <translation id="5457599981699367932">ゲストとしてブラウジング</translation>
+<translation id="5457991019809708398">オン(ローミングなし)</translation>
 <translation id="5458998536542739734">ロック画面のメモ</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> のインデックス</translation>
 <translation id="5463856536939868464">非表示のブックマークを含むメニュー</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">Linux 仮想マシン: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">対象ファイルは前回のダウンロード後に一部または全体が削除されました。</translation>
 <translation id="5801568494490449797">設定</translation>
+<translation id="5804175651771201311">ローミング オフ</translation>
 <translation id="5804241973901381774">権限</translation>
 <translation id="5805697420284793859">ウィンドウ マネージャ</translation>
 <translation id="5811750797187914944">設定を完了</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">サポートが終了しています。</translation>
 <translation id="6317369057005134371">アプリケーション ウィンドウを待機しています...</translation>
 <translation id="6318407754858604988">ダウンロードを開始しました</translation>
+<translation id="6318944945640833942">プリンタを検出できませんでした。プリンタのアドレスをもう一度入力してください。</translation>
 <translation id="6322653941595359182">Chromebook でテキスト メッセージを送受信します</translation>
 <translation id="6324916366299863871">ショートカットの編集</translation>
 <translation id="6325191661371220117">自動起動を無効にする</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">UI サービス</translation>
 <translation id="6725206449694821596">インターネット印刷プロトコル(IPP)</translation>
 <translation id="67269783048918309">使用状況データや診断データを送信します。このデバイスは現在、診断データやデバイスとアプリの使用状況データを Google に自動送信するように設定されています。この情報を使ってお子様個人が特定されることはありません。この情報は、システムとアプリの安定性の向上やその他の機能の改善に役立てられます。また、Google のアプリやパートナー(Android デベロッパーなど)も、集計データとしてこの情報を活用します。この<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />は所有者によって管理されています。お子様の [その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータはお子様の Google アカウントに保存されます。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">接続済み、<ph name="BATTERY_PERCENTAGE" />% のバッテリー残量</translation>
 <translation id="6732801395666424405">証明書が読み込まれていません</translation>
 <translation id="6732900235521116609">ショートカットの削除はできません</translation>
 <translation id="6735304988756581115">Cookie と他のサイトのデータを表示...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">自転車</translation>
 <translation id="6877460900831874810">ロック画面での Chrome のメディア再生を有効にする</translation>
 <translation id="6878422606530379992">センサーが許可されました</translation>
+<translation id="6878665006737889642">もう一度インストールしてください</translation>
 <translation id="6880587130513028875">このページの画像はブロックされました。</translation>
 <translation id="6883319974225028188">デバイスの設定を保存できませんでした。</translation>
 <translation id="6885771755599377173">システム情報のプレビュー</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">同期サーバーに接続できませんでした。再試行しています...</translation>
 <translation id="7121362699166175603">アドレスバーの履歴とオートコンプリートを削除します。お使いの Google アカウントの <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> に、他の形式の閲覧履歴が記録されている場合があります。</translation>
 <translation id="7121389946694989825">使用状況データや診断データを送信します。このデバイスは現在、診断データやデバイスとアプリの使用状況データを Google に自動送信するように設定されています。この情報を使ってお子様個人が特定されることはありません。この情報は、システムとアプリの安定性の向上やその他の機能の改善に役立てられます。また、Google のアプリやパートナー(Android デベロッパーなど)も、集計データとしてこの情報を活用します。お子様の [その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータはお子様の Google アカウントに保存されます。<ph name="BEGIN_LINK1" />詳細<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">スマート ダッシュ</translation>
 <translation id="7123360114020465152">サポートが終了しています</translation>
 <translation id="7124929488592184705">「<ph name="DOCUMENT_NAME" />」の印刷エラー</translation>
 <translation id="7127980134843952133">ダウンロード履歴</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413">現在 <ph name="FULLSCREEN_ORIGIN" /> は全画面表示です。</translation>
 <translation id="7340650977506865820">サイトで画面が共有されています</translation>
 <translation id="7341834142292923918">このサイトへのアクセス許可が必要です</translation>
+<translation id="7344488796804562294">Kerberos の詳細設定</translation>
 <translation id="7345706641791090287">パスワードを再入力</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7347751611463936647">この拡張機能を使用するには、「<ph name="EXTENSION_KEYWORD" />」と入力して Tab キーを押してからコマンドまたは検索キーワードを入力してください。</translation>
@@ -4759,6 +4778,7 @@
 <translation id="8227119283605456246">添付ファイル</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> のパスワードを保存しますか?</translation>
 <translation id="8234795456569844941">問題解決の手がかりとして、具体的にどのような操作を行ったときにプロフィール エラーのメッセージが表示されたかをお知らせください。</translation>
+<translation id="8236917170563564587">代わりにこのタブを共有</translation>
 <translation id="8241040075392580210">シェイディ</translation>
 <translation id="8241806945692107836">デバイスの設定を確認しています...</translation>
 <translation id="8241868517363889229">ブックマークの読み取りと変更</translation>
@@ -4770,6 +4790,7 @@
 <translation id="8249048954461686687">OEM フォルダ</translation>
 <translation id="8249615410597138718">お使いのデバイスに送信</translation>
 <translation id="8249672078237421304">母国語以外のページで翻訳ツールを表示する</translation>
+<translation id="8251441930213048644">今すぐ更新</translation>
 <translation id="8251578425305135684">サムネイルを削除しました。</translation>
 <translation id="8252569384384439529">アップロードしています...</translation>
 <translation id="8253198102038551905">ネットワークのプロパティを表示するには [+] をクリック</translation>
@@ -5147,6 +5168,7 @@
 <translation id="8827752199525959199">その他の操作、<ph name="DOMAIN" /> での <ph name="USERNAME" /> のパスワード</translation>
 <translation id="882854468542856424">すべてのサイトに対して近くにある Bluetooth デバイスの検出を許可しない</translation>
 <translation id="8828933418460119530">DNS 名</translation>
+<translation id="883062543841130884">置換</translation>
 <translation id="8830796635868321089">現在のプロキシ設定を使用してアップデートをチェックできませんでした。<ph name="PROXY_SETTINGS_LINK_START" />プロキシ設定<ph name="PROXY_SETTINGS_LINK_END" />を調整してください。</translation>
 <translation id="8831664945713891930">拡張機能の設定を開く</translation>
 <translation id="8834039744648160717">ネットワーク設定は <ph name="USER_EMAIL" /> によって管理されています。</translation>
@@ -5167,6 +5189,7 @@
 <translation id="8862003515646449717">高速なブラウザをぜひご利用ください</translation>
 <translation id="8863753581171631212">新しい <ph name="APP" /> でリンクを開く</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> を <ph name="APP_NAME" /> に共有しています</translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> はこのデバイスから削除されました</translation>
 <translation id="8868626022555786497">使用中</translation>
 <translation id="8870318296973696995">ホームページ</translation>
 <translation id="8870413625673593573">最近閉じたタブ</translation>
@@ -5175,7 +5198,6 @@
 <translation id="8871974300055371298">コンテンツの設定</translation>
 <translation id="8872155268274985541">無効なキオスク外部更新マニフェスト ファイルが見つかりました。キオスクアプリを更新できませんでした。USB スティックを取り外してください。</translation>
 <translation id="8874184842967597500">未接続</translation>
-<translation id="887550310442005096">あなたの会社または組織がこのデバイスの更新を求めています</translation>
 <translation id="8876307312329369159">この設定はデモセッションでは変更できません。</translation>
 <translation id="8877448029301136595">[親ディレクトリ]</translation>
 <translation id="8879284080359814990">タブで表示(&amp;S)</translation>
@@ -5290,6 +5312,7 @@
 <translation id="9044646465488564462">ネットワークに接続できませんでした: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">アクセスしようとしているページのウェブアドレスを Google に送信します</translation>
 <translation id="9046895021617826162">接続に失敗しました</translation>
+<translation id="9047391224416514812">このユーザー名のアカウントはすでに設定されています</translation>
 <translation id="9050666287014529139">パスフレーズ</translation>
 <translation id="9052208328806230490"><ph name="CLOUD_PRINT_NAME" /> に、アカウント <ph name="EMAIL" /> を使ってプリンタを登録しました</translation>
 <translation id="9052404922357793350">引き続きブロックする</translation>
@@ -5337,6 +5360,7 @@
 <translation id="9121814364785106365">固定されたタブとして開く</translation>
 <translation id="9124003689441359348">保存したパスワードがここに表示されます</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" />(残り <ph name="LICENSE_COUNT" /> ライセンス)</translation>
+<translation id="9128317794749765148">セットアップを完了できませんでした</translation>
 <translation id="9128870381267983090">ネットワークに接続する</translation>
 <translation id="9130015405878219958">入力されたモードが無効です。</translation>
 <translation id="9131487537093447019">Bluetooth デバイスとのメッセージの送受信。</translation>
@@ -5405,6 +5429,7 @@
 <translation id="939598580284253335">パスフレーズを入力</translation>
 <translation id="939736085109172342">新しいフォルダ</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> が Chrome タブと音声を共有しています。</translation>
+<translation id="945166830402967374">組織のデバイス管理者にお問い合わせください</translation>
 <translation id="945522503751344254">フィードバックを送信</translation>
 <translation id="947329552760389097">要素の検証(&amp;I)</translation>
 <translation id="952992212772159698">無効</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index f5cf52b..f390fd6f 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">ಡೆಮೊ ಮೋಡ್ ಸಾಧನದ ಪರವಾನಗಿಗಳಲ್ಲಿ ಸಮಸ್ಯೆ ಸಂಭವಿಸಿದೆ.</translation>
 <translation id="126710816202626562">ಅನುವಾದ ಭಾಷೆ:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">ಸುಧಾರಿತ ಕಾನ್ಫಿಗರೇಶನ್</translation>
 <translation id="1272079795634619415">ನಿಲ್ಲಿಸಿ</translation>
 <translation id="1272978324304772054">ಈ ಬಳಕೆದಾರನ ಖಾತೆಯು ಸಾಧನವು ದಾಖಲಾಗಿರುವ ಡೊಮೇನ್‌ಗೆ ಸಂಬಂಧಿಸಿಲ್ಲ. ನೀವು ವಿಭಿನ್ನ ಡೊಮೆನ್ ಅನ್ನು ದಾಖಲಿಸಲು ಬಯಸುವುದಾದರೆ ನೀವು ಮೊದಲು ಮರುಪ್ರಾಪ್ತಿಯ ಸಾಧನದ ಮೂಲಕ ಹೋಗುವ ಅವಶ್ಯಕತೆ ಇದೆ.</translation>
 <translation id="1274977772557788323">Adobe Flash Player ಸಂಗ್ರಹಣೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation>
 <translation id="1444628761356461360">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಾಧನದ ಮಾಲೀಕರಿಂದ ನಿರ್ವಹಿಸಿಲಾಗುತ್ತದೆ, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">'<ph name="IMAGE_PATH" />' ಅನ್ನು ಥೀಮ್‌ಗಾಗಿ ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="1445693676523799095">ಇದು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು</translation>
 <translation id="1451375123200651445">ವೆಬ್‌ಪುಟ, ಒಂದೇ ಫೈಲ್</translation>
 <translation id="1451917004835509682">ಮೇಲ್ವಿಚಾರಣೆ ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="1454223536435069390">ಸ್ಕ್ರೀ&amp;ನ್‌ಶಾಟ್‌ ತೆಗೆದುಕೊಳ್ಳಿ</translation>
@@ -595,6 +597,7 @@
 <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> ಮೂಲಕ ಮಾತ್ರ ಇದನ್ನು ಸೇರಿಸಬಹುದಾಗಿದೆ</translation>
 <translation id="1877520246462554164">ದೃಢೀಕರಣ ಟೋಕನ್ ಪಡೆಯಲು ವಿಫಲವಾಗಿದೆ. ಸೈನ್ ಔಟ್ ಆಗಿ ಮತ್ತೆ ಸೈನ್ ಇನ್ ಆಗಿ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="1877860345998737529">ಕ್ರಿಯೆಯ ನಿಯೋಜನೆಯನ್ನು ಬದಲಿಸಿ</translation>
+<translation id="1878541307036593717">ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸಿ</translation>
 <translation id="1879000426787380528">ಇದರಂತೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅಳಿಸುವುದೆ?</translation>
 <translation id="1886996562706621347">ಪ್ರೊಟೋಕಾಲ್‌ಗಳಿಗಾಗಿ ಡಿಫಾಲ್ಟ್ ಹ್ಯಾಂಡ್ಲರ್‌‌ಗಳಾಗಲು ಸೈಟ್‌ಗಳನ್ನು ಅನುಮತಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
@@ -607,6 +610,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation>
 <translation id="1895658205118569222">ಶಟ್‌ಡೌನ್</translation>
 <translation id="1895934970388272448">ನೀವು ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ನಿಮ್ಮ ಮುದ್ರಕದಲ್ಲಿ ನೋಂದಣಿಯನ್ನು ದೃಢೀಕರಿಸಬೇಕು - ಅದನ್ನು ಈಗಲೇ ಪರಿಶೀಲಿಸಿ.</translation>
+<translation id="1899826437968063457">ಪ್ಲಗ್‌ಇನ್ VM ಅನ್ನು ರನ್ ಮಾಡಲು ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="1901303067676059328">&amp;ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="1902576642799138955">ವಾಯಿದೆ ಅವಧಿ</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{ಟ್ಯಾಬ್ ಅನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ}one{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ}other{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ}}</translation>
@@ -880,6 +884,7 @@
 <translation id="2318923050469484167">ಪ್ರಸ್ತುತ ಅದೃಶ್ಯ ಸೆಶನ್ (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">ಶೀರ್ಷಿಕೆಗಳು ಮತ್ತು ಅಡಿಟಿಪ್ಪಣಿಗಳು</translation>
 <translation id="2322318151094136999">ಯಾವುದೇ ಸೈಟ್, ಸೀರಿಯಲ್ ಪೋರ್ಟ್‌ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ವಿನಂತಿಸಿದಾಗ, ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
+<translation id="2325444234681128157">ಪಾಸ್‌ವರ್ಡ್‌ ನೆನಪಿಟ್ಟುಕೊಳ್ಳಿ</translation>
 <translation id="2326931316514688470">ಅಪ್ಲಿಕೇಶನ್ &amp;ಮರುಲೋಡ್ ಮಾಡಿ</translation>
 <translation id="2327492829706409234">ಅಪ್ಲಿಕೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸು</translation>
 <translation id="2329597144923131178">ನಿಮ್ಮ ಎಲ್ಲ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">ಪುಟವನ್ನು ಸ್ವಯಂ ರಿಫ್ರೆಶ್ ಮಾಡಲು URL ನಲ್ಲಿ ಪ್ರಶ್ನಾವಳಿ ಪ್ಯಾರಾಮೀಟರ್ ಸೇರಿಸಿ: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">ಗೋಚರತೆ</translation>
 <translation id="2433836460518180625">'ಸಾಧನ ಮಾತ್ರ' ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ</translation>
+<translation id="2434449159125086437">ಪ್ರಿಂಟರ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="2435248616906486374">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="2435457462613246316">ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="2436186046335138073"><ph name="PROTOCOL" /> ಎಲ್ಲಾ ಲಿಂಕ್‌ಗಳನ್ನು ತೆರೆಯಲು <ph name="HANDLER_HOSTNAME" /> ಗೆ ಅನುಮತಿಸುವುದೇ?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64-ಎನ್‌ಕೋಡ್ ಮಾಡಿದ ASCII, ಪ್ರಮಾಣಪತ್ರ ಸರಣಿ</translation>
 <translation id="2653033005692233957">ಹುಡುಕಾಟ ವಿಫಲವಾಗಿದೆ</translation>
 <translation id="2653266418988778031">ಪ್ರಮಾಣೀಕರಣ ಪ್ರಾಧಿಕಾರದ (CA) ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೀವು ಅಳಿಸಿದ್ದೇ ಆದರೆ, ಆ ಬಳಿಕ CA ಬಿಡುಗಡೆ ಮಾಡುವ ಯಾವುದೇ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಿಮ್ಮ ಬ್ರೌಸರ್  ನಂಬುವುದಿಲ್ಲ.</translation>
+<translation id="2653275834716714682">ಪಠ್ಯ ಬದಲಿಸುವಿಕೆ</translation>
 <translation id="2653659639078652383">ಸಲ್ಲಿಸು</translation>
 <translation id="265390580714150011">ಕ್ಷೇತ್ರ ಮೌಲ್ಯ</translation>
 <translation id="2654166010170466751">ಪಾವತಿ ಹ್ಯಾಂಡ್‌ಲರ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಸೈಟ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಅನುಮತಿಸಿ</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">ಆಧುನಿಕ ವೆಬ್‌ಗಾಗಿ ರೂಪಿಸಲಾದ, ತ್ವರಿತ, ಸರಳ ಮತ್ತು ಸುರಕ್ಷಿತ ವೆಬ್‌ ಬ್ರೌಸರ್‌ ಆಗಿದೆ.</translation>
 <translation id="2949289451367477459">ಸ್ಥಳವನ್ನು ಬಳಸಿ. ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳಿಗೆ ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಬಳಸಲು ಅವಕಾಶ ನೀಡಿ. ಸ್ಥಳ ಡೇಟಾವನ್ನು Google ನಿಯತಕಾಲಿಕವಾಗಿ ಸಂಗ್ರಹಿಸಬಹುದು ಮತ್ತು ಸ್ಥಳ ನಿಖರತೆ ಮತ್ತು ಸ್ಥಳ ಆಧಾರಿತ ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಅನಾಮಧೇಯ ರೀತಿಯಲ್ಲಿ ಈ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">ಪ್ಯಾಕ್ ವಿಸ್ತರಣೆಯ ಎಚ್ಚರಿಕೆ</translation>
+<translation id="2959842337402130152">ಕಡಿಮೆ ಸಂಗ್ರಹಣೆಯ ಸ್ಥಳ ಇರುವ ಕಾರಣ ಮರುಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಸಾಧನದಿಂದ <ph name="SPACE_REQUIRED" /> ರಷ್ಟು ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="296026337010986570">ಮುಗಿದಿದೆ! ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ವಿಸ್ತರಣೆಗಳನ್ನು ಪುನಃ ಆನ್ ಮಾಡಲು, &lt;a href="chrome://extensions"&gt;ವಿಸ್ತರಣೆಗಳು&lt;/a&gt; ಎಂಬಲ್ಲಿಗೆ ಭೇಟಿ ನೀಡಿ.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ವಿಸ್ತರಣೆಯನ್ನು ಒದಗಿಸಲಾಗಿದೆ)</translation>
 <translation id="2961695502793809356">ಮುಂದಕ್ಕೆ ಹೋಗಲು ಕ್ಲಿಕ್ ಮಾಡಿ, ಇತಿಹಾಸ ನೋಡಲು ಒತ್ತಿಹಿಡಿಯಿರಿ</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
 <translation id="3454213325559396544">ಈ <ph name="DEVICE_TYPE" /> ಗಾಗಿ, ಇದು ಕೊನೆಯ ಸಾಫ್ಟ್‌ವೇರ್ ಹಾಗೂ ಸುರಕ್ಷತಾ ಅಪ್‌ಡೇಟ್ ಆಗಿದೆ. ಭವಿಷ್ಯದ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪಡೆಯಲು, ಹೊಸ ಮಾಡೆಲ್‌ಗೆ ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ.</translation>
 <translation id="345693547134384690">ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ &amp;ಇಮೇಜ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation>
-<translation id="3457500881955698515">ನಿಮ್ಮ ಕಂಪನಿ ಅಥವಾ ಸಂಸ್ಥೆಗೆ ಈ ಸಾಧನವನ್ನು ಈಗಲೇ ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿರುತ್ತದೆ</translation>
 <translation id="3459509316159669723">ಮುದ್ರಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="3459697287128633276">Google Play ಸ್ಟೋರ್ ಪ್ರವೇಶಿಸಿಲು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, ನಿಮ್ಮ ಗುರುತು ಒದಗಿಸುವವರ ಮೂಲಕ ದೃಢೀಕರಿಸಿ.</translation>
 <translation id="3459774175445953971">ಕಳೆದ ಬಾರಿ ಮಾರ್ಪಡಿಸಿರುವುದು:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">ಮತ್ತೊಂದು ಫೋಲ್ಡರ್ ಆಯ್ಕೆ ಮಾಡಿ...</translation>
 <translation id="3967822245660637423">ಡೌನ್‌ಲೋಡ್‌‌ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
 <translation id="3967919079500697218">ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವ ಸಾಮರ್ಥ್ಯವನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
+<translation id="3969092967100188979">ಆನ್ ಆಗಿದೆ, ರೋಮಿಂಗ್ ಸೇವೆ ಇದೆ</translation>
 <translation id="3970114302595058915">ಐಡಿ</translation>
 <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="3975565978598857337">ಕ್ಷೇತ್ರಕ್ಕಾಗಿ ಸರ್ವರ್ ಸಂಪರ್ಕಿಸುವುದು ವಿಫಲವಾಗಿದೆ</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">ಉಳಿಸಿದ ಬೆರಳಚ್ಚುಗಳು</translation>
 <translation id="407173827865827707">ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{ಟ್ಯಾಬ್ ಅನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ}one{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ}other{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ}}</translation>
+<translation id="4072805772816336153">ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="4074900173531346617">ಇಮೇಲ್ ಸಹಿ ಮಾಡುವವರ ಪ್ರಮಾಣಪತ್ರ</translation>
 <translation id="407520071244661467">ಮಾಪಕ</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">ದೊಡ್ಡದು</translation>
 <translation id="4209251085232852247">ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4209464433672152343">ಪ್ರಿಂಟಿಂಗ್‌ಗಾಗಿ ಸಿದ್ಧಪಡಿಸಲು ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು <ph name="BEGIN_LINK_HELP" />Google ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ<ph name="END_LINK_HELP" /> <ph name="BEGIN_LINK_DASHBOARD" />Google ಕ್ಲೌಡ್ ಪ್ರಿಂಟ್ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌<ph name="END_LINK_DASHBOARD" />ನಲ್ಲಿ ನಿಮ್ಮ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು ಮತ್ತು ಪ್ರಿಂಟರ್ ಇತಿಹಾಸವನ್ನು ವೀಕ್ಷಿಸಿ, ಎಡಿಟ್ ಮಾಡಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ.</translation>
+<translation id="4210048056321123003">ವರ್ಚುವಲ್ ಯಂತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="421182450098841253">&amp;ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸಿ</translation>
 <translation id="4211851069413100178">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ, ಹಾಗೂ ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ ನಿಮ್ಮ Android ಅನುಭವವನ್ನು ಉತ್ತಮಗೊಳಿಸುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಿ. ಇದು ಸಿಸ್ಟಮ್ ಮತ್ತು ಆ್ಯಪ್ ಸ್ಥಿರತೆಗೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟುಗೂಡಿಸಿದ ಡೇಟಾವು, Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಮತ್ತು ಪಾಲುದಾರರಿಗೂ ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, Android ಡೆವಲಪರ್‌ಗಳು. ಈ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್<ph name="END_LINK1" />ಅನ್ನು ಮಾಲೀಕರೇ ಜಾರಿಗೊಳಿಸುತ್ತಾರೆ. ಈ ಸಾಧನದ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಕಳುಹಿಸಲು ಮಾಲೀಕರು ಆಯ್ಕೆ ಮಾಡಬಹುದು. ನಿಮ್ಮ ಹೆಚ್ಚುವರಿ ವೆಬ್‌ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಆನ್‌ ಆಗಿದ್ದಲ್ಲಿ, ಈ ಡೇಟಾವು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲ್ಪಡಬಹುದು. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">ರಫ್ತು</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">ಕರಬೂಜ ಹಣ್ಣು</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ವಿಂಡೋವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
 <translation id="4364830672918311045">ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation>
-<translation id="4365673000813822030">ಓಹ್, ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದೆ.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> ಮೂಲಕ <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">ನೀವು ನಮೂದಿಸಿದ ಇಮೇಲ್ ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್ ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ</translation>
 <translation id="437184764829821926">ಸುಧಾರಿತ ಫಾಂಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="4378556263712303865">ಸಾಧನದ ನಿಯೋಜನೆ</translation>
 <translation id="4380648069038809855">ಪೂರ್ಣಪರದೆಗೆ ಪ್ರವೇಶಿಸಲಾಗಿದೆ</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 ಕ್ಕೂ ಹೆಚ್ಚಿನ ಖಾತೆ}one{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> ಕ್ಕೂ ಹೆಚ್ಚಿನ ಖಾತೆಗಳು}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> ಕ್ಕೂ ಹೆಚ್ಚಿನ ಖಾತೆಗಳು}}</translation>
 <translation id="4384312707950789900">ಆದ್ಯತೆಗೆ ಸೇರಿಸಿ</translation>
 <translation id="4384652540891215547">ವಿಸ್ತರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="438503109373656455">ಸರಾಟೊಗಾ</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">ಈ ಸರ್ವರ್‌ಗಳನ್ನು ಗುರುತಿಸುವಂತಹ ಫೈಲ್‌ನಲ್ಲಿನ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನೀವು ಹೊಂದಿರುವಿರಿ</translation>
 <translation id="4598556348158889687">ಸಂಗ್ರಹಣೆ ನಿರ್ವಹಣೆ</translation>
 <translation id="4598776695426288251">ಬಹು-ಸಾಧನಗಳ ಮೂಲಕ ವೈ-ಫೈ ಲಭ್ಯವಿದೆ</translation>
+<translation id="4599134080475764833">ಪ್ಲಗ್‌ಇನ್ VM ಬಳಸಲು ಸಿದ್ಧವಾಗಿದೆ</translation>
 <translation id="4602466770786743961">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಅನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation>
 <translation id="4608500690299898628">&amp;ಹುಡುಕು...</translation>
 <translation id="4608520674724523647">ಯಶಸ್ವಿ ನೋಂದಣಿಯ ನಿದರ್ಶನ</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">ನಿಮ್ಮ iPhone ನೊಂದಿಗೆ ಈ ಬುಕ್‌ಮಾರ್ಕ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ</translation>
 <translation id="4663373278480897665">ಕ್ಯಾಮೆರಾಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation>
 <translation id="4664482161435122549">PKCS #12 ರಫ್ತು ದೋಷ</translation>
+<translation id="4664736447097490764">Kerberos ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ ಅನ್ನು ಇಲ್ಲಿ ಎಡಿಟ್ ಮಾಡಿ.</translation>
 <translation id="4665014895760275686">ತಯಾರಕರು</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> ವೆಬ್‌ಸೈಟ್‌ ಮೂಲಕ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾದ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುವುದು.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> ಸಕ್ರಿಯಗೊಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
@@ -2507,7 +2519,6 @@
 <translation id="4830502475412647084">OS ಅಪ್‌ಡೇಟ್‌ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಇಂಟರ್ನೆಟ್‌ಗೆ ಸಂಪರ್ಕ ಹೊಂದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ನೆಟ್‌ವರ್ಕ್ ಆಯ್ಕೆಮಾಡಿ. <ph name="LEARN_MORE_LINK_START" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">ವಿನಂತಿಸಿದ ಸಂಪನ್ಮೂಲದಲ್ಲಿ Chrome ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ.</translation>
-<translation id="4835836146030131423">ಸೈನ್ ಇನ್ ಮಾಡುವಲ್ಲಿ ದೋಷ.</translation>
 <translation id="4837926214103741331">ನೀವು ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಪ್ರಮಾಣಿತರಾಗಿಲ್ಲ. ಸೈನ್-ಇನ್ ಅನುಮತಿಗಾಗಿ ಸಾಧನ ಮಾಲೀಕನನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
 <translation id="4837952862063191349">ನಿಮ್ಮ ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಮತ್ತು ಮರುಸ್ಥಾಪಿಸಲು, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ <ph name="DEVICE_TYPE" /> ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
 <translation id="4838836835474292213">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಓದಲು ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation>
@@ -2642,7 +2653,6 @@
 <translation id="5029568752722684782">ನಕಲು ತೆರವುಗೊಳಿಸು</translation>
 <translation id="5030338702439866405">ಇವರಿಂದ ನೀಡಲಾಗಿದೆ</translation>
 <translation id="5033266061063942743">ಜ್ಯಾಮಿತೀಯ ಆಕೃತಿಗಳು</translation>
-<translation id="5033619151015094114">ನಿಮ್ಮ ಕಂಪನಿ ಅಥವಾ ಸಂಸ್ಥೆಗೆ ಈ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿರುತ್ತದೆ</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಬಳಸಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="5036662165765606524">ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲು ಯಾವುದೇ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುವುದು ಬೇಡ</translation>
 <translation id="5037676449506322593">ಎಲ್ಲವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
@@ -2779,6 +2789,7 @@
 <translation id="5255859108402770436">ಮತ್ತೊಮ್ಮೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="5256861893479663409">ಎಲ್ಲಾ ಸೈಟ್‌ಗಳಲ್ಲಿ</translation>
 <translation id="5258992782919386492">ಈ ಸಾಧನದಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ</translation>
+<translation id="5260334392110301220">ಸ್ಮಾರ್ಟ್ ಉಲ್ಲೇಖಗಳು</translation>
 <translation id="5260508466980570042">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಇಮೇಲ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗಲಿಲ್ಲ.  ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5261683757250193089">ವೆಬ್‌ಸ್ಟೋರ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="5264148714798105376">ಇದು ಒಂದು ನಿಮಿಷ ಅಥವಾ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು.</translation>
@@ -2813,6 +2824,7 @@
 <translation id="5301751748813680278">ಅತಿಥಿಯಾಗಿ ಪ್ರವೇಶಿಸಲಾಗಿದೆ.</translation>
 <translation id="5301954838959518834">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation>
 <translation id="5302048478445481009">ಭಾಷೆ</translation>
+<translation id="5302932258331363306">ಬದಲಿಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="5305688511332277257">ಯಾವುದನ್ನೂ ಸ್ಥಾಪನೆ ಮಾಡಲಾಗಿಲ್ಲ</translation>
 <translation id="5307030433605830021">ಬಿತ್ತರಿಸುವಿಕೆ ಮೂಲಕ್ಕೆ ಬೆಂಬಲವಿಲ್ಲ</translation>
 <translation id="5308380583665731573">ಸಂಪರ್ಕಿಸು</translation>
@@ -2912,6 +2924,7 @@
 <translation id="5457113250005438886">ಅಮಾನ್ಯ</translation>
 <translation id="5457459357461771897">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ ಫೋಟೋಗಳು, ಸಂಗೀತ, ಮತ್ತು ಇತರ ಮಾಧ್ಯಮವನ್ನು ಓದಿರಿ ಮತ್ತು ಅಳಿಸಿ</translation>
 <translation id="5457599981699367932">ಅತಿಥಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ</translation>
+<translation id="5457991019809708398">ಆನ್ ಆಗಿದೆ, ರೋಮಿಂಗ್ ಸೇವೆ ಇಲ್ಲ</translation>
 <translation id="5458998536542739734">ಲಾಕ್‌ ಪರದೆಯ ಟಿಪ್ಪಣಿಗಳು</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> ನ ಸೂಚಿಕೆ</translation>
 <translation id="5463856536939868464">ಮರೆಮಾಡಿದ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಹೊಂದಿರುವ ಮೆನು</translation>
@@ -3138,6 +3151,7 @@
 <translation id="5799508265798272974">Linux ವರ್ಚುವಲ್ ಯಂತ್ರ: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">ಕೊನೆಯ ಡೌನ್‌ಲೋಡ್‌ನಿಂದ ಗಮ್ಯಸ್ಥಾನದ ಫೈಲ್ ಅನ್ನು ಮೊಟಕುಮಾಡಲಾಗಿದೆ ಅಥವಾ ತೆಗೆದುಹಾಕಲಾಗಿದೆ.</translation>
 <translation id="5801568494490449797">ಪ್ರಾಶಸ್ತ್ಯಗಳು</translation>
+<translation id="5804175651771201311">ರೋಮಿಂಗ್ ಆಫ್ ಆಗಿದೆ</translation>
 <translation id="5804241973901381774">ಅನುಮತಿಗಳು</translation>
 <translation id="5805697420284793859">ವಿಂಡೋ ಮ್ಯಾನೇಜರ್</translation>
 <translation id="5811750797187914944">ಎಲ್ಲ ರೀತಿಯಲ್ಲಿಯೂ ಸಿದ್ಧವಾಗಿದೆ</translation>
@@ -3485,6 +3499,7 @@
 <translation id="6317318380444133405">ಇನ್ನು ಮುಂದೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="6317369057005134371">ಅಪ್ಲಿಕೇಶನ್ ವಿಂಡೋಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="6318407754858604988">ಡೌನ್‌ಲೋಡ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ</translation>
+<translation id="6318944945640833942">ಪ್ರಿಂಟರ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪ್ರಿಂಟರ್ ವಿಳಾಸವನ್ನು ಪುನಃ ನಮೂದಿಸಿ.</translation>
 <translation id="6322653941595359182">ನಿಮ್ಮ Chromebook ನಿಂದ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಸ್ವೀಕರಿಸಿ</translation>
 <translation id="6324916366299863871">ಶಾರ್ಟ್‌ಕಟ್ ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="6325191661371220117">ಸ್ವಯಂ-ಪ್ರಾರಂಭವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
@@ -3741,6 +3756,7 @@
 <translation id="6725073593266469338">UI ಸೇವೆ</translation>
 <translation id="6725206449694821596">ಇಂಟರ್ನೆಟ್ ಮುದ್ರಿಸುವಿಕೆಯ ಪ್ರೊಟೊಕಾಲ್ (IPP)</translation>
 <translation id="67269783048918309">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಪ್ರಸ್ತುತ ಈ ಸಾಧನವು ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ, ಮತ್ತು ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತಿದೆ. ಈ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಮಗುವನ್ನು ಗುರುತಿಸುವುದಕ್ಕೆ ಬಳಸುವುದಿಲ್ಲ, ಹಾಗೂ ಇದು ಸಿಸ್ಟಮ್ ಮತ್ತು ಆ್ಯಪ್ ಸ್ಥಿರತೆಗೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟುಗೂಡಿಸಿದ ಡೇಟಾವು, Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಮತ್ತು ಪಾಲುದಾರರಿಗೂ ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, Android ಡೆವಲಪರ್‌ಗಳು. ಈ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್<ph name="END_LINK1" />ಅನ್ನು ಮಾಲೀಕರೇ ಜಾರಿಗೊಳಿಸುತ್ತಾರೆ. ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ ಹೆಚ್ಚುವರಿ ವೆಬ್‌ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್‌ ಮಾಡಿದ್ದಲ್ಲಿ, ಈ ಡೇಟಾವು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲ್ಪಡಬಹುದು. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">ಸಂಪರ್ಕಗೊಂಡಿದೆ, <ph name="BATTERY_PERCENTAGE" />% ರಷ್ಟು ಬ್ಯಾಟರಿ ಲಭ್ಯವಿದೆ</translation>
 <translation id="6732801395666424405">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಲೋಡ್‌ ಮಾಡಲಾಗಲಿಲ್ಲ</translation>
 <translation id="6732900235521116609">ಶಾರ್ಟ್‌ಕಟ್‌ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="6735304988756581115">ಕುಕ್ಕಿಗಳು ಮತ್ತು ಇತರ ಸೈಟ್ ಡೇಟಾವನ್ನು ತೋರಿಸಿ...</translation>
@@ -3834,6 +3850,7 @@
 <translation id="6876155724392614295">ಬೈಕ್</translation>
 <translation id="6877460900831874810">ಸ್ಕ್ರೀನ್ ಲಾಕ್‌ನಲ್ಲಿದ್ದಾಗ Chrome ಮಾಧ್ಯಮ ಪ್ಲೇಬ್ಯಾಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="6878422606530379992">ಸೆನ್ಸರ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation>
+<translation id="6878665006737889642">ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವುದನ್ನು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="6880587130513028875">ಈ ಪುಟದಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="6883319974225028188">ಓಹ್‌‌! ಸಾಧನದ ಕಾನ್ಫಿಗರೇಶನ್ ಉಳಿಸಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation>
 <translation id="6885771755599377173">ಸಿಸ್ಟಂ ಮಾಹಿತಿ ಪೂರ್ವವೀಕ್ಷಣೆ</translation>
@@ -4003,6 +4020,7 @@
 <translation id="7120865473764644444">ಸಿಂಕ್ ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಲಿಲ್ಲ. ಮರುಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="7121362699166175603">ವಿಳಾಸ ಪಟ್ಟಿಯ ಇತಿಹಾಸ ಮತ್ತು ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆಯನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ನಲ್ಲಿ ಇತರ ವಿಧಗಳ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೊಂದಿರಬಹುದು.</translation>
 <translation id="7121389946694989825">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಪ್ರಸ್ತುತ ಈ ಸಾಧನವು ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ, ಮತ್ತು ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತಿದೆ. ಈ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಮಗುವನ್ನು ಗುರುತಿಸುವುದಕ್ಕೆ ಬಳಸುವುದಿಲ್ಲ, ಹಾಗೂ ಇದು ಸಿಸ್ಟಮ್ ಮತ್ತು ಆ್ಯಪ್ ಸ್ಥಿರತೆಗೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟುಗೂಡಿಸಿದ ಡೇಟಾವು, Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಮತ್ತು ಪಾಲುದಾರರಿಗೂ ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, Android ಡೆವಲಪರ್‌ಗಳು. ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ ಹೆಚ್ಚುವರಿ ವೆಬ್‌ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್‌ ಮಾಡಿದ್ದಲ್ಲಿ, ಈ ಡೇಟಾವು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲ್ಪಡಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">ಸ್ಮಾರ್ಟ್ ಡ್ಯಾಶ್‌ಗಳು</translation>
 <translation id="7123360114020465152">ಇನ್ನು ಮುಂದೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> ಅನ್ನು ಮುದ್ರಿಸುವಲ್ಲಿ ದೋಷ</translation>
 <translation id="7127980134843952133">ಡೌನ್‌ಲೋಡ್ ಇತಿಹಾಸ</translation>
@@ -4151,6 +4169,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ಇದೀಗ ಪೂರ್ಣ ಪರದೆಯಾಗಿದೆ.</translation>
 <translation id="7340650977506865820">ನಿಮ್ಮ ಪರದೆಯನ್ನು ಸೈಟ್‌ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ</translation>
 <translation id="7341834142292923918">ಈ ಸೈಟ್‌ಗೆ ಪ್ರವೇಶ ಕೋರುತ್ತಿದೆ</translation>
+<translation id="7344488796804562294">ಸುಧಾರಿತ Kerberos ಕಾನ್ಫಿಗರೇಶನ್</translation>
 <translation id="7345706641791090287">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ</translation>
 <translation id="7346909386216857016">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation>
 <translation id="7347751611463936647">ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸಲು "<ph name="EXTENSION_KEYWORD" />", ಅನ್ನು ಟೈಪ್ ಮಾಡಿ, ನಂತರ TAB, ನಂತರ ನಿಮ್ಮ ಕಮಾಂಡ್ ಅಥವಾ ಹುಡುಕಾಟ‌ವನ್ನು ಟೈಪ್ ಮಾಡಿ.</translation>
@@ -4759,6 +4778,7 @@
 <translation id="8227119283605456246">ಫೈಲ್‌‎ ಲಗತ್ತಿಸಿ</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್‌ ಉಳಿಸುವುದೇ?</translation>
 <translation id="8234795456569844941">ಈ ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸಲು ನಮ್ಮ ಇಂಜಿನಿಯರ್‌ಗಳಿಗೆ ಸಹಾಯ ಮಾಡಿ. ಪ್ರೊಫೈಲ್ ದೋಷ ಸಂದೇಶವನ್ನು ಪಡೆಯುವುದಕ್ಕೆ ಸ್ವಲ್ಪ ಮೊದಲು ಏನಾಯಿತು ಎಂದು ನಮಗೆ ತಿಳಿಸಿ:</translation>
+<translation id="8236917170563564587">ಬದಲಾಗಿ ಈ ಟ್ಯಾಬ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ</translation>
 <translation id="8241040075392580210">ಶಾಡಿ</translation>
 <translation id="8241806945692107836">ಸಾಧನದ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿರ್ಧರಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="8241868517363889229">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation>
@@ -4770,6 +4790,7 @@
 <translation id="8249048954461686687">OEM ಫೊಲ್ಡರ್</translation>
 <translation id="8249615410597138718">ನಿಮ್ಮ ಸಾಧನಗಳಿಗೆ ಕಳುಹಿಸಿ</translation>
 <translation id="8249672078237421304">ನೀವು ಓದುವ ಭಾಷೆಯಲ್ಲಿಲ್ಲದ ಪುಟಗಳನ್ನು ಅನುವಾದ ಮಾಡಲು ನೀಡುತ್ತದೆ</translation>
+<translation id="8251441930213048644">ಈಗ ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation>
 <translation id="8251578425305135684">ಥಂಬ್‌ನೇಲ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ.</translation>
 <translation id="8252569384384439529">ಅಪ್‌ಲೋಡ್‌ ಆಗುತ್ತಿದೆ...</translation>
 <translation id="8253198102038551905">ನೆಟ್‌ವರ್ಕ್ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯಲು '+' ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
@@ -5150,6 +5171,7 @@
 <translation id="8827752199525959199">ಇನ್ನಷ್ಟು ಕ್ರಿಯೆಗಳು, <ph name="USERNAME" /> ಅವರಿಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು <ph name="DOMAIN" /> ನಲ್ಲಿ</translation>
 <translation id="882854468542856424">ಸಮೀಪದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಯಾವುದೇ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸಬೇಡಿ</translation>
 <translation id="8828933418460119530">DNS ಹೆಸರು</translation>
+<translation id="883062543841130884">ಬದಲಿಗಳು</translation>
 <translation id="8830796635868321089">ಪ್ರಸ್ತುತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಅಪ್‌ಡೇಟ್‌‌ನ ಪರಿಶೀಲನೆ ವಿಫಲಗೊಂಡಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ <ph name="PROXY_SETTINGS_LINK_START" />ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು<ph name="PROXY_SETTINGS_LINK_END" /> ಹೊಂದಿಸಿ.</translation>
 <translation id="8831664945713891930">ವಿಸ್ತರಣೆಗಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="8834039744648160717"><ph name="USER_EMAIL" /> ಮೂಲಕ ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲಾಗಿದೆ.</translation>
@@ -5170,6 +5192,7 @@
 <translation id="8862003515646449717">ವೇಗವಾದ ಬ್ರೌಸರ್‌ಗೆ ಬದಲಿಸಿ</translation>
 <translation id="8863753581171631212">ಹೊಸ <ph name="APP" /> ನಲ್ಲಿ ಲಿಂಕ್‌ ಅನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> ಅನ್ನು <ph name="APP_NAME" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ</translation>
+<translation id="8864458770072227512">ಈ ಸಾಧನದಿಂದ <ph name="EMAIL" /> ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation>
 <translation id="8868626022555786497">ಬಳಕೆಯಲ್ಲಿದೆ</translation>
 <translation id="8870318296973696995">ಮುಖ ಪುಟ</translation>
 <translation id="8870413625673593573">ಇತ್ತೀಚೆಗೆ ಮುಚ್ಚಿರುವುದು</translation>
@@ -5178,7 +5201,6 @@
 <translation id="8871974300055371298">ವಿಷಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="8872155268274985541">ಅಮಾನ್ಯ ಕಿಯೋಸ್ಕ್ ಬಾಹ್ಯ ಅಪ್‌ಡೇಟ್‌‌ ಮ್ಯಾನಿಫೆಸ್ಟ್ ಫೈಲ್ ಕಂಡುಬಂದಿದೆ. ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು USB ಸ್ಟಿಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ.</translation>
 <translation id="8874184842967597500">ಸಂಪರ್ಕಗೊಳಿಸಿಲ್ಲ</translation>
-<translation id="887550310442005096">ನಿಮ್ಮ ಕಂಪನಿ ಅಥವಾ ಸಂಸ್ಥೆಯು ನೀವು ಈ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕೆಂದು ಕೇಳುತ್ತದೆ</translation>
 <translation id="8876307312329369159">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಡೆಮೊ ಸೆಷನ್‌ನಲ್ಲಿ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
 <translation id="8877448029301136595">[ಮೂಲ ಡೈರೆಕ್ಟರಿ]</translation>
 <translation id="8879284080359814990">ಟ್ಯಾಬ್‌ನಂತೆ &amp;ತೋರಿಸಿ</translation>
@@ -5293,6 +5315,7 @@
 <translation id="9044646465488564462">ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ವಿಫಲವಾಗಿದೆ: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">ನೀವು Google ಗೆ ತಲುಪಿಸಲು ಬಯಸುವಂತಹ ಪುಟದ ವೆಬ್ ವಿಳಾಸವನ್ನು ಕಳುಹಿಸುತ್ತದೆ</translation>
 <translation id="9046895021617826162">ಸಂಪರ್ಕವು ವಿಫಲವಾಗಿದೆ</translation>
+<translation id="9047391224416514812">ಈ ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ಹೊಂದಿರುವ ಖಾತೆಯು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation>
 <translation id="9050666287014529139">ಪಾಸ್‌ಫ್ರೇಸ್</translation>
 <translation id="9052208328806230490"><ph name="EMAIL" /> ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು <ph name="CLOUD_PRINT_NAME" /> ರೊಂದಿಗೆ ನಿಮ್ಮ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು ನೀವು ನೋಂದಾಯಿಸಿರುವಿರಿ</translation>
 <translation id="9052404922357793350">ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
@@ -5340,6 +5363,7 @@
 <translation id="9121814364785106365">ಪಿನ್ ಮಾಡಿದ ಟ್ಯಾಬ್ ಆಗಿ ತೆರೆ</translation>
 <translation id="9124003689441359348">ಉಳಿಸಲಾದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (ಉಳಿದಿರುವ <ph name="LICENSE_COUNT" />.)</translation>
+<translation id="9128317794749765148">ಸೆಟಪ್ ಮಾಡುವಿಕೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
 <translation id="9128870381267983090">ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸು</translation>
 <translation id="9130015405878219958">ಅಮಾನ್ಯ ಮೋಡ್ ನಮೂದಿಸಲಾಗಿದೆ.</translation>
 <translation id="9131487537093447019">ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಸ್ವೀಕರಿಸಿ.</translation>
@@ -5409,6 +5433,7 @@
 <translation id="939598580284253335">ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation>
 <translation id="942532530371314860">Chrome ಟ್ಯಾಬ್ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
+<translation id="945166830402967374">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಸಾಧನ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ</translation>
 <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
 <translation id="947329552760389097">&amp;ಅಂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="952992212772159698">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 2230e80..b0c07664 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">데모 모드 기기 라이선스에 문제가 발생했습니다.</translation>
 <translation id="126710816202626562">번역 언어:</translation>
 <translation id="126768002343224824">16배</translation>
+<translation id="1269405567167332785">고급 설정</translation>
 <translation id="1272079795634619415">중지</translation>
 <translation id="1272978324304772054">이 사용자 계정은 기기가 등록된 도메인에 속해 있지 않습니다. 다른 도메인에 등록하려면 먼저 기기 복구 절차를 거쳐야 합니다.</translation>
 <translation id="1274977772557788323">Adobe Flash Player 저장용량 설정</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" />개가 선택되었습니다</translation>
 <translation id="1444628761356461360">기기 소유자인 <ph name="OWNER_EMAIL" />이(가) 관리하는 설정입니다.</translation>
 <translation id="144518587530125858">테마('<ph name="IMAGE_PATH" />')를 로드하지 못했습니다.</translation>
+<translation id="1445693676523799095">잠시만 기다려 주세요.</translation>
 <translation id="1451375123200651445">웹페이지, 단일 파일</translation>
 <translation id="1451917004835509682">관리 대상 사용자 추가</translation>
 <translation id="1454223536435069390">스크린샷 캡쳐하기(&amp;A)</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">이 프로그램은 <ph name="CHROME_WEB_STORE" />에서만 추가할 수 있습니다</translation>
 <translation id="1877520246462554164">인증 토큰을 가져오지 못했습니다. 로그아웃한 다음 다시 로그인하여 다시 시도해 주세요.</translation>
 <translation id="1877860345998737529">스위치 작업 할당</translation>
+<translation id="1878541307036593717">권한 설정</translation>
 <translation id="1879000426787380528">다음 사용자로 로그인</translation>
 <translation id="1880905663253319515">인증서 '<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation>
 <translation id="1886996562706621347">사이트에서 프로토콜 기본 핸들러로 사용할지 여부를 묻도록 허용(권장)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> 남음</translation>
 <translation id="1895658205118569222">종료</translation>
 <translation id="1895934970388272448">이 프로세스를 종료하려면 프린터 등록을 확인해야 합니다. 지금 확인하세요.</translation>
+<translation id="1899826437968063457">플러그인 VM에 실행 권한 필요</translation>
 <translation id="1901303067676059328">전체 선택(&amp;A)</translation>
 <translation id="1902576642799138955">유효성 기간</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{탭 숨기기}other{탭 숨기기}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">현재 시크릿 세션(<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">머리글과 바닥글</translation>
 <translation id="2322318151094136999">사이트가 직렬 포트에 액세스하려고 할 때 확인(권장)</translation>
+<translation id="2325444234681128157">비밀번호 저장</translation>
 <translation id="2326931316514688470">앱 새로고침(&amp;R)</translation>
 <translation id="2327492829706409234">앱 사용</translation>
 <translation id="2329597144923131178">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">URL에 다음 검색어 매개변수를 추가하여 페이지를 자동으로 새로고침: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">모양</translation>
 <translation id="2433836460518180625">기기 잠금 해제만</translation>
+<translation id="2434449159125086437">프린터를 설정할 수 없습니다. 설정을 확인하고 다시 시도해 보세요.</translation>
 <translation id="2435248616906486374">네트워크 연결 끊김</translation>
 <translation id="2435457462613246316">비밀번호 표시</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" />에서 모든 <ph name="PROTOCOL" /> 링크를 열도록 허용하시겠습니까?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64-인코딩 ASCII, 인증서 체인</translation>
 <translation id="2653033005692233957">검색 실패</translation>
 <translation id="2653266418988778031">인증 기관(CA) 인증서를 삭제하면 브라우저가 해당 CA에서 발급된 인증서를 더 이상 신뢰하지 않습니다.</translation>
+<translation id="2653275834716714682">텍스트 바꾸기</translation>
 <translation id="2653659639078652383">제출</translation>
 <translation id="265390580714150011">필드 값</translation>
 <translation id="2654166010170466751">사이트에서 결제 핸들러를 설치하도록 허용</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">최신 웹에 맞게 구축된 빠르고 단순하며 안전한 웹 브라우저입니다.</translation>
 <translation id="2949289451367477459">위치를 사용합니다. 위치 정보 액세스 권한이 있는 앱 및 서비스가 이 기기의 위치를 사용하도록 허용합니다. Google에서는 위치 정확도와 위치 기반 서비스를 개선하기 위해 위치 데이터를 주기적으로 수집하여 익명으로 사용할 수 있습니다. <ph name="BEGIN_LINK1" />자세히 알아보기<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">확장 프로그램 패키지 경고</translation>
+<translation id="2959842337402130152">저장공간이 부족하여 복원할 수 없습니다. 기기에서 <ph name="SPACE_REQUIRED" />를 확보한 후 다시 시도해 보세요.</translation>
 <translation id="296026337010986570">유해한 소프트웨어 삭제가 완료되었습니다. 확장 프로그램을 다시 사용 설정하려면 &lt;a href="chrome://extensions"&gt;확장 프로그램&lt;/a&gt;으로 이동하세요.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" />(확장 프로그램에서 제공)</translation>
 <translation id="2961695502793809356">클릭하면 다음 페이지로 가고 누르고 있으면 방문 기록이 나타납니다.</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">활성화 완료</translation>
 <translation id="3454213325559396544">이 <ph name="DEVICE_TYPE" />의 마지막 자동 소프트웨어 및 보안 업데이트입니다. 향후 업데이트를 받으려면 새 모델로 업그레이드하세요.</translation>
 <translation id="345693547134384690">새 탭에서 이미지 열기(&amp;I)</translation>
-<translation id="3457500881955698515">회사 또는 조직에서 기기를 즉시 업데이트할 것을 요구합니다.</translation>
 <translation id="3459509316159669723">인쇄</translation>
 <translation id="3459697287128633276">내 계정으로 Google Play 스토어에 액세스하려면 ID 공급업체를 통해 인증해 주세요.</translation>
 <translation id="3459774175445953971">최종 수정 날짜:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">다른 폴더 선택...</translation>
 <translation id="3967822245660637423">다운로드 완료</translation>
 <translation id="3967919079500697218">관리자가 스크린샷 캡쳐 기능을 사용 중지했습니다.</translation>
+<translation id="3969092967100188979">켜짐, 로밍 사용</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">계산 중...</translation>
 <translation id="3975565978598857337">영역 서버에 연락을 취하지 못했습니다.</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">저장된 지문</translation>
 <translation id="407173827865827707">클릭 시</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{탭 고정 해제}other{탭 고정 해제}}</translation>
+<translation id="4072805772816336153">나중에 다시 시도해 보세요.</translation>
 <translation id="4074900173531346617">이메일 서명자 인증서</translation>
 <translation id="407520071244661467">배율</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" />을(를) 전송할 수 없습니다.</translation>
@@ -2137,6 +2146,7 @@
 <translation id="4209092469652827314">크게</translation>
 <translation id="4209251085232852247">사용 중지됨</translation>
 <translation id="4209464433672152343">인쇄 준비를 위해 문서를 <ph name="BEGIN_LINK_HELP" />Google에 전송<ph name="END_LINK_HELP" />했습니다. <ph name="BEGIN_LINK_DASHBOARD" />Google 클라우드 프린트 대시보드<ph name="END_LINK_DASHBOARD" />에서 프린터와 프린터 기록을 확인, 수정, 관리할 수 있습니다.</translation>
+<translation id="4210048056321123003">가상 머신 다운로드 중</translation>
 <translation id="421182450098841253">북마크바 표시(&amp;S)</translation>
 <translation id="4211851069413100178">사용 및 진단 데이터를 보냅니다. 진단, 기기, 앱 사용 데이터를 Google에 자동으로 보내 Android 사용 환경 개선에 참여합니다. 이 데이터는 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />은 소유자가 지정합니다. 소유자가 이 기기의 진단 및 사용 데이터를 Google에 전송할지 선택할 수 있습니다. 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 Google 계정에 저장될 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">내보내기</translation>
@@ -2225,7 +2235,6 @@
 <translation id="4364327530094270451">멜론</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation>
 <translation id="4364830672918311045">알림 표시</translation>
-<translation id="4365673000813822030">동기화 작업이 중지되었습니다.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> 앱으로 <ph name="ACTION_NAME" /> 작업을 실행합니다.</translation>
 <translation id="4370975561335139969">입력한 이메일과 비밀번호가 일치하지 않습니다.</translation>
 <translation id="437184764829821926">고급 글꼴 설정</translation>
@@ -2236,6 +2245,7 @@
 <translation id="4378551569595875038">연결 중...</translation>
 <translation id="4378556263712303865">기기 요청</translation>
 <translation id="4380648069038809855">전체 화면으로 전환됨</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> 외 계정 1개}other{<ph name="EMAIL" /> 외 계정 <ph name="EXTRA_ACCOUNTS" />개}}</translation>
 <translation id="4384312707950789900">기본 네트워크에 추가</translation>
 <translation id="4384652540891215547">확장 프로그램 활성화</translation>
 <translation id="438503109373656455">말</translation>
@@ -2366,6 +2376,7 @@
 <translation id="4596295440756783523">다음 서버를 식별하는 인증서가 등록되어 있습니다.</translation>
 <translation id="4598556348158889687">저장용량 관리</translation>
 <translation id="4598776695426288251">여러 기기를 통해 Wi-Fi 사용 가능</translation>
+<translation id="4599134080475764833">플러그인 VM 사용 가능</translation>
 <translation id="4602466770786743961"><ph name="HOST" />에서 카메라와 마이크에 액세스하도록 항상 허용</translation>
 <translation id="4608500690299898628">찾기(&amp;F)...</translation>
 <translation id="4608520674724523647">등록 성공 그림</translation>
@@ -2403,6 +2414,7 @@
 <translation id="4662788913887017617">이 북마크를 내 iPhone과 공유</translation>
 <translation id="4663373278480897665">카메라 허용됨</translation>
 <translation id="4664482161435122549">PKCS #12 내보내기 오류</translation>
+<translation id="4664736447097490764">여기에서 Kerberos 설정 파일을 수정하세요.</translation>
 <translation id="4665014895760275686">제조업체</translation>
 <translation id="4665446389743427678"><ph name="SITE" />에서 저장한 모든 데이터가 삭제됩니다.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />을(를) 사용하려면 클릭하세요.</translation>
@@ -2504,7 +2516,6 @@
 <translation id="4830502475412647084">OS 업데이트 설치 중</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" />에서 <ph name="NETWORK_NAME" /> 네트워크를 사용하여 인터넷에 연결할 수 없습니다. 다른 네트워크를 선택하세요. <ph name="LEARN_MORE_LINK_START" />자세히 알아보기<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome에서 요청된 리소스에 액세스할 권한이 없습니다.</translation>
-<translation id="4835836146030131423">로그인하는 동안 오류가 발생했습니다.</translation>
 <translation id="4837926214103741331">더 이상 이 기기를 사용할 권한이 없습니다. 기기 소유자에게 로그인 권한에 대해 문의하세요.</translation>
 <translation id="4837952862063191349">로컬 데이터를 잠금 해제하고 복원하려면 이전 <ph name="DEVICE_TYPE" /> 비밀번호 입력</translation>
 <translation id="4838836835474292213">클립보드 읽기 액세스 허용됨</translation>
@@ -2639,7 +2650,6 @@
 <translation id="5029568752722684782">사본 지우기</translation>
 <translation id="5030338702439866405">발급 기관</translation>
 <translation id="5033266061063942743">기하학적 모양</translation>
-<translation id="5033619151015094114">회사 또는 조직에서 기기 업데이트를 요구합니다.</translation>
 <translation id="503498442187459473"><ph name="HOST" />에서 카메라와 마이크를 사용하려고 합니다.</translation>
 <translation id="5036662165765606524">사이트에서 여러 파일을 자동으로 다운로드하도록 허용하지 않음</translation>
 <translation id="5037676449506322593">모두 선택</translation>
@@ -2776,6 +2786,7 @@
 <translation id="5255859108402770436">다시 로그인</translation>
 <translation id="5256861893479663409">모든 사이트에서</translation>
 <translation id="5258992782919386492">이 기기에 설치</translation>
+<translation id="5260334392110301220">스마트 인용문</translation>
 <translation id="5260508466980570042">이메일 또는 비밀번호를 확인할 수 없습니다. 다시 시도해 주세요.</translation>
 <translation id="5261683757250193089">웹 스토어에서 열기</translation>
 <translation id="5264148714798105376">1분 정도 소요될 수 있습니다.</translation>
@@ -2810,6 +2821,7 @@
 <translation id="5301751748813680278">게스트로 로그인 중</translation>
 <translation id="5301954838959518834">확인</translation>
 <translation id="5302048478445481009">언어</translation>
+<translation id="5302932258331363306">대체 항목 표시</translation>
 <translation id="5305688511332277257">설치된 인증서 없음</translation>
 <translation id="5307030433605830021">지원되지 않는 소스</translation>
 <translation id="5308380583665731573">연결</translation>
@@ -2909,6 +2921,7 @@
 <translation id="5457113250005438886">잘못된 데이터</translation>
 <translation id="5457459357461771897">컴퓨터에서 사진, 음악, 기타 미디어 조회 및 삭제</translation>
 <translation id="5457599981699367932">게스트로 로그인</translation>
+<translation id="5457991019809708398">켜짐, 로밍 사용 안함</translation>
 <translation id="5458998536542739734">잠금 화면 메모</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" />의 색인</translation>
 <translation id="5463856536939868464">숨은 북마크를 포함하는 메뉴</translation>
@@ -3134,6 +3147,7 @@
 <translation id="5799508265798272974">Linux 가상 머신: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">마지막 다운로드 이후 대상 파일이 잘렸거나 삭제되었습니다.</translation>
 <translation id="5801568494490449797">환경설정</translation>
+<translation id="5804175651771201311">로밍 꺼짐</translation>
 <translation id="5804241973901381774">권한</translation>
 <translation id="5805697420284793859">창 관리자</translation>
 <translation id="5811750797187914944">설정 완료</translation>
@@ -3481,6 +3495,7 @@
 <translation id="6317318380444133405">프린터가 더 이상 지원되지 않습니다.</translation>
 <translation id="6317369057005134371">애플리케이션 창을 기다리는 중...</translation>
 <translation id="6318407754858604988">다운로드가 시작되었습니다</translation>
+<translation id="6318944945640833942">프린터를 찾을 수 없습니다. 프린터 주소를 다시 입력해 주세요.</translation>
 <translation id="6322653941595359182">Chromebook으로 SMS 보내고 받기</translation>
 <translation id="6324916366299863871">바로가기 수정</translation>
 <translation id="6325191661371220117">자동 실행 사용 안함</translation>
@@ -3737,6 +3752,7 @@
 <translation id="6725073593266469338">UI 서비스</translation>
 <translation id="6725206449694821596">인터넷 인쇄 프로토콜(IPP)</translation>
 <translation id="67269783048918309">사용 및 진단 데이터를 보냅니다. 이 기기는 현재 진단, 기기 및 앱 사용 데이터를 Google에 자동으로 보내고 있습니다. 이 데이터는 자녀를 식별하는 용도로 사용되지 않으며, 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />은 소유자가 지정합니다. 자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">연결됨, 배터리 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6732801395666424405">인증서를 로드하지 못했습니다.</translation>
 <translation id="6732900235521116609">바로가기를 삭제할 수 없음</translation>
 <translation id="6735304988756581115">쿠키 및 기타 사이트 데이터 표시...</translation>
@@ -3829,6 +3845,7 @@
 <translation id="6876155724392614295">자전거</translation>
 <translation id="6877460900831874810">잠금 화면에서 Chrome 미디어 재생 허용</translation>
 <translation id="6878422606530379992">센서가 허용됨</translation>
+<translation id="6878665006737889642">설치 다시 시도</translation>
 <translation id="6880587130513028875">이 페이지에서 이미지가 차단되었습니다.</translation>
 <translation id="6883319974225028188">시스템에서 기기 구성을 저장하지 못했습니다.</translation>
 <translation id="6885771755599377173">시스템 정보 미리보기</translation>
@@ -3997,6 +4014,7 @@
 <translation id="7120865473764644444">동기화 서버에 연결하지 못했습니다. 다시 시도 중...</translation>
 <translation id="7121362699166175603">검색주소창에 저장된 방문 기록과 자동 완성 내역을 지웁니다. Google 계정의 내 활동(<ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />)에는 인터넷 사용 기록이 다른 형식으로 남아 있을 수도 있습니다.</translation>
 <translation id="7121389946694989825">사용 및 진단 데이터를 보냅니다. 이 기기는 현재 진단, 기기 및 앱 사용 데이터를 Google에 자동으로 보내고 있습니다. 이 데이터는 자녀를 식별하는 용도로 사용되지 않으며, 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. <ph name="BEGIN_LINK1" />자세히 알아보기<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">스마트 대시</translation>
 <translation id="7123360114020465152">프린터가 더 이상 지원되지 않습니다.</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" />을(를) 인쇄하는 중에 오류가 발생함</translation>
 <translation id="7127980134843952133">다운로드 기록</translation>
@@ -4145,6 +4163,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" />이(가) 이제 전체화면으로 표시됩니다.</translation>
 <translation id="7340650977506865820">사이트에서 화면을 공유하고 있습니다.</translation>
 <translation id="7341834142292923918">이 사이트의 액세스 권한이 필요합니다.</translation>
+<translation id="7344488796804562294">고급 Kerberos 설정</translation>
 <translation id="7345706641791090287">비밀번호 확인</translation>
 <translation id="7346909386216857016">확인</translation>
 <translation id="7347751611463936647">이 확장 프로그램을 사용하려면 '<ph name="EXTENSION_KEYWORD" />'(을)를 입력하고 TAB을 누른 다음 명령어 또는 검색어를 입력하세요.</translation>
@@ -4756,6 +4775,7 @@
 <translation id="8227119283605456246">파일 첨부</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" />의 비밀번호를 저장하시겠습니까?</translation>
 <translation id="8234795456569844941">Google 엔지니어가 이 문제를 해결하도록 도와주세요. 프로필 오류 메시지가 표시되기 직전에 무슨 일이 있었는지 알려 주시기 바랍니다.</translation>
+<translation id="8236917170563564587">이 탭을 대신 공유</translation>
 <translation id="8241040075392580210">해와 구름</translation>
 <translation id="8241806945692107836">기기 설정을 확인하는 중...</translation>
 <translation id="8241868517363889229">북마크 조회 및 변경</translation>
@@ -4767,6 +4787,7 @@
 <translation id="8249048954461686687">OEM 폴더</translation>
 <translation id="8249615410597138718">기기로 전송</translation>
 <translation id="8249672078237421304">이 언어로 된 페이지에 대한 번역 옵션 제공</translation>
+<translation id="8251441930213048644">지금 새로고침</translation>
 <translation id="8251578425305135684">미리보기 이미지가 삭제되었습니다.</translation>
 <translation id="8252569384384439529">업로드 중...</translation>
 <translation id="8253198102038551905">'+'를 클릭하여 네트워크 속성 보기</translation>
@@ -5144,6 +5165,7 @@
 <translation id="8827752199525959199">추가 작업입니다. <ph name="DOMAIN" /> <ph name="USERNAME" />의 비밀번호입니다.</translation>
 <translation id="882854468542856424">모든 사이트에서 주변 블루투스 기기 조회 허용 안함</translation>
 <translation id="8828933418460119530">DNS 이름</translation>
+<translation id="883062543841130884">대체 항목</translation>
 <translation id="8830796635868321089">현재 프록시 설정을 사용하여 업데이트를 확인하지 못했습니다. <ph name="PROXY_SETTINGS_LINK_START" />프록시 설정<ph name="PROXY_SETTINGS_LINK_END" />을 조정하세요.</translation>
 <translation id="8831664945713891930">확장 프로그램 설정 열기</translation>
 <translation id="8834039744648160717">네트워크 구성은 <ph name="USER_EMAIL" />님이 관리합니다.</translation>
@@ -5164,6 +5186,7 @@
 <translation id="8862003515646449717">빠른 브라우저로 전환</translation>
 <translation id="8863753581171631212">새 <ph name="APP" />에서 링크 열기</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> 탭을 <ph name="APP_NAME" /> 앱과 공유하는 중</translation>
+<translation id="8864458770072227512">기기에서 <ph name="EMAIL" />이(가) 삭제되었습니다.</translation>
 <translation id="8868626022555786497">사용 중</translation>
 <translation id="8870318296973696995">홈페이지</translation>
 <translation id="8870413625673593573">최근에 닫은 탭</translation>
@@ -5172,7 +5195,6 @@
 <translation id="8871974300055371298">콘텐츠 설정</translation>
 <translation id="8872155268274985541">잘못된 Kiosk 외부 업데이트 매니페스트 파일이 발견되었습니다. Kiosk 앱을 업데이트하지 못했습니다. USB 메모리를 제거하세요.</translation>
 <translation id="8874184842967597500">연결되지 않음</translation>
-<translation id="887550310442005096">회사 또는 조직에서 기기 업데이트를 요청합니다.</translation>
 <translation id="8876307312329369159">데모 세션에서는 이 설정을 변경할 수 없습니다.</translation>
 <translation id="8877448029301136595">[상위 디렉터리]</translation>
 <translation id="8879284080359814990">탭으로 표시(&amp;S)</translation>
@@ -5287,6 +5309,7 @@
 <translation id="9044646465488564462">네트워크 연결 실패: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">사용자가 접속하려는 페이지의 웹 주소를 Google에 전송</translation>
 <translation id="9046895021617826162">연결 실패</translation>
+<translation id="9047391224416514812">사용자 이름이 같은 계정이 이미 존재합니다.</translation>
 <translation id="9050666287014529139">암호</translation>
 <translation id="9052208328806230490"><ph name="EMAIL" /> 계정을 사용하여 프린터를 <ph name="CLOUD_PRINT_NAME" />에 등록했습니다.</translation>
 <translation id="9052404922357793350">차단 계속</translation>
@@ -5334,6 +5357,7 @@
 <translation id="9121814364785106365">고정 탭으로 열기</translation>
 <translation id="9124003689441359348">저장한 비밀번호가 여기에 표시됩니다.</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" />(<ph name="LICENSE_COUNT" />개 남음)</translation>
+<translation id="9128317794749765148">설정을 완료할 수 없음</translation>
 <translation id="9128870381267983090">네트워크에 연결</translation>
 <translation id="9130015405878219958">잘못된 모드를 입력했습니다.</translation>
 <translation id="9131487537093447019">블루투스 기기와 메시지를 주고받습니다.</translation>
@@ -5402,6 +5426,7 @@
 <translation id="939598580284253335">암호 입력</translation>
 <translation id="939736085109172342">새 폴더</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" />에서 Chrome 탭과 오디오를 공유 중입니다.</translation>
+<translation id="945166830402967374">조직의 기기 관리자에게 문의하세요.</translation>
 <translation id="945522503751344254">의견 보내기</translation>
 <translation id="947329552760389097">요소 검사(&amp;I)</translation>
 <translation id="952992212772159698">활성화되지 않음</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 21811b0..ec365b5 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktyvinimas baigtas</translation>
 <translation id="3454213325559396544">Tai yra paskutinis automatinis programinės įrangos ir saugos naujinys, skirtas „<ph name="DEVICE_TYPE" />“. Kad gautumėte būsimus naujinius, įsigykite naujesnį modelį.</translation>
 <translation id="345693547134384690">Atidaryti &amp;paveikslėlį naujame skirtuke</translation>
-<translation id="3457500881955698515">Įmonė ar organizacija reikalauja iškart atnaujinti šį įrenginį</translation>
 <translation id="3459509316159669723">Spausdinimas</translation>
 <translation id="3459697287128633276">Kad leistumėte paskyrai pasiekti „Google Play“ parduotuvę, autentifikuokite prieigą naudodami tapatybės teikėją.</translation>
 <translation id="3459774175445953971">Paskutinį kartą keista:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melionas</translation>
 <translation id="4364567974334641491">„<ph name="APP_NAME" />“ bendrina langą.</translation>
 <translation id="4364830672918311045">Pateikti pranešimus</translation>
-<translation id="4365673000813822030">Deja, sinchronizavimas sustabdytas.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> su „<ph name="APP_NAME" />“.</translation>
 <translation id="4370975561335139969">Įvestas slaptažodis neatitinka el. pašto adreso</translation>
 <translation id="437184764829821926">Išplėstiniai šrifto nustatymai</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Įdiegiamas OS naujinys</translation>
 <translation id="4830573902900904548">„<ph name="DEVICE_TYPE" />“ įrenginiui nepavyksta prisijungti prie interneto naudojant „<ph name="NETWORK_NAME" />“. Pasirinkite kitą tinklą. <ph name="LEARN_MORE_LINK_START" />Sužinokite daugiau<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">„Chrome“ negali pasiekti pageidaujamo ištekliaus.</translation>
-<translation id="4835836146030131423">Prisiregistravimo klaida.</translation>
 <translation id="4837926214103741331">Neturite leidimo naudoti šį įrenginį. Susisiekite su įrenginio savininku, kad gautumėte leidimą prisijungti.</translation>
 <translation id="4837952862063191349">Kad atrakintumėte ir atkurtumėte vietinius duomenis, įveskite seną „<ph name="DEVICE_TYPE" />“ slaptažodį.</translation>
 <translation id="4838836835474292213">Iškarpinės skaitymo prieiga leidžiama</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Išvalyti kopiją</translation>
 <translation id="5030338702439866405">Išdavė</translation>
 <translation id="5033266061063942743">Geometrinės figūros</translation>
-<translation id="5033619151015094114">Įmonė ar organizacija reikalauja atnaujinti šį įrenginį</translation>
 <translation id="503498442187459473"><ph name="HOST" /> nori naudoti kamerą ir mikrofoną</translation>
 <translation id="5036662165765606524">Neleisti jokiai svetainei automatiškai atsisiųsti kelis failus</translation>
 <translation id="5037676449506322593">Pasirinkti viską</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">Turinio nustatymai</translation>
 <translation id="8872155268274985541">Rastas netinkamas viešojo terminalo išorinio naujinio aprašas. Nepavyko atnaujinti viešojo terminalo programos. Atjunkite USB atmintuką.</translation>
 <translation id="8874184842967597500">Neprisijungta</translation>
-<translation id="887550310442005096">Įmonė ar organizacija prašo atnaujinti šį įrenginį</translation>
 <translation id="8876307312329369159">Šio nustatymo negalima pakeisti demonstracinėje sesijoje.</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Rodyti kaip skirtuką</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 739a8c5..678e9e1 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktivizācija pabeigta</translation>
 <translation id="3454213325559396544">Šis ir pēdējais automātiskais programmatūras un drošības atjauninājums šai ierīcei (<ph name="DEVICE_TYPE" />). Lai saņemtu turpmākus atjauninājumus, veiciet jaunināšanu uz jaunāku modeli.</translation>
 <translation id="345693547134384690">Atvērt attēlu jaunā cilnē</translation>
-<translation id="3457500881955698515">Saskaņā ar jūsu uzņēmuma vai organizācijas prasībām šī ierīce ir nekavējoties jāatjaunina</translation>
 <translation id="3459509316159669723">Drukāšana</translation>
 <translation id="3459697287128633276">Lai ar jūsu kontu varētu piekļūt Google Play veikalam, nepieciešams autentificēties, izmantojot identitātes nodrošinātāju.</translation>
 <translation id="3459774175445953971">Pēdējo reizi mainīts:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melone</translation>
 <translation id="4364567974334641491">Lietotne <ph name="APP_NAME" /> koplieto logu.</translation>
 <translation id="4364830672918311045">Parādīt paziņojumus</translation>
-<translation id="4365673000813822030">Hmm! Sinhronizācija ir pārtraukusi darboties.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> lietotnē <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Ievadītā e-pasta adrese un parole neatbilst.</translation>
 <translation id="437184764829821926">Uzlaboti fonta iestatījumi</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">OS atjauninājuma instalēšana</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ierīcē nevar izveidot savienojumu ar internetu, izmantojot tīklu <ph name="NETWORK_NAME" />. Lūdzu, izvēlieties citu tīklu. <ph name="LEARN_MORE_LINK_START" />Uzziniet vairāk<ph name="LEARN_MORE_LINK_END" />.</translation>
 <translation id="4835385943915508971">Chrome nevar piekļūt pieprasītajam resursam.</translation>
-<translation id="4835836146030131423">Kļūda pierakstoties.</translation>
 <translation id="4837926214103741331">Jums nav atļaujas izmantot šo ierīci. Lūdzu, sazinieties ar ierīces īpašnieku, lai saņemtu pierakstīšanās atļauju.</translation>
 <translation id="4837952862063191349">Lai atbloķētu un atjaunotu lokālos datus, lūdzu, ievadiet savu iepriekšējo ierīces <ph name="DEVICE_TYPE" /> paroli.</translation>
 <translation id="4838836835474292213">Atļauta piekļuve starpliktuves satura lasīšanai</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Dzēst kopiju</translation>
 <translation id="5030338702439866405">Izsniedzis</translation>
 <translation id="5033266061063942743">Ģeometriskas formas</translation>
-<translation id="5033619151015094114">Saskaņā ar jūsu uzņēmuma vai organizācijas prasībām šī ierīce ir jāatjaunina</translation>
 <translation id="503498442187459473"><ph name="HOST" /> vēlas lietot jūsu kameru un mikrofonu.</translation>
 <translation id="5036662165765606524">Neļaut nevienai vietnei automātiski lejupielādēt vairākus failus</translation>
 <translation id="5037676449506322593">Atlasīt visu</translation>
@@ -5201,7 +5197,6 @@
 <translation id="8871974300055371298">Satura iestatījumi</translation>
 <translation id="8872155268274985541">Atrasts nederīgs Kioska lietotnes ārējais atjaunināšanas manifesta fails. Neizdevās atjaunināt Kioska lietotni. Lūdzu, izņemiet USB atmiņas karti.</translation>
 <translation id="8874184842967597500">Savienojums nav izveidots</translation>
-<translation id="887550310442005096">Jūsu uzņēmums vai organizācija lūdz atjaunināt šo ierīci</translation>
 <translation id="8876307312329369159">Demonstrācijas sesijā šo iestatījumu nevar mainīt.</translation>
 <translation id="8877448029301136595">[vecāku direktorija]</translation>
 <translation id="8879284080359814990">Rādīt kā &amp;cilni</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 5e876d6..9632e89 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">ഡെമോ മോഡ് ഉപകരണ ലൈസൻസുകളിൽ ഒരു പ്രശ്‌നമുണ്ടായി.</translation>
 <translation id="126710816202626562">വിവർത്തന ഭാഷ:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">വിപുലമായ കോൺഫിഗറേഷൻ</translation>
 <translation id="1272079795634619415">നിര്‍ത്തുക</translation>
 <translation id="1272978324304772054">ഈ ഉപയോക്തൃ അക്കൗണ്ട് ഉപകരണം ചേർത്തിരിക്കുന്ന ഡൊമെയ്‌നിന്റെ ഭാഗമല്ല. നിങ്ങൾക്ക് മറ്റൊരു ഡൊമെയ്ൻ ചേർക്കണമെങ്കിൽ ആദ്യം ഉപകരണം വീണ്ടെടുക്കുന്നതിലേക്ക് പോകേണ്ടതുണ്ട്.</translation>
 <translation id="1274977772557788323">Adobe Flash Player സ്റ്റോറേജ് ക്രമീകരണം</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> തിരഞ്ഞെടുത്തു</translation>
 <translation id="1444628761356461360">ഈ ക്രമീകരണം നിയന്ത്രിക്കുന്നത് ഉപകരണത്തിന്റെ ഉടമയായ <ph name="OWNER_EMAIL" /> ആണ്.</translation>
 <translation id="144518587530125858">തീമിനായി '<ph name="IMAGE_PATH" />' ലോഡ് ചെയ്യാനായില്ല.</translation>
+<translation id="1445693676523799095">ഇതിന് കുറച്ച് സമയമെടുത്തേക്കാം</translation>
 <translation id="1451375123200651445">വെബ്‌പേജ്, ഒരൊറ്റ ഫയൽ</translation>
 <translation id="1451917004835509682">സൂപ്പർവൈസ് ചെയ്‌ത വ്യക്തിയെ ചേർക്കുക</translation>
 <translation id="1454223536435069390">സ്ക്രീൻഷോട്ടെടുക്കുക</translation>
@@ -591,6 +593,7 @@
 <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" />-ല്‍ നിന്ന് മാത്രമേ ഇത് ചേർക്കാനാവൂ</translation>
 <translation id="1877520246462554164">വിശ്വാസ്യത ഉറപ്പിക്കൽ ടോക്കൺ സ്വീകരിക്കുന്നത് പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുന്നതിന് സൈൻ ഔട്ട് ചെയ്യുക, തുടർന്ന് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="1877860345998737529">സ്വിച്ച് ആക്ഷൻ മാനേജ്‌മെൻ്റ്</translation>
+<translation id="1878541307036593717">അനുമതികൾ സജ്ജീകരിക്കുക</translation>
 <translation id="1879000426787380528">എന്ന പേരിൽ സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" എന്ന സർട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കണോ?</translation>
 <translation id="1886996562706621347">പ്രോട്ടോകോളുകള്‍ക്കായി ഡിഫോൾട്ട് ഹാന്‍ഡ്‌ലറുകള്‍ ആകുന്നത് ആവശ്യപ്പെടാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു (ശുപാർശ ചെയ്തിരിക്കുന്നത്)</translation>
@@ -603,6 +606,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> ശേഷിക്കുന്നു</translation>
 <translation id="1895658205118569222">ഷട്ട്‌ഡൗൺ ചെയ്യുക</translation>
 <translation id="1895934970388272448">ഈ പ്രോസസ്സ് പൂർത്തിയാക്കാൻ നിങ്ങളുടെ പ്രിന്ററിൽ രജിസ്ട്രേഷൻ സ്ഥിരീകരിക്കണം - അത് ഇപ്പോൾ പരിശോധിക്കുക.</translation>
+<translation id="1899826437968063457">പ്ലഗിൻ VM-ന് റൺ ചെയ്യാൻ അനുമതി ആവശ്യമാണ്</translation>
 <translation id="1901303067676059328">എല്ലാം &amp;തിരഞ്ഞെടുക്കൂ</translation>
 <translation id="1902576642799138955">സാധുതാ കാലാവധി</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{ടാബ് മ്യൂട്ട് ചെയ്യുക}other{ടാബുകൾ മ്യൂട്ട് ചെയ്യുക}}</translation>
@@ -876,6 +880,7 @@
 <translation id="2318923050469484167">നിലവിലെ അദൃശ്യ സെഷൻ (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">ഹെഡ്ഡറുകളും ഫൂട്ടറുകളും</translation>
 <translation id="2322318151094136999">സീരിയൽ പോർട്ടുകൾ ആക്‌സസ് ചെയ്യാൻ സൈറ്റ് താൽപ്പര്യപ്പെടുമ്പോൾ എന്നോട് ചോദിക്കുക (നിർദ്ദേശിച്ചത്)</translation>
+<translation id="2325444234681128157">പാസ്‌വേഡ് ഓർക്കുക</translation>
 <translation id="2326931316514688470">ആപ്പ് &amp;വീണ്ടും ലോഡ് ചെയ്യുക</translation>
 <translation id="2327492829706409234">അപ്ലിക്കേഷനുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2329597144923131178">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകളും ചരിത്രവും മറ്റ് ക്രമീകരണവും ലഭിക്കാൻ സൈൻ ഇൻ ചെയ്യുക.</translation>
@@ -943,6 +948,7 @@
 <translation id="2433452467737464329">പേജ് സ്വയമേവ പുതുക്കാൻ URL-ൽ ചോദ്യ പാരാ ചേർക്കുക: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">കാഴ്ച്ച</translation>
 <translation id="2433836460518180625">ഉപകരണം മാത്രം അൺലോക്ക് ചെയ്യുക</translation>
+<translation id="2434449159125086437">പ്രിന്റർ സജ്ജീകരിക്കാനാവുന്നില്ല. കോൺഫിഗറേഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2435248616906486374">നെറ്റ്‌വർക്ക് വിച്‌ഛേദിച്ചു</translation>
 <translation id="2435457462613246316">പാസ്‌വേഡ് കാണിക്കുക</translation>
 <translation id="2436186046335138073">എല്ലാ <ph name="PROTOCOL" /> ലിങ്കുകളും തുറക്കാൻ <ph name="HANDLER_HOSTNAME" /> എന്നതിനെ അനുവദിക്കണോ?</translation>
@@ -1095,6 +1101,7 @@
 <translation id="2649045351178520408">Base64-എന്‍‌കോഡ് ചെയ്‌ത ASCII, സര്‍‌ട്ടിഫിക്കറ്റ് ചെയിന്‍‌</translation>
 <translation id="2653033005692233957">തിരയൽ പരാജയപ്പെട്ടു</translation>
 <translation id="2653266418988778031">നിങ്ങളൊരു സര്‍ട്ടിഫിക്കേഷന്‍ അതോറിറ്റി (CA) ഇല്ലാതാക്കുകയാണെങ്കില്‍, നിങ്ങളുടെ ബ്രൌസര്‍ ഇനിമുതല്‍ ആ CA നല്‍കുന്ന സാക്ഷ്യപത്രങ്ങളെയൊന്നും വിശ്വസിക്കില്ല.</translation>
+<translation id="2653275834716714682">ടെക്‌സ്‌റ്റ് പകരംവയ്‌ക്കൽ</translation>
 <translation id="2653659639078652383">സമര്‍പ്പിക്കൂ</translation>
 <translation id="265390580714150011">ഫീല്‍‌ഡ് മൂല്യം</translation>
 <translation id="2654166010170466751">പേയ്‌മെന്റ് ഹാൻഡ്‌ലറുകളെ ഇൻസ്റ്റാൾ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു</translation>
@@ -1303,6 +1310,7 @@
 <translation id="29488703364906173">ആധുനിക വെബിനായി സൃഷ്‌ടിച്ചിരിക്കുന്ന വേഗതയാർന്നതും ലളിതവും സുരക്ഷിതവുമായ വെബ് ബ്രൗസർ.</translation>
 <translation id="2949289451367477459">ലൊക്കേഷൻ ഉപയോഗിക്കുക. ലൊക്കേഷൻ അനുമതിയുള്ള ആപ്പുകളെയും സേവനങ്ങളെയും ഈ ഉപകരണത്തിന്‍റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ അനുവദിക്കുക. Google, ഇടയ്ക്കിടെ ലൊക്കേഷൻ ഡാറ്റ ശേഖരിക്കുകയും, ലൊക്കേഷൻ കൃത്യതയും ലൊക്കേഷൻ അധിഷ്ഠിത സേവനങ്ങളും മെച്ചപ്പെടുത്താൻ, രഹസ്യസ്വഭാവത്തോടെ ഈ ഡാറ്റ ഉപയോഗിക്കുകയും ചെയ്തേക്കാം. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">പായ്‌ക്ക് വിപുലീകരണ മുന്നറിയിപ്പ്</translation>
+<translation id="2959842337402130152">സ്‌റ്റോറേജ് സ്‌പെയ്‌സ് ഇല്ലാത്തതിനാൽ പുനഃസ്ഥാപിക്കാപിക്കാനായില്ല. ഉപകരണത്തിൽ <ph name="SPACE_REQUIRED" /> ഇടമുണ്ടാക്കി വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="296026337010986570">പൂര്‍ത്തിയായി! ദോഷകരമായ സോഫ്‌റ്റ്‌വെയര്‍ നീക്കം ചെയ്‌തു. വിപുലീകരണങ്ങള്‍ വീണ്ടും ഓണാക്കാന്‍, &lt;a href="chrome://extensions"&gt;വിപുലീകരണങ്ങള്‍&lt;/a&gt; സന്ദര്‍ശിക്കുക.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (വിപുലീകരണം നൽകി)</translation>
 <translation id="2961695502793809356">മുന്നോട്ട് പോകാൻ ക്ലിക്ക് ചെയ്യുക, ചരിത്രം കാണാന്‍ ഹോള്‍ഡ് ചെയ്യുക</translation>
@@ -1610,7 +1618,6 @@
 <translation id="3454157711543303649">സജീവമാക്കല്‍ പൂര്‍ത്തിയായി</translation>
 <translation id="3454213325559396544">ഈ <ph name="DEVICE_TYPE" />-ന് സ്വയമേവയുള്ള അവസാനത്തെ സോഫ്‌റ്റ്‌വെയർ, സുരക്ഷാ അപ്‌ഡേറ്റ് ആണിത്. ഭാവി അപ്‌ഡേറ്റുകൾ ലഭിക്കാൻ പുതിയൊരു മോഡലിലേക്ക് അപ്‌ഗ്രേഡ് ചെയ്യൂ.</translation>
 <translation id="345693547134384690">പുതിയ ടാബിൽ ചിത്രം തുറക്കുക</translation>
-<translation id="3457500881955698515">നിങ്ങളുടെ കമ്പനിയോ ഓർഗനൈസേഷനോ ഇപ്പോൾ ഈ ഉപകരണത്തിൽ ഒരു അപ്‌ഡേറ്റ് നടത്താൻ ആവശ്യപ്പെടുന്നു</translation>
 <translation id="3459509316159669723">പ്രിന്റിംഗ്</translation>
 <translation id="3459697287128633276">Google Play സ്‌റ്റോർ ആക്‌സസ് ചെയ്യുന്നതിനായി നിങ്ങളുടെ അക്കൗണ്ട് പ്രവർത്തനക്ഷമമാക്കാൻ, നിങ്ങളുടെ ഐഡന്റിറ്റി ദാതാവുമായി പരിശോധിച്ചുറപ്പിക്കുക.</translation>
 <translation id="3459774175445953971">അവസാനം പരിഷ്‌ക്കരിച്ചത്:</translation>
@@ -1986,6 +1993,7 @@
 <translation id="3966072572894326936">മറ്റൊരു ഫോള്‍ഡര്‍ തിരഞ്ഞെടുക്കൂ...</translation>
 <translation id="3967822245660637423">ഡൗൺലോഡ് പൂർത്തിയായി</translation>
 <translation id="3967919079500697218">സ്ക്രീൻഷോട്ടുകൾ എടുക്കാനുള്ള കഴിവ് നിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി.</translation>
+<translation id="3969092967100188979">ഓണാണ്, റോമിംഗിലാണ്</translation>
 <translation id="3970114302595058915">ഐഡി</translation>
 <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation>
 <translation id="3975565978598857337">മേഖലയ്ക്കുള്ള സെർവറുമായി ബന്ധപ്പെടുന്നത് പരാജയപ്പെട്ടു</translation>
@@ -2047,6 +2055,7 @@
 <translation id="4068776064906523561">സംരക്ഷിച്ച വിരലടയാളങ്ങൾ</translation>
 <translation id="407173827865827707">ക്ലിക്കിൽ</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{ടാബ് അണ്‍‌പിന്‍‌ ചെയ്യുക}other{ടാബുകള്‍ അണ്‍പിന്‍ ചെയ്യുക}}</translation>
+<translation id="4072805772816336153">പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="4074900173531346617">സൈനര്‍‌ സര്‍‌ട്ടിഫിക്കറ്റ് ഇമെയില്‍‌ അയയ്‌ക്കുക</translation>
 <translation id="407520071244661467">സ്കെയിൽ</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> കാസ്‌റ്റ് ചെയ്യാനാവുന്നില്ല.</translation>
@@ -2135,6 +2144,7 @@
 <translation id="4209092469652827314">വലുത്</translation>
 <translation id="4209251085232852247">ഓഫാക്കി</translation>
 <translation id="4209464433672152343">പ്രമാണങ്ങൾ അച്ചടിക്കാൻ തയ്യാറാക്കുന്നതിനായി <ph name="BEGIN_LINK_HELP" />Google-ലേക്ക് അയച്ചു<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google ക്ലൗഡ് പ്രിന്റ് ഡാഷ്‍ബോര്‍ഡിൽ<ph name="END_LINK_DASHBOARD" /> നിങ്ങളുടെ പ്രിന്ററുകളും പ്രിന്റർ ചരിത്രവും കാണുക, എഡിറ്റ് ചെയ്യുക, മാനേജ് ചെയ്യുക.</translation>
+<translation id="4210048056321123003">വെർച്വൽ മെഷീൻ ഡൗൺലോഡ് ചെയ്യുന്നു</translation>
 <translation id="421182450098841253">ബുക്ക്മാർക്കുകൾ ബാർ &amp;കാണിക്കുക</translation>
 <translation id="4211851069413100178">ഉപയോഗവും പ്രശ്‌നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്‌നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ സ്വയമേവ Google-ന് അയച്ച്, നിങ്ങളുടെ Android അനുഭവം മെച്ചപ്പെടുത്താൻ സഹായിക്കുക. സിസ്‌റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് ഇത് സഹായിക്കും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. ഈ <ph name="BEGIN_LINK1" />ക്രമീകരണം<ph name="END_LINK1" /> നടപ്പിലാക്കുന്നത് ഉടമയാണ്. ഈ ഉപകരണത്തിലെ പ്രശ്‌നനിർണ്ണയവും ഉപയോഗവുമായി ബന്ധപ്പെട്ട ഡാറ്റ Google-ന് അയയ്ക്കാൻ ഉടമ തീരുമാനിച്ചേക്കാം. നിങ്ങളുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">എക്‌സ്‌പോർട്ടുചെയ്യുക</translation>
@@ -2223,7 +2233,6 @@
 <translation id="4364327530094270451">മത്തങ്ങ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation>
 <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation>
-<translation id="4365673000813822030">ക്ഷമിക്കണം, സമന്വയം പ്രവർത്തനം നിർത്തി.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> ഉപയോഗിച്ചുള്ള <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">നിങ്ങൾ നൽകിയ ഇമെയിലും പാസ്‌വേഡും പൊരുത്തപ്പെടുന്നില്ല</translation>
 <translation id="437184764829821926">വിപുലീകരിച്ച ഫോണ്ട് ക്രമീകരണങ്ങൾ</translation>
@@ -2234,6 +2243,7 @@
 <translation id="4378551569595875038">കണക്റ്റുചെയ്യുന്നു...</translation>
 <translation id="4378556263712303865">ഉപകരണ അഭ്യർത്ഥന</translation>
 <translation id="4380648069038809855">പൂർണ്ണ സ്ക്രീനിൽ പ്രവേശിച്ചു</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 അക്കൗണ്ട് കൂടി}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> അക്കൗണ്ടുകൾ കൂടി}}</translation>
 <translation id="4384312707950789900">തിരഞ്ഞെടുത്തവയിലേക്ക് ചേർക്കുക</translation>
 <translation id="4384652540891215547">വിപുലീകരണം സജീവമാക്കുക</translation>
 <translation id="438503109373656455">സാരറ്റോഗ</translation>
@@ -2364,6 +2374,7 @@
 <translation id="4596295440756783523">ഈ സെര്‍‌വറുകളെ തിരിച്ചറിയുന്ന സര്‍‌ട്ടിഫിക്കറ്റുകള്‍‌ നിങ്ങളുടെ ഫയലിലുണ്ട്</translation>
 <translation id="4598556348158889687">സ്‌റ്റോറേജ് മാനേജ്‌മെന്റ്</translation>
 <translation id="4598776695426288251">ഒന്നിലധികം ഉപകരണങ്ങളിൽ നിന്ന് ലഭ്യമായ വൈഫൈ</translation>
+<translation id="4599134080475764833">പ്ലഗിൻ VM ഉപയോഗത്തിന് തയ്യാറാണ്</translation>
 <translation id="4602466770786743961">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്‌സസ് ചെയ്യുന്നതിന് <ph name="HOST" /> എന്നതിനെ എപ്പോഴും അനുവദിക്കുക</translation>
 <translation id="4608500690299898628">&amp;കണ്ടെത്തുക...</translation>
 <translation id="4608520674724523647">എൻറോൾമെൻറ് ചിത്രീകരണം വിജയകരം</translation>
@@ -2401,6 +2412,7 @@
 <translation id="4662788913887017617">നിങ്ങളുടെ iPhone ഉപയോഗിച്ച് ഈ ബുക്ക്‌മാർക്ക് പങ്കിടുക</translation>
 <translation id="4663373278480897665">ക്യാമറ അനുവദനീയം</translation>
 <translation id="4664482161435122549">PKCS #12 കയറ്റുമതി പിശക്</translation>
+<translation id="4664736447097490764">Kerberos കോൺഫിഗറേഷൻ ഫയൽ ഇവിടെ എഡിറ്റ് ചെയ്യുക.</translation>
 <translation id="4665014895760275686">നിര്‍മ്മാതാവ്</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> സംഭരിച്ച മുഴുവൻ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> പ്രവർത്തനക്ഷമമാക്കാൻ ക്ലിക്ക് ചെയ്യുക</translation>
@@ -2502,7 +2514,6 @@
 <translation id="4830502475412647084">OS അപ്‌ഡേറ്റ് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നു</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> ഉപയോഗിച്ച് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഇന്റർനെറ്റിൽ കണ‌ക്റ്റ് ചെയ്യാനാകുന്നില്ല. മറ്റൊരു നെറ്റ്‌വർക്ക് തിരഞ്ഞെടുക്കുക. <ph name="LEARN_MORE_LINK_START" />കൂടുതലറിയുക<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">അഭ്യർത്ഥിച്ച ഉറവിടത്തിലേക്ക് Chrome-ന് ആക്‌സസ് ഇല്ല.</translation>
-<translation id="4835836146030131423">പ്രവേശിക്കല്‍‌ പിശക്.</translation>
 <translation id="4837926214103741331">ഈ ഉപകരണം ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല. സൈൻ ഇൻ അനുമതിയ്‌ക്കായി ഉപകരണ ഉടമയെ ബന്ധപ്പെടുക.</translation>
 <translation id="4837952862063191349">നിങ്ങളുടെ പ്രാദേശിക വിവരം അൺലോക്ക് ചെയ്‌ത് പുനഃസ്ഥാപിക്കാൻ, നിങ്ങളുടെ പഴയ പാസ്‌വേഡ് <ph name="DEVICE_TYPE" /> നൽകുക.</translation>
 <translation id="4838836835474292213">ക്ലിപ്പ്ബോർഡ് വായിക്കുന്നതിനുള്ള ആക്‌സസ് അനുവദിച്ചു</translation>
@@ -2637,7 +2648,6 @@
 <translation id="5029568752722684782">പകർപ്പ് മായ്‌ക്കുക</translation>
 <translation id="5030338702439866405">ഇനിപ്പറയുന്നത് നല്‍‌കിയത്</translation>
 <translation id="5033266061063942743">ജ്യാമിതീയ രൂപങ്ങള്‍</translation>
-<translation id="5033619151015094114">നിങ്ങളുടെ കമ്പനിയോ ഓർഗനൈസേഷനോ ഈ ഉപകരണത്തിൽ ഒരു അപ്‌ഡേറ്റ് നടത്താൻ ആവശ്യപ്പെടുന്നു</translation>
 <translation id="503498442187459473">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കാൻ <ph name="HOST" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="5036662165765606524">ഒന്നിലധികം ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യുന്നതിന് ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation>
 <translation id="5037676449506322593">എല്ലാം തിരഞ്ഞെടുക്കുക</translation>
@@ -2774,6 +2784,7 @@
 <translation id="5255859108402770436">വീണ്ടും സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="5256861893479663409">എല്ലാ സൈറ്റുകളിലും</translation>
 <translation id="5258992782919386492">ഈ ഉപകരണത്തിൽ ഇൻസ്‌റ്റാൾ ചെയ്യുക</translation>
+<translation id="5260334392110301220">സ്‌മാർട്ട് ക്വോട്ടുകൾ</translation>
 <translation id="5260508466980570042">ക്ഷമിക്കൂ, നിങ്ങളുടെ ഇമെയില്‍ അല്ലെങ്കില്‍ പാസ്‍വേഡ് പരിശോധിച്ചുറപ്പിക്കാൻ കഴിഞ്ഞില്ല. വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5261683757250193089">വെബ് സ്‌റ്റോറിൽ തുറക്കുക</translation>
 <translation id="5264148714798105376">ഇതിന് ഒന്നോ രണ്ടോ മിനിറ്റ് എടുത്തേക്കാം.</translation>
@@ -2808,6 +2819,7 @@
 <translation id="5301751748813680278">അതിഥിയായി പ്രവേശിക്കുന്നു.</translation>
 <translation id="5301954838959518834">മനസ്സിലായി</translation>
 <translation id="5302048478445481009">ഭാഷ</translation>
+<translation id="5302932258331363306">പകരമുള്ളവ കാണിക്കുക</translation>
 <translation id="5305688511332277257">ഒന്നും ഇന്‍സ്റ്റാള്‍ ചെയ്തിട്ടില്ല</translation>
 <translation id="5307030433605830021">ഉറവിടം അനുയോജ്യമല്ല</translation>
 <translation id="5308380583665731573">കണക്‌റ്റുചെയ്യുക</translation>
@@ -2907,6 +2919,7 @@
 <translation id="5457113250005438886">അസാധുവാണ്</translation>
 <translation id="5457459357461771897">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഫോട്ടോകളും സംഗീതവും മറ്റ് മീഡിയയും റീഡ് ചെയ്യുക, ഇല്ലാതാക്കുക</translation>
 <translation id="5457599981699367932">അതിഥിയായി ബ്രൌസ് ചെയ്യുക</translation>
+<translation id="5457991019809708398">ഓണാണ്, റോമിംഗിൽ അല്ല</translation>
 <translation id="5458998536542739734">ലോക്ക് സ്‌ക്രീൻ കുറിപ്പുകൾ</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> ന്റെ സൂചിക</translation>
 <translation id="5463856536939868464">മെനുവില്‍‌ മറച്ച ബുക്ക്‌മാര്‍‌ക്കുകള്‍‌ അടങ്ങിയിരിക്കുന്നു</translation>
@@ -3133,6 +3146,7 @@
 <translation id="5799508265798272974">Linux വെർച്വൽ മെഷീൻ: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">അവസാന ഡൗൺലോഡിന് ശേഷം ഉദ്ദിഷ്‌ടസ്ഥാന ഫയൽ ചുരുങ്ങിപ്പോയി അല്ലെങ്കിൽ നീക്കം ചെയ്യപ്പെട്ടു.</translation>
 <translation id="5801568494490449797">മുൻഗണനകൾ</translation>
+<translation id="5804175651771201311">റോമിംഗ് ഓഫാണ്</translation>
 <translation id="5804241973901381774">അനുമതികൾ</translation>
 <translation id="5805697420284793859">വിൻഡോ മാനേജർ</translation>
 <translation id="5811750797187914944">എല്ലാം സജ്ജീകരിച്ചു</translation>
@@ -3481,6 +3495,7 @@
 <translation id="6317318380444133405">ഇനിയങ്ങോട്ട് പിന്തുണയില്ല.</translation>
 <translation id="6317369057005134371">ആപ്പ് വിൻഡോയ്‌ക്കായി കാത്തിരിക്കുന്നു...</translation>
 <translation id="6318407754858604988">ഡൗൺലോഡ് ആരംഭിച്ചു</translation>
+<translation id="6318944945640833942">പ്രിന്റർ കണ്ടെത്താനായില്ല. പ്രിന്റർ വിലാസം വീണ്ടും നൽകുക.</translation>
 <translation id="6322653941595359182">നിങ്ങളുടെ Chromebook-ൽ നിന്ന് അക്ഷര സന്ദേശങ്ങൾ അയയ്ക്കുകയും സ്വീകരിക്കുകയും ചെയ്യുക</translation>
 <translation id="6324916366299863871">കുറുക്കുവഴി എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="6325191661371220117">സ്വയമേവ ലോഞ്ച് ചെയ്യൽ പ്രവർത്തനരഹിതമാക്കുക</translation>
@@ -3737,6 +3752,7 @@
 <translation id="6725073593266469338">UI സേവനം</translation>
 <translation id="6725206449694821596">ഇന്റർനെറ്റ് പ്രിന്റിംഗ് പ്രോട്ടോക്കോൾ (IPP)</translation>
 <translation id="67269783048918309">ഉപയോഗവും പ്രശ്‌നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്‌നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഈ ഉപകരണം നിലവിൽ സ്വയമേവ Google-ന് അയയ്ക്കുന്നുണ്ട്. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്‌റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. ഈ <ph name="BEGIN_LINK1" />ക്രമീകരണം<ph name="END_LINK1" /> നടപ്പിലാക്കുന്നത് ഉടമയാണ്. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്‌റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">കണക്റ്റ് ചെയ്‌തു, <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation>
 <translation id="6732801395666424405">സർട്ടിഫിക്കറ്റുകൾ ലോഡുചെയ്‌തില്ല</translation>
 <translation id="6732900235521116609">കുറുക്കുവഴി നീക്കം ചെയ്യാനാവില്ല</translation>
 <translation id="6735304988756581115">കുക്കികളും മറ്റ് സൈറ്റ് ഡാറ്റയും കാണിക്കുക...</translation>
@@ -3829,6 +3845,7 @@
 <translation id="6876155724392614295">ബൈക്കോടിക്കുക</translation>
 <translation id="6877460900831874810">ലോക്ക് സ്‌ക്രീനിൽ Chrome മീഡിയ പ്ലേബാക്ക് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="6878422606530379992">സെൻസറുകൾ അനുവദിച്ചു</translation>
+<translation id="6878665006737889642">ഇൻസ്‌റ്റാൾ ചെയ്യാൻ വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="6880587130513028875">ഈ പേജില്‍‌ ചിത്രങ്ങളെ തടഞ്ഞു.</translation>
 <translation id="6883319974225028188">ക്ഷമിക്കണം!  സിസ്‌റ്റത്തിന് ഉപകരണ കോൺഫിഗറേഷൻ സംരക്ഷിക്കാനായില്ല.</translation>
 <translation id="6885771755599377173">സിസ്‌റ്റം വിവരത്തിന്റെ പ്രിവ്യൂ</translation>
@@ -3997,6 +4014,7 @@
 <translation id="7120865473764644444">സമന്വയ സെര്‍വറിലേക്ക് കണക്‌റ്റ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുന്നു...</translation>
 <translation id="7121362699166175603">ചരിത്രവും വിലാസ ബാറിലെ സ്വയം പൂർത്തീകരണങ്ങളും മായ്ക്കുന്നു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="7121389946694989825">ഉപയോഗവും പ്രശ്‌നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്‌നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഈ ഉപകരണം നിലവിൽ സ്വയമേവ Google-ന് അയയ്ക്കുന്നുണ്ട്. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്‌റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്‌റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">സ്‌മാർട്ട് ഡാഷുകൾ</translation>
 <translation id="7123360114020465152">ഇനിയങ്ങോട്ട് പിന്തുണയില്ല</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> അച്ചടിക്കുന്നതിൽ പിശക്</translation>
 <translation id="7127980134843952133">ഡൗൺലോഡ് ചരിത്രം</translation>
@@ -4145,6 +4163,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ഇപ്പോൾ പൂർണ്ണ സ്‌ക്രീനിലാണ്.</translation>
 <translation id="7340650977506865820">സൈറ്റ് നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു</translation>
 <translation id="7341834142292923918">ഈ സൈറ്റിലേക്ക് ആക്‌സസ് ആവശ്യമുണ്ട്</translation>
+<translation id="7344488796804562294">വിപുലമായ Kerberos കോൺഫിഗറേഷൻ</translation>
 <translation id="7345706641791090287">പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</translation>
 <translation id="7346909386216857016">മനസ്സിലായി!</translation>
 <translation id="7347751611463936647">ഈ വിപുലീകരണം ഉപയോഗിക്കുന്നതിന് "<ph name="EXTENSION_KEYWORD" />" ടൈപ്പ് ചെയ്യുക, തുടർന്ന് TAB അമർത്തിയതിനുശേഷം നിങ്ങളുടെ അഭിപ്രായമോ തിരയലോ നൽകുക.</translation>
@@ -4756,6 +4775,7 @@
 <translation id="8227119283605456246">ഫയൽ അറ്റാച്ചുചെയ്യുക</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> എന്നതിനായി പാസ്‌വേഡുകൾ സംരക്ഷിക്കണോ?</translation>
 <translation id="8234795456569844941">ഈ പ്രശ്‌നം പരിഹരിക്കുന്നതിന് ഞങ്ങളുടെ എഞ്ചിനീയർമാരെ സഹായിക്കുക. നിങ്ങൾക്ക് പ്രൊഫൈൽ ‌പിശക് സന്ദേശം ‌ലഭിക്കുന്നതിന് മുമ്പ് എന്താണ് ‌സംഭവിച്ചതെന്ന് ‌കൃത്യമായി ഞങ്ങളോട് പറയുക:</translation>
+<translation id="8236917170563564587">പകരം ഈ ടാബ് പങ്കിടുക</translation>
 <translation id="8241040075392580210">ഷേഡി</translation>
 <translation id="8241806945692107836">ഉപകരണ കോൺഫിഗറേഷൻ നിർണ്ണയിക്കുന്നു...</translation>
 <translation id="8241868517363889229">നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ റീഡുചെയ്യുക, മാറ്റുക</translation>
@@ -4767,6 +4787,7 @@
 <translation id="8249048954461686687">OEM ഫോൾഡർ</translation>
 <translation id="8249615410597138718">നിങ്ങളുടെ ഉപകരണങ്ങളിലേക്ക് അയയ്‌ക്കുക</translation>
 <translation id="8249672078237421304">നിങ്ങൾക്ക് വായിക്കാനാവുന്ന ഭാഷയിലേക്ക് പേജുകൾ വിവർത്തനം ചെയ്യുന്നത് വാഗ്ദാനം ചെയ്യുന്നു</translation>
+<translation id="8251441930213048644">ഇപ്പോൾ‍ പുതുക്കിയെടുക്കുക</translation>
 <translation id="8251578425305135684">ലഘുചിത്രം നീക്കംചെയ്‌തു.</translation>
 <translation id="8252569384384439529">അപ്‌ലോഡ് ചെയ്യുന്നു...</translation>
 <translation id="8253198102038551905">നെറ്റ്‌വർക്ക് പ്രോപ്പർട്ടികൾ ലഭിക്കാൻ '+' ക്ലിക്ക് ചെയ്യുക</translation>
@@ -5143,6 +5164,7 @@
 <translation id="8827752199525959199"><ph name="DOMAIN" /> ഡൊമെയ്‌നിലെ <ph name="USERNAME" /> എന്ന ഉപയോക്താവിന്റെ കൂടുതൽ പ്രവർത്തനങ്ങളും പാസ്‌വേഡും</translation>
 <translation id="882854468542856424">സമീപത്തുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്താൻ ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation>
 <translation id="8828933418460119530">DNS നാമം</translation>
+<translation id="883062543841130884">പകരമുള്ളവ</translation>
 <translation id="8830796635868321089">നിലവിലെ പ്രോക്‌സി ക്രമീകരണങ്ങൾ ഉപയോഗിച്ചുള്ള അപ്‌ഡേറ്റ് പരിശോധന പരാജയപ്പെട്ടു. നിങ്ങളുടെ <ph name="PROXY_SETTINGS_LINK_START" />പ്രോക്‌സി ക്രമീകരണങ്ങൾ<ph name="PROXY_SETTINGS_LINK_END" /> ക്രമീകരിക്കുക.</translation>
 <translation id="8831664945713891930">വിപുലീകരണ ക്രമീകരണം തുറക്കുക</translation>
 <translation id="8834039744648160717">നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ നിയന്ത്രിക്കുന്നത് <ph name="USER_EMAIL" /> ആണ്.</translation>
@@ -5163,6 +5185,7 @@
 <translation id="8862003515646449717">ഒരു വേഗതയേറിയ ബ്രൗസറിലേക്ക് മാറുക</translation>
 <translation id="8863753581171631212">പുതിയ <ph name="APP" /> ആപ്പിൽ ലിങ്ക് തുറക്കുക</translation>
 <translation id="8864055848767439877"><ph name="APP_NAME" /> എന്നതിലേക്ക് <ph name="TAB_NAME" /> പങ്കിടുന്നു</translation>
+<translation id="8864458770072227512">ഈ ഉപകരണത്തിൽ നിന്ന് <ph name="EMAIL" /> നീക്കം ചെയ്‌തു</translation>
 <translation id="8868626022555786497">ഉപയോഗത്തിലാണ്</translation>
 <translation id="8870318296973696995">ഹോം പേജ്</translation>
 <translation id="8870413625673593573">സമീപകാലത്ത് അടച്ചവ</translation>
@@ -5171,7 +5194,6 @@
 <translation id="8871974300055371298">ഉള്ളടക്ക ക്രമീകരണങ്ങൾ</translation>
 <translation id="8872155268274985541">അസാധുവായ കിയോസ്‌ക് ബാഹ്യ അപ്ഡേറ്റ് മാനിഫെസ്‌റ്റ് ഫയൽ കണ്ടെത്തി. കിയോസ്‌ക് അപ്ലിക്കേഷൻ അപ്‌ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. USB സ്‌റ്റിക്ക് നീക്കംചെയ്യുക.</translation>
 <translation id="8874184842967597500">കണക്റ്റുചെയ്‌തിട്ടില്ല</translation>
-<translation id="887550310442005096">ഈ ഉപകരണം അപ്‌ഡേറ്റ് ചെയ്യാൻ നിങ്ങളുടെ കമ്പനിയോ ഓർഗനൈസേഷനോ ആവശ്യപ്പെടുന്നു</translation>
 <translation id="8876307312329369159">ഒരു ഡെമോ സെഷനിൽ ഈ ക്രമീകരണം മാറ്റാനാകില്ല.</translation>
 <translation id="8877448029301136595">[രക്ഷാകര്‍തൃ ഡയറക്റ്ററി]</translation>
 <translation id="8879284080359814990">&amp;ടാബായി കാണിക്കുക</translation>
@@ -5286,6 +5308,7 @@
 <translation id="9044646465488564462">നെറ്റ്‌വര്‍‌ക്കിലേക്ക് കണക്റ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">നിങ്ങൾ എത്തിച്ചേരാൻ ശ്രമിക്കുന്ന പേജിന്റെ വെബ് വിലാസം Google-ലേക്ക് അയയ്ക്കുന്നു</translation>
 <translation id="9046895021617826162">ബന്ധിപ്പിക്കല്‍ പരാജയപ്പെട്ടു</translation>
+<translation id="9047391224416514812">ഈ ഉപയോക്തൃനാമമുള്ള അക്കൗണ്ട് നിലവിൽ ഉപയോഗത്തിലുണ്ട്</translation>
 <translation id="9050666287014529139">പാസ്ഫ്രെയ്‍സ്</translation>
 <translation id="9052208328806230490"><ph name="EMAIL" /> അക്കൗണ്ട് ഉപയോഗിച്ച് <ph name="CLOUD_PRINT_NAME" /> ല്‍ നിങ്ങളുടെ പ്രിന്‍ററുകൾ രജിസ്റ്റര്‍ ചെയ്തു</translation>
 <translation id="9052404922357793350">ബ്ലോക്ക് ചെയ്യുന്നത് തുടരുക</translation>
@@ -5333,6 +5356,7 @@
 <translation id="9121814364785106365">പിന്‍ ചെയ്ത ടാബായി തുറക്കുക</translation>
 <translation id="9124003689441359348">സംരക്ഷിച്ച പാസ്‌വേഡുകൾ ഇവിടെ ദൃശ്യമാകും</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ശേഷിക്കുന്നു)</translation>
+<translation id="9128317794749765148">സജ്ജീകരണം പൂർത്തിയാക്കാനായില്ല</translation>
 <translation id="9128870381267983090">നെറ്റ്‌വർക്കിലേക്ക് ബന്ധിപ്പിക്കുക</translation>
 <translation id="9130015405878219958">അസാധുവായ മോഡ് നല്‍കി.</translation>
 <translation id="9131487537093447019">Bluetooth ഉപകരണങ്ങളിലേക്ക് സന്ദേശങ്ങൾ അയയ്ക്കുകയും സ്വീകരിക്കുകയും ചെയ്യുക.</translation>
@@ -5401,6 +5425,7 @@
 <translation id="939598580284253335">പാസ്ഫ്രെയ്സ് നല്‍കുക</translation>
 <translation id="939736085109172342">പുതിയ ഫോള്‍ഡര്‍</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome ടാബും ഓഡിയോയും പങ്കിടുന്നു.</translation>
+<translation id="945166830402967374">നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ ഉപകരണ അഡ്‌മിനുമായി ബന്ധപ്പെടുക</translation>
 <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
 <translation id="947329552760389097">&amp;ഘടകങ്ങൾ പരിശോധിക്കുക</translation>
 <translation id="952992212772159698">സജീവമാക്കിയില്ല</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 4f25d1c..b8ebc06 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">डेमो मोड डिव्हाइस परवान्यांना समस्या आली.</translation>
 <translation id="126710816202626562">भाषांतर भाषा:</translation>
 <translation id="126768002343224824">१६x</translation>
+<translation id="1269405567167332785">प्रगत कॉन्फिगरेशन</translation>
 <translation id="1272079795634619415">थांबा</translation>
 <translation id="1272978324304772054">हे वापरकर्ता खाते ज्यावर डिव्हाइसने नोंदणी केली आहे त्या डोमेनशी संबंधित नाही. तुम्ही एखादे वेगळ्या डोमेनची नोंदणी करू इच्छित असल्यास, तुम्हाला प्रथम डिव्हाइस पुनर्प्राप्तीद्वारा जाणे आवश्यक आहे.</translation>
 <translation id="1274977772557788323">Adobe Flash Player स्टोरेज सेटिंग्ज</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> निवडले</translation>
 <translation id="1444628761356461360">ही सेटिंग डिव्हाइस मालक, <ph name="OWNER_EMAIL" /> द्वारे व्यवस्थापित केली आहे.</translation>
 <translation id="144518587530125858">थीमसाठी '<ph name="IMAGE_PATH" />' लोड करणे शक्य नाही.</translation>
+<translation id="1445693676523799095">यासाठी थोडा वेळ लागू शकतो</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फाइल</translation>
 <translation id="1451917004835509682">पर्यवेक्षी व्यक्ती जोडा</translation>
 <translation id="1454223536435069390">स्क्रीनशॉट घ्या</translation>
@@ -593,6 +595,7 @@
 <translation id="1875387611427697908">हे केवळ <ph name="CHROME_WEB_STORE" /> वरून जोडले जाऊ शकते</translation>
 <translation id="1877520246462554164">अॉथेंटिकेशन टोकन मिळवण्यात अयशस्वी. कृपया साइन आउट करा आणि नंतर पुन्हा प्रयत्न करण्यासाठी साइन इन करा.</translation>
 <translation id="1877860345998737529">स्विच अॅक्शन असाइनमेंट</translation>
+<translation id="1878541307036593717">परवानग्या सेट करा</translation>
 <translation id="1879000426787380528">हे म्हणून साइन करा</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" सर्टिफिकेट हटवायचे?</translation>
 <translation id="1886996562706621347">प्रोटोकॉलकरिता डीफॉल्ट हँडलर होण्यासाठी साइटना विचारण्याची अनुमती द्या</translation>
@@ -605,6 +608,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> शिल्लक</translation>
 <translation id="1895658205118569222">बंद करा</translation>
 <translation id="1895934970388272448">ही प्रक्रिया समाप्त करण्यासाठी तुम्हाला आपल्या प्रिंटरवर नोंदणीची पुष्टी करणे आवश्यक आहे - हे आता तपासा.</translation>
+<translation id="1899826437968063457">रन करण्यासाठी प्लग-इन VM ला परवानगीची आवश्यकता आहे</translation>
 <translation id="1901303067676059328">&amp;सर्व निवडा</translation>
 <translation id="1902576642799138955">वैधता कालावधी</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{टॅब म्यूट करा}other{टॅब म्यूट करा}}</translation>
@@ -878,6 +882,7 @@
 <translation id="2318923050469484167">वर्तमान गुप्त सेशन (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">शीर्षक आणि अधोलेख</translation>
 <translation id="2322318151094136999">साइटला सीरियल पोर्ट अ‍ॅक्सेस करायची असतील तेव्हा विचारा (शिफारस केलेले)</translation>
+<translation id="2325444234681128157">पासवर्ड लक्षात ठेवा</translation>
 <translation id="2326931316514688470">&amp;अ‍ॅप रीलोड करा</translation>
 <translation id="2327492829706409234">अ‍ॅप सुरू करा</translation>
 <translation id="2329597144923131178">आपल्‍या सर्व डिव्‍हाइसेस वरील तुमचे बुकमार्क, इतिहास, पासवर्ड आणि इतर सेटिंग्ज मिळविण्‍यासाठी साइन इन करा.</translation>
@@ -945,6 +950,7 @@
 <translation id="2433452467737464329">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी URL मध्ये क्वेरी परम जोडा: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">स्वरूप</translation>
 <translation id="2433836460518180625">फक्त डिव्हाइस अनलॉक करा</translation>
+<translation id="2434449159125086437">प्रिंटर सेट करू शकलो नाही. कृपया कॉन्फिगरेशन तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="2435248616906486374">नेटवर्क डिस्कनेक्ट झाले</translation>
 <translation id="2435457462613246316">पासवर्ड दर्शवा</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> ला सर्व <ph name="PROTOCOL" /> लिंक उघडण्याची अनुमती द्यायची?</translation>
@@ -1097,6 +1103,7 @@
 <translation id="2649045351178520408">Base64-encoded ASCII, सर्टिफिकेट श्रृंखला</translation>
 <translation id="2653033005692233957">शोधता आले नाही</translation>
 <translation id="2653266418988778031">तुम्ही एक प्रमाणन अधिकृतता (CA) सर्टिफिकेट हटविल्यास, तुमचा ब्राउझर त्या CA द्वारे जारी केलेल्या कोणत्याही सर्टिफिकेटवर यापुढे विश्वास ठेवणार नाही.</translation>
+<translation id="2653275834716714682">मजकूर बदलणे</translation>
 <translation id="2653659639078652383">सबमिट करा</translation>
 <translation id="265390580714150011">फील्ड मूल्य</translation>
 <translation id="2654166010170466751">पेमेंट हँडलर इंस्टॉल करण्यासाठी साइटना अनुमती द्या</translation>
@@ -1305,6 +1312,7 @@
 <translation id="29488703364906173">हे आधुनिक वेबसाठी बनविलेले जलद, सोपे आणि सुरक्षित वेब ब्राउझर आहे.</translation>
 <translation id="2949289451367477459">स्‍थान वापरा. स्थान परवानगी असलेल्या अ‍ॅप्स आणि सेवांना या डिव्हाइसचे स्थान वापरण्याची अनुमती द्या. Google अधूनमधून स्थान डेटा गोळा करू शकते आणि स्थान अचूकता व स्थानावर आधारित सेवांमध्ये सुधारणा करण्यासाठी हा डेटा निनावी वापरू शकते. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">पॅक एक्स्टेंशन चेतावणी</translation>
+<translation id="2959842337402130152">स्टोरेज जागा कमी असल्यामुळे रिस्टोअर करू शकत नाही. डिव्हाइसमधील <ph name="SPACE_REQUIRED" /> जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="296026337010986570">पूर्ण झाले! धोकादायक सॉफ्टवेअर काढून टाकले. एक्स्टेंशन पुन्हा सुरू करण्यासाठी &lt;a href="chrome://extensions"&gt;Extensions&lt;/a&gt; ला भेट द्या.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (एक्स्टेंशन प्रदान केले)</translation>
 <translation id="2961695502793809356">पुढे जाण्यासाठी क्लिक करा, इतिहास पहाण्यासाठी होल्ड करा</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">सक्रियन पूर्ण झाले</translation>
 <translation id="3454213325559396544">या <ph name="DEVICE_TYPE" /> साठी हे अंतिम ऑटोमेटिक सॉफ्टवेअर आणि सिक्युरिटी अपडेट आहे. वैशिष्ट्यांसंबंधित अपडेट मिळवण्यासाठी, सर्वात नवीन मॉडेलवर अपग्रेड करा.</translation>
 <translation id="345693547134384690">नवीन विंडोमध्ये &amp;प्रतिमा उघडा</translation>
-<translation id="3457500881955698515">तुमच्या कंपनीला किंवा संस्थेला लगेच या डिव्हाइसवर अपडेटची आवश्यकता आहे</translation>
 <translation id="3459509316159669723">प्रिंट</translation>
 <translation id="3459697287128633276">तुमच्या खात्यावर Google Play स्टोअर वापरणे सुरू करण्यासाठी, कृपया तुमच्या ओळख पुरवठादाराच्या साहाय्याने अॉथेंटिकेट करा.</translation>
 <translation id="3459774175445953971">अखेरचे सुधारित:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">अन्य फोल्डर निवडा...</translation>
 <translation id="3967822245660637423">पूर्ण डाउनलोड करा</translation>
 <translation id="3967919079500697218">स्क्रीनशॉट घेण्याची क्षमता तुमच्या अॅडमिनिस्ट्रेटरद्वारे अक्षम केली गेली आहे.</translation>
+<translation id="3969092967100188979">सुरू आहे, रोमिंग</translation>
 <translation id="3970114302595058915">आयडी</translation>
 <translation id="397105322502079400">गणना करत आहे...</translation>
 <translation id="3975565978598857337">क्षेत्रासाठी सर्व्हरशी कनेक्ट करता आले नाही</translation>
@@ -2052,6 +2060,7 @@
 <translation id="4068776064906523561">फिंगरप्रिंट सेव्ह केले</translation>
 <translation id="407173827865827707">क्लिकवर</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{टॅब अनपिन करा}other{टॅब अनपिन करा}}</translation>
+<translation id="4072805772816336153">नंतर पुन्हा प्रयत्न करा</translation>
 <translation id="4074900173531346617">ईमेल स्वाक्षरीकर्ता सर्टिफिकेट</translation>
 <translation id="407520071244661467">स्केल</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> कास्ट करू शकलो नाही.</translation>
@@ -2138,6 +2147,7 @@
 <translation id="4209092469652827314">मोठा</translation>
 <translation id="4209251085232852247">बंद केले</translation>
 <translation id="4209464433672152343">दस्तऐवज प्रिंट करण्यासाठी <ph name="BEGIN_LINK_HELP" />Google कडे पाठवले<ph name="END_LINK_HELP" /> आहेत. <ph name="BEGIN_LINK_DASHBOARD" />Google क्लाउड प्रिंट डॅशबोर्ड<ph name="END_LINK_DASHBOARD" /> वर तुमचे प्रिंटर आणि प्रिंटर इतिहास पहा, संपादित करा आणि व्यवस्थापित करा.</translation>
+<translation id="4210048056321123003">व्हर्च्युअल मशीन डाउनलोड होत आहे</translation>
 <translation id="421182450098841253">बुकमार्क बार &amp;दर्शवा</translation>
 <translation id="4211851069413100178">वापर आणि निदान डेटा पाठवा. Google ला आपोआप निदान आणि डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवून तुमचा Android अनुभव सुधारण्यात मदत करा. हे सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारणा करण्यात मदत करेल. काही एकत्रित केलेला डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांना देखील मदत करेल. या <ph name="BEGIN_LINK1" />सेटिंगची<ph name="END_LINK1" /> मालकाद्वारे अंमलबजावणी केली जाते. मालक या डिव्हाइससाठी निदान आणि वापर डेटा Google ला पाठवणे निवडू शकतो. जर तुमची अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सेटिंग सुरू केलेली असल्यास, हा डेटा तुमच्या Google खाते वर सेव्ह केला जाऊ शकतो. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">एक्सपोर्ट</translation>
@@ -2226,7 +2236,6 @@
 <translation id="4364327530094270451">खरबूज</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> विंडो शेअर करीत आहे.</translation>
 <translation id="4364830672918311045">सूचना डिस्प्ले करा</translation>
-<translation id="4365673000813822030">अरेरे, समक्रमणाने काम करणे थांबवले आहे.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> सह <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">तुम्ही एंटर केलेला ईमेल आणि पासवर्ड जुळत नाही</translation>
 <translation id="437184764829821926">प्रगत फॉन्ट सेटिंग्ज</translation>
@@ -2237,6 +2246,7 @@
 <translation id="4378551569595875038">कनेक्ट करीत आहे...</translation>
 <translation id="4378556263712303865">डीव्हाइसची मागणी</translation>
 <translation id="4380648069038809855">फुल स्क्रीनमध्ये प्रवेश केला आहे</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, आणखी एक खाते}other{<ph name="EMAIL" />, आणखी <ph name="EXTRA_ACCOUNTS" /> खाती}}</translation>
 <translation id="4384312707950789900">प्राधान्यीकृतमध्‍ये जोडा</translation>
 <translation id="4384652540891215547">एक्स्टेंशन सुरू करा</translation>
 <translation id="438503109373656455">Saratoga</translation>
@@ -2367,6 +2377,7 @@
 <translation id="4596295440756783523">आपल्‍याकडे फाईलवर अशी प्रमाणपत्रे आहेत जी या सर्व्हरला ओळखतात</translation>
 <translation id="4598556348158889687">स्टोरेज व्यवस्थापन</translation>
 <translation id="4598776695426288251">एकाहून अधिक डिव्हाइसद्वारे वाय-फाय उपलब्ध आहे</translation>
+<translation id="4599134080475764833">प्लग-इन VM वापरण्यासाठी तयार आहे</translation>
 <translation id="4602466770786743961">नेहमी <ph name="HOST" /> ला तुमचा कॅमेरा आणि मायक्रोफोन अॅक्सेस करण्‍यास परवानगी द्या</translation>
 <translation id="4608500690299898628">&amp;शोधा...</translation>
 <translation id="4608520674724523647">यशस्वी नोंदणीचे उदाहरण</translation>
@@ -2404,6 +2415,7 @@
 <translation id="4662788913887017617">हा बुकमार्क आपल्या iPhone सह शेअर करा</translation>
 <translation id="4663373278480897665">कॅमेऱ्याला अनुमती आहे</translation>
 <translation id="4664482161435122549">PKCS #12 निर्यात एरर</translation>
+<translation id="4664736447097490764">करब्रोस कॉन्फिगरेशन फाइल येथे संपादित करा.</translation>
 <translation id="4665014895760275686">निर्माता</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> द्वारे स्टोअर केलेला डेटा हटवला जाईल.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> सुरू करण्यासाठीवर क्लिक करा</translation>
@@ -2505,7 +2517,6 @@
 <translation id="4830502475412647084">OS अपडेट इंस्टॉल करत आहे</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> वापरून इंटरनेटशी कनेक्ट करण्‍यात तुमचे <ph name="DEVICE_TYPE" /> अक्षम आहे. कृपया अन्य नेटवर्क वापरा. <ph name="LEARN_MORE_LINK_START" />अधिक जाणून घ्‍या<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome ला विनंती केलेल्या संसाधनांचा अॅक्सेस नाही.</translation>
-<translation id="4835836146030131423">साइन इन करताना एरर.</translation>
 <translation id="4837926214103741331">तुम्ही हे डिव्हाइस वापरण्यासाठी प्राधिकृत नाही. कृपया साइन इन करण्याच्या परवानगीसाठी डिव्हाइस मालकाशी संपर्क साधा.</translation>
 <translation id="4837952862063191349">तुमचा स्थानिक डेटा अनलॉक आणि रिस्टोअर करण्‍यासाठी, कृपया तुमचा जुना <ph name="DEVICE_TYPE" /> पासवर्ड एंटर करा.</translation>
 <translation id="4838836835474292213">क्लिपबोर्डचा रीड अॅक्सेस द्या</translation>
@@ -2640,7 +2651,6 @@
 <translation id="5029568752722684782">कॉपी साफ करा</translation>
 <translation id="5030338702439866405">द्वारा जारी</translation>
 <translation id="5033266061063942743">भूमितीय आकार</translation>
-<translation id="5033619151015094114">तुमच्या कंपनीला किंवा संस्थेला या डिव्हाइसवर अपडेटची आवश्यकता आहे</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ला तुमचा कॅमेरा आणि मायक्रोफोन वापरायचा आहे</translation>
 <translation id="5036662165765606524">एकापेक्षा जास्त फायली आपोआप डाउनलोड करण्यासाठी कोणत्याही साइटला अनुमती देऊ नका</translation>
 <translation id="5037676449506322593">सर्व निवडा</translation>
@@ -2777,6 +2787,7 @@
 <translation id="5255859108402770436">पुन्हा साइन इन करा</translation>
 <translation id="5256861893479663409">सर्व साइटवर</translation>
 <translation id="5258992782919386492">या डिव्हाइसवर इंस्टॉल करा</translation>
+<translation id="5260334392110301220">स्मार्ट कोट</translation>
 <translation id="5260508466980570042">सॉरी, तुमचा ईमेल किंवा पासवर्ड पडताळणी करणे शक्य नाही. कृपया पुन्हा प्रयत्न करा.</translation>
 <translation id="5261683757250193089">वेब स्टोअर मध्ये उघडा</translation>
 <translation id="5264148714798105376">यास मिनिटभर किंवा त्‍याहून अधिक वेळ लागू शकतो.</translation>
@@ -2811,6 +2822,7 @@
 <translation id="5301751748813680278">अतिथी म्हणून एंटर होत आहे.</translation>
 <translation id="5301954838959518834">ठीक आहे, समजले</translation>
 <translation id="5302048478445481009">भाषा</translation>
+<translation id="5302932258331363306">उपघटक दाखवा</translation>
 <translation id="5305688511332277257">काहीही इंस्टॉल केले नाही</translation>
 <translation id="5307030433605830021">स्रोत सपोर्ट करत नाही</translation>
 <translation id="5308380583665731573">कनेक्‍ट करा</translation>
@@ -2910,6 +2922,7 @@
 <translation id="5457113250005438886">चुकीचा</translation>
 <translation id="5457459357461771897">तुमच्या कॉंप्युटरवरील फोटो, संगीत आणि अन्य मीडिया वाचा आणि हटवा</translation>
 <translation id="5457599981699367932">अतिथी म्हणून ब्राउझ करा</translation>
+<translation id="5457991019809708398">सुरू आहे, रोमिंग नाही</translation>
 <translation id="5458998536542739734">स्क्रीनवरील टिपा लॉक करा</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> ची अनुक्रमणिका</translation>
 <translation id="5463856536939868464">मेनूमध्ये लपलेले बुकमार्क आहेत</translation>
@@ -3135,6 +3148,7 @@
 <translation id="5799508265798272974">Linux व्हर्च्युअल मशीन: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">अंतिम डाउनलोडपासून गंतव्य फाइल कापली किंवा काढली.</translation>
 <translation id="5801568494490449797">प्राधान्ये</translation>
+<translation id="5804175651771201311">रोमिंग बंद आहे</translation>
 <translation id="5804241973901381774">परवानग्या</translation>
 <translation id="5805697420284793859">विंडो व्यवस्थापक</translation>
 <translation id="5811750797187914944">सर्व तयार आहे</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">आता सपोर्ट करत नाही.</translation>
 <translation id="6317369057005134371">ॲप्लिकेशन विंडोसाठी प्रतीक्षा करत आहे...</translation>
 <translation id="6318407754858604988">डाउनलोड सुरू झाले</translation>
+<translation id="6318944945640833942">प्रिंटर शोधू शकलो नाही. कृपया प्रिंटर अॅड्रेस पुन्हा एंटर करा.</translation>
 <translation id="6322653941595359182">तुमच्या Chromebook वरून एसएमएस पाठवा आणि मिळवा</translation>
 <translation id="6324916366299863871">शॉर्टकट संपादित करा</translation>
 <translation id="6325191661371220117">स्वयं-लाँच अक्षम करा</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">UI सेवा</translation>
 <translation id="6725206449694821596">इंटरनेट प्रिंट प्रोटोकॉल (IPP)</translation>
 <translation id="67269783048918309">वापर आणि निदान डेटा पाठवा. हे डिव्हाइस सध्या Google ला आपोआप निदान, डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवत आहे. हे तुमच्या लहान मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारण्यात मदत करेल. काही एकत्रित केलेला डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांना देखील मदत करेल. या <ph name="BEGIN_LINK1" />सेटिंगची<ph name="END_LINK1" /> मालकाद्वारे अंमलबजावणी केली जाते. तुमच्या लहान मुलासाठी अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सुरू केलेली असल्यास, ही माहिती त्याच्या Google खात्यामध्ये स्टोअर केली जाऊ शकते. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">कनेक्ट केले, <ph name="BATTERY_PERCENTAGE" />% बॅटरी</translation>
 <translation id="6732801395666424405">लोड न झालेली प्रमाणपत्रे</translation>
 <translation id="6732900235521116609">शॉर्टकट काढून टाकू शकत नाही</translation>
 <translation id="6735304988756581115">कुकीज आणि इतर साइट डेटा दर्शवा...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">सायकल</translation>
 <translation id="6877460900831874810">लॉक स्क्रीनवर Chrome मीडिया प्लेबॅक सुरू करा</translation>
 <translation id="6878422606530379992">सेन्सरना अनुमती आहे</translation>
+<translation id="6878665006737889642">पुन्हा इंस्टॉल करून पाहा</translation>
 <translation id="6880587130513028875">या पृष्ठावरील इमेज अवरोधित केलेल्या होत्या.</translation>
 <translation id="6883319974225028188">अरेरे! डिव्हाइस कॉन्फिगरेशन सेव्ह करण्यात सिस्टम अयशस्वी झाले.</translation>
 <translation id="6885771755599377173">सिस्टम माहिती पूर्वावलोकन</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">संंकालित सर्व्हरशी कनेक्ट करणे शक्य झाले नाही. पुन्हा प्रयत्न करीत आहे...</translation>
 <translation id="7121362699166175603">अ‍ॅड्रेस बारवरील इतिहास आणि आपोआप पूर्ण करण्याचे दाखले साफ करते. तुमच्या Google खात्यामध्ये <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> वर कदाचित ब्राउझिंगचे इतर फॉर्म असतील.</translation>
 <translation id="7121389946694989825">वापर आणि निदान डेटा पाठवा. हे डिव्हाइस सध्या Google ला आपोआप निदान, डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवत आहे. हे तुमच्या लहान मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारणा करण्यात मदत करेल. काही एकत्रित केलेला डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांना देखील मदत करेल. तुमच्या लहान मुलासाठी अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सुरू केलेली असल्यास, ही माहिती त्याच्या Google खात्यामध्ये स्टोअर केली जाऊ शकते. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">स्मार्ट डॅश</translation>
 <translation id="7123360114020465152">आता सपोर्ट करत नाही.</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> प्रिंट करताना एरर आली</translation>
 <translation id="7127980134843952133">इतिहास डाउनलोड करा</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> आता फुल स्क्रीन आहे.</translation>
 <translation id="7340650977506865820">साइट तुमची स्क्रीन शेअर करत आहे</translation>
 <translation id="7341834142292923918">या साइटचा ॲक्सेस हवा आहे</translation>
+<translation id="7344488796804562294">प्रगत करब्रोस कॉन्फिगरेशन</translation>
 <translation id="7345706641791090287">तुमचा पासवर्ड कन्फर्म करा</translation>
 <translation id="7346909386216857016">ठीक आहे, समजले</translation>
 <translation id="7347751611463936647">हे एक्स्टेंशन वापरण्यासाठी, "<ph name="EXTENSION_KEYWORD" />", नंतर TAB, नंतर तुमची आज्ञा किंवा शोध टाइप करा.</translation>
@@ -4756,6 +4775,7 @@
 <translation id="8227119283605456246">फाईल संलग्न करा</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> साठी पासवर्ड सेव्ह करायचा आहे का?</translation>
 <translation id="8234795456569844941">कृपया आमच्या इंजिनियरना ही समस्या सोडवण्यात मदत करा. तुम्हाला प्रोफाइल एरर मिळण्याआधी नेमके काय झाले ते आम्हाला सांगा:</translation>
+<translation id="8236917170563564587">त्याऐवजी हा टॅब शेअर करा</translation>
 <translation id="8241040075392580210">Shady</translation>
 <translation id="8241806945692107836">डिव्हाइस कॉन्फिगरेशन निर्धारित करत आहे...</translation>
 <translation id="8241868517363889229">तुमचे बुकमार्क वाचा आणि बदला</translation>
@@ -4767,6 +4787,7 @@
 <translation id="8249048954461686687">OEM फोल्डर</translation>
 <translation id="8249615410597138718">तुमच्या डिव्हाइसवर पाठवा</translation>
 <translation id="8249672078237421304">तुम्ही वाचत असलेल्या भाषेमध्ये नसलेल्या पृष्ठांचे भाषांतर करण्याचा प्रस्ताव द्या</translation>
+<translation id="8251441930213048644">आता रिफ्रेश करा</translation>
 <translation id="8251578425305135684">थंबनेल काढली.</translation>
 <translation id="8252569384384439529">अपलोड करत आहे…</translation>
 <translation id="8253198102038551905">नेटवर्क गुणधर्म मिळविण्यासाठी '+' क्लिक करा</translation>
@@ -5144,6 +5165,7 @@
 <translation id="8827752199525959199">आणखी कृती, <ph name="DOMAIN" /> वरील <ph name="USERNAME" /> साठीचा पासवर्ड</translation>
 <translation id="882854468542856424">कोणत्याही साइटला जवळपासचे ब्लूटूथ डिव्हाइस शोधण्याची अनुमती देऊ नका</translation>
 <translation id="8828933418460119530">DNS नाव</translation>
+<translation id="883062543841130884">उपघटक</translation>
 <translation id="8830796635868321089">विद्यमान प्रॉक्सी सेटिंग्ज वापरून अपडेट तपासणी अयशस्वी झाली. कृपया तुमच्या <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी 
 सेटिंग्ज<ph name="PROXY_SETTINGS_LINK_END" /> अॅडजस्ट करा.</translation>
 <translation id="8831664945713891930">एक्स्टेंशन सेटिंग्ज उघडा</translation>
@@ -5165,6 +5187,7 @@
 <translation id="8862003515646449717">वेगवान ब्राउझरवर बदला</translation>
 <translation id="8863753581171631212">लिंक नवीन <ph name="APP" /> मध्ये उघडा</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" /> <ph name="APP_NAME" />वर शेअर करत आहे</translation>
+<translation id="8864458770072227512">या डिव्हाइसवरून <ph name="EMAIL" /> काढून टाकण्यात आला</translation>
 <translation id="8868626022555786497">वापरात आहे</translation>
 <translation id="8870318296973696995">होम</translation>
 <translation id="8870413625673593573">अलीकडे बंद</translation>
@@ -5173,7 +5196,6 @@
 <translation id="8871974300055371298">आशय सेटिंग्ज</translation>
 <translation id="8872155268274985541">अवैध कियोस्क बाह्य अपडेट मॅनिफेस्ट फाइल आढळली. कियोस्क अॅप अपडेट करण्यात अयशस्वी. कृपया USB स्टिक काढून टाका.</translation>
 <translation id="8874184842967597500">कनेक्ट केलेले नाही</translation>
-<translation id="887550310442005096">तुमची कंपनी किंवा संस्था तुम्हाला हे डिव्हाइस अपडेट करण्याची विनंती करते</translation>
 <translation id="8876307312329369159">हे सेटिंग डेमो सत्रामध्ये बदलले जाऊ शकत नाही.</translation>
 <translation id="8877448029301136595">[मूळ डिरेक्टरी]</translation>
 <translation id="8879284080359814990">टॅब म्हणून &amp;दर्शवा</translation>
@@ -5288,6 +5310,7 @@
 <translation id="9044646465488564462">नेटवर्कशी कनेक्ट करण्यात अयशस्वी: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Google वरून ज्या पेजवर तुम्ही पोहोचण्याचा प्रयत्न करत आहात त्याचा वेब पत्ता पाठवते</translation>
 <translation id="9046895021617826162">कनेक्ट करण्यात अयशस्वी</translation>
+<translation id="9047391224416514812">हे वापरकर्ता नाव असलेले खाते आधीपासून अस्तित्वात आहे</translation>
 <translation id="9050666287014529139">सांकेतिक पासफ्रेझ</translation>
 <translation id="9052208328806230490">तुम्ही तुमचे मुद्रक <ph name="EMAIL" /> खाते वापरून <ph name="CLOUD_PRINT_NAME" /> सह नोंदणीकृत केले आहेत</translation>
 <translation id="9052404922357793350">ब्लॉक करणे सुरू ठेवा</translation>
@@ -5335,6 +5358,7 @@
 <translation id="9121814364785106365">पिन केलेला टॅब म्हणून उघडा</translation>
 <translation id="9124003689441359348">सेव्ह केलेले पासवर्ड येथे दिसून येतील</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> शि.)</translation>
+<translation id="9128317794749765148">सेट करणे पूर्ण करू शकलो नाही</translation>
 <translation id="9128870381267983090">नेटवर्कशी कनेक्ट करा</translation>
 <translation id="9130015405878219958">चुकीचे मोड एंटर केले.</translation>
 <translation id="9131487537093447019">ब्लूटूथ डिव्हाइस वर मेसेज पाठवा आणि त्यावरून मिळवा.</translation>
@@ -5403,6 +5427,7 @@
 <translation id="939598580284253335">सांकेतिक पासफ्रेझ एंटर करा</translation>
 <translation id="939736085109172342">नवीन फोल्‍डर</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome टॅब आणि ऑडिओ शेअर करीत आहे.</translation>
+<translation id="945166830402967374">तुमच्या संस्थेच्या डिव्हाइस अॅडमिनशी संपर्क साधा</translation>
 <translation id="945522503751344254">अभिप्राय पाठवा</translation>
 <translation id="947329552760389097">&amp;तपासणी घटक</translation>
 <translation id="952992212772159698">सक्रिय नाही</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index e42e5b1..50f06488 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1622,7 +1622,6 @@
 <translation id="3454157711543303649">Pengaktifan lengkap</translation>
 <translation id="3454213325559396544">Ini ialah kemas kini perisian dan keselamatan yang terakhir untuk <ph name="DEVICE_TYPE" /> ini. Untuk mendapatkan kemas kini pada masa akan datang, tingkatkan kepada model yang lebih baharu.</translation>
 <translation id="345693547134384690">Buka &amp;imej dalam tab baharu</translation>
-<translation id="3457500881955698515">Syarikat atau organisasi anda menghendaki peranti ini dikemas kini sekarang juga</translation>
 <translation id="3459509316159669723">Mencetak</translation>
 <translation id="3459697287128633276">Untuk membolehkan akaun anda mengakses Gedung Google Play, sila sahkan dengan Pembekal Pengenalan anda.</translation>
 <translation id="3459774175445953971">Terakhir diubah suai:</translation>
@@ -2239,7 +2238,6 @@
 <translation id="4364327530094270451">Tembikai</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> berkongsi tetingkap.</translation>
 <translation id="4364830672918311045">Paparkan pemberitahuan</translation>
-<translation id="4365673000813822030">Alamak, Penyegerakan telah berhenti berfungsi.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> dengan <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">E-mel dan kata laluan yang anda masukkan tidak padan</translation>
 <translation id="437184764829821926">Tetapan fon terperinci</translation>
@@ -2521,7 +2519,6 @@
 <translation id="4830502475412647084">Memasang kemas kini OS</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> anda tidak dapat menyambung ke Internet menggunakan <ph name="NETWORK_NAME" />. Sila pilih rangkaian lain. <ph name="LEARN_MORE_LINK_START" />Ketahui lebih lanjut<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome tidak boleh mengakses sumber yang diminta.</translation>
-<translation id="4835836146030131423">Ralat melog masuk.</translation>
 <translation id="4837926214103741331">Anda tiada kebenaran untuk menggunakan peranti ini. Sila hubungi pemilik peranti untuk mendapatkan kebenaran log masuk.</translation>
 <translation id="4837952862063191349">Untuk membuka kunci dan memulihkan data tempatan anda, sila masukkan kata laluan <ph name="DEVICE_TYPE" /> lama anda.</translation>
 <translation id="4838836835474292213">Akses baca papan keratan dibenarkan</translation>
@@ -2656,7 +2653,6 @@
 <translation id="5029568752722684782">Hapuskan salinan</translation>
 <translation id="5030338702439866405">Dikeluarkan Oleh</translation>
 <translation id="5033266061063942743">Bentuk geometri</translation>
-<translation id="5033619151015094114">Syarikat atau organisasi anda menghendaki peranti ini dikemas kini</translation>
 <translation id="503498442187459473"><ph name="HOST" /> mahu menggunakan kamera dan mikrofon anda</translation>
 <translation id="5036662165765606524">Jangan benarkan mana-mana tapak memuat turun berbilang fail secara automatik</translation>
 <translation id="5037676449506322593">Pilih Semua</translation>
@@ -5203,7 +5199,6 @@
 <translation id="8871974300055371298">Tetapan kandungan</translation>
 <translation id="8872155268274985541">Fail manifes kemas kini luar Kiosk yang tidak sah dijumpai. Gagal mengemas kini apl Kiosk. Sila alih keluar batang USB.</translation>
 <translation id="8874184842967597500">Tidak bersambung</translation>
-<translation id="887550310442005096">Syarikat atau organisasi anda meminta anda mengemas kini peranti ini</translation>
 <translation id="8876307312329369159">Tetapan ini tidak boleh ditukar dalam sesi tunjuk cara.</translation>
 <translation id="8877448029301136595">[direktori induk]</translation>
 <translation id="8879284080359814990">&amp;Paparkan Sebagai Tab</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 55337cbd..056fc1b 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Activering voltooid</translation>
 <translation id="3454213325559396544">Dit is de laatste automatische software- en beveiligingsupdate voor dit <ph name="DEVICE_TYPE" />. Upgrade naar een nieuwer model om nieuwe updates te ontvangen.</translation>
 <translation id="345693547134384690">&amp;Afbeelding openen in nieuw tabblad</translation>
-<translation id="3457500881955698515">Je bedrijf of organisatie vereist een onmiddellijke update voor dit apparaat</translation>
 <translation id="3459509316159669723">Afdrukken</translation>
 <translation id="3459697287128633276">Als je je account wilt inschakelen voor toegang tot de Google Play Store, moet je verifiëren via je identiteitsprovider.</translation>
 <translation id="3459774175445953971">Laatst bijgewerkt:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Meloen</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deelt een venster.</translation>
 <translation id="4364830672918311045">Meldingen weergeven</translation>
-<translation id="4365673000813822030">De synchronisatie werkt niet meer.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> met <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Het opgegeven e-mailadres en wachtwoord komen niet overeen</translation>
 <translation id="437184764829821926">Geavanceerde instellingen voor lettertypen</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">OS-update installeren</translation>
 <translation id="4830573902900904548">Je <ph name="DEVICE_TYPE" /> kan geen verbinding maken met internet via <ph name="NETWORK_NAME" />. Kies een ander netwerk. <ph name="LEARN_MORE_LINK_START" />Meer informatie<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome heeft geen toegang tot de gevraagde bron.</translation>
-<translation id="4835836146030131423">Fout bij inloggen.</translation>
 <translation id="4837926214103741331">Je beschikt niet over de rechten om dit apparaat te gebruiken. Neem contact op met de eigenaar van het apparaat voor toestemming om in te loggen.</translation>
 <translation id="4837952862063191349">Geef het oude wachtwoord van je <ph name="DEVICE_TYPE" /> op om te ontgrendelen en je lokale gegevens te herstellen.</translation>
 <translation id="4838836835474292213">Leestoegang voor klembord toegestaan</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Kopie wissen</translation>
 <translation id="5030338702439866405">Verleend door</translation>
 <translation id="5033266061063942743">Geometrische vormen</translation>
-<translation id="5033619151015094114">Je bedrijf of organisatie vereist een update voor dit apparaat</translation>
 <translation id="503498442187459473"><ph name="HOST" /> wil gebruikmaken van je camera en microfoon</translation>
 <translation id="5036662165765606524">Sites niet toestaan automatisch meerdere bestanden te downloaden</translation>
 <translation id="5037676449506322593">Selecteer alles</translation>
@@ -5201,7 +5197,6 @@
 <translation id="8871974300055371298">Instellingen voor content</translation>
 <translation id="8872155268274985541">Ongeldig manifestbestand voor de externe update van Kiosk gevonden. Het updaten van de Kiosk-app is mislukt. Verwijder de USB-stick.</translation>
 <translation id="8874184842967597500">Niet verbonden</translation>
-<translation id="887550310442005096">Je bedrijf of organisatie vraagt je dit apparaat te updaten</translation>
 <translation id="8876307312329369159">Deze instelling kan niet worden gewijzigd tijdens een demosessie.</translation>
 <translation id="8877448029301136595">[hoofddirectory]</translation>
 <translation id="8879284080359814990">Weergeven al&amp;s tabblad</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index a6e70b770..f622a2bd 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Det oppsto et problem med enhetslisenser i demomodus.</translation>
 <translation id="126710816202626562">Målspråket:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Avansert konfigurasjon</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1272978324304772054">Denne brukerkontoen tilhører ikke domenet som enheten er registrert for. Hvis du vil registrere deg for et annet domene, må du først gå gjennom enhetsgjenoppretting.</translation>
 <translation id="1274977772557788323">Lagringsinnstillinger for Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> valgt</translation>
 <translation id="1444628761356461360">Denne innstillingen administreres av enhetseieren, <ph name="OWNER_EMAIL" /> .</translation>
 <translation id="144518587530125858">Kan ikke laste inn <ph name="IMAGE_PATH" /> for tema.</translation>
+<translation id="1445693676523799095">Dette kan ta en stund</translation>
 <translation id="1451375123200651445">Nettside – enkeltfil</translation>
 <translation id="1451917004835509682">Legg til en administrert person</translation>
 <translation id="1454223536435069390">Ta en skjermdump</translation>
@@ -591,6 +593,7 @@
 <translation id="1875387611427697908">Dette kan bare legges til fra <ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">Kunne ikke hente autentiseringstokenet. Logg av og på igjen for å prøve på nytt.</translation>
 <translation id="1877860345998737529">Tilordning av bryterhandlinger</translation>
+<translation id="1878541307036593717">Konfigurer tillatelser</translation>
 <translation id="1879000426787380528">Logg på som</translation>
 <translation id="1880905663253319515">Vil du slette sertifikatet «<ph name="CERTIFICATE_NAME" />»?</translation>
 <translation id="1886996562706621347">Tillat at nettsteder kan be om å bli standardbehandlere for protokoller (anbefalt)</translation>
@@ -603,6 +606,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> igjen</translation>
 <translation id="1895658205118569222">Avslutning</translation>
 <translation id="1895934970388272448">Du må bekrefte registreringen på skriveren for å fullføre denne prosessen – sjekk det nå.</translation>
+<translation id="1899826437968063457">VM for programtillegg trenger tillatelse til å kjøre</translation>
 <translation id="1901303067676059328">Marker &amp;alt</translation>
 <translation id="1902576642799138955">Gyldighetsperiode</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Kutt lyden for fanen}other{Kutt lyden for fanene}}</translation>
@@ -876,6 +880,7 @@
 <translation id="2318923050469484167">Denne inkognitoøkten (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Topp- og bunntekst</translation>
 <translation id="2322318151094136999">Spør når et nettsted vil ha tilgang til serielle porter (anbefales)</translation>
+<translation id="2325444234681128157">Husk passordet</translation>
 <translation id="2326931316514688470">&amp;Last inn appen på nytt</translation>
 <translation id="2327492829706409234">Aktiver appen</translation>
 <translation id="2329597144923131178">Logg på for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker.</translation>
@@ -943,6 +948,7 @@
 <translation id="2433452467737464329">Legg til en søkeparameter i nettadressen for å automatisk laste inn siden på nytt: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Utseende</translation>
 <translation id="2433836460518180625">Lås kun opp enheten</translation>
+<translation id="2434449159125086437">Kunne ikke konfigurere skriveren. Kontrollér konfigurasjonen og prøv på nytt.</translation>
 <translation id="2435248616906486374">Nettverket mistet tilkoblingen</translation>
 <translation id="2435457462613246316">Vis passord</translation>
 <translation id="2436186046335138073">Vil du la <ph name="HANDLER_HOSTNAME" /> åpne alle <ph name="PROTOCOL" />-linker?</translation>
@@ -1094,6 +1100,7 @@
 <translation id="2649045351178520408">Base64-kodet ASCII, sertifikatkjede</translation>
 <translation id="2653033005692233957">Søket mislyktes</translation>
 <translation id="2653266418988778031">Hvis du sletter et CA-sertifikat (sertifiseringsinstans), vil nettleseren ikke lenger stole på noen sertifikater som er utstedt av denne sertifiseringsinstansen.</translation>
+<translation id="2653275834716714682">Utskifting av tekst</translation>
 <translation id="2653659639078652383">Send</translation>
 <translation id="265390580714150011">Feltverdi</translation>
 <translation id="2654166010170466751">Tillat at nettsteder installerer betalingsbehandlere</translation>
@@ -1302,6 +1309,7 @@
 <translation id="29488703364906173">En rask, enkel og sikker nettleser, utviklet for et moderne Internett.</translation>
 <translation id="2949289451367477459">Bruk posisjon. Tillat at apper og tjenester med posisjonstillatelse bruker posisjonen til enheten. Google kan samle inn posisjonsdata med jevne mellomrom og bruke disse dataene til å forbedre posisjonsnøyaktigheten og posisjonsbaserte tjenester på en anonym måte. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Advarsel om pakkeutvidelse</translation>
+<translation id="2959842337402130152">Det er ikke nok lagringplass til å gjenopprette. Frigjør <ph name="SPACE_REQUIRED" /> på enheten, og prøv på nytt.</translation>
 <translation id="296026337010986570">Ferdig! Skadelig programvare er fjernet. For å slå på utvidelser igjen, gå til &lt;a href="chrome://extensions"&gt;Utvidelser&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (fra utvidelse)</translation>
 <translation id="2961695502793809356">Klikk for å gå fremover – hold for å se logg</translation>
@@ -1608,7 +1616,6 @@
 <translation id="3454157711543303649">Aktiveringen er fullført</translation>
 <translation id="3454213325559396544">Dette er den siste automatiske programvare- og sikkerhetsoppdateringen for denne <ph name="DEVICE_TYPE" />-enheten. For å få fremtidige oppdateringer, oppgrader til en nyere modell.</translation>
 <translation id="345693547134384690">Åpne b&amp;ilde i ny fane</translation>
-<translation id="3457500881955698515">Bedriften eller organisasjonen din krever at denne enheten oppdateres med det samme</translation>
 <translation id="3459509316159669723">Utskrift</translation>
 <translation id="3459697287128633276">For å få tilgang til Google Play Butikken med kontoen din, bekreft hvem du er, hos identitetsleverandøren din.</translation>
 <translation id="3459774175445953971">Sist endret:</translation>
@@ -1983,6 +1990,7 @@
 <translation id="3966072572894326936">Velg en annen mappe...</translation>
 <translation id="3967822245660637423">Nedlasting fullført</translation>
 <translation id="3967919079500697218">Muligheten til å ta skjermdumper er deaktivert av administratoren.</translation>
+<translation id="3969092967100188979">På – roamer</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">Beregner …</translation>
 <translation id="3975565978598857337">Kunne ikke kontakte tjeneren for området</translation>
@@ -2044,6 +2052,7 @@
 <translation id="4068776064906523561">Lagrede fingeravtrykk</translation>
 <translation id="407173827865827707">Ved klikk</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Løsne fanen}other{Løsne fanene}}</translation>
+<translation id="4072805772816336153">Prøv på nytt senere</translation>
 <translation id="4074900173531346617">Sertifikat for signering av e-poster</translation>
 <translation id="407520071244661467">Skalér</translation>
 <translation id="4075639477629295004">Kunne ikke caste <ph name="FILE_NAME" />.</translation>
@@ -2132,6 +2141,7 @@
 <translation id="4209092469652827314">Stor</translation>
 <translation id="4209251085232852247">Slått av</translation>
 <translation id="4209464433672152343">Dokumenter <ph name="BEGIN_LINK_HELP" />sendes til Google<ph name="END_LINK_HELP" /> for å forberede dem for utskrift. Se, rediger og administrer skriverne dine og skriverloggen i <ph name="BEGIN_LINK_DASHBOARD" />Google Cloud Print-oversikten<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Laster ned den virtuelle maskinen</translation>
 <translation id="421182450098841253">&amp;Vis bokmerkerad</translation>
 <translation id="4211851069413100178">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen din bedre ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Dette bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Denne <ph name="BEGIN_LINK1" />innstillingen<ph name="END_LINK1" /> håndheves av eieren. Eieren kan velge å sende diagnostikk- og bruksdata for denne enheten til Google. Hvis du har slått på innstillingen for annen nett- og appaktivitet, kan disse dataene bli lagret i Google-kontoen din. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Eksportér</translation>
@@ -2220,7 +2230,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindu.</translation>
 <translation id="4364830672918311045">Vis varsler</translation>
-<translation id="4365673000813822030">Beklager, synkroniseringen har sluttet å fungere.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> med <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation>
 <translation id="437184764829821926">Avanserte innstillinger for skrifttype</translation>
@@ -2231,6 +2240,7 @@
 <translation id="4378551569595875038">Kobler til …</translation>
 <translation id="4378556263712303865">Enhetsrekvisisjon</translation>
 <translation id="4380648069038809855">Åpnet fullskjerm</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> og 1 konto til}other{<ph name="EMAIL" /> og <ph name="EXTRA_ACCOUNTS" /> kontoer til}}</translation>
 <translation id="4384312707950789900">Legg til som et foretrukket nettverk</translation>
 <translation id="4384652540891215547">Aktiver utvidelsen</translation>
 <translation id="438503109373656455">Jockey</translation>
@@ -2361,6 +2371,7 @@
 <translation id="4596295440756783523">Du har registrerte sertifikater som identifiserer disse tjenerne</translation>
 <translation id="4598556348158889687">Lagringsbehandling</translation>
 <translation id="4598776695426288251">Wi-Fi er tilgjengelig via flere enheter</translation>
+<translation id="4599134080475764833">VM for programtillegg er klar til bruk</translation>
 <translation id="4602466770786743961">Tillat alltid at <ph name="HOST" /> bruker kameraet og mikrofonen</translation>
 <translation id="4608500690299898628">&amp;Finn</translation>
 <translation id="4608520674724523647">Illustrasjon av vellykket registrering</translation>
@@ -2398,6 +2409,7 @@
 <translation id="4662788913887017617">Del dette bokmerket med iPhone</translation>
 <translation id="4663373278480897665">Kameraet er tillatt</translation>
 <translation id="4664482161435122549">Eksportfeil for PKCS #12</translation>
+<translation id="4664736447097490764">Rediger Kerberos-konfigurasjonsfilen her.</translation>
 <translation id="4665014895760275686">Produsent</translation>
 <translation id="4665446389743427678">Alle data som lagres av <ph name="SITE" />, blir slettet.</translation>
 <translation id="4668721319092543482">Klikk for å slå på <ph name="PLUGIN_NAME" /></translation>
@@ -2499,7 +2511,6 @@
 <translation id="4830502475412647084">Installerer OS-oppdateringen</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> kan ikke koble til Internett via <ph name="NETWORK_NAME" />. Velg et annet nettverk. <ph name="LEARN_MORE_LINK_START" />Finn ut mer<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome har ikke tilgang til den forespurte ressursen.</translation>
-<translation id="4835836146030131423">Feil ved pålogging.</translation>
 <translation id="4837926214103741331">Du er ikke autorisert til å bruke denne enheten. Ta kontakt med eieren av enheten for å få tillatelse til å logge på.</translation>
 <translation id="4837952862063191349">For å låse opp og gjenopprette lokale data må du oppgi det gamle <ph name="DEVICE_TYPE" />-passordet ditt.</translation>
 <translation id="4838836835474292213">Lesetilgang til utklippstavlen er tillatt</translation>
@@ -2634,7 +2645,6 @@
 <translation id="5029568752722684782">Slett kopi</translation>
 <translation id="5030338702439866405">Utstedt av</translation>
 <translation id="5033266061063942743">Geometriske figurer</translation>
-<translation id="5033619151015094114">Selskapet ditt eller organisasjonen din krever at denne enheten oppdateres</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ber om å bruke kameraet ditt og mikrofonen din</translation>
 <translation id="5036662165765606524">Ikke tillat at nettsteder laster ned flere filer automatisk</translation>
 <translation id="5037676449506322593">Velg alle</translation>
@@ -2771,6 +2781,7 @@
 <translation id="5255859108402770436">Logg på igjen</translation>
 <translation id="5256861893479663409">På alle nettsteder</translation>
 <translation id="5258992782919386492">Installer på denne enheten</translation>
+<translation id="5260334392110301220">Smarte hermetegn</translation>
 <translation id="5260508466980570042">Beklager, e-postadressen eller passordet kan ikke verifiseres. Prøv på nytt.</translation>
 <translation id="5261683757250193089">Åpne i Nettmarked</translation>
 <translation id="5264148714798105376">Dette kan ta omtrent ett minutt.</translation>
@@ -2805,6 +2816,7 @@
 <translation id="5301751748813680278">Går inn som gjest.</translation>
 <translation id="5301954838959518834">Greit</translation>
 <translation id="5302048478445481009">Språk</translation>
+<translation id="5302932258331363306">Vis erstatninger</translation>
 <translation id="5305688511332277257">Ingen installert</translation>
 <translation id="5307030433605830021">Kilden støttes ikke</translation>
 <translation id="5308380583665731573">Koble til</translation>
@@ -2904,6 +2916,7 @@
 <translation id="5457113250005438886">Ugyldig</translation>
 <translation id="5457459357461771897">lese og slette bilder, musikk og andre medier fra datamaskinen din</translation>
 <translation id="5457599981699367932">Surf som gjest</translation>
+<translation id="5457991019809708398">På – roamer ikke</translation>
 <translation id="5458998536542739734">Notater på låseskjermen</translation>
 <translation id="5463275305984126951">Indeks for <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Meny med skjulte bokmerker</translation>
@@ -3129,6 +3142,7 @@
 <translation id="5799508265798272974">Virtuell Linux-maskin: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Målfilen har blitt komprimert eller fjernet siden siste nedlasting</translation>
 <translation id="5801568494490449797">Innstillinger</translation>
+<translation id="5804175651771201311">Roaming er av</translation>
 <translation id="5804241973901381774">Tillatelser</translation>
 <translation id="5805697420284793859">Window Manager</translation>
 <translation id="5811750797187914944">Ferdig</translation>
@@ -3476,6 +3490,7 @@
 <translation id="6317318380444133405">Støttes ikke lenger.</translation>
 <translation id="6317369057005134371">Venter på appvinduet …</translation>
 <translation id="6318407754858604988">Nedlastingen er startet</translation>
+<translation id="6318944945640833942">Fant ikke noen skriver. Skriv inn skriveradressen på nytt.</translation>
 <translation id="6322653941595359182">Send og motta tekstmeldinger fra Chromebooken</translation>
 <translation id="6324916366299863871">Endre snarvei</translation>
 <translation id="6325191661371220117">Deaktiver automatisk oppstart</translation>
@@ -3732,6 +3747,7 @@
 <translation id="6725073593266469338">UI-tjeneste</translation>
 <translation id="6725206449694821596">Internet Printing Protocol (IPP)</translation>
 <translation id="67269783048918309">Send bruks- og diagnostikkdata. Denne enheten sender for øyeblikket diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Denne <ph name="BEGIN_LINK1" />innstillingen<ph name="END_LINK1" /> håndheves av eieren. Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Koblet til – <ph name="BATTERY_PERCENTAGE" /> % batteri</translation>
 <translation id="6732801395666424405">Sertifikater er ikke lastet inn</translation>
 <translation id="6732900235521116609">Kan ikke fjerne snarveien</translation>
 <translation id="6735304988756581115">Vis informasjonskapsler og andre nettsteddata</translation>
@@ -3824,6 +3840,7 @@
 <translation id="6876155724392614295">Sykkel</translation>
 <translation id="6877460900831874810">Slå på Chrome-medieavspilling på låseskjermen</translation>
 <translation id="6878422606530379992">Sensorer er tillatt</translation>
+<translation id="6878665006737889642">Prøv å installere på nytt</translation>
 <translation id="6880587130513028875">Bilder er blokkert på siden.</translation>
 <translation id="6883319974225028188">Beklager. Systemet kunne ikke lagre enhetskonfigurasjonen.</translation>
 <translation id="6885771755599377173">Forhåndsvisning av systeminformasjon</translation>
@@ -3992,6 +4009,7 @@
 <translation id="7120865473764644444">Kunne ikke koble til synkroniseringstjeneren. Prøver på nytt …</translation>
 <translation id="7121362699166175603">Tømmer loggen og fjerner autofullføringer i adressefeltet. Det kan hende Google-kontoen din har andre typer nettleserlogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Send bruks- og diagnostikkdata. Denne enheten sender for øyeblikket diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Smarte tankestreker</translation>
 <translation id="7123360114020465152">Støttes ikke lenger</translation>
 <translation id="7124929488592184705">Feil ved utskrift av <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Nedlastingslogg</translation>
@@ -4140,6 +4158,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> kjører nå i full skjerm.</translation>
 <translation id="7340650977506865820">Nettstedet deler skjermen din</translation>
 <translation id="7341834142292923918">Vil ha tilgang til dette nettstedet</translation>
+<translation id="7344488796804562294">Avansert Kerberos-konfigurasjon</translation>
 <translation id="7345706641791090287">Bekreft passordet</translation>
 <translation id="7346909386216857016">Greit</translation>
 <translation id="7347751611463936647">For å bruke denne utvidelsen, skriver du «<ph name="EXTENSION_KEYWORD" />» , trykker på TAB, og skriver kommandoordet eller søkeordet.</translation>
@@ -4749,6 +4768,7 @@
 <translation id="8227119283605456246">Legg ved fil</translation>
 <translation id="8230134520748321204">Vil du lagre passord for <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Hjelp programutviklerne våre med å løse dette problemet. Fortell oss hva som skjedde rett før du fikk profilfeilmeldingen:</translation>
+<translation id="8236917170563564587">Del denne fanen i stedet</translation>
 <translation id="8241040075392580210">Skybert</translation>
 <translation id="8241806945692107836">Fastslår enhetskonfigurasjonen …</translation>
 <translation id="8241868517363889229">lese og endre bokmerker</translation>
@@ -4760,6 +4780,7 @@
 <translation id="8249048954461686687">OEM-mappe</translation>
 <translation id="8249615410597138718">Send til enhetene dine</translation>
 <translation id="8249672078237421304">Tilby oversettelse av nettsider på språk du ikke kan lese</translation>
+<translation id="8251441930213048644">Last inn på nytt nå</translation>
 <translation id="8251578425305135684">Miniatyrbilde fjernet.</translation>
 <translation id="8252569384384439529">Laster opp …</translation>
 <translation id="8253198102038551905">Klikk på «+» for å gå til nettverksegenskaper</translation>
@@ -5137,6 +5158,7 @@
 <translation id="8827752199525959199">Flere handlinger, passord for <ph name="USERNAME" /> på <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Ikke tillat nettsteder å oppdage Bluetooth-enheter i nærheten</translation>
 <translation id="8828933418460119530">DNS-navn</translation>
+<translation id="883062543841130884">Erstatninger</translation>
 <translation id="8830796635868321089">Oppdateringssjekken mislyktes med de gjeldende mellomtjenerinnstillingene. Du må endre <ph name="PROXY_SETTINGS_LINK_START" />mellomtjenerinnstillingene<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Åpne innstillingene for utvidelser</translation>
 <translation id="8834039744648160717">Nettverkskonfigurasjonen kontrolleres av <ph name="USER_EMAIL" />.</translation>
@@ -5157,6 +5179,7 @@
 <translation id="8862003515646449717">Bytt til en raskere nettleser</translation>
 <translation id="8863753581171631212">Åpne linken i ny <ph name="APP" /></translation>
 <translation id="8864055848767439877">Deler <ph name="TAB_NAME" /> med <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> ble fjernet fra denne enheten</translation>
 <translation id="8868626022555786497">I bruk</translation>
 <translation id="8870318296973696995">Startside</translation>
 <translation id="8870413625673593573">Nylig lukket</translation>
@@ -5165,7 +5188,6 @@
 <translation id="8871974300055371298">Innholdsinnstillinger</translation>
 <translation id="8872155268274985541">Fant ugyldig ekstern manifestfil for Kiosk-oppdatering. Kunne ikke oppdatere Kiosk-appen. Ta ut USB-pinnen.</translation>
 <translation id="8874184842967597500">Ikke tilkoblet</translation>
-<translation id="887550310442005096">Selskapet ditt eller organisasjonen din ber deg om å oppdatere denne enheten</translation>
 <translation id="8876307312329369159">Denne innstillingen kan ikke endres under en demonstrasjonsøkt.</translation>
 <translation id="8877448029301136595">[overordnet katalog]</translation>
 <translation id="8879284080359814990">Vi&amp;s som fane</translation>
@@ -5280,6 +5302,7 @@
 <translation id="9044646465488564462">Kunne ikke koble til nettverket: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Sender Google nettadressen til siden du prøver å åpne</translation>
 <translation id="9046895021617826162">Tilkoblingen mislyktes</translation>
+<translation id="9047391224416514812">Det finnes allerede en konto med dette brukernavnet</translation>
 <translation id="9050666287014529139">Passordfrase</translation>
 <translation id="9052208328806230490">Du har registrert skriverne dine med <ph name="CLOUD_PRINT_NAME" /> ved hjelp av konto <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">Fortsett blokkering</translation>
@@ -5327,6 +5350,7 @@
 <translation id="9121814364785106365">Åpne som festet fane</translation>
 <translation id="9124003689441359348">Lagrede passord vises her</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> gjenstår)</translation>
+<translation id="9128317794749765148">Kunne ikke fullføre konfigureringen</translation>
 <translation id="9128870381267983090">Koble til nettverk</translation>
 <translation id="9130015405878219958">Ugyldig modus angitt.</translation>
 <translation id="9131487537093447019">sende meldinger til og motta meldinger fra Bluetooth-enheter.</translation>
@@ -5395,6 +5419,7 @@
 <translation id="939598580284253335">Angi en passordfrase</translation>
 <translation id="939736085109172342">Ny mappe</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> deler lyd og en fane fra Chrome.</translation>
+<translation id="945166830402967374">Kontakt enhetsadministratoren for organisasjonen din</translation>
 <translation id="945522503751344254">Gi tilbakemelding</translation>
 <translation id="947329552760389097">&amp;Undersøk elementer</translation>
 <translation id="952992212772159698">Ikke aktivert</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 456bd92..70d479b 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktywacja ukończona</translation>
 <translation id="3454213325559396544">To jest ostatnia automatyczna aktualizacja oprogramowania i zabezpieczeń, którą otrzymuje to urządzenie (<ph name="DEVICE_TYPE" />). Aby otrzymywać aktualizacje w przyszłości, przejdź na nowszy model.</translation>
 <translation id="345693547134384690">Otwórz &amp;grafikę w nowej karcie</translation>
-<translation id="3457500881955698515">Twoja firma lub instytucja wymaga natychmiastowego zaktualizowania tego urządzenia</translation>
 <translation id="3459509316159669723">Drukowanie</translation>
 <translation id="3459697287128633276">Aby Twoje konto miało dostęp do Sklepu Google Play, uwierzytelnij je za pomocą dostawcy tożsamości.</translation>
 <translation id="3459774175445953971">Ostatnia modyfikacja:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> udostępnia okno.</translation>
 <translation id="4364830672918311045">Wyświetlanie powiadomień</translation>
-<translation id="4365673000813822030">Ups, synchronizacja przestała działać.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> w aplikacji <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Podany adres e-mail i hasło nie pasują do siebie</translation>
 <translation id="437184764829821926">Zaawansowane ustawienia czcionek</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Instaluję aktualizację systemu operacyjnego</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> nie może się połączyć z internetem przez sieć <ph name="NETWORK_NAME" />. Wybierz inną sieć. <ph name="LEARN_MORE_LINK_START" />Więcej informacji<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome nie ma dostępu do żądanego zasobu.</translation>
-<translation id="4835836146030131423">Błąd podczas logowania.</translation>
 <translation id="4837926214103741331">Nie masz uprawnień do korzystania z tego urządzenia. Aby uzyskać pozwolenie na logowanie się, skontaktuj się z jego właścicielem.</translation>
 <translation id="4837952862063191349">Aby odblokować i przywrócić dane lokalne, podaj swoje stare hasło do urządzenia <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Przyznano uprawnienia do odczytu zawartości schowka</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Usuń kopię</translation>
 <translation id="5030338702439866405">Wystawiony przez</translation>
 <translation id="5033266061063942743">Kształty geometryczne</translation>
-<translation id="5033619151015094114">Twoja firma lub instytucja wymaga zaktualizowania tego urządzenia</translation>
 <translation id="503498442187459473"><ph name="HOST" /> chce korzystać z kamery i mikrofonu</translation>
 <translation id="5036662165765606524">Nie zezwalaj żadnym witrynom na automatyczne pobieranie wielu plików</translation>
 <translation id="5037676449506322593">Wybierz wszystko</translation>
@@ -5202,7 +5198,6 @@
 <translation id="8871974300055371298">Ustawienia treści</translation>
 <translation id="8872155268274985541">Odnaleziono nieprawidłowy plik manifestu zewnętrznej aktualizacji aplikacji kiosku. Aplikacja nie została zaktualizowana. Odłącz pamięć USB.</translation>
 <translation id="8874184842967597500">Brak połączenia</translation>
-<translation id="887550310442005096">Twoja firma lub instytucja prosi o zaktualizowanie tego urządzenia</translation>
 <translation id="8876307312329369159">Tego ustawienia nie można zmienić w sesji demonstracyjnej.</translation>
 <translation id="8877448029301136595">[katalog główny]</translation>
 <translation id="8879284080359814990">&amp;Pokaż jako kartę</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index f62a920..1984e3e 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Ativação concluída</translation>
 <translation id="3454213325559396544">Esta é a última atualização automática de software e segurança deste <ph name="DEVICE_TYPE" />. Para receber atualizações futuras, faça upgrade para um modelo mais novo.</translation>
 <translation id="345693547134384690">Abrir &amp;imagem em uma nova guia</translation>
-<translation id="3457500881955698515">Há uma exigência da sua empresa ou organização para atualizar este dispositivo imediatamente</translation>
 <translation id="3459509316159669723">Imprimir</translation>
 <translation id="3459697287128633276">Para ativar sua conta para acessar a Google Play Store, autentique com seu Provedor de identidade.</translation>
 <translation id="3459774175445953971">Última modificação:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melão</translation>
 <translation id="4364567974334641491">O app <ph name="APP_NAME" /> está compartilhando uma janela.</translation>
 <translation id="4364830672918311045">Exibir notificações</translation>
-<translation id="4365673000813822030">Ops, a sincronização parou de funcionar.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> com <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">O e-mail e a senha que você digitou não coincidem.</translation>
 <translation id="437184764829821926">Configurações de fonte avançadas</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Instalando atualização do SO</translation>
 <translation id="4830573902900904548">Não foi possível conectar seu <ph name="DEVICE_TYPE" /> à Internet usando <ph name="NETWORK_NAME" />. Escolha outra rede. <ph name="LEARN_MORE_LINK_START" />Saiba mais<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">O Chrome não tem acesso ao recurso solicitado.</translation>
-<translation id="4835836146030131423">Erro ao fazer login.</translation>
 <translation id="4837926214103741331">Você não tem autorização para usar este dispositivo. Para permissão de login, entre em contato com o proprietário do dispositivo.</translation>
 <translation id="4837952862063191349">Para desbloquear e restaurar seus dados locais, digite sua senha antiga do <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Acesso de leitura à área de transferência permitido</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Limpar cópia</translation>
 <translation id="5030338702439866405">Emitido por</translation>
 <translation id="5033266061063942743">Formas geométricas</translation>
-<translation id="5033619151015094114">Há uma exigência da sua empresa ou organização para atualizar este dispositivo</translation>
 <translation id="503498442187459473"><ph name="HOST" /> quer usar sua câmera e seu microfone</translation>
 <translation id="5036662165765606524">Não permitir que nenhum site faça download de vários arquivos automaticamente</translation>
 <translation id="5037676449506322593">Selecionar tudo</translation>
@@ -5204,7 +5200,6 @@
 <translation id="8871974300055371298">Configurações de conteúdo</translation>
 <translation id="8872155268274985541">Arquivo de manifesto de atualização externa do modo quiosque inválido encontrado. Falha ao atualizar o aplicativo de quiosque. Remova o pendrive.</translation>
 <translation id="8874184842967597500">Não conectado</translation>
-<translation id="887550310442005096">Há uma solicitação da sua empresa ou organização para atualizar este dispositivo</translation>
 <translation id="8876307312329369159">Não é possível alterar essa configuração em uma sessão de demonstração.</translation>
 <translation id="8877448029301136595">[diretório pai]</translation>
 <translation id="8879284080359814990">&amp;Mostrar como guia</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index cf87d41b..5fe0a85 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Activação concluída</translation>
 <translation id="3454213325559396544">Esta é a última atualização automática de software e de segurança para este <ph name="DEVICE_TYPE" />. Para obter atualizações futuras, atualize para um modelo mais recente.</translation>
 <translation id="345693547134384690">Abrir imagem num novo separador</translation>
-<translation id="3457500881955698515">A sua empresa ou entidade requer uma atualização imediata a este dispositivo.</translation>
 <translation id="3459509316159669723">Impressão</translation>
 <translation id="3459697287128633276">Para permitir que a sua conta aceda à Google Play Store, realize a autenticação junto do seu Fornecedor de identidade.</translation>
 <translation id="3459774175445953971">Última modificação:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melão</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> está a partilhar uma janela.</translation>
 <translation id="4364830672918311045">Apresentar notificações</translation>
-<translation id="4365673000813822030">Ups, a Sincronização deixou de funcionar.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> com <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">O email e a palavra-passe introduzidos não coincidem.</translation>
 <translation id="437184764829821926">Definições avançadas do tipo de letra</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">A instalar a atualização do SO…</translation>
 <translation id="4830573902900904548">O seu <ph name="DEVICE_TYPE" /> não consegue estabelecer ligação à Internet através de <ph name="NETWORK_NAME" />. Escolha outra rede. <ph name="LEARN_MORE_LINK_START" />Saiba mais<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">O Chrome não tem acesso ao recurso solicitado.</translation>
-<translation id="4835836146030131423">Erro ao iniciar sessão.</translation>
 <translation id="4837926214103741331">Não está autorizado a utilizar este dispositivo. Contacte o proprietário do dispositivo para obter autorização de início de sessão.</translation>
 <translation id="4837952862063191349">Para desbloquear e restaurar os dados locais, introduza a palavra-passe antiga do seu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Acesso de leitura à área de transferência permitido</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Limpar cópia</translation>
 <translation id="5030338702439866405">Emitido por</translation>
 <translation id="5033266061063942743">Formas geométricas</translation>
-<translation id="5033619151015094114">A sua empresa ou entidade requer uma atualização a este dispositivo.</translation>
 <translation id="503498442187459473"><ph name="HOST" /> pretende utilizar a câmara e o microfone.</translation>
 <translation id="5036662165765606524">Não permitir que os sites transfiram vários ficheiros automaticamente</translation>
 <translation id="5037676449506322593">Selecionar tudo</translation>
@@ -5201,7 +5197,6 @@
 <translation id="8871974300055371298">Definições de conteúdo</translation>
 <translation id="8872155268274985541">Foi encontrado um ficheiro do manifesto de atualização externa do Quiosque inválido. Falha ao atualizar a aplicação Quiosque. Remova a pen USB.</translation>
 <translation id="8874184842967597500">Sem ligação</translation>
-<translation id="887550310442005096">A sua empresa ou entidade solicita que atualize este dispositivo.</translation>
 <translation id="8876307312329369159">Não é possível alterar esta definição numa sessão de demonstração.</translation>
 <translation id="8877448029301136595">[directório principal]</translation>
 <translation id="8879284080359814990">Mo&amp;strar Como Separador</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 160bad32..f2649cbb4 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">A apărut o problemă cu licențele dispozitivului din modul demo.</translation>
 <translation id="126710816202626562">Limba traducerii:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Configurare avansată</translation>
 <translation id="1272079795634619415">Oprește</translation>
 <translation id="1272978324304772054">Acest cont de utilizator nu aparține domeniului pe care este înscris dispozitivul. Dacă doriți să vă înscrieți pe un alt domeniu, trebuie să parcurgeți mai întâi procesul de recuperare a dispozitivului.</translation>
 <translation id="1274977772557788323">Setări privind stocarea Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> selectate</translation>
 <translation id="1444628761356461360">Această setare este gestionată de proprietarul dispozitivului, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nu se poate încărca „<ph name="IMAGE_PATH" />” pentru temă.</translation>
+<translation id="1445693676523799095">Poate dura un timp</translation>
 <translation id="1451375123200651445">Pagină web, un singur fișier</translation>
 <translation id="1451917004835509682">Adaugă o persoană monitorizată</translation>
 <translation id="1454223536435069390">F&amp;aceți o captură de ecran</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">Aceasta poate fi adăugată numai din <ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">Nu s-a putut obține indicativul de autentificare. Pentru a reîncerca, deconectează-te și conectează-te din nou.</translation>
 <translation id="1877860345998737529">Atribuirea acțiunii de comutare</translation>
+<translation id="1878541307036593717">Configurează permisiunile</translation>
 <translation id="1879000426787380528">Conectează-te ca</translation>
 <translation id="1880905663253319515">Șterge certificatul „<ph name="CERTIFICATE_NAME" />”?</translation>
 <translation id="1886996562706621347">Permiteți site-urilor să solicite să devină handlere prestabilite pentru protocoale (recomandat)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">Timp rămas: <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">Închideți</translation>
 <translation id="1895934970388272448">Pentru a finaliza acest proces, este necesar să confirmați înregistrarea de pe imprimantă. Verificați acum.</translation>
+<translation id="1899826437968063457">Plugin VM are nevoie de permisiunea de a rula</translation>
 <translation id="1901303067676059328">Select&amp;ează tot</translation>
 <translation id="1902576642799138955">Perioadă de validitate</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Dezactivează sunetul filei}few{Dezactivează sunetul filelor}other{Dezactivează sunetul filelor}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Sesiunea incognito actuală (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Anteturi și subsoluri</translation>
 <translation id="2322318151094136999">Anunță-mă dacă un site vrea să acceseze porturile seriale (recomandat)</translation>
+<translation id="2325444234681128157">Reține parola</translation>
 <translation id="2326931316514688470">&amp;Reîncarcă aplicația</translation>
 <translation id="2327492829706409234">Activați aplicația</translation>
 <translation id="2329597144923131178">Conectează-te și accesează marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Pentru actualizarea automată a paginii: chrome://network/?refresh=&lt;sec&gt;, adăugați un parametru de interogare în adresa URL</translation>
 <translation id="2433507940547922241">Aspect</translation>
 <translation id="2433836460518180625">Deblochează numai dispozitivul</translation>
+<translation id="2434449159125086437">Nu s-a putut configura imprimanta. Fă o verificare a configurației și încearcă din nou.</translation>
 <translation id="2435248616906486374">Rețea deconectată</translation>
 <translation id="2435457462613246316">Afișați parola</translation>
 <translation id="2436186046335138073">Permiteți ca <ph name="HANDLER_HOSTNAME" /> să deschidă toate linkurile <ph name="PROTOCOL" />?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">ASCII codificat Base64, lanț de certificate</translation>
 <translation id="2653033005692233957">Căutarea nu a reușit</translation>
 <translation id="2653266418988778031">Dacă ștergi un certificat al unei autorități de certificare (CA), browserul nu va mai avea încredere în niciun certificat emis de acea CA.</translation>
+<translation id="2653275834716714682">Înlocuirea textului</translation>
 <translation id="2653659639078652383">Trimite</translation>
 <translation id="265390580714150011">Valoarea câmpului</translation>
 <translation id="2654166010170466751">Permite site-urilor să instaleze handlere pentru plăți</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Un browser web rapid, simplu și sigur, creat pentru internetul modern.</translation>
 <translation id="2949289451367477459">Folosește locația. Permite aplicațiilor și serviciilor cu permisiune pentru locație să folosească locația acestui dispozitiv. Google poate colecta periodic date despre locație și le poate folosi în mod anonim pentru a îmbunătăți precizia localizării și a serviciilor bazate pe locație. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Avertisment privind pachetul pentru extensie</translation>
+<translation id="2959842337402130152">Nu se poate restabili din cauza spațiului de stocare insuficient. Eliberează <ph name="SPACE_REQUIRED" /> pe dispozitiv și încearcă din nou.</translation>
 <translation id="296026337010986570">Gata! Software-ul dăunător a fost eliminat. Pentru a reactiva extensiile, accesează &lt;a href="chrome://extensions"&gt;Extensii&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (oferit de extensie)</translation>
 <translation id="2961695502793809356">Dă clic pentru a naviga înainte, ține apăsat pentru a vedea istoricul</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">Activarea a fost finalizată</translation>
 <translation id="3454213325559396544">Aceasta este cea mai recentă actualizare automată de software și securitate pentru acest dispozitiv <ph name="DEVICE_TYPE" />. Pentru a primi actualizări viitoare, fă upgrade la un model mai nou.</translation>
 <translation id="345693547134384690">Deschide &amp;imaginea într-o filă nouă</translation>
-<translation id="3457500881955698515">Compania sau organizația ta solicită o actualizare pentru acest dispozitiv imediat.</translation>
 <translation id="3459509316159669723">Printare</translation>
 <translation id="3459697287128633276">Pentru a permite contului să acceseze Magazinul Google Play, autentifică-te folosind Furnizorul de identitate.</translation>
 <translation id="3459774175445953971">Ultima modificare:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">Alegeți alt dosar...</translation>
 <translation id="3967822245660637423">Descărcare finalizată</translation>
 <translation id="3967919079500697218">Capacitatea de a crea capturi de ecran a fost dezactivată de administrator.</translation>
+<translation id="3969092967100188979">Activat, se utilizează roamingul</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">Se calculează...</translation>
 <translation id="3975565978598857337">Contactarea serverului pentru domeniu nu a reușit</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">Amprentele salvate</translation>
 <translation id="407173827865827707">Când se dă clic</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Anulează fixarea filei}few{Anulează fixarea filelor}other{Anulează fixarea filelor}}</translation>
+<translation id="4072805772816336153">Încearcă din nou mai târziu</translation>
 <translation id="4074900173531346617">Certificat semnatar pentru e-mail</translation>
 <translation id="407520071244661467">Redimensionează</translation>
 <translation id="4075639477629295004">Nu se poate proiecta <ph name="FILE_NAME" />.</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">Mare</translation>
 <translation id="4209251085232852247">Dezactivat</translation>
 <translation id="4209464433672152343">Documentele sunt <ph name="BEGIN_LINK_HELP" />trimise la Google<ph name="END_LINK_HELP" /> pentru a le pregăti de printare. Afișează, modifică și gestionează imprimantele și istoricul de printare din <ph name="BEGIN_LINK_DASHBOARD" />tabloul de bord Google Cloud Print<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Se descarcă mașina virtuală</translation>
 <translation id="421182450098841253">&amp;Afișați bara de marcaje</translation>
 <translation id="4211851069413100178">Trimite date de utilizare și diagnosticare. Contribuie la îmbunătățirea experienței Android trimițând automat la Google date privind diagnosticarea și utilizarea dispozitivelor și a aplicațiilor. Aceasta va ajuta la stabilitatea sistemului, a aplicației și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> este impusă de proprietar. Proprietarul poate alege să trimită date de diagnosticare și utilizare a dispozitivului la Google. Dacă setarea Activitatea suplimentară de pe web și din aplicații este activată, aceste date pot fi salvate în Contul tău Google. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Exportă</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">Pepene galben</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> trimite conținutul unei ferestre.</translation>
 <translation id="4364830672918311045">Afișează notificările</translation>
-<translation id="4365673000813822030">Hopa, sincronizarea a încetat să funcționeze.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> cu <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Adresa de e-mail și parola pe care le-ai introdus nu se potrivesc</translation>
 <translation id="437184764829821926">Setări avansate pentru fonturi</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">Se stabilește conexiunea...</translation>
 <translation id="4378556263712303865">Solicitarea dispozitivului</translation>
 <translation id="4380648069038809855">Ai intrat în ecranul complet</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, + încă un cont}few{<ph name="EMAIL" />, + încă <ph name="EXTRA_ACCOUNTS" /> conturi}other{<ph name="EMAIL" />, + încă <ph name="EXTRA_ACCOUNTS" /> de conturi}}</translation>
 <translation id="4384312707950789900">Adaugă în preferate</translation>
 <translation id="4384652540891215547">Activați extensia</translation>
 <translation id="438503109373656455">Fulgeraș</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">Ai certificate stocate care identifică aceste servere</translation>
 <translation id="4598556348158889687">Gestionarea stocării</translation>
 <translation id="4598776695426288251">Conexiune Wi-Fi disponibilă prin mai multe dispozitive</translation>
+<translation id="4599134080475764833">Plugin VM poate fi folosit</translation>
 <translation id="4602466770786743961">Permiteți întotdeauna accesul <ph name="HOST" /> la camera și microfonul dvs.</translation>
 <translation id="4608500690299898628">&amp;Caută...</translation>
 <translation id="4608520674724523647">Ilustrație pentru înregistrare</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">Trimite marcajul pe iPhone</translation>
 <translation id="4663373278480897665">Camera foto este permisă</translation>
 <translation id="4664482161435122549">PKCS # 12 Eroare de export</translation>
+<translation id="4664736447097490764">Editează fișierul de configurare Kerberos aici.</translation>
 <translation id="4665014895760275686">Producător</translation>
 <translation id="4665446389743427678">Toate datele stocate de <ph name="SITE" /> vor fi șterse.</translation>
 <translation id="4668721319092543482">Dă clic pentru a activa <ph name="PLUGIN_NAME" /></translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">Se instalează actualizarea sistemului de operare</translation>
 <translation id="4830573902900904548">Dispozitivul <ph name="DEVICE_TYPE" /> nu se poate conecta la internet folosind <ph name="NETWORK_NAME" />. Alege altă rețea. <ph name="LEARN_MORE_LINK_START" />Află mai multe<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome nu are acces la resursa solicitată.</translation>
-<translation id="4835836146030131423">Eroare la accesarea contului.</translation>
 <translation id="4837926214103741331">Nu ești autorizat(ă) să folosești acest dispozitiv. Contactează proprietarul dispozitivului pentru permisiunea de conectare.</translation>
 <translation id="4837952862063191349">Pentru a debloca și a restabili datele locale, introdu parola anterioară pentru <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Accesul de citire la clipboard este permis</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">Șterge copia</translation>
 <translation id="5030338702439866405">Emis de</translation>
 <translation id="5033266061063942743">Forme geometrice</translation>
-<translation id="5033619151015094114">Compania sau organizația ta solicită o actualizare pentru acest dispozitiv</translation>
 <translation id="503498442187459473"><ph name="HOST" /> dorește să utilizeze camera foto și microfonul</translation>
 <translation id="5036662165765606524">Nu permiteți niciunui site să descarce automat mai multe fișiere</translation>
 <translation id="5037676449506322593">Selectează tot</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">Conectează-te din nou</translation>
 <translation id="5256861893479663409">Pe toate site-urile</translation>
 <translation id="5258992782919386492">Instalează pe acest dispozitiv</translation>
+<translation id="5260334392110301220">Ghilimele inteligente</translation>
 <translation id="5260508466980570042">Ne pare rău, adresa de e-mail sau parola nu a putut fi verificată. Încearcă din nou.</translation>
 <translation id="5261683757250193089">Deschide în Magazinul web</translation>
 <translation id="5264148714798105376">Poate dura câteva minute.</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">Se conectează ca invitat.</translation>
 <translation id="5301954838959518834">OK, am înțeles</translation>
 <translation id="5302048478445481009">Limbă</translation>
+<translation id="5302932258331363306">Afișează înlocuirile</translation>
 <translation id="5305688511332277257">Niciunul instalat</translation>
 <translation id="5307030433605830021">Sursa nu este acceptată</translation>
 <translation id="5308380583665731573">Conectează-te</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">Nevalide</translation>
 <translation id="5457459357461771897">Citește și șterge fotografii, muzică și alte tipuri de conținut media de pe computer</translation>
 <translation id="5457599981699367932">Navighează ca invitat</translation>
+<translation id="5457991019809708398">Activat, nu se utilizează roamingul</translation>
 <translation id="5458998536542739734">Notele pe ecranul de blocare</translation>
 <translation id="5463275305984126951">Index pentru <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Meniu conținând marcajele ascunse</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">Mașină virtuală Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Fișierul de destinație a fost trunchiat sau eliminat de la ultima descărcare.</translation>
 <translation id="5801568494490449797">Preferințe</translation>
+<translation id="5804175651771201311">Roaming dezactivat</translation>
 <translation id="5804241973901381774">Permisiuni</translation>
 <translation id="5805697420284793859">Managerul de ferestre</translation>
 <translation id="5811750797187914944">Gata</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">Nu mai este acceptată.</translation>
 <translation id="6317369057005134371">Se așteaptă fereastra aplicației...</translation>
 <translation id="6318407754858604988">A început descărcarea</translation>
+<translation id="6318944945640833942">Nu s-a detectat nicio imprimantă. Introdu din nou adresa imprimantei.</translation>
 <translation id="6322653941595359182">Trimite și primește mesaje text pe Chromebook</translation>
 <translation id="6324916366299863871">Editează o comandă rapidă</translation>
 <translation id="6325191661371220117">Dezactivați lansarea automată</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">Serviciul IU</translation>
 <translation id="6725206449694821596">Internet Printing Protocol (IPP)</translation>
 <translation id="67269783048918309">Trimite date de utilizare și diagnosticare. Momentan, dispozitivul trimite automat date de diagnosticare și de utilizare a dispozitivului și aplicațiilor la Google. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> este impusă de proprietar. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Conectat, nivelul bateriei: <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6732801395666424405">Certificatele nu s-au încărcat</translation>
 <translation id="6732900235521116609">Nu se poate elimina comanda rapidă</translation>
 <translation id="6735304988756581115">Afișează cookie-uri și alte date privind site-ul...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">Bicicletă</translation>
 <translation id="6877460900831874810">Activează redarea conținutului media Chrome pe ecranul de blocare</translation>
 <translation id="6878422606530379992">Folosirea senzorilor este permisă</translation>
+<translation id="6878665006737889642">Încearcă să instalezi din nou</translation>
 <translation id="6880587130513028875">Imaginile au fost blocate pe această pagină.</translation>
 <translation id="6883319974225028188">Hopa! Sistemul nu a putut salva configurarea dispozitivului.</translation>
 <translation id="6885771755599377173">Previzualizarea informațiilor de sistem</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">Nu s-a putut stabili conexiunea cu serverul de sincronizare. Se încearcă din nou…</translation>
 <translation id="7121362699166175603">Șterge istoricul și completările automate din bara de adrese. Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Trimite date de utilizare și diagnosticare. Momentan, dispozitivul trimite automat date de diagnosticare și de utilizare a dispozitivului și aplicațiilor la Google. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Cratime inteligente</translation>
 <translation id="7123360114020465152">Nu mai este acceptată</translation>
 <translation id="7124929488592184705">Eroare la printarea <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Istoricul descărcărilor</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> este acum pe ecran complet.</translation>
 <translation id="7340650977506865820">Site-ul permite accesul la ecranul tău</translation>
 <translation id="7341834142292923918">Vrea acces la acest site</translation>
+<translation id="7344488796804562294">Configurare Kerberos avansată</translation>
 <translation id="7345706641791090287">Confirmă parola</translation>
 <translation id="7346909386216857016">OK, am înțeles</translation>
 <translation id="7347751611463936647">Pentru a utiliza această extensie, introdu „<ph name="EXTENSION_KEYWORD" />”, apoi apasă pe TAB și folosește comanda sau căutarea.</translation>
@@ -4758,6 +4777,7 @@
 <translation id="8227119283605456246">Atașează un fișier</translation>
 <translation id="8230134520748321204">Salvezi parola pentru <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Ajută-i pe inginerii noștri să remedieze această problemă. Spune-ne ce s-a întâmplat chiar înainte să primești mesajul de eroare privind profilul:</translation>
+<translation id="8236917170563564587">Distribuie această filă</translation>
 <translation id="8241040075392580210">Norișor</translation>
 <translation id="8241806945692107836">Se determină configurația dispozitivului...</translation>
 <translation id="8241868517363889229">Citește și modifică marcajele</translation>
@@ -4769,6 +4789,7 @@
 <translation id="8249048954461686687">Dosar OEM</translation>
 <translation id="8249615410597138718">Trimite pe dispozitivele tale</translation>
 <translation id="8249672078237421304">Oferă traducerea paginilor care nu sunt într-o limbă pe care o cunosc</translation>
+<translation id="8251441930213048644">Actualizează acum</translation>
 <translation id="8251578425305135684">Miniatura a fost eliminată.</translation>
 <translation id="8252569384384439529">Se încarcă...</translation>
 <translation id="8253198102038551905">Pentru a vedea proprietățile rețelei, dă clic pe „+”</translation>
@@ -5146,6 +5167,7 @@
 <translation id="8827752199525959199">Mai multe acțiuni, parola pentru <ph name="USERNAME" /> de pe <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Nu permite niciunui site să descopere dispozitive Bluetooth din apropiere.</translation>
 <translation id="8828933418460119530">Nume DNS</translation>
+<translation id="883062543841130884">Înlocuiri</translation>
 <translation id="8830796635868321089">Căutarea actualizărilor utilizând setările de proxy actuale nu a reușit. Ajustați <ph name="PROXY_SETTINGS_LINK_START" />setările de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Deschide setările pentru extensii</translation>
 <translation id="8834039744648160717">Configurarea rețelei este controlată de <ph name="USER_EMAIL" />.</translation>
@@ -5166,6 +5188,7 @@
 <translation id="8862003515646449717">Comută la un browser rapid</translation>
 <translation id="8863753581171631212">Deschide linkul într-o fereastră nouă în <ph name="APP" /></translation>
 <translation id="8864055848767439877">Se trimite <ph name="TAB_NAME" /> la <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> a fost eliminat de pe acest dispozitiv</translation>
 <translation id="8868626022555786497">În uz</translation>
 <translation id="8870318296973696995">Pagina de pornire</translation>
 <translation id="8870413625673593573">Închise recent</translation>
@@ -5174,7 +5197,6 @@
 <translation id="8871974300055371298">Setări de conținut</translation>
 <translation id="8872155268274985541">S-a găsit un fișier manifest nevalid pentru actualizarea externă a aplicației de tip chioșc. Actualizarea aplicației de tip chioșc nu a reușit. Scoate stickul USB.</translation>
 <translation id="8874184842967597500">Neconectat</translation>
-<translation id="887550310442005096">Compania sau organizația ta solicită să actualizezi acest dispozitiv</translation>
 <translation id="8876307312329369159">Setarea nu poate fi modificată într-o sesiune demonstrativă.</translation>
 <translation id="8877448029301136595">[directorul părinte]</translation>
 <translation id="8879284080359814990">&amp;Afișează ca filă</translation>
@@ -5289,6 +5311,7 @@
 <translation id="9044646465488564462">Conectarea la rețea nu s-a realizat: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Trimite la Google adresa web a paginii pe care încerci să o accesezi</translation>
 <translation id="9046895021617826162">Conectare nereușită</translation>
+<translation id="9047391224416514812">Există deja un cont cu acest nume de utilizator</translation>
 <translation id="9050666287014529139">Expresie de acces</translation>
 <translation id="9052208328806230490">Ai înregistrat imprimantele la <ph name="CLOUD_PRINT_NAME" /> utilizând contul <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">Continuă blocarea</translation>
@@ -5336,6 +5359,7 @@
 <translation id="9121814364785106365">Deschide ca filă fixată</translation>
 <translation id="9124003689441359348">Parolele salvate vor fi afișate aici</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> rămase)</translation>
+<translation id="9128317794749765148">Nu s-a putut finaliza configurarea</translation>
 <translation id="9128870381267983090">Conectați-vă la rețea</translation>
 <translation id="9130015405878219958">A fost introdus un mod nevalid.</translation>
 <translation id="9131487537093447019">Trimite mesaje către dispozitivele Bluetooth și primește mesaje de la acestea.</translation>
@@ -5404,6 +5428,7 @@
 <translation id="939598580284253335">Introdu expresia de acces</translation>
 <translation id="939736085109172342">Dosar nou</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> trimite conținutul unei file Chrome și conținutul audio.</translation>
+<translation id="945166830402967374">Contactează administratorul dispozitivului organizației</translation>
 <translation id="945522503751344254">Trimite feedback</translation>
 <translation id="947329552760389097">&amp;Inspectează elementele</translation>
 <translation id="952992212772159698">Neactivat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index a72e2f18..66acf1069 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Возникла проблема с лицензиями для устройств, работающих в демонстрационном режиме.</translation>
 <translation id="126710816202626562">Перевести на:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Расширенные настройки</translation>
 <translation id="1272079795634619415">Остановить</translation>
 <translation id="1272978324304772054">Этот аккаунт не относится к домену, в котором зарегистрировано устройство. Чтобы зарегистрироваться в другом домене, сначала восстановите настройки устройства.</translation>
 <translation id="1274977772557788323">Настройки хранилища Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">Выбрано: <ph name="NUMBER_OF_ITEMS_SELECTED" /></translation>
 <translation id="1444628761356461360">Этот аккаунт контролируется владельцем устройства (<ph name="OWNER_EMAIL" />)</translation>
 <translation id="144518587530125858">Не удалось загрузить "<ph name="IMAGE_PATH" />" для темы.</translation>
+<translation id="1445693676523799095">Это может занять несколько минут</translation>
 <translation id="1451375123200651445">Веб-страница, один файл</translation>
 <translation id="1451917004835509682">Добавить управляемый профиль</translation>
 <translation id="1454223536435069390">С&amp;делать снимок экрана</translation>
@@ -593,6 +595,7 @@
 <translation id="1875387611427697908">Это приложение или расширение можно установить только из сервиса "<ph name="CHROME_WEB_STORE" />".</translation>
 <translation id="1877520246462554164">Не удалось получить токен аутентификации. Чтобы повторить попытку, выйдите из аккаунта и войдите снова.</translation>
 <translation id="1877860345998737529">Назначение действий для функции Switch Access</translation>
+<translation id="1878541307036593717">Настройка разрешений</translation>
 <translation id="1879000426787380528">Войти как</translation>
 <translation id="1880905663253319515">Удалить сертификат <ph name="CERTIFICATE_NAME" />?</translation>
 <translation id="1886996562706621347">Разрешить запросы на установку обработчиков протоколов (рекомендуется)</translation>
@@ -605,6 +608,7 @@
 <translation id="1895252664692693738">Ещё <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">Завершение работы</translation>
 <translation id="1895934970388272448">Чтобы завершить операцию, подтвердите регистрацию на принтере.</translation>
+<translation id="1899826437968063457">Необходимо разрешение для запуска Plugin VM</translation>
 <translation id="1901303067676059328">Выделить &amp;все</translation>
 <translation id="1902576642799138955">Срок действия</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Отключить звук на вкладке}one{Отключить звук на вкладках}few{Отключить звук на вкладках}many{Отключить звук на вкладках}other{Отключить звук на вкладках}}</translation>
@@ -878,6 +882,7 @@
 <translation id="2318923050469484167">Текущий сеанс в режиме инкогнито (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Верхние и нижние колонтитулы</translation>
 <translation id="2322318151094136999">Запрашивать разрешение на доступ сайтов к последовательным портам (рекомендуется)</translation>
+<translation id="2325444234681128157">Запомнить·пароль</translation>
 <translation id="2326931316514688470">Пере&amp;загрузить приложение</translation>
 <translation id="2327492829706409234">Включить приложение</translation>
 <translation id="2329597144923131178">Войдите, чтобы синхронизировать закладки, пароли, историю и т. д. на всех устройствах.</translation>
@@ -944,6 +949,7 @@
 <translation id="2433452467737464329">Добавьте в URL параметр запроса для автоматического обновления страницы: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Внешний вид</translation>
 <translation id="2433836460518180625">Только снимать блокировку устройства</translation>
+<translation id="2434449159125086437">Не удалось настроить принтер. Проверьте конфигурацию и повторите попытку.</translation>
 <translation id="2435248616906486374">Подключение отсутствует</translation>
 <translation id="2435457462613246316">Показать пароль</translation>
 <translation id="2436186046335138073">Использовать <ph name="HANDLER_HOSTNAME" /> для обработки ссылок типа "<ph name="PROTOCOL" />"?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">ASCII с кодировкой Base64, цепочка сертификатов</translation>
 <translation id="2653033005692233957">Ошибка поиска</translation>
 <translation id="2653266418988778031">Если удалить сертификат Центра сертификации, ваш браузер не сможет доверять сертификатам, выпущенным этим Центром сертификации.</translation>
+<translation id="2653275834716714682">Замена текста</translation>
 <translation id="2653659639078652383">Отправить</translation>
 <translation id="265390580714150011">Значение поля</translation>
 <translation id="2654166010170466751">Разрешить сайтам устанавливать обработчики платежей.</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Chrome – это простой, быстрый и безопасный браузер для современного Интернета.</translation>
 <translation id="2949289451367477459">Включение геолокации. Предоставьте приложениям и сервисам доступ к данным о местоположении устройства. Чтобы повышать точность геолокации и улучшать некоторые сервисы, компания Google может периодически собирать анонимные геоданные пользователей. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Внимание!</translation>
+<translation id="2959842337402130152">Не удалось выполнить импорт: на устройстве недостаточно места. Освободите <ph name="SPACE_REQUIRED" /> и повторите попытку.</translation>
 <translation id="296026337010986570">Готово! Вредоносное ПО удалено. Вы можете снова включить расширения на &lt;a href="chrome://extensions"&gt;этой странице&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (предусмотрено продление)</translation>
 <translation id="2961695502793809356">Нажмите, чтобы перейти вперед. Удерживайте, чтобы просмотреть историю.</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">Активация завершена</translation>
 <translation id="3454213325559396544">Это последнее автоматическое обновление ПО и безопасности для устройства <ph name="DEVICE_TYPE" />. Если вы хотите получать обновления в дальнейшем, перейдите на более новую модель.</translation>
 <translation id="345693547134384690">Открыть &amp;картинку в новой вкладке</translation>
-<translation id="3457500881955698515">Вашей организации нужно, чтобы вы обновили ПО на этом устройстве прямо сейчас.</translation>
 <translation id="3459509316159669723">Печать</translation>
 <translation id="3459697287128633276">Чтобы предоставить аккаунту доступ к Google Play, введите данные, полученные от поставщика идентификационной информации.</translation>
 <translation id="3459774175445953971">Изменен:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">Выбрать другую папку...</translation>
 <translation id="3967822245660637423">Скачивание завершено.</translation>
 <translation id="3967919079500697218">Функция создания скриншотов была отключена администратором.</translation>
+<translation id="3969092967100188979">Вкл., с роумингом</translation>
 <translation id="3970114302595058915">Идентификатор</translation>
 <translation id="397105322502079400">Вычисление…</translation>
 <translation id="3975565978598857337">Не удалось связаться с областью сервера.</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">Сохраненные отпечатки пальцев</translation>
 <translation id="407173827865827707">При нажатии</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Открепить вкладку}one{Открепить вкладки}few{Открепить вкладки}many{Открепить вкладки}other{Открепить вкладки}}</translation>
+<translation id="4072805772816336153">Повторите попытку позже.</translation>
 <translation id="4074900173531346617">Сертификат для подписи электронной почты</translation>
 <translation id="407520071244661467">Масштаб</translation>
 <translation id="4075639477629295004">Невозможно транслировать файл "<ph name="FILE_NAME" />"</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">Крупный</translation>
 <translation id="4209251085232852247">Отключено</translation>
 <translation id="4209464433672152343">Документы <ph name="BEGIN_LINK_HELP" />отправляются в Google<ph name="END_LINK_HELP" /> для подготовки к печати. Список принтеров и история печати доступны на <ph name="BEGIN_LINK_DASHBOARD" />панели управления<ph name="END_LINK_DASHBOARD" /> сервиса "Google Виртуальный принтер".</translation>
+<translation id="4210048056321123003">Скачивание виртуальной машины…</translation>
 <translation id="421182450098841253">Показывать панель &amp;закладок</translation>
 <translation id="4211851069413100178">Отправка данных о работе устройства. Помогите сделать Android ещё лучше – разрешите автоматически отправлять в Google диагностическую информацию, данные об использовании приложений и самого устройства. Эти данные нужны нам, чтобы в будущем повысить стабильность приложений и внести другие улучшения. Некоторые данные в обобщенном виде пригодятся партнерам Google, например разработчикам Android. Эта <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> принудительно применяется владельцем. Он вправе разрешить автоматическую отправку в Google данных об использовании и диагностике устройства. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в вашем аккаунте. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Экспортировать</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">Дыня</translation>
 <translation id="4364567974334641491">Приложение "<ph name="APP_NAME" />" предоставило доступ к окну.</translation>
 <translation id="4364830672918311045">Показывать уведомления</translation>
-<translation id="4365673000813822030">К сожалению, выполнить синхронизацию не удалось.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> в приложении "<ph name="APP_NAME" />".</translation>
 <translation id="4370975561335139969">Указан неправильный адрес или пароль</translation>
 <translation id="437184764829821926">Расширенные настройки шрифтов</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">Подключение…</translation>
 <translation id="4378556263712303865">Заявка устройства</translation>
 <translation id="4380648069038809855">Полноэкранный режим включен</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> и ещё 1 аккаунт}one{<ph name="EMAIL" /> и ещё <ph name="EXTRA_ACCOUNTS" /> аккаунт}few{<ph name="EMAIL" /> и ещё <ph name="EXTRA_ACCOUNTS" /> аккаунта}many{<ph name="EMAIL" /> и ещё <ph name="EXTRA_ACCOUNTS" /> аккаунтов}other{<ph name="EMAIL" /> и ещё <ph name="EXTRA_ACCOUNTS" /> аккаунта}}</translation>
 <translation id="4384312707950789900">Добавить в предпочитаемые сети</translation>
 <translation id="4384652540891215547">Активация расширения</translation>
 <translation id="438503109373656455">Скачки</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">У вас есть сертификаты, идентифицирующие эти серверы</translation>
 <translation id="4598556348158889687">Управление хранилищем</translation>
 <translation id="4598776695426288251">Доступно подключение к Wi-Fi через несколько устройств</translation>
+<translation id="4599134080475764833">Выполнена установка Plugin VM</translation>
 <translation id="4602466770786743961">Всегда предоставлять сайту <ph name="HOST" /> доступ к камере и микрофону</translation>
 <translation id="4608500690299898628">&amp;Найти...</translation>
 <translation id="4608520674724523647">Пример с завершенной регистрацией</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">Поделитесь закладкой с iPhone</translation>
 <translation id="4663373278480897665">Доступ к камере разрешен</translation>
 <translation id="4664482161435122549">Ошибка экспорта PKCS #12</translation>
+<translation id="4664736447097490764">В этом разделе можно изменить файл конфигурации Kerberos.</translation>
 <translation id="4665014895760275686">Производитель</translation>
 <translation id="4665446389743427678">Все данные, хранящиеся на сайте <ph name="SITE" />, будут удалены.</translation>
 <translation id="4668721319092543482">Нажмите, чтобы включить плагин "<ph name="PLUGIN_NAME" />"</translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">Обновление ОС</translation>
 <translation id="4830573902900904548">Устройству <ph name="DEVICE_TYPE" /> не удается подключиться к Интернету по сети <ph name="NETWORK_NAME" />. Выберите другую сеть. <ph name="LEARN_MORE_LINK_START" />Подробнее…<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Запрошенный ресурс недоступен в Chrome</translation>
-<translation id="4835836146030131423">Ошибка при входе.</translation>
 <translation id="4837926214103741331">У вас нет доступа к этому устройству. Свяжитесь с его владельцем.</translation>
 <translation id="4837952862063191349">Чтобы разблокировать и восстановить данные, введите старый пароль устройства <ph name="DEVICE_TYPE" /></translation>
 <translation id="4838836835474292213">Доступ к буферу обмена открыт</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">Удалить данные</translation>
 <translation id="5030338702439866405">Выдан:</translation>
 <translation id="5033266061063942743">Геометрические фигуры</translation>
-<translation id="5033619151015094114">Вашей организации нужно, чтобы вы обновили ПО на этом устройстве.</translation>
 <translation id="503498442187459473">Сайт <ph name="HOST" /> запрашивает доступ к камере и микрофону.</translation>
 <translation id="5036662165765606524">Запретить сайтам автоматически скачивать более одного файла</translation>
 <translation id="5037676449506322593">Выделить все</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">Войдите в аккаунт снова</translation>
 <translation id="5256861893479663409">На всех сайтах</translation>
 <translation id="5258992782919386492">Установить на этом устройстве</translation>
+<translation id="5260334392110301220">Умные кавычки</translation>
 <translation id="5260508466980570042">Вы указали неверный адрес электронной почты или пароль. Повторите попытку.</translation>
 <translation id="5261683757250193089">Открыть в Интернет-магазине</translation>
 <translation id="5264148714798105376">Это может занять около минуты.</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">Вы входите как гость.</translation>
 <translation id="5301954838959518834">ОК</translation>
 <translation id="5302048478445481009">Язык</translation>
+<translation id="5302932258331363306">Показать замены</translation>
 <translation id="5305688511332277257">Не установлено</translation>
 <translation id="5307030433605830021">Источник не поддерживается</translation>
 <translation id="5308380583665731573">Подключение</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">Недопустимые данные</translation>
 <translation id="5457459357461771897">Доступ к фотографиям, музыке и другим медиафайлам на вашем компьютере, а также их удаление</translation>
 <translation id="5457599981699367932">Войти в гостевой режим</translation>
+<translation id="5457991019809708398">Вкл., без роуминга</translation>
 <translation id="5458998536542739734">Заметки на заблокированном экране</translation>
 <translation id="5463275305984126951">Содержание <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Меню со скрытыми закладками</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">Виртуальная машина Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Выбранный файл был поврежден или удален после скачивания.</translation>
 <translation id="5801568494490449797">Настройки</translation>
+<translation id="5804175651771201311">Роуминг отключен</translation>
 <translation id="5804241973901381774">Разрешения</translation>
 <translation id="5805697420284793859">Менеджер окон</translation>
 <translation id="5811750797187914944">Готово</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">Принтер больше не поддерживается.</translation>
 <translation id="6317369057005134371">Запуск приложения…</translation>
 <translation id="6318407754858604988">Скачивание началось</translation>
+<translation id="6318944945640833942">Принтер не найден. Укажите адрес ещё раз.</translation>
 <translation id="6322653941595359182">Отправлять и получать SMS на устройстве Chromebook</translation>
 <translation id="6324916366299863871">Изменение ярлыка</translation>
 <translation id="6325191661371220117">Отключить автозапуск</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">Сервис интерфейса</translation>
 <translation id="6725206449694821596">Internet Printing Protocol (IPP)</translation>
 <translation id="67269783048918309">Отправка данных о работе устройства. Сейчас это устройство автоматически отправляет в Google диагностическую информацию, сведения об использовании приложений и самого устройства. Установить личность ребенка по этим данным нельзя. Они нужны нам, чтобы в будущем повысить стабильность приложений и внести другие улучшения. Некоторые данные в обобщенном виде пригодятся партнерам Google, например разработчикам Android. Эта <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> принудительно применяется владельцем. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в аккаунте ребенка. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Подключено, батарея заряжена на <ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="6732801395666424405">Сертификаты не загружены</translation>
 <translation id="6732900235521116609">Невозможно удалить ярлык</translation>
 <translation id="6735304988756581115">Показать cookie и другие данные...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">Велосипед</translation>
 <translation id="6877460900831874810">Разрешить воспроизведение мультимедиа из Chrome на заблокированном экране</translation>
 <translation id="6878422606530379992">Использование датчиков разрешено</translation>
+<translation id="6878665006737889642">Повторите попытку</translation>
 <translation id="6880587130513028875">Показ изображений запрещен для этой страниц.</translation>
 <translation id="6883319974225028188">Не удалось сохранить конфигурацию устройства</translation>
 <translation id="6885771755599377173">Cведения о системе</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">Ошибка синхронизации: отсутствует подключение к серверу. Повторная попытка…</translation>
 <translation id="7121362699166175603">Удаление истории и вариантов автозаполнения в адресной строке. Информация о других ваших действиях в Интернете может также храниться на странице <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Отправка данных о работе устройства. Сейчас это устройство автоматически отправляет в Google диагностическую информацию, сведения об использовании приложений и самого устройства. Установить личность ребенка по этим данным нельзя. Они нужны нам, чтобы в будущем повысить стабильность приложений и внести другие улучшения. Некоторые данные в обобщенном виде пригодятся партнерам Google, например разработчикам Android. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в аккаунте ребенка. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Умные переносы</translation>
 <translation id="7123360114020465152">Принтер больше не поддерживается.</translation>
 <translation id="7124929488592184705">Не удалось распечатать <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">История скачиваний</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> отображается в полноэкранном режиме.</translation>
 <translation id="7340650977506865820">Сайт открывает доступ к вашему экрану</translation>
 <translation id="7341834142292923918">Расширение запрашивает доступ к этому сайту</translation>
+<translation id="7344488796804562294">Расширенные настройки Kerberos</translation>
 <translation id="7345706641791090287">Подтвердите пароль</translation>
 <translation id="7346909386216857016">ОК</translation>
 <translation id="7347751611463936647">Чтобы использовать это расширение, введите "<ph name="EXTENSION_KEYWORD" />", нажмите клавишу табуляции, а затем введите команду или поисковый запрос.</translation>
@@ -4757,6 +4776,7 @@
 <translation id="8227119283605456246">Прикрепить файл</translation>
 <translation id="8230134520748321204">Сохранить пароль для <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Чтобы нашим разработчикам было проще решить проблему, опишите, что произошло перед появлением сообщения об ошибке в профиле:</translation>
+<translation id="8236917170563564587">Поделиться текущей вкладкой</translation>
 <translation id="8241040075392580210">Тучка</translation>
 <translation id="8241806945692107836">Определение конфигурации устройства…</translation>
 <translation id="8241868517363889229">Просмотр и изменение закладок</translation>
@@ -4768,6 +4788,7 @@
 <translation id="8249048954461686687">Папка OEM</translation>
 <translation id="8249615410597138718">Отправьте на свои устройства</translation>
 <translation id="8249672078237421304">Предлагать перевод страниц, если их язык отличается от используемого в браузере</translation>
+<translation id="8251441930213048644">Обновить сейчас</translation>
 <translation id="8251578425305135684">Быстрая ссылка удалена.</translation>
 <translation id="8252569384384439529">Загрузка...</translation>
 <translation id="8253198102038551905">Чтобы просмотреть свойства сети, нажмите "+"</translation>
@@ -5145,6 +5166,7 @@
 <translation id="8827752199525959199">Пароль для аккаунта <ph name="USERNAME" /> на сайте <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Запретить сайтам искать Bluetooth-устройства поблизости</translation>
 <translation id="8828933418460119530">DNS-имя</translation>
+<translation id="883062543841130884">Замены</translation>
 <translation id="8830796635868321089">Не удалось выполнить проверку обновлений. Проверьте <ph name="PROXY_SETTINGS_LINK_START" />настройки прокси-сервера<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831664945713891930">Открыть настройки расширений</translation>
 <translation id="8834039744648160717">Конфигурацию сети контролирует пользователь <ph name="USER_EMAIL" />.</translation>
@@ -5165,6 +5187,7 @@
 <translation id="8862003515646449717">Перейдите на быстрый браузер</translation>
 <translation id="8863753581171631212">Открыть ссылку в новом окне приложения "<ph name="APP" />"</translation>
 <translation id="8864055848767439877">Отправка вкладки "<ph name="TAB_NAME" />" в приложение "<ph name="APP_NAME" />"…</translation>
+<translation id="8864458770072227512">Аккаунт <ph name="EMAIL" /> удален с устройства.</translation>
 <translation id="8868626022555786497">Занято</translation>
 <translation id="8870318296973696995">Главная страница</translation>
 <translation id="8870413625673593573">Недавно закрытые</translation>
@@ -5173,7 +5196,6 @@
 <translation id="8871974300055371298">Настройки контента</translation>
 <translation id="8872155268274985541">Обнаружен недопустимый файл манифеста. Не удалось установить внешние обновления для киоск-приложения. Извлеките USB-накопитель.</translation>
 <translation id="8874184842967597500">Не подключено</translation>
-<translation id="887550310442005096">Вашей организации нужно, чтобы вы обновили ПО на этом устройстве.</translation>
 <translation id="8876307312329369159">Эту настройку нельзя изменить в демонстрационном сеансе.</translation>
 <translation id="8877448029301136595">[родительский каталог]</translation>
 <translation id="8879284080359814990">Показать как вкладку</translation>
@@ -5288,6 +5310,7 @@
 <translation id="9044646465488564462">Не удалось подключиться к сети: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Отправлять в Google адреса веб-страниц, которые вы пытаетесь открыть</translation>
 <translation id="9046895021617826162">Сбой подключения</translation>
+<translation id="9047391224416514812">Аккаунт с таким именем пользователя уже существует.</translation>
 <translation id="9050666287014529139">Кодовая фраза</translation>
 <translation id="9052208328806230490">Вы зарегистрировали принтеры в <ph name="CLOUD_PRINT_NAME" /> с использованием аккаунта <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">Продолжать блокировать</translation>
@@ -5335,6 +5358,7 @@
 <translation id="9121814364785106365">Открыть в закрепленной вкладке</translation>
 <translation id="9124003689441359348">Здесь появятся сохраненные пароли</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (осталось <ph name="LICENSE_COUNT" />)</translation>
+<translation id="9128317794749765148">Не удалось завершить установку</translation>
 <translation id="9128870381267983090">Подключитесь к сети</translation>
 <translation id="9130015405878219958">Указан неверный режим.</translation>
 <translation id="9131487537093447019">Обмен сообщениями с устройствами Bluetooth.</translation>
@@ -5403,6 +5427,7 @@
 <translation id="939598580284253335">Введите кодовую фразу</translation>
 <translation id="939736085109172342">Новая папка</translation>
 <translation id="942532530371314860">Приложение "<ph name="APP_NAME" />" предоставило доступ к вкладке Chrome и к аудио.</translation>
+<translation id="945166830402967374">Обратитесь к администратору устройства.</translation>
 <translation id="945522503751344254">Отправить отзыв</translation>
 <translation id="947329552760389097">&amp;Проверить элементы</translation>
 <translation id="952992212772159698">Не активировано</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 7ca2b83..188dd0f3 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1619,7 +1619,6 @@
 <translation id="3454157711543303649">Aktivácia bola dokončená</translation>
 <translation id="3454213325559396544">Toto je posledná automatická aktualizácia softvéru a zabezpečenia pre toto zariadenie (<ph name="DEVICE_TYPE" />). Ak chcete v budúcnosti dostávať aktualizácie, prejdite na novší model.</translation>
 <translation id="345693547134384690">Otvoriť &amp;obrázok na novej karte</translation>
-<translation id="3457500881955698515">Vaša spoločnosť alebo organizácia požaduje, aby ste toto zariadenie okamžite aktualizovali</translation>
 <translation id="3459509316159669723">Tlač</translation>
 <translation id="3459697287128633276">Ak chcete povoliť účtu prístup do Obchodu Google Play, overte svoju totožnosť pomocou poskytovateľa identity.</translation>
 <translation id="3459774175445953971">Posledná úprava:</translation>
@@ -2236,7 +2235,6 @@
 <translation id="4364327530094270451">Dyňa</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> zdieľa okno.</translation>
 <translation id="4364830672918311045">Zobrazovať upozornenia</translation>
-<translation id="4365673000813822030">Synchronizácia prestala pracovať.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> v aplikácii <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Zadaný e-mail a heslo nesúhlasia.</translation>
 <translation id="437184764829821926">Rozšírené nastavenia písma</translation>
@@ -2518,7 +2516,6 @@
 <translation id="4830502475412647084">Inštaluje sa aktualizácia operačného systému</translation>
 <translation id="4830573902900904548">Vaše zariadenie <ph name="DEVICE_TYPE" /> sa nedokáže pripojiť k internetu pomocou siete <ph name="NETWORK_NAME" />. Vyberte inú sieť. <ph name="LEARN_MORE_LINK_START" />Ďalšie informácie<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome nemá prístup k požadovanému zdroju.</translation>
-<translation id="4835836146030131423">Chyba prihlásenia.</translation>
 <translation id="4837926214103741331">Nemáte oprávnenie používať toto zariadenie. Ak chcete získať povolenie na prihlásenie, kontaktujte majiteľa zariadenia.</translation>
 <translation id="4837952862063191349">Ak chcete zariadenie odomknúť a obnoviť svoje miestne údaje, zadajte svoje staré heslo pre zariadenie <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Je povolený prístup k čítaniu schránky</translation>
@@ -2653,7 +2650,6 @@
 <translation id="5029568752722684782">Vymazať kópiu</translation>
 <translation id="5030338702439866405">Vydavateľ</translation>
 <translation id="5033266061063942743">Geometrické tvary</translation>
-<translation id="5033619151015094114">Vaša spoločnosť alebo organizácia požaduje, aby ste toto zariadenie aktualizovali</translation>
 <translation id="503498442187459473"><ph name="HOST" /> chce použiť váš fotoaparát a mikrofón</translation>
 <translation id="5036662165765606524">Nepovoliť žiadnym stránkam automaticky sťahovať viacero súborov súčasne</translation>
 <translation id="5037676449506322593">Vybrať všetko</translation>
@@ -5198,7 +5194,6 @@
 <translation id="8871974300055371298">Nastavenia obsahu</translation>
 <translation id="8872155268274985541">Našiel sa neplatný súbor manifestu externej aktualizácie Kiosku. Aplikáciu Kiosk sa nepodarilo aktualizovať. Odoberte kľúč USB.</translation>
 <translation id="8874184842967597500">Nepripojené</translation>
-<translation id="887550310442005096">Vaša spoločnosť alebo organizácia žiada, aby ste toto zariadenie aktualizovali</translation>
 <translation id="8876307312329369159">Toto nastavenie sa nedá zmeniť v relácii ukážky.</translation>
 <translation id="8877448029301136595">[rodičovský adresár]</translation>
 <translation id="8879284080359814990">&amp;Zobraziť ako kartu</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index bf1219e3..4697382 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Aktiviranje končano</translation>
 <translation id="3454213325559396544">To je zadnja samodejna posodobitev programske opreme in varnostna posodobitev za to napravo <ph name="DEVICE_TYPE" />. Če želite v prihodnje prejemati posodobitve, nagradite na novejši model.</translation>
 <translation id="345693547134384690">Odpri &amp;sliko v novem zavihku</translation>
-<translation id="3457500881955698515">Vaše podjetje ali organizacija zahteva takojšnjo posodobitev te naprave</translation>
 <translation id="3459509316159669723">Tiskanje</translation>
 <translation id="3459697287128633276">Če želite računu omogočiti dostop do Trgovine Google Play, morate preveriti pristnost s ponudnikom identitete.</translation>
 <translation id="3459774175445953971">Zadnja sprememba:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Melona</translation>
 <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala okno.</translation>
 <translation id="4364830672918311045">Prikaz obvestil</translation>
-<translation id="4365673000813822030">Ojej, Google Sinhronizacija je nehala delovati.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> z aplikacijo <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">E-poštni naslov in geslo, ki ste ju vnesli, se ne ujemata.</translation>
 <translation id="437184764829821926">Napredne nastavitve pisave</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Nameščanje posodobitve operacijskega sistema</translation>
 <translation id="4830573902900904548">Naprava <ph name="DEVICE_TYPE" /> se ne more povezati v internet prek omrežja <ph name="NETWORK_NAME" />. Izberite drugo omrežje. <ph name="LEARN_MORE_LINK_START" />Več o tem<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome nima dostopa do zahtevanega vira</translation>
-<translation id="4835836146030131423">Napaka pri prijavi.</translation>
 <translation id="4837926214103741331">Nimate dovoljenja za uporabo te naprave. Za dovoljenje za prijavo se obrnite na lastnika naprave.</translation>
 <translation id="4837952862063191349">Če želite napravo odkleniti in obnoviti lokalne podatke vnesite staro geslo za <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Dostop za branje odložišča je omogočen</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Počisti kopijo</translation>
 <translation id="5030338702439866405">Izdajatelj</translation>
 <translation id="5033266061063942743">Geometrijske oblike</translation>
-<translation id="5033619151015094114">Vaše podjetje ali organizacija zahteva, da se ta naprava posodobi</translation>
 <translation id="503498442187459473"><ph name="HOST" /> želi uporabiti kamero in mikrofon</translation>
 <translation id="5036662165765606524">Nobenemu spletnemu mestu ne dovoli samodejnega prenosa več datotek</translation>
 <translation id="5037676449506322593">Izberi vse</translation>
@@ -5203,7 +5199,6 @@
 <translation id="8871974300055371298">Nastavitve vsebine</translation>
 <translation id="8872155268274985541">Najdena je bila neveljavna zunanja datoteka manifesta za posodobitev za kiosk. Posodobitev aplikacije za kiosk ni uspela. Odstranite ključek USB.</translation>
 <translation id="8874184842967597500">Povezava ni vzpostavljena</translation>
-<translation id="887550310442005096">Vaše podjetje ali organizacija zahteva, da posodobite to napravo</translation>
 <translation id="8876307312329369159">Te možnosti ni mogoče spremeniti v predstavitveni seji.</translation>
 <translation id="8877448029301136595">[nadrejeni imenik]</translation>
 <translation id="8879284080359814990">&amp;Pokaži kot zavihek</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index abe2eb8d..f62c480 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1617,7 +1617,6 @@
 <translation id="3454157711543303649">Активација је довршена</translation>
 <translation id="3454213325559396544">Ово је последње аутоматско безбедносно ажурирање и ажурирање софтвера за <ph name="DEVICE_TYPE" />. Надоградите на новији модел да бисте добијали будућа ажурирања.</translation>
 <translation id="345693547134384690">Отвори &amp;слику на новој картици</translation>
-<translation id="3457500881955698515">Ваше предузеће или организација захтева ажурирање за овај уређај одмах</translation>
 <translation id="3459509316159669723">Штампање</translation>
 <translation id="3459697287128633276">Да бисте омогућили налогу да приступа Google Play продавници, потврдите идентитет помоћу добављача идентитета.</translation>
 <translation id="3459774175445953971">Последњи пут измењено:</translation>
@@ -2234,7 +2233,6 @@
 <translation id="4364327530094270451">Диња</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> дели прозор.</translation>
 <translation id="4364830672918311045">Приказуј обавештења</translation>
-<translation id="4365673000813822030">Упс, синхронизација је престала да функционише.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> помоћу апликације <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Имејл и лозинка које сте унели се не подударају</translation>
 <translation id="437184764829821926">Напредна подешавања фонта</translation>
@@ -2516,7 +2514,6 @@
 <translation id="4830502475412647084">Инсталира се ажурирање ОС-а</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> не може да се повеже на интернет помоћу мреже <ph name="NETWORK_NAME" />. Изаберите неку другу мрежу. <ph name="LEARN_MORE_LINK_START" />Сазнајте више<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome нема приступ захтеваном ресурсу.</translation>
-<translation id="4835836146030131423">Грешка у пријављивању.</translation>
 <translation id="4837926214103741331">Немате овлашћење за коришћење овог уређаја. Контактирајте власника уређаја да бисте добили дозволу за пријављивање.</translation>
 <translation id="4837952862063191349">Да бисте откључали приступ локалним подацима и вратили их, унесите стару лозинку за уређај <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Приступ за читање привремене меморије је дозвољен</translation>
@@ -2651,7 +2648,6 @@
 <translation id="5029568752722684782">Обриши копију</translation>
 <translation id="5030338702439866405">Издао/ла</translation>
 <translation id="5033266061063942743">Геометријски облици</translation>
-<translation id="5033619151015094114">Предузеће или организација тражи ажурирање за овај уређај</translation>
 <translation id="503498442187459473"><ph name="HOST" /> жели да користи камеру и микрофон</translation>
 <translation id="5036662165765606524">Не дозволи ниједном сајту да аутоматски преузима више датотека</translation>
 <translation id="5037676449506322593">Изабери све</translation>
@@ -5199,7 +5195,6 @@
 <translation id="8871974300055371298">Подешавања садржаја</translation>
 <translation id="8872155268274985541">Пронађена је неважећа датотека манифеста за спољно ажурирање киоска. Ажурирање киоск апликације није успело. Уклоните USB меморију.</translation>
 <translation id="8874184842967597500">Није повезано</translation>
-<translation id="887550310442005096">Предузеће или организација тражи да ажурирате овај уређај</translation>
 <translation id="8876307312329369159">Ово подешавање не можете да промените у сесији демонстрације.</translation>
 <translation id="8877448029301136595">[матични директоријум]</translation>
 <translation id="8879284080359814990">&amp;Прикажи као картицу</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index bd3c2b4..c06227e 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1620,7 +1620,6 @@
 <translation id="3454157711543303649">Aktiveringen har slutförts</translation>
 <translation id="3454213325559396544">Detta är den sista automatiska programvaru- och säkerhetsuppdateringen för <ph name="DEVICE_TYPE" />. Uppgradera till en nyare modell om du vill få uppdateringar i framtiden.</translation>
 <translation id="345693547134384690">Öppna &amp;bild i ny flik</translation>
-<translation id="3457500881955698515">Ditt företag eller din organisation kräver att den här enheten startas om genast</translation>
 <translation id="3459509316159669723">Skriva ut</translation>
 <translation id="3459697287128633276">Autentisering hos identitetsleverantören krävs innan du kan använda Google Play Butik med kontot.</translation>
 <translation id="3459774175445953971">Senast ändrad:</translation>
@@ -2237,7 +2236,6 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> delar ett fönster.</translation>
 <translation id="4364830672918311045">Visa aviseringar</translation>
-<translation id="4365673000813822030">Oj, synkroniseringen har slutat fungera.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> med <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">E-postadressen och lösenordet matchar inte</translation>
 <translation id="437184764829821926">Avancerade inställningar för teckensnitt</translation>
@@ -2519,7 +2517,6 @@
 <translation id="4830502475412647084">Uppdateringen för operativsystemet installeras</translation>
 <translation id="4830573902900904548">Din <ph name="DEVICE_TYPE" /> kan inte ansluta till internet med <ph name="NETWORK_NAME" />. Välj ett annat nätverk. <ph name="LEARN_MORE_LINK_START" />Läs mer<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome har inte tillgång till den begärda resursen.</translation>
-<translation id="4835836146030131423">Inloggningsfel.</translation>
 <translation id="4837926214103741331">Du har inte behörighet att använda den här enheten. Kontakta enhetens ägare om du vill ha behörighet att logga in.</translation>
 <translation id="4837952862063191349">Lås upp och återställ lokal data genom att ange ditt gamla lösenord för <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Läsbehörighet till Urklipp har tillåtits</translation>
@@ -2654,7 +2651,6 @@
 <translation id="5029568752722684782">Ta bort kopia</translation>
 <translation id="5030338702439866405">Utfärdat av</translation>
 <translation id="5033266061063942743">Geometriska former</translation>
-<translation id="5033619151015094114">Ditt företag eller din organisation kräver att den här enheten uppdateras</translation>
 <translation id="503498442187459473"><ph name="HOST" /> vill använda kameran och mikrofonen</translation>
 <translation id="5036662165765606524">Tillåt inte att någon webbplats laddar ned flera filer automatiskt</translation>
 <translation id="5037676449506322593">Markera alla</translation>
@@ -5200,7 +5196,6 @@
 <translation id="8871974300055371298">Innehållsinställningar</translation>
 <translation id="8872155268274985541">Ogiltig manifestfil för extern kioskuppdatering hittades. Det gick inte att uppdatera kioskappen. Ta bort USB-minnet.</translation>
 <translation id="8874184842967597500">Inte ansluten</translation>
-<translation id="887550310442005096">Ditt företag eller din organisation uppmanar dig att uppdatera den här enheten</translation>
 <translation id="8876307312329369159">Inställningen kan inte ändras i demoläget.</translation>
 <translation id="8877448029301136595">[överordnad katalog]</translation>
 <translation id="8879284080359814990">&amp;Visa som flik</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 6470533..70345c8 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1614,7 +1614,6 @@
 <translation id="3454157711543303649">Uamilishaji umekamilika</translation>
 <translation id="3454213325559396544">Hili ndilo sasisho la mwisho la kiotomatiki la programu na usalama wa <ph name="DEVICE_TYPE" />. Ili upate masasisho katika siku zijazo, tumia muundo mpya zaidi.</translation>
 <translation id="345693547134384690">Fungua p&amp;icha katika kichupo kipya</translation>
-<translation id="3457500881955698515">Kampuni au shirika lako linataka usasishe kifaa hiki mara moja.</translation>
 <translation id="3459509316159669723">Kuchapisha</translation>
 <translation id="3459697287128633276">Ili kuiruhusu akaunti yako kufikia Duka la Google Play, tafadhali thibitisha na Mtoa huduma za Kitambulisho.</translation>
 <translation id="3459774175445953971">Ilibadilishwa mwisho:</translation>
@@ -2229,7 +2228,6 @@
 <translation id="4364327530094270451">Tikiti</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation>
 <translation id="4364830672918311045">Onyesha arifa</translation>
-<translation id="4365673000813822030">Lo, Usawazishaji umekatizwa.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> ukitumia <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Anwani ya barua pepe na nenosiri uliloweka havilingani</translation>
 <translation id="437184764829821926">Mipangilio ya kina ya fonti</translation>
@@ -2511,7 +2509,6 @@
 <translation id="4830502475412647084">Inasasisha Mfumo wa Uendeshaji</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> yako haiwezi kuunganisha kwenye Intaneti kwa kutumia <ph name="NETWORK_NAME" />. Tafadhali chagua mtandao mwingine. <ph name="LEARN_MORE_LINK_START" />Pata maelezo zaidi<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome haina idhini ya kufikia rasilimali uliyoomba.</translation>
-<translation id="4835836146030131423">Hitilafu katika kuingia.</translation>
 <translation id="4837926214103741331">Huruhusiwi kukitumia kifaa hiki. Tafadhali wasiliana na mmiliki wa kifaa kwa ruhusa ya kuingia katika akaunti.</translation>
 <translation id="4837952862063191349">Ili ufungue na kurejesha data yako ya karibu, tafadhali weka nenosiri lako la zamani la <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4838836835474292213">Imepewa idhini ya kusoma ubao wa kunakili</translation>
@@ -2646,7 +2643,6 @@
 <translation id="5029568752722684782">Futa nakala</translation>
 <translation id="5030338702439866405">Kimetolewa Na</translation>
 <translation id="5033266061063942743">Maumbo ya Jiometriki</translation>
-<translation id="5033619151015094114">Kampuni au shirika lako linataka usasishe kifaa hiki</translation>
 <translation id="503498442187459473"><ph name="HOST" /> inataka kutumia kamera na maikrofoni yako</translation>
 <translation id="5036662165765606524">Usiruhusu tovuti yoyote kupakua faili nyingi kiotomatiki</translation>
 <translation id="5037676449506322593">Chagua Zote</translation>
@@ -5195,7 +5191,6 @@
 <translation id="8871974300055371298">Mipangilio ya maudhui</translation>
 <translation id="8872155268274985541">Fali isiyo sahihi ya maelezo ya sasisho ya nje ya Skrini Nzima imepatikana. Haijafaulu kusasisha programu ya Skrini Nzima. Tafadhali ondoa hifadhi ya USB.</translation>
 <translation id="8874184842967597500">Haijaunganishwa</translation>
-<translation id="887550310442005096">Kampuni au shirika lako linakuomba usasishe kifaa hiki</translation>
 <translation id="8876307312329369159">Mipangilio hii haiwezi kubadilishwa katika hali ya onyesho</translation>
 <translation id="8877448029301136595">[saraka kuu]</translation>
 <translation id="8879284080359814990">Onye&amp;sha kama Kichupo</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 3f90b8b..f9060261 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">டெமோ பயன்முறையில் சாதனம் இயங்குவதற்கான உரிமங்களில் ஒரு சிக்கல் ஏற்பட்டது.</translation>
 <translation id="126710816202626562">மொழிபெயர்ப்பிற்கான மொழி:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">மேம்பட்ட உள்ளமைவு</translation>
 <translation id="1272079795634619415">நிறுத்து</translation>
 <translation id="1272978324304772054">இந்தப் பயனர் கணக்கானது சாதனம் பதிவுசெய்யப்பட்ட களத்திற்கு உரியது அல்ல. வேறொரு களத்தில் பதிவுசெய்ய விரும்பினால், முதலில் சாதன மீட்புக்குச் செல்ல வேண்டும்.</translation>
 <translation id="1274977772557788323">Adobe Flash Player இன் சேமிப்பக அமைப்புகள்</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> தேர்ந்தெடுக்கப்பட்டன</translation>
 <translation id="1444628761356461360">இந்த அமைப்பானது சாதனத்தின் உரிமையாளரால் <ph name="OWNER_EMAIL" /> நிர்வகிக்கப்படுகிறது.</translation>
 <translation id="144518587530125858">தீமிற்காக '<ph name="IMAGE_PATH" />' ஐ ஏற்ற முடியவில்லை.</translation>
+<translation id="1445693676523799095">இதற்குச் சிறிது நேரம் ஆகலாம்</translation>
 <translation id="1451375123200651445">இணையப்பக்கம், ஒற்றைக் கோப்பு</translation>
 <translation id="1451917004835509682">மேற்பார்வையிடப்படும் பயனரைச் சேர்</translation>
 <translation id="1454223536435069390">ஸ்கிரீன் ஷாட்டை எடு</translation>
@@ -527,6 +529,7 @@
 <translation id="1781502536226964113">புதிய தாவல் பக்கத்தைத் திற</translation>
 <translation id="1781771911845953849">கணக்குகளும் ஒத்திசைவும்</translation>
 <translation id="1782196717298160133">ஃபோனைக் கண்டறிகிறது</translation>
+<translation id="1784707308176068866">சாதனத்தில் நிறுவியுள்ள இணங்கக்கூடிய ஆப்ஸிடமிருந்து கோரிக்கை வந்தால் பின்னணியில் இயக்கு</translation>
 <translation id="1784849162047402014">சாதனத்தில் சேமிப்பிடம் குறைவாக உள்ளது</translation>
 <translation id="1790194216133135334"><ph name="DEVICE_NAME" /> சாதனத்திற்கு இணைப்பை அனுப்பு</translation>
 <translation id="1792619191750875668">நீட்டிக்கப்பட்ட திரை</translation>
@@ -535,6 +538,7 @@
 <translation id="1799071797295057738">"<ph name="EXTENSION_NAME" />" நீட்டிப்பு தானாக முடக்கப்பட்டது.</translation>
 <translation id="1802687198411089702">பக்கம் செயல்படவில்லை. காத்திருக்கவும் அல்லது வெளியேறவும்.</translation>
 <translation id="1802931390041703523">இந்தப் பக்கத்தில் Flash தடுக்கப்பட்டுள்ளது</translation>
+<translation id="1803531841600994172">இதற்கு மொழிபெயர்க்கவும்:</translation>
 <translation id="1803545009660609783">மீண்டும் பயிற்சியளி</translation>
 <translation id="1805472176602625930">பாதுகாப்பு விசையிலுள்ள பட்டனை அழுத்தவும்</translation>
 <translation id="1805738995123446102">பின்னணித் தாவல் மைக்ரோஃபோனைப் பயன்படுத்துகிறது</translation>
@@ -592,6 +596,7 @@
 <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> இலிருந்து மட்டுமே இதைச் சேர்க்க முடியும்</translation>
 <translation id="1877520246462554164">அங்கீகரிப்பு டோக்கனைப் பெற முடியவில்லை. மீண்டும் முயல, வெளியேறி மீண்டும் உள்நுழையவும்.</translation>
 <translation id="1877860345998737529">சுவிட்ச் செயலை நியமித்தல்</translation>
+<translation id="1878541307036593717">அனுமதிகளை அமைக்கும்</translation>
 <translation id="1879000426787380528">உள்நுழையும் கணக்கு</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" சான்றிதழை நீக்கவா?</translation>
 <translation id="1886996562706621347">நெறிமுறைகளுக்கு இயல்புநிலை ஹேண்ட்லர்களாக இருக்கும்படி கேட்க தளங்களை அனுமதி (பரிந்துரைத்தது)</translation>
@@ -604,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> மீதமுள்ளன</translation>
 <translation id="1895658205118569222">நிறுத்தம்</translation>
 <translation id="1895934970388272448">இந்தச் செயல்முறையை முடிக்க உங்கள் அச்சுப்பொறியில் பதிவை உறுதிப்படுத்த வேண்டும் - அதை இப்போது சரிபார்க்கவும்.</translation>
+<translation id="1899826437968063457">செருகுநிரல் VM இயங்குவதற்கு அனுமதி தேவை</translation>
 <translation id="1901303067676059328">அ&amp;னைத்தையும் தேர்ந்தெடு</translation>
 <translation id="1902576642799138955">செல்லுபடிக் காலம்</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{தாவலின் ஒலியை முடக்கு}other{தாவல்களின் ஒலியை முடக்கு}}</translation>
@@ -735,6 +741,7 @@
 <translation id="212862741129535676">காலஇடைவெளி நிலையின் பணிசெயல் சதவீதம்</translation>
 <translation id="2129825002735785149">செருகுநிரலைப் புதுப்பி</translation>
 <translation id="2131077480075264">"<ph name="IMPORT_NAME" />" ஆல் அனுமதிக்கப்படாததால், "<ph name="APP_NAME" />"ஐ நிறுவ முடியவில்லை</translation>
+<translation id="21354425047973905">பின்களை மறை</translation>
 <translation id="2135456203358955318">டாக் செய்யப்பட்ட பெரிதாக்கி</translation>
 <translation id="2135787500304447609">&amp;மீண்டும் தொடங்கு</translation>
 <translation id="2136372518715274136">புதிய கடவுச்சொல்லை உள்ளிடுக</translation>
@@ -876,6 +883,7 @@
 <translation id="2318923050469484167">தற்போதைய மறைநிலை அமர்வு (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">மேற்குறிப்புகளும் அடிக்குறிப்புகளும்</translation>
 <translation id="2322318151094136999">ஒரு தளம் சீரியல் போர்ட்டுகளை அணுக வேண்டியிருக்கும்போது கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
+<translation id="2325444234681128157">கடவுச்சொல்லைச் சேமி</translation>
 <translation id="2326931316514688470">&amp;பயன்பாட்டை மீண்டும் ஏற்று</translation>
 <translation id="2327492829706409234">ஆப்ஸை இயக்கு</translation>
 <translation id="2329597144923131178">உங்கள் எல்லா சாதனங்களிலும் புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெற உள்நுழையவும்.</translation>
@@ -943,12 +951,14 @@
 <translation id="2433452467737464329">பக்கத்தைத் தானாகவே புதுப்பிக்க URLலில் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">தோற்றம்</translation>
 <translation id="2433836460518180625">சாதனத்தை மட்டும் திற</translation>
+<translation id="2434449159125086437">பிரிண்டரை அமைக்க இயலவில்லை. உள்ளமைவைச் சரிபார்த்து மீண்டும் முயலவும்.</translation>
 <translation id="2435248616906486374">நெட்வொர்க் துண்டிக்கப்பட்டது</translation>
 <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation>
 <translation id="2436186046335138073">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation>
 <translation id="2436707352762155834">குறைந்தபட்சம்</translation>
 <translation id="2439545803278355377">புதிய பின்னை உள்ளிடவும். குறைந்தபட்சம் 4 எழுத்துருக்கள் இருக்க வேண்டும். எழுத்துகள், எண்கள் மற்றும் பிற எழுத்துருக்கள் அதில் இருக்கலாம்.</translation>
 <translation id="2440604414813129000">ஆ&amp;தாரத்தைக் காண்பி</translation>
+<translation id="2444119669991608829"><ph name="LANGUAGE" /> மொழியில் பக்கம் இல்லையா ?</translation>
 <translation id="2445081178310039857">நீட்டிப்பு மூல கோப்பகம் தேவை.</translation>
 <translation id="2445484935443597917">ஒரு புதிய சுயவிவரத்தை உருவாக்கு</translation>
 <translation id="2446585455334014596"><ph name="APP_NAME" /> உங்கள் அடையாளத்தைச் சரிபார்க்க விரும்புகிறது</translation>
@@ -962,6 +972,7 @@
 <translation id="2454247629720664989">திறவுச்சொல்</translation>
 <translation id="245661998428026871">பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையில் இயக்கப்படும் வீடியோ நிறுத்தப்படும்.</translation>
 <translation id="2457246892030921239"><ph name="APP_NAME" />, <ph name="VOLUME_NAME" /> இலிருந்து கோப்புகளை நகலெடுக்க விரும்புகிறது.</translation>
+<translation id="2458379781610688953">கணக்கைப் புதுப்பி, <ph name="EMAIL" /></translation>
 <translation id="2458591546854598341">சாதன நிர்வாக டோக்கன் தவறானது.</translation>
 <translation id="2462724976360937186">சான்றளிக்கும் மைய விசை ID</translation>
 <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> சேர்க்கப்பட்டது</translation>
@@ -1094,6 +1105,7 @@
 <translation id="2649045351178520408">Base64-குறியேற்றப்பட்ட ASCII, சான்றிதழ் சங்கிலி</translation>
 <translation id="2653033005692233957">தேட முடியவில்லை</translation>
 <translation id="2653266418988778031">நீங்கள் ஒரு சான்றளிக்கும் மைய(CA) சான்றிதழை நீக்கினால், அந்த CA வழங்கிய எந்த சான்றிதழையும் உங்கள் உலாவி இதன் பின்னர் நம்பாது.</translation>
+<translation id="2653275834716714682">உரை மாற்றுதல்</translation>
 <translation id="2653659639078652383">சமர்ப்பி</translation>
 <translation id="265390580714150011">புல மதிப்பு</translation>
 <translation id="2654166010170466751">பேமண்ட் ஹேண்ட்லர்களை நிறுவுவதற்குத் தளங்களை அனுமதிக்கும்</translation>
@@ -1128,6 +1140,7 @@
 <translation id="2693176596243495071">அச்சச்சோ! எதிர்பாராத பிழை ஏற்பட்டது. பிறகு முயலவும் அல்லது சிக்கல் தொடர்ந்தால், உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
 <translation id="2695749433451188613">இன்டர்நெட் பிரிண்டிங் புரோட்டோகால் (HTTPS)</translation>
 <translation id="2699911226086014512">பின்னை அமைக்க இயலவில்லை, பிழைக் குறியீடு: <ph name="RETRIES" />.</translation>
+<translation id="2701737434167469065">உள்நுழை, <ph name="EMAIL" /></translation>
 <translation id="270358213449696159">Google Chrome OS விதிமுறைகளின் உள்ளடக்கம்</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
 <translation id="270516211545221798">டச்பேடின் வேகம்</translation>
@@ -1301,6 +1314,7 @@
 <translation id="29488703364906173">நவீன இணையத்திற்காக, விரைவான, எளிமையான மற்றும் பாதுகாப்பான இணைய உலாவியாக உருவாக்கப்பட்டது.</translation>
 <translation id="2949289451367477459">இருப்பிடத்தைப் பயன்படுத்தும். இருப்பிட அனுமதி உள்ள ஆப்ஸையும் சேவைகளையும் இந்தச் சாதனத்தின் இருப்பிடத்தைப் பயன்படுத்த அனுமதிக்கும். இருப்பிடத்தின் துல்லியத்தன்மையையும் இருப்பிடம் சார்ந்த சேவைகளையும் மேம்படுத்த, Google அவ்வப்போது இருப்பிடத் தரவைச் சேகரித்து, அதை அடையாளமற்ற வகையில் பயன்படுத்தக்கூடும்.<ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">தொகுப்பு நீட்டிப்பு எச்சரிக்கை</translation>
+<translation id="2959842337402130152">சேமிப்பகம் இல்லாததால் மீட்டெடுக்க இயலவில்லை. சாதனத்திலிருந்து <ph name="SPACE_REQUIRED" />யை காலிசெய்து மீண்டும் முயலவும்.</translation>
 <translation id="296026337010986570">முடிந்தது! தீங்கிழைக்கும் மென்பொருள் அகற்றப்பட்டது. நீட்டிப்புகளை மீண்டும் இயக்க, &lt;a href="chrome://extensions"&gt;நீட்டிப்புகள்&lt;/a&gt; பிரிவுக்குச் செல்லவும்.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (நீட்டிப்பு வழங்கப்பட்டது)</translation>
 <translation id="2961695502793809356">அடுத்தப் பக்கத்திற்கு செல்ல கிளிக் செய்க, வரலாற்றைக் காண அழுத்திக்கொண்டே இருங்கள்</translation>
@@ -1607,7 +1621,6 @@
 <translation id="3454157711543303649">செயலாக்கம் நிறைவுற்றது</translation>
 <translation id="3454213325559396544"><ph name="DEVICE_TYPE" /> சாதனத்தின் மென்பொருளுக்கும் பாதுகாப்பிற்கும் தானாக செய்யப்படும் கடைசிப் புதுப்பிப்பு இது தான். எதிர்வரும் புதுப்பிப்புகளைப் பெற புதிய வகை சாதனங்களுக்கு மாறவும்.</translation>
 <translation id="345693547134384690">&amp;படத்தை புதிய தாவலில் திற</translation>
-<translation id="3457500881955698515">இந்தச் சாதனத்தை உடனடியாகப் புதுப்பிக்கும்படி உங்கள் நிறுவனமோ அமைப்போ வலியுறுத்துகிறது.</translation>
 <translation id="3459509316159669723">அச்சிடல்</translation>
 <translation id="3459697287128633276">Google Play ஸ்டோரை அணுகும் வகையில் உங்கள் கணக்கை இயக்க, அடையாள வழங்குநர் மூலம் அங்கீகரிக்கவும்.</translation>
 <translation id="3459774175445953971">கடைசியாக மாற்றப்பட்டது:</translation>
@@ -1916,6 +1929,7 @@
 <translation id="3872220884670338524">கூடுதல் செயல்கள், <ph name="DOMAIN" /> இல் <ph name="USERNAME" />க்கான சேமித்த கணக்கு</translation>
 <translation id="3872991219937722530">சாதனத்தில் காலி இடத்தை உருவாக்கவும் அல்லது உங்கள் சாதனம் இயங்காது.</translation>
 <translation id="3873315167136380065">இதை இயக்குவதற்கு, <ph name="BEGIN_LINK" />ஒத்திசைவை மீட்டமைத்து<ph name="END_LINK" /> உங்கள் ஒத்திசைவுக் கடவுச்சொற்றொடரை அகற்றவும்.</translation>
+<translation id="3873423927483480833">பின்களைக் காட்டும்</translation>
 <translation id="3873915545594852654">ARC++ல் ஒரு சிக்கல் ஏற்பட்டது.</translation>
 <translation id="3878840326289104869">மேற்பார்வையிடப்படும் பயனரை உருவாக்குகிறது</translation>
 <translation id="3879748587602334249">பதிவிறக்க நிர்வாகி</translation>
@@ -1983,6 +1997,7 @@
 <translation id="3966072572894326936">வேறு கோப்புறையைத் தேர்வு செய்க...</translation>
 <translation id="3967822245660637423">பதிவிறக்கம் முடிந்தது</translation>
 <translation id="3967919079500697218">ஸ்கிரீன் ஷாட்டுகள் எடுக்கும் திறனை உங்கள் நிர்வாகி முடக்கியுள்ளார்.</translation>
+<translation id="3969092967100188979">ஆன், ரோமிங்கில் உள்ளது</translation>
 <translation id="3970114302595058915">ஐடி</translation>
 <translation id="397105322502079400">கணக்கிடுகிறது...</translation>
 <translation id="3975565978598857337">டொமைனுக்காக சேவையகத்தைப் பயன்படுத்த இயலவில்லை</translation>
@@ -2044,6 +2059,7 @@
 <translation id="4068776064906523561">சேமித்த கைரேகைகள்</translation>
 <translation id="407173827865827707">கிளிக் செய்யும் போது</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{தாவலைப் பிரித்தெடு}other{தாவல்களைப் பிரித்தெடு}}</translation>
+<translation id="4072805772816336153">பிறகு முயலவும்</translation>
 <translation id="4074900173531346617">மின்னஞ்சல் கையொப்பமிடுநர் சான்றிதழ்</translation>
 <translation id="407520071244661467">அளவு</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" />ஐ அலைபரப்ப முடியவில்லை.</translation>
@@ -2132,6 +2148,7 @@
 <translation id="4209092469652827314">பெரிய</translation>
 <translation id="4209251085232852247">முடக்கப்பட்டுள்ளது</translation>
 <translation id="4209464433672152343">ஆவணங்களை அச்சிடுவதற்குத் தயார்படுத்த, அவை <ph name="BEGIN_LINK_HELP" />Googleளுக்கு அனுப்பப்படும்<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google கிளவுட் பிரிண்ட் டாஷ்போர்டில்<ph name="END_LINK_DASHBOARD" /> உங்கள் பிரிண்டர்களையும் பிரிண்டர் வரலாற்றையும் பார்க்கலாம், திருத்தலாம் மற்றும் நிர்வகிக்கலாம்.</translation>
+<translation id="4210048056321123003">விர்ச்சுவல் மெஷினைப் பதிவிறக்குகிறது</translation>
 <translation id="421182450098841253">புக்மார்க்ஸ் பட்டியைக் &amp;காட்டு</translation>
 <translation id="4211851069413100178">உபயோகம் &amp; கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் Android அனுபவத்தை மேம்படுத்த உதவுக. இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த <ph name="BEGIN_LINK1" />அமைப்பைச்<ph name="END_LINK1" /> செயல்படுத்தியுள்ளார். உரிமையாளர் இந்தச் சாதனத்தின் கண்டறிதல் தரவையும் உபயோகத் தரவையும் Googleளுக்கு அனுப்புவதற்குத் தேர்வுசெய்யலாம். கூடுதல் ’இணையம் &amp; ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு உங்கள் Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">ஏற்றுமதி செய்</translation>
@@ -2212,7 +2229,7 @@
 <translation id="4350019051035968019">இந்தச் சாதனத்தை உங்கள் கணக்கிற்குச் சொந்தமான களத்தில் பதிவுசெய்ய முடியாது, ஏனெனில் சாதனமானது வேறு களத்தால் நிர்வகிக்கப்படுவதற்காகக் குறிக்கப்பட்டுள்ளது.</translation>
 <translation id="4354344420232759511">நீங்கள் பார்வையிட்ட தளங்கள் இங்கே தோன்றும்</translation>
 <translation id="435527878592612277">உங்கள் படத்தைத் தேர்ந்தெடுக்கவும்</translation>
-<translation id="4358313196493694334">கிளிக் செய்யும் இடத்தை நிலைப்படுத்துவும்</translation>
+<translation id="4358313196493694334">கிளிக் செய்யும் இடத்தை நிலைப்படுத்தவும்</translation>
 <translation id="4359408040881008151">நீட்டிப்பு(கள்) சார்ந்திருப்பதன் காரணமாக நிறுவப்பட்டது.</translation>
 <translation id="4359717112757026264">நகரக் காட்சி</translation>
 <translation id="4361142739114356624">இந்தக் கிளையண்ட் சான்றிதழுக்கான தனிப்பட்ட குறியீடு இல்லை அல்லது தவறானது</translation>
@@ -2220,7 +2237,6 @@
 <translation id="4364327530094270451">முலாம்பழம்</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> சாளரத்தைப் பகிர்கிறது.</translation>
 <translation id="4364830672918311045">அறிவிப்புகளைக் காட்டலாம்</translation>
-<translation id="4365673000813822030">அச்சச்சோ, ஒத்திசைவு பணியை நிறுத்தியுள்ளது.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> மூலம் <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">உள்ளிட்ட மின்னஞ்சலும், கடவுச்சொல்லும் பொருந்தவில்லை.</translation>
 <translation id="437184764829821926">மேம்பட்ட எழுத்துரு அமைப்புகள்</translation>
@@ -2231,6 +2247,7 @@
 <translation id="4378551569595875038">இணைக்கிறது...</translation>
 <translation id="4378556263712303865">சாதனக் கோரிக்கை</translation>
 <translation id="4380648069038809855">முழுத்திரையில் காட்டப்படுகிறது</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, மேலும் ஒரு கணக்கு}other{<ph name="EMAIL" />, மேலும் <ph name="EXTRA_ACCOUNTS" /> கணக்குகள்}}</translation>
 <translation id="4384312707950789900">விருப்பப்பட்டியலில் சேர்</translation>
 <translation id="4384652540891215547">நீட்டிப்பைச் செயல்படுத்து</translation>
 <translation id="438503109373656455">சரடோகா</translation>
@@ -2339,6 +2356,7 @@
 <translation id="4562155214028662640">கைரேகையைச் சேர்</translation>
 <translation id="4563880231729913339">விரல் 3</translation>
 <translation id="4565377596337484307">கடவுச்சொல்லை மறைக்கும்</translation>
+<translation id="456717285308019641">மொழியாக்கம் செய்யப்பட வேண்டிய பக்கத்தின் மொழி:</translation>
 <translation id="4567772783389002344">சொல்லைச் சேர்</translation>
 <translation id="4568025708905928793">பாதுகாப்பு விசை ஒன்று கோரப்படுகிறது</translation>
 <translation id="4568213207643490790">இந்தச் சாதனத்தில் Google கணக்குகள் அனுமதிக்கப்படவில்லை.</translation>
@@ -2360,6 +2378,7 @@
 <translation id="4596295440756783523">இந்தச் சேவையகங்களை அடையாளங்காணும் சான்றிதழ்கள் கோப்பில் உள்ளன</translation>
 <translation id="4598556348158889687">சேமிப்பிட மேலாண்மை</translation>
 <translation id="4598776695426288251">பல சாதனங்களின் மூலமாக வைஃபை கிடைக்கிறது</translation>
+<translation id="4599134080475764833">செருகுநிரல் VM பயன்படுத்தத் தயாராக உள்ளது</translation>
 <translation id="4602466770786743961">உங்கள் கேமராவையும் மைக்ரோஃபோனையும் அணுக <ph name="HOST" /> ஐ எப்போதும் அனுமதிக்கவும்</translation>
 <translation id="4608500690299898628">&amp;கண்டுபிடி...</translation>
 <translation id="4608520674724523647">வெற்றிகரமான பதிவு குறித்த விளக்கப்படம்</translation>
@@ -2369,6 +2388,7 @@
 <translation id="4613144866899789710">Linux நிறுவலை ரத்துசெய்கிறது...</translation>
 <translation id="4613271546271159013">புதிய தாவலைத் திறக்கும்போது காண்பிக்கப்படும் பக்கத்தை நீட்டிப்பு மாற்றியுள்ளது.</translation>
 <translation id="4615586811063744755">குக்கீ எதுவும் தேர்ந்தெடுக்கப்படவில்லை</translation>
+<translation id="4617001782309103936">மிகச் சுருக்கமாக உள்ளது</translation>
 <translation id="4617270414136722281">நீட்டிப்பு விருப்பங்கள்</translation>
 <translation id="4619615317237390068">பிற சாதனங்களின் தாவல்கள்</translation>
 <translation id="4620809267248568679">இந்த அமைப்பு நீட்டிப்பால் செயல்படுத்தப்படுகிறது.</translation>
@@ -2381,6 +2401,7 @@
 <translation id="4633003931260532286">நீட்டிப்பிற்கு குறைந்தபட்சம் "<ph name="IMPORT_VERSION" />" பதிப்புடன் கூடிய "<ph name="IMPORT_NAME" />" தேவை, ஆனால் "<ph name="INSTALLED_VERSION" />" பதிப்பு மட்டும் நிறுவப்பட்டுள்ளது</translation>
 <translation id="4634771451598206121">மீண்டும் உள்நுழைக...</translation>
 <translation id="4635398712689569051">விருந்தினர் பயனர்களுக்கு <ph name="PAGE_NAME" /> கிடைக்காது.</translation>
+<translation id="4637083375689622795">கூடுதல் செயல்கள், <ph name="EMAIL" /></translation>
 <translation id="4641539339823703554">Chrome ஆல் கணினி நேரத்தை அமைக்க முடியவில்லை. கீழே நேரத்தைச் சரிபார்த்து, தேவைப்பட்டால் சரிசெய்யவும்.</translation>
 <translation id="4643612240819915418">புதிய தாவலில் வீடியோவைத் &amp;திற</translation>
 <translation id="4645676300727003670">&amp;வைத்திரு</translation>
@@ -2395,6 +2416,7 @@
 <translation id="4662788913887017617">இந்தப் புத்தகக்குறியை உங்கள் iPhone உடன் பகிருங்கள்</translation>
 <translation id="4663373278480897665">கேமரா அனுமதிக்கப்பட்டது</translation>
 <translation id="4664482161435122549">PKCS #12 ஏற்றுமதி பிழை</translation>
+<translation id="4664736447097490764">Kerberos உள்ளமைவு கோப்பை இங்கே திருத்தலாம்.</translation>
 <translation id="4665014895760275686">உற்பத்தியாளர்</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> சேகரித்த தரவு அனைத்தும் நீக்கப்படும்.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ஐ இயக்க, கிளிக் செய்யவும்</translation>
@@ -2496,7 +2518,6 @@
 <translation id="4830502475412647084">OS புதுப்பிப்பை நிறுவுகிறது</translation>
 <translation id="4830573902900904548">உங்கள் <ph name="DEVICE_TYPE" /> ஆல் <ph name="NETWORK_NAME" /> மூலம் இணையத்துடன் இணைய முடியவில்லை. வேறு நெட்வொர்க்கைத் தேர்வுசெய்யவும். <ph name="LEARN_MORE_LINK_START" />மேலும் அறிக<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chromeமிடம் நீங்கள் கோரியதற்கான அணுகல் இல்லை.</translation>
-<translation id="4835836146030131423">உள்நுழைவதில் பிழை.</translation>
 <translation id="4837926214103741331">இந்தச் சாதனத்தைப் பயன்படுத்த, உங்களுக்கு அங்கீகாரம் இல்லை. உள்நுழைவு அனுமதியைப் பெற, சாதன உரிமையாளரைத் தொடர்பு கொள்ளவும்.</translation>
 <translation id="4837952862063191349">உங்கள் அகக் கணினியின் தரவைத் திறந்து, மீட்டெடுக்க, <ph name="DEVICE_TYPE" /> இன் பழைய கடவுச்சொல்லை உள்ளிடவும்.</translation>
 <translation id="4838836835474292213">கிளிப்போர்டைப் படிப்பதற்கான அணுகல் அனுமதிக்கப்பட்டது</translation>
@@ -2631,7 +2652,6 @@
 <translation id="5029568752722684782">நகலை அழி</translation>
 <translation id="5030338702439866405">வழங்கியது</translation>
 <translation id="5033266061063942743">வடிவியல் வடிவங்கள்</translation>
-<translation id="5033619151015094114">உங்கள் நிறுவனமோ அமைப்போ விடுத்துள்ள கோரிக்கையின்படி இந்தச் சாதனத்தைப் புதுப்பிக்க வேண்டும்</translation>
 <translation id="503498442187459473"><ph name="HOST" /> உங்கள் கேமராவையும் மைக்ரோஃபோனையும் பயன்படுத்த விரும்புகிறது</translation>
 <translation id="5036662165765606524">எந்தத் தளத்தையும் பல கோப்புகளைத் தானாகப் பதிவிறக்க அனுமதிக்காதே</translation>
 <translation id="5037676449506322593">எல்லாம் தேர்ந்தெடு</translation>
@@ -2768,6 +2788,7 @@
 <translation id="5255859108402770436">மீண்டும் உள்நுழைக</translation>
 <translation id="5256861893479663409">எல்லாத் தளங்களிலும்</translation>
 <translation id="5258992782919386492">இந்தச் சாதனத்தில் நிறுவு</translation>
+<translation id="5260334392110301220">Smart Quotes</translation>
 <translation id="5260508466980570042">மன்னிக்கவும், உங்கள் மின்னஞ்சலையும் கடவுச்சொல்லையும் சரிபார்க்க முடியவில்லை. தயவுசெய்து மீண்டும் முயற்சி செய்க.</translation>
 <translation id="5261683757250193089">இணைய அங்காடியில் திற</translation>
 <translation id="5264148714798105376">இதற்கு ஒரு நிமிடம் அல்லது அதற்கும் மேல் ஆகலாம்.</translation>
@@ -2802,6 +2823,7 @@
 <translation id="5301751748813680278">விருந்தினராக உள்நுழைவு.</translation>
 <translation id="5301954838959518834">சரி, புரிந்தது</translation>
 <translation id="5302048478445481009">மொழி</translation>
+<translation id="5302932258331363306">மாற்றுகளைக் காட்டு</translation>
 <translation id="5305688511332277257">எதுவும் நிறுவப்படவில்லை</translation>
 <translation id="5307030433605830021">மூல உள்ளடக்கம் ஆதரிக்கப்படவில்லை</translation>
 <translation id="5308380583665731573">இணை</translation>
@@ -2897,9 +2919,11 @@
 <translation id="5449588825071916739">எல்லா தாவல்களையும் புக்மார்க்கிடுக</translation>
 <translation id="5449716055534515760">Close Win&amp;dow</translation>
 <translation id="5454166040603940656"><ph name="PROVIDER" /> உடன்</translation>
+<translation id="545426320101607695">இதற்கு மொழிபெயர்க்கவும்:</translation>
 <translation id="5457113250005438886">தவறானது</translation>
 <translation id="5457459357461771897">உங்கள் கம்ப்யூட்டரிலிருந்து படங்கள், இசை மற்றும் பிற மீடியாவைப் படிக்கலாம், நீக்கலாம்</translation>
 <translation id="5457599981699367932">விருந்தினராக உலாவுங்கள்</translation>
+<translation id="5457991019809708398">ஆன், ரோமிங்கில் இல்லை</translation>
 <translation id="5458998536542739734">லாக் ஸ்கிரீன் குறிப்புகள்</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> இன் பொருளடக்கம்</translation>
 <translation id="5463856536939868464">மறைந்த புக்மார்க்குகளைக் கொண்ட மெனு</translation>
@@ -3126,6 +3150,7 @@
 <translation id="5799508265798272974">Linux விர்ச்சுவல் மெஷின்: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">கடைசியாக பதிவிறக்கியதிலிருந்து இலக்குக் கோப்பு சிதைந்துள்ளது அல்லது அகற்றப்பட்டது.</translation>
 <translation id="5801568494490449797">விருப்பத்தேர்வுகள்</translation>
+<translation id="5804175651771201311">ரோமிங் ஆஃப் செய்யப்பட்டுள்ளது</translation>
 <translation id="5804241973901381774">அனுமதிகள்</translation>
 <translation id="5805697420284793859">சாளர நிர்வாகி</translation>
 <translation id="5811750797187914944">முடிந்தது</translation>
@@ -3473,6 +3498,7 @@
 <translation id="6317318380444133405">இனி ஆதரிக்கப்படாது.</translation>
 <translation id="6317369057005134371">பயன்பாட்டு சாளரத்திற்காகக் காத்திருக்கிறது...</translation>
 <translation id="6318407754858604988">பதிவிறக்கம் தொடங்கியது</translation>
+<translation id="6318944945640833942">பிரிண்டரைக் கண்டறிய இயலவில்லை. பிரிண்டர் முகரியை மீண்டும் உள்ளிடுக.</translation>
 <translation id="6322653941595359182">உங்கள் Chromebookகிலிருந்து மெசேஜ்களை அனுப்பலாம், பெறலாம்</translation>
 <translation id="6324916366299863871">ஷார்ட்கட்டைத் திருத்து</translation>
 <translation id="6325191661371220117">தானியங்கு துவக்கியை முடக்கு</translation>
@@ -3729,6 +3755,7 @@
 <translation id="6725073593266469338">UI சேவை</translation>
 <translation id="6725206449694821596">இன்டர்நெட் பிரிண்டிங் புரோட்டோகால் (IPP)</translation>
 <translation id="67269783048918309">உபயோகம் &amp; கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை இந்தச் சாதனம் தற்போது Googleளுக்குத் தானாக அனுப்புகிறது. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த <ph name="BEGIN_LINK1" />அமைப்பைச்<ph name="END_LINK1" /> செயல்படுத்தியுள்ளார். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் &amp; ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">இணைக்கப்பட்டது, பேட்டரி: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6732801395666424405">சான்றிதழ்கள் ஏற்றப்படவில்லை</translation>
 <translation id="6732900235521116609">ஷார்ட்கட்டை அகற்ற முடியவில்லை</translation>
 <translation id="6735304988756581115">குக்கீகள் மற்றும் பிற தள தரவைக் காண்பி...</translation>
@@ -3819,7 +3846,9 @@
 <translation id="6871644448911473373">OCSP பதிலளிப்பான்: <ph name="LOCATION" /></translation>
 <translation id="6872781471649843364">சேவையகம் நீங்கள் உள்ளிட்ட கடவுச்சொல்லை நிராகரித்தது.</translation>
 <translation id="6876155724392614295">பைக்</translation>
+<translation id="6877460900831874810">Chrome மீடியா பிளேபேக்கைப் பூட்டுத் திரையில் இயக்கு</translation>
 <translation id="6878422606530379992">சென்சார்கள் அனுமதிக்கப்பட்டுள்ளன</translation>
+<translation id="6878665006737889642">நிறுவுவதற்கு மீண்டும் முயலவும்</translation>
 <translation id="6880587130513028875">இந்தப் பக்கத்தில், படங்கள் தடுக்கப்பட்டன.</translation>
 <translation id="6883319974225028188">அச்சச்சோ!  சாதன உள்ளமைவைச் சேமிக்க முடியவில்லை.</translation>
 <translation id="6885771755599377173">முறைமைத் தகவலின் மாதிரிக்காட்சி</translation>
@@ -3919,6 +3948,7 @@
 <translation id="7019805045859631636">வேகமான</translation>
 <translation id="7022562585984256452">உங்களின் முகப்பு பக்கம் அமைக்கப்பட்டது.</translation>
 <translation id="7025190659207909717">மொபைல் டேட்டா சேவை மேலாண்மை</translation>
+<translation id="7027891519253193555"><ph name="LANGUAGE" /> மொழியில் பக்கம் இல்லையா ?</translation>
 <translation id="7029809446516969842">கடவுச்சொற்கள்</translation>
 <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - சீரியல் போர்ட் இணைக்கப்பட்டது</translation>
 <translation id="7031962166228839643">TPM தயாரிக்கப்படுவதால், தயவுசெய்து காத்திருங்கள் (இதற்கு சில நிமிடங்கள் ஆகக்கூடும்)...</translation>
@@ -3987,6 +4017,7 @@
 <translation id="7120865473764644444">ஒத்திசைவுச் சேவையகத்துடன் இணைக்க முடியவில்லை. மீண்டும் முயற்சிக்கிறது...</translation>
 <translation id="7121362699166175603">வரலாற்றையும் முகவரிப் பட்டியில் தன்னிரப்பிகளையும் அழிக்கும். உங்கள் Google கணக்கு, <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற இணைப்பில் உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கக்கூடும்.</translation>
 <translation id="7121389946694989825">உபயோகம் &amp; கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை இந்தச் சாதனம் தற்போது Googleளுக்குத் தானாக அனுப்புகிறது. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் &amp; ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Smart Dashes</translation>
 <translation id="7123360114020465152">இனி ஆதரிக்கப்படாது</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" />ஐ அச்சிடுவதில் பிழை</translation>
 <translation id="7127980134843952133">பதிவிறக்க வரலாறு</translation>
@@ -4124,6 +4155,7 @@
 <translation id="7328699668338161242">அசிஸ்டண்ட்டால் உங்கள் குரலை ஏற்கனவே அடையாளம் காண முடியும்</translation>
 <translation id="7328867076235380839">தவறான சேர்க்கை</translation>
 <translation id="7329154610228416156">பாதுகாப்பற்ற URLஐப் (<ph name="BLOCKED_URL" />) பயன்படுத்தும்படி உள்ளமைக்கப்பட்டதால் உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
+<translation id="733006820760728943">செயலிலுள்ள கணக்காக அமை</translation>
 <translation id="7334190995941642545">தற்போது Smart Lock கிடைக்கவில்லை. பின்னர் முயற்சிக்கவும்.</translation>
 <translation id="7334274148831027933">டாக் செய்யப்பட்ட பெரிதாக்கியை இயக்கு</translation>
 <translation id="7335974957018254119">எழுத்துப்பிழைச் சரிபார்ப்பை இதற்குப் பயன்படுத்தவும்</translation>
@@ -4134,6 +4166,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" />, இப்போது முழுத் திரையில் உள்ளது.</translation>
 <translation id="7340650977506865820">தளமானது உங்கள் திரையைப் பகிர்கிறது</translation>
 <translation id="7341834142292923918">இந்தத் தளத்திற்கு அணுகலைக் கோருகிறது</translation>
+<translation id="7344488796804562294">மேம்பட்ட Kerberos உள்ளமைவு</translation>
 <translation id="7345706641791090287">கடவுச்சொல்லை உறுதிப்படுத்தவும்</translation>
 <translation id="7346909386216857016">சரி, புரிந்தது</translation>
 <translation id="7347751611463936647">இந்த நீட்டிப்பைப் பயன்படுத்துவதற்கு, "<ph name="EXTENSION_KEYWORD" />" என தட்டச்சு செய்து, TABஐ அழுத்தி, பின்னர் உங்கள் கட்டளை அல்லது தேடலைத் தட்டச்சு செய்யவும்.</translation>
@@ -4199,6 +4232,7 @@
 <translation id="7442465037756169001">Hangouts Meet hardware அமைப்பதற்குத் தயாராக உள்ளது.</translation>
 <translation id="744341768939279100">புதிய சுயவிவரத்தை உருவாக்கு</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ஐ முடக்கு</translation>
+<translation id="7448430327655618736">ஆப்ஸைத் தானாகவே நிறுவும்</translation>
 <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> உலாவியில் திறக்கும்</translation>
 <translation id="7453008956351770337">இந்தப் பிரிண்டரைத் தேர்ந்தெடுப்பதன் மூலம், பின்வரும் நீட்டிப்பு உங்கள் பிரிண்டரை அணுகுவதற்கான அனுமதியை வழங்குகிறீர்கள்:</translation>
 <translation id="7456142309650173560">dev</translation>
@@ -4381,6 +4415,7 @@
 <translation id="7728570244950051353">உறக்கப் பயன்முறையிலிருந்து பூட்டுத் திரை</translation>
 <translation id="7728668285692163452">சேனல் மாற்றம் பின்னர் பயன்படுத்தப்படும்</translation>
 <translation id="7730449930968088409">உங்கள் திரையின் உள்ளடக்கத்தைப் பதிவுசெய்யலாம்</translation>
+<translation id="7731119595976065702">மேலும் மொழிகள்...</translation>
 <translation id="7732111077498238432">இது கொள்கையால் கட்டுப்படுத்தப்படும் நெட்வொர்க்</translation>
 <translation id="7737238973539693982">Linuxஸை (பீட்டா) நீக்கு</translation>
 <translation id="7740996059027112821">நிலையானது</translation>
@@ -4736,6 +4771,7 @@
 <translation id="8214489666383623925">கோப்பைத் திற...</translation>
 <translation id="8214962590150211830">இவரை அகற்று</translation>
 <translation id="8217399928341212914">பல கோப்புகள் தானாகப் பதிவிறக்கப்படுவதைத் தொடர்ந்து தடு</translation>
+<translation id="822519928942492333">மொழியாக்கம் செய்யப்பட வேண்டிய பக்கத்தின் மொழி:</translation>
 <translation id="8225265270453771718">ஆப்ஸ் சாளரத்தைப் பகிருங்கள்</translation>
 <translation id="8225753906568652947">உங்கள் சலுகைகளை ரிடீம் செய்க</translation>
 <translation id="8226222018808695353">தடுக்கப்பட்டது</translation>
@@ -4744,6 +4780,7 @@
 <translation id="8227119283605456246">கோப்பை இணை</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" />க்கான கடவுச்சொல்லைச் சேமிக்கவா?</translation>
 <translation id="8234795456569844941">சுயவிவரப் பிழைச் செய்தியைப் பெறும் முன், என்ன நடந்தது என்பதை விவரிப்பதன் மூலம், இந்தச் சிக்கலைச் சரிசெய்ய, எங்கள் பொறியாளர்களுக்கு உதவவும்.</translation>
+<translation id="8236917170563564587">இந்தத் தாவலைப் பகிர்</translation>
 <translation id="8241040075392580210">ஷேடி</translation>
 <translation id="8241806945692107836">சாதன உள்ளமைவைத் தீர்மானிக்கிறது...</translation>
 <translation id="8241868517363889229">உங்கள் புக்மார்க்குகளைப் படிக்கலாம் மற்றும் மாற்றலாம்</translation>
@@ -4755,6 +4792,7 @@
 <translation id="8249048954461686687">OEM கோப்புறை</translation>
 <translation id="8249615410597138718">உங்கள் சாதனங்களுக்கு அனுப்புதல்</translation>
 <translation id="8249672078237421304">நான் படிக்கும் மொழியில் இல்லாத பக்கங்களை மொழிபெயர்ப்பதற்கான விருப்பத்தை வழங்கு</translation>
+<translation id="8251441930213048644">இப்போது ரெஃப்ரெஷ் செய்</translation>
 <translation id="8251578425305135684">சிறு படம் நீக்கப்பட்டது.</translation>
 <translation id="8252569384384439529">பதிவேற்றுகிறது...</translation>
 <translation id="8253198102038551905">நெட்வொர்க் பண்புகளைப் பெற '+'ஐக் கிளிக் செய்யவும்</translation>
@@ -5132,6 +5170,7 @@
 <translation id="8827752199525959199">கூடுதல் செயல்கள், <ph name="DOMAIN" /> இல் <ph name="USERNAME" />க்கான கடவுச்சொல்</translation>
 <translation id="882854468542856424">எந்தத் தளத்தையும் அருகிலுள்ள புளூடூத் சாதனங்களைக் கண்டறிய அனுமதிக்காதே</translation>
 <translation id="8828933418460119530">DNS பெயர்</translation>
+<translation id="883062543841130884">மாற்றுகள்</translation>
 <translation id="8830796635868321089">தற்போதைய பிராக்சி அமைப்புகளைப் பயன்படுத்துவதில் புதுப்பிப்பு சரிபார்ப்பு தோல்வியடைந்தது. உங்கள் <ph name="PROXY_SETTINGS_LINK_START" />பிராக்சி அமைப்புகளைச்<ph name="PROXY_SETTINGS_LINK_END" /> சரிசெய்யவும்.</translation>
 <translation id="8831664945713891930">நீட்டிப்புகள் அமைப்புகளைத் திற</translation>
 <translation id="8834039744648160717">நெட்வொர்க் உள்ளமைவைக் கட்டுப்படுத்துவது: <ph name="USER_EMAIL" />.</translation>
@@ -5152,6 +5191,7 @@
 <translation id="8862003515646449717">விரைவான உலாவிக்கு மாறவும்</translation>
 <translation id="8863753581171631212">புதிய <ph name="APP" /> இல் இணைப்பைத் திற</translation>
 <translation id="8864055848767439877"><ph name="APP_NAME" /> ஆப்ஸுடன் <ph name="TAB_NAME" /> தாவலைப் பகிர்கிறது</translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> என்ற மின்னஞ்சல் முகவரி இந்தச் சாதனத்திலிருந்து அகற்றப்பட்டது</translation>
 <translation id="8868626022555786497">பயன்படுத்தியது:</translation>
 <translation id="8870318296973696995">முகப்புப் பக்கம்</translation>
 <translation id="8870413625673593573">சமீபத்தில் மூடியவை</translation>
@@ -5160,7 +5200,6 @@
 <translation id="8871974300055371298">உள்ளடக்க அமைப்புகள்</translation>
 <translation id="8872155268274985541">தவறான கியாஸ்க் வெளிப்புற புதுப்பிப்பு மெனிஃபெஸ்ட் ஃபைல் கண்டறியப்பட்டது. கியாஸ்க் ஆப்ஸைப் புதுப்பித்தல் தோல்வியுற்றது. USB சாதனத்தை அகற்றவும்.</translation>
 <translation id="8874184842967597500">இணைக்கப்படவில்லை</translation>
-<translation id="887550310442005096">உங்கள் நிறுவனமோ அமைப்போ இந்தச் சாதனத்தைப் புதுப்பிக்கும்படி கேட்டுக்கொள்கிறது</translation>
 <translation id="8876307312329369159">டெமோ அமர்வில் இந்த அமைப்பை மாற்ற முடியாது.</translation>
 <translation id="8877448029301136595">[மூலக் கோப்பகம்]</translation>
 <translation id="8879284080359814990">தாவலாகக் &amp;காண்பி</translation>
@@ -5275,6 +5314,7 @@
 <translation id="9044646465488564462">நெட்வொர்க்குடன் இணைப்பதில் தோல்வி: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">நீங்கள் செல்ல முயற்சிக்கும் பக்கத்தின் இணைய முகவரியை Googleளுக்கு அனுப்பும்</translation>
 <translation id="9046895021617826162">இணைப்பு தோல்வியடைந்தது</translation>
+<translation id="9047391224416514812">இந்தப் பெயரில் ஏற்கனவே ஒரு கணக்கு உள்ளது</translation>
 <translation id="9050666287014529139">கடவுச்சொற்றொடர்</translation>
 <translation id="9052208328806230490"><ph name="CLOUD_PRINT_NAME" /> உடன் <ph name="EMAIL" /> கணக்கைப் பயன்படுத்தி உங்கள் பிரிண்டர்களைப் பதிவு செய்துள்ளீர்கள்</translation>
 <translation id="9052404922357793350">தடுப்பதைத் தொடர்</translation>
@@ -5322,6 +5362,7 @@
 <translation id="9121814364785106365">பொருத்திய தாவலாகத் திற</translation>
 <translation id="9124003689441359348">சேமித்த கடவுச்சொற்கள் இங்கே தோன்றும்</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ரெம்)</translation>
+<translation id="9128317794749765148">அமைவை நிறைவுசெய்ய இயலவில்லை</translation>
 <translation id="9128870381267983090">நெட்வொர்க்குடன் இணையவும்</translation>
 <translation id="9130015405878219958">செல்லாத பயன்முறை உள்ளிடப்பட்டது. </translation>
 <translation id="9131487537093447019">புளூடூத் சாதனங்களுக்குச் செய்திகளை அனுப்புதல் மற்றும் அதிலிருந்து செய்திகளைப் பெறுதல்.</translation>
@@ -5390,6 +5431,7 @@
 <translation id="939598580284253335">கடவுச்சொற்றொடரை உள்ளிடுக</translation>
 <translation id="939736085109172342">புதிய கோப்புறை</translation>
 <translation id="942532530371314860">Chrome தாவலையும் ஆடியோவையும் <ph name="APP_NAME" /> பகிர்கிறது.</translation>
+<translation id="945166830402967374">உங்கள் நிறுவனத்தின் சாதன நிர்வாகியைத் தொடர்புகொள்ளவும்</translation>
 <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
 <translation id="947329552760389097">&amp;கூறுகளை ஆய்வு செய்</translation>
 <translation id="952992212772159698">செயலாக்கப்படவில்லை</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 7d0a0ffc..30702018 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">డెమో మోడ్ పరికర లైసెన్స్‌లకు సంబంధించి ఒక సమస్య ఏర్పడింది.</translation>
 <translation id="126710816202626562">అనువాద భాష:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">అధునాతన కాన్ఫిగరేషన్</translation>
 <translation id="1272079795634619415">ఆపు</translation>
 <translation id="1272978324304772054">ఈ వినియోగదారు ఖాతా, పరికరం నమోదు చేయబడిన డొమైన్‌కు చెందినది కాదు. మీరు వేరొక డొమైన్‌కు నమోదు చేయాలనుకుంటే మీరు ముందుగా పరికరాన్ని పునరుద్ధరించాలి.</translation>
 <translation id="1274977772557788323">Adobe Flash Player నిల్వ సెట్టింగ్‌లు</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> ఎంచుకోబడింది/ఎంచుకోబడ్డాయి</translation>
 <translation id="1444628761356461360">ఈ సెట్టింగ్‌ను పరికరం యజమాని అయిన <ph name="OWNER_EMAIL" /> నిర్వహిస్తున్నారు.</translation>
 <translation id="144518587530125858">థీమ్ కోసం '<ph name="IMAGE_PATH" />'ను లోడ్ చేయడం సాధ్యపడలేదు.</translation>
+<translation id="1445693676523799095">దీనికి కొంత సమయం పట్టవచ్చు</translation>
 <translation id="1451375123200651445">వెబ్ పేజీ, ఒకే ఫైల్</translation>
 <translation id="1451917004835509682">పర్యవేక్షించబడే వ్యక్తిని జోడించు</translation>
 <translation id="1454223536435069390">స్క్రీన్‌షాట్ తీ&amp;యి</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">దీనిని <ph name="CHROME_WEB_STORE" /> నుండి మాత్రమే జోడించవచ్చు</translation>
 <translation id="1877520246462554164">ప్రమాణీకరణ టోకెన్‌ను పొందడం విఫలమైంది. దయచేసి సైన్ అవుట్ చేసి, సైన్ ఇన్ చేసిన తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="1877860345998737529">స్విచ్ చర్య కేటాయింపు</translation>
+<translation id="1878541307036593717">అనుమతులను సెట్ చేయండి</translation>
 <translation id="1879000426787380528">ఇలా సైన్ ఇన్ చేయండి</translation>
 <translation id="1880905663253319515">ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />"ను తొలగించాలా?</translation>
 <translation id="1886996562706621347">ప్రోటోకాల్స్‌కు డిఫాల్ట్ హ్యాండ్లర్‌లుగా కావడం కోసం అడగటానికి సైట్‌లను అనుమతించండి (సిఫార్సు చేయబడింది)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> మిగిలి ఉంది</translation>
 <translation id="1895658205118569222">షట్‌డౌన్</translation>
 <translation id="1895934970388272448">మీరు ఈ ప్రాసెస్‌ను పూర్తి చేయడానికి మీ ప్రింటర్‌లో తప్పనిసరిగా నమోదుని నిర్ధారించాలి - ఇప్పుడే తనిఖీ చేయండి.</translation>
+<translation id="1899826437968063457">ప్లగ్ఇన్ VMను అమలు చేయడానికి అనుమతి మంజూరు చేయాలి</translation>
 <translation id="1901303067676059328">&amp;అన్నీ ఎంచుకోండి</translation>
 <translation id="1902576642799138955">చెల్లుబాటు కాలం</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{ట్యాబ్‌ను మ్యూట్ చేయి}other{ట్యాబ్‌లను మ్యూట్ చేయి}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">ప్రస్తుత అజ్ఞాత సెషన్ (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">హెడర్‌లు మరియు ఫుటర్‌లు</translation>
 <translation id="2322318151094136999">ఏదైనా ఒక సైట్, సీరియల్ పోర్ట్‌లను యాక్సెస్ చేయాలని భావించినప్పుడు అనుమతి అడగాలి (సిఫార్సు చేయడమైనది)</translation>
+<translation id="2325444234681128157">పాస్‌వర్డ్‌ను గుర్తుంచుకో</translation>
 <translation id="2326931316514688470">యాప్‌ను &amp;మళ్లీ లోడ్ చేయి</translation>
 <translation id="2327492829706409234">యాప్‌ను ప్రారంభించు</translation>
 <translation id="2329597144923131178">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు, ఇతర సెట్టింగ్‌లను మీ అన్ని పరికరాలలో పొందడానికి సైన్ ఇన్ చేయండి.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">పేజీని స్వీయ రీఫ్రెష్ చేయడానికి URLలో ప్రశ్న పరామితిని జోడించండి: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">కనిపించే తీరు</translation>
 <translation id="2433836460518180625">పరికరాన్ని మాత్రం అన్‌లాక్ చేయండి</translation>
+<translation id="2434449159125086437">ప్రింటర్‌ను సెటప్ చేయలేకపోయింది. దయచేసి కాన్ఫిగరేషన్‌ను సరిచూసుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="2435248616906486374">నెట్‌వర్క్ డిస్‌కనెక్ట్ అయింది</translation>
 <translation id="2435457462613246316">పాస్‌వర్డ్‌ను చూపించు</translation>
 <translation id="2436186046335138073">అన్ని <ph name="PROTOCOL" /> లింక్‌లను తెరవడానికి <ph name="HANDLER_HOSTNAME" />ను అనుమతించాలా?</translation>
@@ -1097,6 +1103,7 @@
 <translation id="2649045351178520408">Base64-ఎన్‌కోడ్ చేసిన ASCII, సర్టిఫికెట్ చైన్</translation>
 <translation id="2653033005692233957">శోధన విఫలమైంది</translation>
 <translation id="2653266418988778031">మీరు స‌ర్టిఫికెట్‌ అధికారి (CA) స‌ర్టిఫికెట్‌ను తొలగిస్తే, మీ బ్రౌజర్ CA ద్వారా జారీ చేయబడిన ఏ స‌ర్టిఫికెట్‌లను ఇకపై నమ్మదు.</translation>
+<translation id="2653275834716714682">వచనం భర్తీ</translation>
 <translation id="2653659639078652383">సమర్పించు</translation>
 <translation id="265390580714150011">ఫీల్డ్ విలువ</translation>
 <translation id="2654166010170466751">చెల్లింపు హ్యాండ్లర్‌లను ఇన్‌స్టాల్ చేయడానికి సైట్‌లను అనుమతించండి</translation>
@@ -1305,6 +1312,7 @@
 <translation id="29488703364906173">ఆధునిక వెబ్ కోసం రూపొందించబడిన వేగవంతమైన, సరళమైన, సురక్షితమైన వెబ్ బ్రౌజర్.</translation>
 <translation id="2949289451367477459">స్థానాన్ని ఉపయోగించండి. స్థాన అనుమతిని కలిగిన యాప్‌లు మరియు సేవలు ఈ పరికర స్థానాన్ని ఉపయోగించడానికి అనుమతించండి. Google కాలానుగుణంగా స్థాన డేటాని సేకరించవచ్చు మరియు స్థాన ఖచ్చితత్వం మరియు స్థానం-ఆధారిత సేవలను మెరుగుపరచడం కోసం ఈ డేటాని అనామకంగా ఉపయోగించవచ్చు. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">ప్యాక్ పొడిగింపు హెచ్చరిక</translation>
+<translation id="2959842337402130152">నిల్వ స్థలం లేని కారణంగా పునరుద్ధరించడం సాధ్యపడలేదు. పరికరంలో <ph name="SPACE_REQUIRED" /> స్థలం ఖాళీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="296026337010986570">పూర్తయింది! హానికరమైన సాఫ్ట్‌వేర్ తీసివేయబడింది. ఎక్స్‌టెన్షన్‌లను తిరిగి ఆన్ చేయడానికి, &lt;a href="chrome://extensions"&gt;ఎక్స్‌టెన్షన్‌లు&lt;/a&gt; సందర్శించండి.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (పొడిగింపు అందించినది)</translation>
 <translation id="2961695502793809356">ముందుకు వెళ్ళడానికి క్లిక్ చెయ్యండి. చరిత్రను చూడటానికి నొక్కి ఉంచండి</translation>
@@ -1612,7 +1620,6 @@
 <translation id="3454157711543303649">సక్రియం చేయడం పూర్తయింది</translation>
 <translation id="3454213325559396544">ఈ <ph name="DEVICE_TYPE" />కు ఇదే చివరి ఆటోమేటిక్ సాఫ్ట్‌వేర్ మరియు భద్రతాపరమైన అప్‌డేట్. భవిష్యత్తు అప్‌డేట్‌లను పొందడానికి, సరికొత్త మోడల్‌కు అప్‌గ్రేడ్ చేయండి.</translation>
 <translation id="345693547134384690">కొత్త‌ టాబ్‌లో &amp;చిత్రాన్ని తెరువు</translation>
-<translation id="3457500881955698515">మీ కంపెనీ లేదా సంస్థ నియమాల ప్రకారం, ఈ పరికరాన్ని తక్షణం అప్‌డేట్ చేయాలి</translation>
 <translation id="3459509316159669723">ముద్రణ</translation>
 <translation id="3459697287128633276">మీ ఖాతాలో Google Play స్టోర్ యాక్సెస్‌ను ఆరంభించాలంటే, దయచేసి మీ గుర్తింపు ప్రదాతతో ప్రామాణీకరించండి.</translation>
 <translation id="3459774175445953971">చివరగా సవరించబడింది:</translation>
@@ -1989,6 +1996,7 @@
 <translation id="3966072572894326936">మరొక ఫోల్డర్‌ను ఎంచుకోండి...</translation>
 <translation id="3967822245660637423">డౌన్‌లోడ్ పూర్తయింది</translation>
 <translation id="3967919079500697218">మీ నిర్వాహకులు స్క్రీన్‌షాట్‌లను తీయగల సామర్ధ్యాన్ని నిలిపివేశారు.</translation>
+<translation id="3969092967100188979">ఆన్, రోమింగ్‌లో ఉంది</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">గణిస్తోంది...</translation>
 <translation id="3975565978598857337">సర్వర్ కోసం నెట్‌వర్క్ పరిధిని కనెక్ట్ చేయడంలో విఫలమైంది</translation>
@@ -2050,6 +2058,7 @@
 <translation id="4068776064906523561">సేవ్ చేయబడిన వేలిముద్రలు</translation>
 <translation id="407173827865827707">క్లిక్ చేసినప్పుడు</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{ట్యాబ్‌ను అన్‌పిన్ చేయి}other{ట్యాబ్‌లను అన్‌పిన్ చేయి}}</translation>
+<translation id="4072805772816336153">తర్వాత మళ్లీ ప్రయత్నించండి</translation>
 <translation id="4074900173531346617">ఇమెయిల్ సైన్ చేసినవారి సర్టిఫికెట్</translation>
 <translation id="407520071244661467">ప్రమాణం</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" />ని ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
@@ -2138,6 +2147,7 @@
 <translation id="4209092469652827314">పెద్దది</translation>
 <translation id="4209251085232852247">ఆఫ్ చేయబడింది</translation>
 <translation id="4209464433672152343">ముద్రించడం కోసం పత్రాలను సిద్ధం చేయడానికి అవి <ph name="BEGIN_LINK_HELP" />Googleకు పంపబడతాయి<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google క్లౌడ్ ప్రింట్‌ డాష్‌బోర్డ్<ph name="END_LINK_DASHBOARD" />లో మీ ప్రింటర్‌లు, ప్రింటర్ చరిత్రను చూడండి. సవరించండి. నిర్వహించండి.</translation>
+<translation id="4210048056321123003">వర్చువల్ మెషిన్‌ను డౌన్‌లోడ్ చేస్తోంది</translation>
 <translation id="421182450098841253"> &amp;బుక్‌మార్క్‌ల బార్‌ను చూపు</translation>
 <translation id="4211851069413100178">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. సమస్య విశ్లేషణ, పరికరం, యాప్ వినియోగ డేటాను Googleకి ఆటోమేటిక్‌గా పంపడం ద్వారా మీ Android అనుభవాన్ని మెరుగుపరచడంలో సహాయపడండి. ఇది సిస్టమ్, యాప్ స్థిరత్వానికి, అలాగే ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్‌లకు, అలాగే Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. ఈ <ph name="BEGIN_LINK1" />సెట్టింగ్‌<ph name="END_LINK1" />ని యజమాని అమలు చేసారు. ఈ పరికరానికి సంబంధించిన విశ్లేషణ, వినియోగ డేటాను Googleకి పంపేలా యజమాని ఎంచుకోవచ్చు. మీ అదనపు వెబ్ &amp; యాప్ కార్యకలాపం సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా మీ Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">ఎగుమతి చేయి</translation>
@@ -2226,7 +2236,6 @@
 <translation id="4364327530094270451">ఖర్బూజాపండు</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ఒక విండోను షేర్ చేస్తోంది.</translation>
 <translation id="4364830672918311045">నోటిఫికేషన్‌లను ప్రదర్శించడం</translation>
-<translation id="4365673000813822030">అయ్యో, సమకాలీకరణ పని చేయడం ఆగిపోయింది.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" />తో <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">మీరు నమోదు చేసిన ఇమెయిల్, పాస్‌వర్డ్ సరిపోలలేదు</translation>
 <translation id="437184764829821926">అధునాతన ఫాంట్ సెట్టింగ్‌లు</translation>
@@ -2237,6 +2246,7 @@
 <translation id="4378551569595875038">కనెక్ట్ అవుతోంది...</translation>
 <translation id="4378556263712303865">పరికరం అభ్యర్థన</translation>
 <translation id="4380648069038809855">పూర్తి స్క్రీన్‌లోకి ప్రవేశించారు</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +మరో 1 ఖాతా ఉంది}other{<ph name="EMAIL" />, +మరో <ph name="EXTRA_ACCOUNTS" /> ఖాతాలు ఉన్నాయి}}</translation>
 <translation id="4384312707950789900">ప్రాధాన్య నెట్‌వర్క్‌లకు జోడించు</translation>
 <translation id="4384652540891215547">పొడిగింపును సక్రియం చేయండి</translation>
 <translation id="438503109373656455">సారటోగా</translation>
@@ -2367,6 +2377,7 @@
 <translation id="4596295440756783523">మీకు ఫైల్‌లో ఈ సర్వర్‌లను గుర్తించే ప్రమాణపత్రాలు ఉన్నాయి</translation>
 <translation id="4598556348158889687">నిల్వ నిర్వహణ</translation>
 <translation id="4598776695426288251">బహుళ పరికరాల ద్వారా Wi-Fi అందుబాటులో ఉంది</translation>
+<translation id="4599134080475764833">ప్లగ్ఇన్ VM ఉపయోగించడానికి సిద్ధంగా ఉంది</translation>
 <translation id="4602466770786743961">మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి <ph name="HOST" />ను ఎల్లప్పుడూ అనుమతించండి</translation>
 <translation id="4608500690299898628">&amp;కనుగొను...</translation>
 <translation id="4608520674724523647">విజయవంతమైన నమోదు ఉదాహరణ</translation>
@@ -2404,6 +2415,7 @@
 <translation id="4662788913887017617">ఈ బుక్‌మార్క్‌ను మీ iPhoneతో షేర్ చేయండి</translation>
 <translation id="4663373278480897665">కెమెరా అనుమతించబడింది</translation>
 <translation id="4664482161435122549">PKCS #12 ఎగుమతి ఎర్రర్</translation>
+<translation id="4664736447097490764">Kerberos కాన్ఫిగరేషన్ ఫైల్‌ను ఇక్కడ సవరించండి.</translation>
 <translation id="4665014895760275686">తయారీదారు</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> ద్వారా నిల్వ చేయబడిన మొత్తం డేటా తొలగించబడుతుంది.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ను ప్రారంభించడానికి క్లిక్ చేయండి</translation>
@@ -2505,7 +2517,6 @@
 <translation id="4830502475412647084">OS అప్‌డేట్‌ ఇన్‌స్టాల్ చేయబడుతుంది</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" />ను ఉపయోగించి మీ <ph name="DEVICE_TYPE" /> ఇంటర్నెట్‌కి కనెక్ట్ చేయలేకపోయింది. దయచేసి మరో నెట్‌వర్క్‌ను ఎంచుకోండి. <ph name="LEARN_MORE_LINK_START" />మరింత తెలుసుకోండి<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome అభ్యర్థించిన వనరుకు యాక్సెస్ కలిగి లేదు.</translation>
-<translation id="4835836146030131423">సైన్ ఇన్ చేయడంలో ఎర్రర్.</translation>
 <translation id="4837926214103741331">ఈ పరికరాన్ని ఉపయోగించడానికి మీకు అధికారం లేదు. దయచేసి సైన్-ఇన్ అనుమతి కోసం పరికర యజమానిని సంప్రదించండి.</translation>
 <translation id="4837952862063191349">మీ స్థానిక డేటాను అన్‌లాక్ చేసి పునరుద్ధరించడానికి, దయచేసి మీ పాత <ph name="DEVICE_TYPE" /> పాస్‌వర్డ్‌ను నమోదు చేయండి.</translation>
 <translation id="4838836835474292213">క్లిప్‌బోర్డ్‌ను చదివే యాక్సెస్ అనుమతించబడింది</translation>
@@ -2640,7 +2651,6 @@
 <translation id="5029568752722684782">కాపీని తీసివేయి</translation>
 <translation id="5030338702439866405">వీరిచే జారీచేయబడింది</translation>
 <translation id="5033266061063942743">జ్యామితీయ ఆకారాలు</translation>
-<translation id="5033619151015094114">మీ కంపెనీ లేదా సంస్థ నియమాల ప్రకారం, ఈ పరికరాన్ని అప్‌డేట్ చేయాలి.</translation>
 <translation id="503498442187459473"><ph name="HOST" /> మీ కెమెరాను మరియు మైక్రోఫోన్‌ను ఉపయోగించాలనుకుంటోంది</translation>
 <translation id="5036662165765606524">బహుళ ఫైల్‌లను ఆటోమేటిక్‌గా డౌన్‌లోడ్ చేయడానికి ఏ సైట్‌నూ అనుమతించవద్దు</translation>
 <translation id="5037676449506322593">అన్నీ ఎంచుకోండి</translation>
@@ -2777,6 +2787,7 @@
 <translation id="5255859108402770436">మళ్లీ సైన్ ఇన్ చేయండి</translation>
 <translation id="5256861893479663409">అన్ని సైట్‌లలో</translation>
 <translation id="5258992782919386492">ఈ పరికరంలో ఇన్‌స్టాల్ చేయి</translation>
+<translation id="5260334392110301220">స్మార్ట్ కోట్‌లు</translation>
 <translation id="5260508466980570042">క్షమించండి, మీ ఇమెయిల్ లేదా పాస్‌వర్డ్ ధృవీకరించబడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి.</translation>
 <translation id="5261683757250193089">వెబ్ స్టోర్‌లో తెరవండి</translation>
 <translation id="5264148714798105376">ఇది ఇంచుమించు ఒక నిమిషంలో పూర్తి కావచ్చు.</translation>
@@ -2811,6 +2822,7 @@
 <translation id="5301751748813680278">అతిథిగా ప్రవేశిస్తున్నారు.</translation>
 <translation id="5301954838959518834">సరే, అర్థమైంది</translation>
 <translation id="5302048478445481009">భాష</translation>
+<translation id="5302932258331363306">ప్రత్యామ్నాయాలను చూపు</translation>
 <translation id="5305688511332277257">ఏవి వ్యవస్థాపించబడలేదు</translation>
 <translation id="5307030433605830021">మూలాధారానికి మద్దతు లేదు</translation>
 <translation id="5308380583665731573">కనెక్ట్ చేయండి</translation>
@@ -2910,6 +2922,7 @@
 <translation id="5457113250005438886">చెల్లదు</translation>
 <translation id="5457459357461771897">మీ కంప్యూటర్‌లోని ఫోటోలు, సంగీతం మరియు ఇతర మీడియాను చదవడం మరియు తొలగించడం</translation>
 <translation id="5457599981699367932">అతిథి లాగా బ్రౌజ్ చేయండి</translation>
+<translation id="5457991019809708398">ఆన్, రోమింగ్‌లో లేదు</translation>
 <translation id="5458998536542739734">లాక్ స్క్రీన్ గమనికలు</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> యొక్క సూచిక</translation>
 <translation id="5463856536939868464">దాచిపెట్టిన బుక్‌మార్క్‌లు ఉన్న మెను</translation>
@@ -3135,6 +3148,7 @@
 <translation id="5799508265798272974">Linux వర్చువల్ మెషీన్: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">గమ్యస్థానం ఫైల్ చివరి డౌన్‌లోడ్ తర్వాత కుదించబడింది లేదా తీసివేయబడింది.</translation>
 <translation id="5801568494490449797">ప్రాధాన్యతలు</translation>
+<translation id="5804175651771201311">రోమింగ్ ఆఫ్‌లో ఉంది</translation>
 <translation id="5804241973901381774">అనుమతులు</translation>
 <translation id="5805697420284793859">విండో మేనేజర్</translation>
 <translation id="5811750797187914944">అంతా ఒకే</translation>
@@ -3482,6 +3496,7 @@
 <translation id="6317318380444133405">ఇప్పుడు మద్దతు లేదు.</translation>
 <translation id="6317369057005134371">అప్లికేషన్ విండో కోసం వేచి ఉంది...</translation>
 <translation id="6318407754858604988">డౌన్‌లోడ్ ప్రారంభించబడింది</translation>
+<translation id="6318944945640833942">ప్రింటర్‌ను గుర్తించలేకపోయింది. దయచేసి ప్రింటర్ చిరునామాను మళ్లీ నమోదు చేయండి.</translation>
 <translation id="6322653941595359182">మీ Chromebook నుండి వచన సందేశాలను పంపండి మరియు స్వీకరించండి</translation>
 <translation id="6324916366299863871">షార్ట్‌కట్‌ను సవరించండి</translation>
 <translation id="6325191661371220117">ఆటో-లాంఛ్‌ను నిలిపివేయి</translation>
@@ -3738,6 +3753,7 @@
 <translation id="6725073593266469338">UI సేవ</translation>
 <translation id="6725206449694821596">ఇంటర్నెట్ ముద్రణ ప్రోటోకాల్ (IPP)</translation>
 <translation id="67269783048918309">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ, అలాగే పరికర, యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకి పంపుతుంది. ఇది మీ చిన్నారి గురించి గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్‌లకు, అలాగే Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. ఈ <ph name="BEGIN_LINK1" />సెట్టింగ్‌<ph name="END_LINK1" />ని యజమాని అమలు చేసారు. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ కార్యకలాపం సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">కనెక్ట్ చేయబడింది, <ph name="BATTERY_PERCENTAGE" />% బ్యాటరీ ఉంది</translation>
 <translation id="6732801395666424405">ప్రమాణపత్రాలు లోడ్ కాలేదు</translation>
 <translation id="6732900235521116609">షార్ట్‌కట్‌ను తొలగించలేరు</translation>
 <translation id="6735304988756581115">కుక్కీలు మరియు ఇతర సైట్ డేటాను చూపించు...</translation>
@@ -3830,6 +3846,7 @@
 <translation id="6876155724392614295">బైక్</translation>
 <translation id="6877460900831874810">లాక్ స్క్రీన్‌లో ఉన్నప్పుడు Chrome మీడియా ప్లేబ్యాక్‌ను అనుమతించు</translation>
 <translation id="6878422606530379992">సెన్సార్‌లు అనుమతించబడ్డాయి</translation>
+<translation id="6878665006737889642">మళ్లీ ఇన్‌స్టాల్ చేయడానికి ప్రయత్నించండి</translation>
 <translation id="6880587130513028875">ఈ పేజీపై చిత్రాలు నిరోధించబడ్డాయి.</translation>
 <translation id="6883319974225028188">అయ్యో!  పరికర కాన్ఫిగరేషన్‌ను సేవ్ చేయడంలో సిస్టమ్ విఫలమైంది.</translation>
 <translation id="6885771755599377173">సిస్టమ్ సమాచార ప్రివ్యూ</translation>
@@ -3998,6 +4015,7 @@
 <translation id="7120865473764644444">సింక్ సర్వర్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నిస్తోంది...</translation>
 <translation id="7121362699166175603">చిరునామా బార్‌లో చరిత్ర, స్వీయపూరింపులను తొలగిస్తుంది. మీ Google ఖాతా <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో ఇతర రూపాల్లో ఉన్న బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation>
 <translation id="7121389946694989825">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ, అలాగే పరికర, యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకి పంపుతుంది. ఇది మీ చిన్నారి గురించి గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్‌లకు, అలాగే Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ కార్యకలాపం సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">స్మార్ట్ డాష్‌లు</translation>
 <translation id="7123360114020465152">ఇకపై మద్దతు లేదు</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" />ని ముద్రిస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది</translation>
 <translation id="7127980134843952133">డౌన్‌లోడ్ చరిత్ర</translation>
@@ -4146,6 +4164,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> ఇప్పుడు పూర్తి స్క్రీన్‌లో కనిపిస్తుంది.</translation>
 <translation id="7340650977506865820">సైట్ మీ స్క్రీన్‌ను షేర్ చేస్తోంది</translation>
 <translation id="7341834142292923918">ఈ సైట్‌కు యాక్సెస్ కోరుతోంది</translation>
+<translation id="7344488796804562294">అధునాతన Kerberos కాన్ఫిగరేషన్</translation>
 <translation id="7345706641791090287">మీ పాస్‌వర్డ్‌ను నిర్ధారించండి</translation>
 <translation id="7346909386216857016">సరే, అర్థమైంది</translation>
 <translation id="7347751611463936647">ఈ ఎక్స్‌టెన్షన్‌ను ఉపయోగించడానికి, "<ph name="EXTENSION_KEYWORD" />", తర్వాత TAB, ఆపై మీ ఆదేశం లేదా శోధనను టైప్ చేయండి.</translation>
@@ -4753,6 +4772,7 @@
 <translation id="8227119283605456246">ఫైల్‌ను జోడించు</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌ని సేవ్ చేయాలా?</translation>
 <translation id="8234795456569844941">దయచేసి ఈ సమస్యను పరిష్కరించడంలో మా ఇంజినీర్‌లకు సహాయపడండి. ప్రొఫైల్ ఎర్రర్ సందేశం ఎదురయ్యే ముందు ఏమి జరిగిందో మాకు తెలియజేయండి:</translation>
+<translation id="8236917170563564587">బదులుగా, ఈ ట్యాబ్‌ను షేర్ చేయి</translation>
 <translation id="8241040075392580210">షేడీ</translation>
 <translation id="8241806945692107836">పరికర కాన్ఫిగరేషన్‌ను గుర్తిస్తోంది...</translation>
 <translation id="8241868517363889229">మీ బుక్‌మార్క్‌లను చదవడం మరియు మార్చడం</translation>
@@ -4764,6 +4784,7 @@
 <translation id="8249048954461686687">OEM ఫోల్డర్</translation>
 <translation id="8249615410597138718">మీ పరికరాలకు పంపండి</translation>
 <translation id="8249672078237421304">మీరు చదివే భాషలో లేని పేజీలను అనువదించే సౌలభ్యం</translation>
+<translation id="8251441930213048644">ఇప్పుడు రిఫ్రెష్ చేయి</translation>
 <translation id="8251578425305135684">సూక్ష్మచిత్రం తొలగించబడింది.</translation>
 <translation id="8252569384384439529">అప్‌లోడ్ చేస్తోంది...</translation>
 <translation id="8253198102038551905">నెట్‌వర్క్ లక్షణాలను పొందడానికి '+' క్లిక్ చేయండి</translation>
@@ -5142,6 +5163,7 @@
 <translation id="8827752199525959199">మరిన్ని చర్యలు, <ph name="DOMAIN" />లో <ph name="USERNAME" /> కోసం పాస్‌వర్డ్</translation>
 <translation id="882854468542856424">సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొనడానికి ఏ సైట్‌ను అనుమతించవద్దు</translation>
 <translation id="8828933418460119530">DNS పేరు</translation>
+<translation id="883062543841130884">ప్రత్యామ్నాయాలు</translation>
 <translation id="8830796635868321089">ప్రస్తుత ప్రాక్సీ సెట్టింగ్‌లను ఉపయోగించి అప్‌‌డేట్‌ను తనిఖీ చేయడం విఫలమైంది. దయచేసి మీ <ph name="PROXY_SETTINGS_LINK_START" />ప్రాక్సీ సెట్టింగ్‌ల<ph name="PROXY_SETTINGS_LINK_END" />ను సర్దుబాటు చేయండి.</translation>
 <translation id="8831664945713891930">ఎక్స్‌టెన్షన్‌ల సెట్టింగ్‌లను తెరవండి</translation>
 <translation id="8834039744648160717">నెట్‌వర్క్ కాన్ఫిగరేషన్‌ను <ph name="USER_EMAIL" /> నియంత్రిస్తున్నారు.</translation>
@@ -5162,6 +5184,7 @@
 <translation id="8862003515646449717">వేగవంతమైన బ్రౌజర్‌కు మారండి</translation>
 <translation id="8863753581171631212">కొత్త <ph name="APP" />లో లింక్‌ను తెరువు</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" />ను <ph name="APP_NAME" />కు షేర్ చేస్తోంది</translation>
+<translation id="8864458770072227512">ఈ పరికరం నుండి <ph name="EMAIL" /> తీసివేయబడింది</translation>
 <translation id="8868626022555786497">ఉపయోగంలో ఉంది</translation>
 <translation id="8870318296973696995">హోమ్ పేజీ</translation>
 <translation id="8870413625673593573">ఇటీవల మూసివేసినవి</translation>
@@ -5170,7 +5193,6 @@
 <translation id="8871974300055371298">కంటెంట్ సెట్టింగ్‌లు</translation>
 <translation id="8872155268274985541">చెల్లని కియోస్క్ బాహ్య అప్‌డేట్‌ మానిఫెస్ట్ ఫైల్ కనుగొనబడింది. కియోస్క్ యాప్‌ను అప్‌డేట్ చేయ‌డంలో విఫలమైంది. దయచేసి USB స్టిక్‌ను తీసివేయండి.</translation>
 <translation id="8874184842967597500">కనెక్ట్ చేయబడలేదు</translation>
-<translation id="887550310442005096">మీరు ఈ పరికరాన్ని అప్‌డేట్ చేయాల్సిందిగా మీ కంపెనీ లేదా సంస్థ మిమ్మల్ని కోరుతోంది</translation>
 <translation id="8876307312329369159">ఈ సెట్టింగ్‌ను డెమో సెషన్‌లో మార్చడం సాధ్యపడదు.</translation>
 <translation id="8877448029301136595">[పేరెంట్ డైరెక్టరీ]</translation>
 <translation id="8879284080359814990">&amp;ట్యాబ్ లాగా చూపండి</translation>
@@ -5285,6 +5307,7 @@
 <translation id="9044646465488564462">నెట్‌వర్క్‌కు కనెక్ట్ చేయడంలో విఫలమైంది: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">మీరు సంప్రదించడానికి ప్రయత్నిస్తున్న పేజీ యొక్క వెబ్ చిరునామాను Googleకి పంపుతుంది</translation>
 <translation id="9046895021617826162">కనెక్ట్ విఫలమైంది</translation>
+<translation id="9047391224416514812">ఈ వినియోగదారు పేరుతో ఇప్పటికే ఒక ఖాతా ఉంది</translation>
 <translation id="9050666287014529139">రహస్య పదబంధం</translation>
 <translation id="9052208328806230490">మీరు <ph name="EMAIL" /> ఖాతాను ఉపయోగించి <ph name="CLOUD_PRINT_NAME" />తో మీ ప్రింట‌ర్‌ల‌ను నమోదు చేశారు</translation>
 <translation id="9052404922357793350">బ్లాక్ చేయడాన్ని కొనసాగించు</translation>
@@ -5332,6 +5355,7 @@
 <translation id="9121814364785106365">పిన్ చేసిన టాబ్ లాగా తెరువు</translation>
 <translation id="9124003689441359348">సేవ్ చేసిన పాస్‌వర్డ్‌లు ఇక్కడ కనిపిస్తాయి</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ఉన్నాయి)</translation>
+<translation id="9128317794749765148">సెటప్‌ను పూర్తి చేయలేకపోయింది</translation>
 <translation id="9128870381267983090">నెట్‌వర్క్‌కి కనెక్ట్ చేయి</translation>
 <translation id="9130015405878219958">చెల్లని మోడ్ ఎంటర్ చేయ‌బడింది.</translation>
 <translation id="9131487537093447019">బ్లూటూత్ పరికరాలకు సందేశాలను పంపడానికి మరియు వాటి నుండి స్వీకరించడానికి అనుమతి.</translation>
@@ -5400,6 +5424,7 @@
 <translation id="939598580284253335">రహస్య పదబంధాన్ని నమోదు చేయండి</translation>
 <translation id="939736085109172342">క్రొత్త  ఫోల్డర్</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> ఒక Chrome ట్యాబ్‌ను మరియు ఆడియోను భాగస్వామ్యం చేస్తోంది.</translation>
+<translation id="945166830402967374">మీ సంస్థ నిర్వాహకులను సంప్రదించండి</translation>
 <translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation>
 <translation id="947329552760389097">&amp;మూలకాలను పర్యవేక్షించు</translation>
 <translation id="952992212772159698">సక్రియం చెయ్యబడలేదు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index ed6e369a..54d185668 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">เกิดปัญหาเกี่ยวกับใบอนุญาตของอุปกรณ์โหมดสาธิต</translation>
 <translation id="126710816202626562">ภาษาที่แปล:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">การกำหนดค่าขั้นสูง</translation>
 <translation id="1272079795634619415">หยุด</translation>
 <translation id="1272978324304772054">บัญชีผู้ใช้นี้ไม่ได้อยู่ในโดเมนที่ลงทะเบียนอุปกรณ์ ถ้าคุณต้องการลงทะเบียนไปยังโดเมนอื่น คุณจะต้องกู้คืนอุปกรณ์ก่อน</translation>
 <translation id="1274977772557788323">การตั้งค่าพื้นที่เก็บข้อมูล Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">เลือกไว้ <ph name="NUMBER_OF_ITEMS_SELECTED" /> รายการ</translation>
 <translation id="1444628761356461360"><ph name="OWNER_EMAIL" /> ซึ่งเป็นเจ้าของอุปกรณ์เป็นผู้จัดการการตั้งค่านี้</translation>
 <translation id="144518587530125858">ไม่สามารถโหลดธีมจาก "<ph name="IMAGE_PATH" />"</translation>
+<translation id="1445693676523799095">อาจใช้เวลาสักครู่</translation>
 <translation id="1451375123200651445">หน้าเว็บ ไฟล์เดียว</translation>
 <translation id="1451917004835509682">เพิ่มบุคคลภายใต้การดูแล</translation>
 <translation id="1454223536435069390">จับ&amp;ภาพหน้าจอ</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">ต้องเพิ่มจาก <ph name="CHROME_WEB_STORE" /> เท่านั้น</translation>
 <translation id="1877520246462554164">ไม่ได้รับโทเค็นการตรวจสอบสิทธิ์ โปรดออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้งเพื่อลองอีกครั้ง</translation>
 <translation id="1877860345998737529">การกำหนดการดำเนินการด้วยสวิตช์</translation>
+<translation id="1878541307036593717">สิทธิ์การตั้งค่า</translation>
 <translation id="1879000426787380528">ลงชื่อเข้าใช้ด้วย</translation>
 <translation id="1880905663253319515">ลบใบรับรอง "<ph name="CERTIFICATE_NAME" />" หรือไม่</translation>
 <translation id="1886996562706621347">อนุญาตให้ไซต์แจ้งขอเป็นเครื่องจัดการเริ่มต้นสำหรับโปรโตคอล (แนะนำ)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">เหลืออีก <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">ปิด</translation>
 <translation id="1895934970388272448">คุณต้องยืนยันการลงทะเบียนเครื่องพิมพ์ของคุณเพื่อให้ขั้นตอนนี้เสร็จสิ้น ตรวจสอบเลย</translation>
+<translation id="1899826437968063457">Plugin VM ต้องได้รับอนุญาตให้ทำงาน</translation>
 <translation id="1901303067676059328">เลือก&amp;ทั้งหมด</translation>
 <translation id="1902576642799138955">ระยะเวลาที่มีผลบังคับใช้</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{ซ่อนแท็บ}other{ซ่อนแท็บ}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">เซสชันไม่ระบุตัวตนปัจจุบัน (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">ส่วนหัวและส่วนท้ายกระดาษ</translation>
 <translation id="2322318151094136999">ถามเมื่อเว็บไซต์ต้องการเข้าถึงพอร์ตอนุกรม (แนะนำ)</translation>
+<translation id="2325444234681128157">จำรหัสผ่าน</translation>
 <translation id="2326931316514688470">โ&amp;หลดแอปซ้ำ</translation>
 <translation id="2327492829706409234">เปิดใช้งานแอปพลิเคชัน</translation>
 <translation id="2329597144923131178">ลงชื่อเข้าใช้เพื่อรับบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ ในอุปกรณ์ทั้งหมด</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">เพิ่มพารามิเตอร์ข้อความค้นหาใน URL เพื่อรีเฟรชหน้าอัตโนมัติ: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">ลักษณะที่ปรากฏ</translation>
 <translation id="2433836460518180625">ปลดล็อกอุปกรณ์เท่านั้น</translation>
+<translation id="2434449159125086437">ตั้งค่าเครื่องพิมพ์ไม่ได้ โปรดตรวจสอบการกำหนดค่าแล้วลองอีกครั้ง</translation>
 <translation id="2435248616906486374">เครือข่ายถูกตัดการเชื่อมต่อ</translation>
 <translation id="2435457462613246316">แสดงรหัสผ่าน</translation>
 <translation id="2436186046335138073">อนุญาตให้ <ph name="HANDLER_HOSTNAME" /> เปิดลิงก์ <ph name="PROTOCOL" /> ทั้งหมดไหม</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64-encoded ASCII, กลุ่มใบรับรอง (Certificate Chain)</translation>
 <translation id="2653033005692233957">การค้นหาไม่สำเร็จ</translation>
 <translation id="2653266418988778031">หากคุณลบใบรับรองของผู้ออกใบรับรอง (CA) เบราว์เซอร์ของคุณจะไม่เชื่อถือใบรับรองใดที่ออกโดย CA นั้นอีกต่อไป</translation>
+<translation id="2653275834716714682">การแทนที่ข้อความ</translation>
 <translation id="2653659639078652383">ส่ง</translation>
 <translation id="265390580714150011">ค่าฟิลด์ </translation>
 <translation id="2654166010170466751">อนุญาตให้เว็บไซต์ติดตั้งเครื่องจัดการการชำระเงิน</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">เว็บเบราว์เซอร์ที่รวดเร็ว ใช้งานง่าย และปลอดภัย สร้างขึ้นมาเพื่อเว็บสมัยใหม่</translation>
 <translation id="2949289451367477459">ใช้ตำแหน่ง อนุญาตแอปและบริการที่มีสิทธิ์เข้าถึงตำแหน่งให้ใช้ตำแหน่งของอุปกรณ์นี้ Google อาจรวบรวมข้อมูลตำแหน่งเป็นระยะและใช้ข้อมูลนี้ในแบบไม่ระบุตัวตนเพื่อปรับปรุงความแม่นยำของตำแหน่งและบริการที่อ้างอิงตำแหน่ง <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">คำเตือนเกี่ยวกับการรวมแพ็กเกจส่วนขยาย</translation>
+<translation id="2959842337402130152">นำเข้าไม่ได้เนื่องจากมีพื้นที่เก็บข้อมูลไม่เพียงพอ เพิ่มพื้นที่ว่าง <ph name="SPACE_REQUIRED" /> ในอุปกรณ์แล้วลองอีกครั้ง</translation>
 <translation id="296026337010986570">เสร็จแล้ว! นำซอฟต์แวร์ที่เป็นอันตรายออกแล้ว หากต้องการเปิดส่วนขยายอีกครั้ง โปรดไปที่&lt;a href="chrome://extensions"&gt;ส่วนขยาย&lt;/a&gt;</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (มีส่วนขยายให้มาด้วย)</translation>
 <translation id="2961695502793809356">คลิกเพื่อไปข้างหน้า กดค้างเพื่อดูประวัติการเข้าชม</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">การเปิดใช้งานเสร็จสมบูรณ์</translation>
 <translation id="3454213325559396544">นี่เป็นการอัปเดตซอฟต์แวร์และความปลอดภัยอัตโนมัติครั้งสุดท้ายสำหรับ <ph name="DEVICE_TYPE" /> เครื่องนี้ โปรดอัปเกรดเป็นรุ่นที่ใหม่กว่าเพื่อรับการอัปเดตในอนาคต</translation>
 <translation id="345693547134384690">เปิด&amp;รูปภาพในแท็บใหม่</translation>
-<translation id="3457500881955698515">บริษัทหรือองค์กรของคุณกำหนดให้อัปเดตอุปกรณ์นี้ทันที</translation>
 <translation id="3459509316159669723">การพิมพ์</translation>
 <translation id="3459697287128633276">หากต้องการเปิดใช้การเข้าถึง Google Play Store ให้แก่บัญชี โปรดใช้ผู้ให้บริการข้อมูลประจำตัวเพื่อตรวจสอบสิทธิ์ของคุณ</translation>
 <translation id="3459774175445953971">ปรับปรุงล่าสุด:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">เลือกโฟลเดอร์อื่น...</translation>
 <translation id="3967822245660637423">ดาวน์โหลดเสร็จสมบูรณ์</translation>
 <translation id="3967919079500697218">ความสามารถในการบันทึกภาพหน้าจอถูกปิดใช้โดยผู้ดูแลระบบ</translation>
+<translation id="3969092967100188979">เปิด โรมมิ่ง</translation>
 <translation id="3970114302595058915">รหัส</translation>
 <translation id="397105322502079400">กำลังคำนวณ...</translation>
 <translation id="3975565978598857337">ติดต่อเซิร์ฟเวอร์ของขอบเขตไม่สำเร็จ</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">ลายนิ้วมือที่บันทึกไว้</translation>
 <translation id="407173827865827707">เมื่อคลิก</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{เลิกตรึงแท็บ}other{เลิกตรึงแท็บ}}</translation>
+<translation id="4072805772816336153">ลองอีกครั้งภายหลัง</translation>
 <translation id="4074900173531346617">ใบรับรองผู้เซ็นชื่อในอีเมล</translation>
 <translation id="407520071244661467">ปรับขนาด</translation>
 <translation id="4075639477629295004">ไม่สามารถแคสต์ <ph name="FILE_NAME" /></translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">ขนาดใหญ่</translation>
 <translation id="4209251085232852247">ปิดอยู่</translation>
 <translation id="4209464433672152343">เอกสารจะ<ph name="BEGIN_LINK_HELP" />ส่งไปยัง Google<ph name="END_LINK_HELP" /> เพื่อเตรียมพิมพ์ ดู แก้ไข และจัดการเครื่องพิมพ์และประวัติการพิมพ์ได้ใน<ph name="BEGIN_LINK_DASHBOARD" />แดชบอร์ด Google Cloud Print<ph name="END_LINK_DASHBOARD" /></translation>
+<translation id="4210048056321123003">กำลังดาวน์โหลดเครื่องเสมือน</translation>
 <translation id="421182450098841253">&amp;แสดงแถบบุ๊กมาร์ก</translation>
 <translation id="4211851069413100178">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของคุณให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ ซึ่งจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android เจ้าของเป็นผู้บังคับใช้<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้ เจ้าของอาจเลือกที่จะส่งข้อมูลการวินิจฉัยและการใช้งานสำหรับอุปกรณ์นี้ไปยัง Google หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปไว้ ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของคุณ <ph name="BEGIN_LINK2" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">ส่งออก</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">เมลอน</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> กำลังแชร์หน้าต่าง</translation>
 <translation id="4364830672918311045">แสดงการแจ้งเตือน</translation>
-<translation id="4365673000813822030">อ๊ะ การซิงค์หยุดทำงาน</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" />ด้วย <ph name="APP_NAME" /></translation>
 <translation id="4370975561335139969">อีเมลและรหัสผ่านที่คุณป้อนไม่ตรงกัน</translation>
 <translation id="437184764829821926">การตั้งค่าแบบอักษรขึ้นสูง</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">กำลังเชื่อมต่อ...</translation>
 <translation id="4378556263712303865">ข้อกำหนดของอุปกรณ์</translation>
 <translation id="4380648069038809855">เข้าสู่โหมดเต็มหน้าจอ</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> และอีกอย่างน้อย 1 บัญชี}other{<ph name="EMAIL" /> และอีกอย่างน้อย <ph name="EXTRA_ACCOUNTS" /> บัญชี}}</translation>
 <translation id="4384312707950789900">เพิ่มไปยังเครือข่ายที่ต้องการ</translation>
 <translation id="4384652540891215547">เปิดใช้งานส่วนขยาย</translation>
 <translation id="438503109373656455">ซาราโทกะ</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">คุณมีใบรับรองของไฟล์ซึ่งระบุตัวตนของเซิร์ฟเวอร์เหล่านี้:</translation>
 <translation id="4598556348158889687">การจัดการพื้นที่เก็บข้อมูล</translation>
 <translation id="4598776695426288251">มี Wi-Fi พร้อมใช้งานผ่านอุปกรณ์หลายเครื่อง</translation>
+<translation id="4599134080475764833">Plugin VM พร้อมใช้งานแล้ว</translation>
 <translation id="4602466770786743961">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องและไมโครโฟนของคุณเสมอ</translation>
 <translation id="4608500690299898628">&amp;ค้นหา...</translation>
 <translation id="4608520674724523647">ภาพการลงทะเบียนสำเร็จ</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">แชร์บุ๊กมาร์กนี้กับ iPhone ของคุณ</translation>
 <translation id="4663373278480897665">อนุญาตให้ใช้กล้องถ่ายรูป</translation>
 <translation id="4664482161435122549">ข้อผิดพลาดในการส่งออก PKCS #12</translation>
+<translation id="4664736447097490764">แก้ไขไฟล์การกำหนดค่า Kerberos ที่นี่</translation>
 <translation id="4665014895760275686">ผู้ผลิต</translation>
 <translation id="4665446389743427678">ระบบจะลบข้อมูลทั้งหมดที่ <ph name="SITE" /> จัดเก็บไว้</translation>
 <translation id="4668721319092543482">คลิกเพื่อเปิดใช้ <ph name="PLUGIN_NAME" /></translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">กำลังติดตั้งอัปเดตระบบปฏิบัติการ</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ของคุณไม่สามารถเชื่อมต่ออินเทอร์เน็ตโดยใช้ <ph name="NETWORK_NAME" /> โปรดเลือกเครือข่ายอื่น <ph name="LEARN_MORE_LINK_START" />ดูข้อมูลเพิ่มเติม<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome ไม่มีสิทธิ์เข้าถึงทรัพยากรที่ขอ</translation>
-<translation id="4835836146030131423">เกิดข้อผิดพลาดในการลงชื่อเข้าใช้</translation>
 <translation id="4837926214103741331">คุณไม่ได้รับอนุญาตให้ใช้อุปกรณ์นี้ โปรดติดต่อเจ้าของอุปกรณ์เพื่อขออนุญาตลงชื่อเข้าใช้</translation>
 <translation id="4837952862063191349">หากต้องการปลดล็อกและกู้คืนข้อมูลในเครื่อง โปรดป้อนรหัสผ่านเก่าของ <ph name="DEVICE_TYPE" /></translation>
 <translation id="4838836835474292213">อนุญาตการเข้าถึงการอ่านคลิปบอร์ด</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">ล้างสำเนา</translation>
 <translation id="5030338702439866405">ออกโดย</translation>
 <translation id="5033266061063942743">รูปทรงเรขาคณิต</translation>
-<translation id="5033619151015094114">บริษัทหรือองค์กรของคุณกำหนดให้อัปเดตอุปกรณ์นี้</translation>
 <translation id="503498442187459473"><ph name="HOST" /> ต้องการใช้กล้องถ่ายรูปและไมโครโฟนของคุณ</translation>
 <translation id="5036662165765606524">ไม่อนุญาตให้ไซต์ใดๆ ทำการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติ</translation>
 <translation id="5037676449506322593">เลือก&amp;ทั้งหมด</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">ลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="5256861893479663409">ในเว็บไซต์ทั้งหมด</translation>
 <translation id="5258992782919386492">ติดตั้งในอุปกรณ์นี้</translation>
+<translation id="5260334392110301220">เครื่องหมายคำพูดอัจฉริยะ</translation>
 <translation id="5260508466980570042">ขออภัย ไม่สามารถยืนยันอีเมลหรือรหัสผ่านของคุณได้ โปรดลองอีกครั้ง</translation>
 <translation id="5261683757250193089">เปิดในเว็บสโตร์</translation>
 <translation id="5264148714798105376">อาจใช้เวลาประมาณ 1 นาที</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">เข้าสู่ระบบในฐานะผู้มาเยือน</translation>
 <translation id="5301954838959518834">ตกลง เข้าใจแล้ว</translation>
 <translation id="5302048478445481009">ภาษา </translation>
+<translation id="5302932258331363306">แสดงการใช้แทน</translation>
 <translation id="5305688511332277257">ไม่มีการติดตั้ง</translation>
 <translation id="5307030433605830021">ไม่รองรับแหล่งที่มา</translation>
 <translation id="5308380583665731573">เชื่อมต่อ</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">ไม่ถูกต้อง</translation>
 <translation id="5457459357461771897">อ่านและลบรูปภาพ เพลง และสื่ออื่นๆ จากคอมพิวเตอร์ของคุณ</translation>
 <translation id="5457599981699367932">ท่องเว็บในฐานะผู้มาเยือน</translation>
+<translation id="5457991019809708398">เปิด ไม่ได้โรมมิ่ง</translation>
 <translation id="5458998536542739734">โน้ตในหน้าจอล็อก</translation>
 <translation id="5463275305984126951">ดัชนีของ <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">เมนูมีบุ๊กมาร์กซ่อนอยู่</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">เครื่องเสมือนของ Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">ไฟล์ปลายทางไม่สมบูรณ์หรือถูกลบไปตั้งแต่การดาวน์โหลดครั้งล่าสุด</translation>
 <translation id="5801568494490449797">ค่ากำหนด</translation>
+<translation id="5804175651771201311">ปิดโรมมิ่ง</translation>
 <translation id="5804241973901381774">การอนุญาต</translation>
 <translation id="5805697420284793859">ตัวจัดการหน้าต่าง</translation>
 <translation id="5811750797187914944">ตั้งค่าเรียบร้อย</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">ไม่รองรับแล้ว</translation>
 <translation id="6317369057005134371">กำลังรอหน้าต่างแอปพลิเคชัน...</translation>
 <translation id="6318407754858604988">เริ่มดาวน์โหลดแล้ว</translation>
+<translation id="6318944945640833942">ไม่พบเครื่องพิมพ์ โปรดป้อนที่อยู่เครื่องพิมพ์อีกครั้ง</translation>
 <translation id="6322653941595359182">ส่งและรับข้อความจาก Chromebook</translation>
 <translation id="6324916366299863871">แก้ไขทางลัด</translation>
 <translation id="6325191661371220117">ปิดใช้งานการเรียกใช้อัตโนมัติ</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">บริการ UI</translation>
 <translation id="6725206449694821596">โปรโตคอลการพิมพ์ผ่านอินเทอร์เน็ต (IPP)</translation>
 <translation id="67269783048918309">ส่งข้อมูลการใช้งานและการวินิจฉัย ปัจจุบันอุปกรณ์นี้ส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android เจ้าของเป็นผู้บังคับใช้<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้ หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK2" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">เชื่อมต่อแล้ว แบตเตอรี่ <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6732801395666424405">ยังไม่ได้โหลดใบรับรอง</translation>
 <translation id="6732900235521116609">นำทางลัดออกไม่ได้</translation>
 <translation id="6735304988756581115">แสดงคุกกี้และข้อมูลอื่นของไซต์...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">จักรยาน</translation>
 <translation id="6877460900831874810">เปิดใช้การเล่นสื่อใน Chrome บนหน้าจอล็อก</translation>
 <translation id="6878422606530379992">อนุญาตให้ใช้เซ็นเซอร์</translation>
+<translation id="6878665006737889642">ลองติดตั้งอีกครั้ง</translation>
 <translation id="6880587130513028875">หน้าเว็บนี้บล็อกการแสดงภาพ</translation>
 <translation id="6883319974225028188">อ๊ะ! ระบบไม่สามารถบันทึกการกำหนดค่าอุปกรณ์</translation>
 <translation id="6885771755599377173">ดูตัวอย่างข้อมูลระบบ</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์การซิงค์ได้ กำลังลองใหม่...</translation>
 <translation id="7121362699166175603">ล้างประวัติการเข้าชมและการเติมข้อความอัตโนมัติในแถบที่อยู่เว็บ บัญชี Google อาจมีประวัติการท่องเว็บรูปแบบอื่นๆ ที่ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation>
 <translation id="7121389946694989825">ส่งข้อมูลการใช้งานและการวินิจฉัย ปัจจุบันอุปกรณ์นี้ส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">เครื่องหมายขีดกลางอัจฉริยะ</translation>
 <translation id="7123360114020465152">ไม่รองรับแล้ว</translation>
 <translation id="7124929488592184705">เกิดข้อผิดพลาดขณะพิมพ์ <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">ประวัติการดาวน์โหลด</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> แสดงแบบเต็มหน้าจออยู่</translation>
 <translation id="7340650977506865820">เว็บไซต์กำลังแชร์หน้าจอของคุณ</translation>
 <translation id="7341834142292923918">ต้องการเข้าถึงเว็บไซต์นี้</translation>
+<translation id="7344488796804562294">การกำหนดค่า Kerberos ขั้นสูง</translation>
 <translation id="7345706641791090287">ยืนยันรหัสผ่าน</translation>
 <translation id="7346909386216857016">รับทราบ</translation>
 <translation id="7347751611463936647">ในการใช้ส่วนขยายนี้ ให้พิมพ์ "<ph name="EXTENSION_KEYWORD" />" แล้วกด TAB ตามด้วยคำสั่งหรือการค้นหาของคุณ</translation>
@@ -4758,6 +4777,7 @@
 <translation id="8227119283605456246">แนบไฟล์</translation>
 <translation id="8230134520748321204">บันทึกรหัสผ่านสำหรับ <ph name="ORIGIN" /> ไหม</translation>
 <translation id="8234795456569844941">โปรดช่วยวิศวกรของเราแก้ปัญหานี้ แจ้งให้เราทราบถึงสิ่งที่เกิดขึ้นก่อนที่คุณจะได้รับข้อความแสดงข้อผิดพลาดของโปรไฟล์</translation>
+<translation id="8236917170563564587">แชร์แท็บนี้แทน</translation>
 <translation id="8241040075392580210">เชดดี้</translation>
 <translation id="8241806945692107836">กำลังกำหนดการกำหนดค่าอุปกรณ์...</translation>
 <translation id="8241868517363889229">อ่านและเปลี่ยนแปลงบุ๊กมาร์กของคุณ</translation>
@@ -4769,6 +4789,7 @@
 <translation id="8249048954461686687">โฟลเดอร์ OEM</translation>
 <translation id="8249615410597138718">ส่งไปยังอุปกรณ์</translation>
 <translation id="8249672078237421304">เสนอให้แปลหน้าที่ไม่ได้อยู่ในภาษาที่คุณอ่านได้</translation>
+<translation id="8251441930213048644">รีเฟรชเลย</translation>
 <translation id="8251578425305135684">รูปภาพขนาดย่อถูกลบแล้ว</translation>
 <translation id="8252569384384439529">กำลังอัปโหลด...</translation>
 <translation id="8253198102038551905">คลิก "+" เพื่อดูคุณสมบัติของเครือข่าย</translation>
@@ -5146,6 +5167,7 @@
 <translation id="8827752199525959199">การดำเนินการอื่นๆ รหัสผ่านของ <ph name="USERNAME" /> ใน <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">ไม่อนุญาตให้เว็บไซต์ค้นหาอุปกรณ์บลูทูธใกล้เคียง</translation>
 <translation id="8828933418460119530">ชื่อ DNS</translation>
+<translation id="883062543841130884">การใช้แทน</translation>
 <translation id="8830796635868321089">ไม่สามารถตรวจหาการอัปเดตโดยใช้การตั้งค่าพร็อกซีปัจจุบัน โปรดปรับ<ph name="PROXY_SETTINGS_LINK_START" />การตั้งค่าพร็อกซี<ph name="PROXY_SETTINGS_LINK_END" /></translation>
 <translation id="8831664945713891930">เปิดการตั้งค่าส่วนขยาย</translation>
 <translation id="8834039744648160717">การกำหนดค่าเครือข่ายควบคุมโดย <ph name="USER_EMAIL" /></translation>
@@ -5166,6 +5188,7 @@
 <translation id="8862003515646449717">เปลี่ยนเป็นเบราว์เซอร์ที่เร็ว</translation>
 <translation id="8863753581171631212">เปิดลิงก์ใน <ph name="APP" /> ใหม่</translation>
 <translation id="8864055848767439877">กำลังแชร์ <ph name="TAB_NAME" /> กับ <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512">นำ <ph name="EMAIL" /> ออกจากอุปกรณ์นี้แล้ว</translation>
 <translation id="8868626022555786497">ใช้งานอยู่</translation>
 <translation id="8870318296973696995">หน้าแรก</translation>
 <translation id="8870413625673593573">เพิ่งปิด</translation>
@@ -5174,7 +5197,6 @@
 <translation id="8871974300055371298">การตั้งค่าเนื้อหา</translation>
 <translation id="8872155268274985541">พบไฟล์ Manifest การอัปเดตภายนอกของคีออสก์ที่ไม่ถูกต้อง ไม่สามารถอัปเดตแอปคีออสก์ได้ โปรดนำ USB สติ๊กออก</translation>
 <translation id="8874184842967597500">ไม่ได้เชื่อมต่อ</translation>
-<translation id="887550310442005096">บริษัทหรือองค์กรของคุณขอให้อัปเดตอุปกรณ์นี้</translation>
 <translation id="8876307312329369159">คุณเปลี่ยนการตั้งค่านี้ในเซสชันสาธิตไม่ได้</translation>
 <translation id="8877448029301136595">[ไดเรกทอรีหลัก]</translation>
 <translation id="8879284080359814990">แ&amp;สดงเป็นแถบ</translation>
@@ -5289,6 +5311,7 @@
 <translation id="9044646465488564462">ไม่สามารถเชื่อมต่อเครือข่าย: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">ส่งที่อยู่เว็บของหน้าที่คุณพยายามเข้าถึงให้กับ Google</translation>
 <translation id="9046895021617826162">การเชื่อมต่อล้มเหลว</translation>
+<translation id="9047391224416514812">มีบัญชีที่ใช้ชื่อผู้ใช้นี้แล้ว</translation>
 <translation id="9050666287014529139">ข้อความรหัสผ่าน</translation>
 <translation id="9052208328806230490">คุณได้ลงทะเบียนเครื่องพิมพ์กับ <ph name="CLOUD_PRINT_NAME" /> โดยใช้บัญชี <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">บล็อกต่อไป</translation>
@@ -5336,6 +5359,7 @@
 <translation id="9121814364785106365">เปิดเป็นแท็บที่ปักหมุดไว้</translation>
 <translation id="9124003689441359348">รหัสผ่านที่บันทึกไว้จะแสดงที่นี่</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (เหลือ <ph name="LICENSE_COUNT" /> รายการ)</translation>
+<translation id="9128317794749765148">ตั้งค่าไม่สำเร็จ</translation>
 <translation id="9128870381267983090">เชื่อมต่อกับเครือข่าย</translation>
 <translation id="9130015405878219958">โหมดที่ป้อนไม่ถูกต้อง</translation>
 <translation id="9131487537093447019">ส่งข้อความถึงและรับข้อความจากอุปกรณ์บลูทูธ</translation>
@@ -5404,6 +5428,7 @@
 <translation id="939598580284253335">ป้อนข้อความรหัสผ่าน</translation>
 <translation id="939736085109172342">โฟลเดอร์ใหม่</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> กำลังแชร์แท็บและเสียงใน Chrome</translation>
+<translation id="945166830402967374">โปรดติดต่อผู้ดูแลระบบอุปกรณ์ขององค์กร</translation>
 <translation id="945522503751344254">ส่งความคิดเห็น</translation>
 <translation id="947329552760389097">&amp;ตรวจสอบองค์ประกอบ</translation>
 <translation id="952992212772159698">ไม่ได้เปิดการใช้งาน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index db004d9..dcf99f9 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Demo modu cihaz lisanslarıyla ilgili bir sorun oluştu.</translation>
 <translation id="126710816202626562">Çeviri dili:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Gelişmiş yapılandırma</translation>
 <translation id="1272079795634619415">Durdur</translation>
 <translation id="1272978324304772054">Bu kullanıcı hesabı, cihazın kaydedildiği alan adına ait değil. Farklı bir alan adına kaydolmak istiyorsanız, öncelikle cihaz kurtarma işlemini tamamlamanız gerekir.</translation>
 <translation id="1274977772557788323">Adobe Flash Player Depolama ayarları</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> öğe seçildi</translation>
 <translation id="1444628761356461360">Bu ayar, cihaz sahibi <ph name="OWNER_EMAIL" /> tarafından yönetiliyor.</translation>
 <translation id="144518587530125858">Temaya ilişkin '<ph name="IMAGE_PATH" />' yolu yüklenemedi.</translation>
+<translation id="1445693676523799095">Bu işlem biraz zaman alabilir</translation>
 <translation id="1451375123200651445">Web Sayfası, Tek Dosya</translation>
 <translation id="1451917004835509682">Denetlenen Kişi Ekle</translation>
 <translation id="1454223536435069390">Ekr&amp;an görüntüsü al</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">Bu yalnızca <ph name="CHROME_WEB_STORE" /> kullanılarak eklenebilir</translation>
 <translation id="1877520246462554164">Kimlik doğrulama jetonu alınamadı. Tekrar denemek için lütfen oturumu kapatıp sonra yeniden oturum açın.</translation>
 <translation id="1877860345998737529">Anahtar işlem görevi</translation>
+<translation id="1878541307036593717">İzinleri ayarla</translation>
 <translation id="1879000426787380528">Farklı kullanıcı olarak oturum açın</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" sertifikası silinsin mi?</translation>
 <translation id="1886996562706621347">Sitelerin, protokoller için varsayılan işleyiciler olmasını sormasına izin ver (önerilir)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738"><ph name="TIME_LEFT" /> kaldı</translation>
 <translation id="1895658205118569222">Kapat</translation>
 <translation id="1895934970388272448">Bu işlemi tamamlamak için yazıcınızda kaydı onaylamalısınız; şimdi kontrol edin.</translation>
+<translation id="1899826437968063457">Eklenti sanal makinesinin çalışmak için izne ihtiyacı var</translation>
 <translation id="1901303067676059328">Tümünü &amp;seç</translation>
 <translation id="1902576642799138955">Geçerlilik Süresi</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Sekmenin sesini kapat}other{Sekmelerin sesini kapat}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Geçerli gizli oturum (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Üstbilgiler ve altbilgiler</translation>
 <translation id="2322318151094136999">Bir site seri bağlantı noktasına erişmek istediğinde sor (önerilir)</translation>
+<translation id="2325444234681128157">Şifreyi hatırla</translation>
 <translation id="2326931316514688470">&amp;Uygulamayı yeniden yükle</translation>
 <translation id="2327492829706409234">Uygulamayı etkinleştir</translation>
 <translation id="2329597144923131178">Yer işaretlerinize, geçmişinize ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için oturum açın.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Sayfayı otomatik olarak yenilemek için URL'ye bir sorgu parametresi ekleyin: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Görünüm</translation>
 <translation id="2433836460518180625">Yalnızca cihazın kilidini aç</translation>
+<translation id="2434449159125086437">Yazıcı kurulamıyor. Lütfen yapılandırmayı kontrol edip tekrar deneyin.</translation>
 <translation id="2435248616906486374">Ağ bağlantısı kesildi</translation>
 <translation id="2435457462613246316">Şifreyi göster</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> ana makinesinin tüm <ph name="PROTOCOL" /> bağlantılarını açmasına izin verilsin mi?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">Base64 kodlu ASCII, sertifika zinciri</translation>
 <translation id="2653033005692233957">Arama başarısız oldu</translation>
 <translation id="2653266418988778031">Bir Sertifika Yetkilisi (CA) sertifikasını silerseniz, tarayıcınız bundan sonra söz konusu CA tarafından yayınlanan hiçbir sertifikaya güvenmez.</translation>
+<translation id="2653275834716714682">Metin Değiştirme</translation>
 <translation id="2653659639078652383">Gönder</translation>
 <translation id="265390580714150011">Alan Değeri</translation>
 <translation id="2654166010170466751">Sitelerin ödeme işleyici yüklemesine izin ver</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Modern web için geliştirilmiş hızlı, basit ve güvenli bir web tarayıcısı.</translation>
 <translation id="2949289451367477459">Konum bilgilerini kullan. Konum izinleri olan uygulama ve hizmetlerin bu cihazın konumunu kullanmasına izin verin. Google, konum verilerini düzenli olarak toplayabilir ve konum doğruluğu ile konuma dayalı hizmetleri iyileştirmek için bu verileri anonim bir şekilde kullanabilir. <ph name="BEGIN_LINK1" />Daha Fazla Bilgi<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Uzantı paketleme uyarısı</translation>
+<translation id="2959842337402130152">Depolama alanı olmadığı için geri yüklenemiyor. Cihazda <ph name="SPACE_REQUIRED" /> yer açıp tekrar deneyin.</translation>
 <translation id="296026337010986570">Bitti! Zararlı yazılım kaldırıldı. Uzantıları tekrar açmak için &lt;a href="chrome://extensions"&gt;Uzantılar&lt;/a&gt; sayfasını ziyaret edin.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (süresi uzatıldı)</translation>
 <translation id="2961695502793809356">İlerlemek için tıkla, geçmişi görmek için tıklayıp tut</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">Etkinleştirme tamamlandı</translation>
 <translation id="3454213325559396544">Bu, <ph name="DEVICE_TYPE" /> için son otomatik yazılım ve güvenlik güncellemesidir. Gelecekteki güncellemeleri almak için daha yeni bir sürüme geçin.</translation>
 <translation id="345693547134384690">Resm&amp;i yeni sekmede aç</translation>
-<translation id="3457500881955698515">Şirketiniz veya kuruluşunuz bu cihazı hemen güncellemenizi gerektiriyor</translation>
 <translation id="3459509316159669723">Yazdırma</translation>
 <translation id="3459697287128633276">Hesabınızın Google Play Store'a erişmesini sağlamak için lütfen Kimlik Sağlayıcınızı kullanarak kimliğinizi doğrulayın.</translation>
 <translation id="3459774175445953971">Son değiştirildiği tarih:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">Başka bir klasör seçin...</translation>
 <translation id="3967822245660637423">İndirme tamamlandı</translation>
 <translation id="3967919079500697218">Ekran görüntüsü alabilme işlevi yöneticiniz tarafından devre dışı bırakılmıştır.</translation>
+<translation id="3969092967100188979">Açık, dolaşımda</translation>
 <translation id="3970114302595058915">Kimlik</translation>
 <translation id="397105322502079400">Hesaplanııyor...</translation>
 <translation id="3975565978598857337">Alanın sunucusuyla iletişim kurulamadı</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">Kayıtlı parmak izleri</translation>
 <translation id="407173827865827707">Tıklandığında</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Sekmenin sabitlemesini kaldır}other{Sekmelerin sabitlemesini kaldır}}</translation>
+<translation id="4072805772816336153">Daha sonra tekrar deneyin</translation>
 <translation id="4074900173531346617">E-posta İmza Sahibi Sertifikası</translation>
 <translation id="407520071244661467">Ölçek</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" /> yayınlanamıyor.</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">Büyük</translation>
 <translation id="4209251085232852247">Kapatıldı</translation>
 <translation id="4209464433672152343">Dokümanlar yazdırılmaya hazırlanmaları için <ph name="BEGIN_LINK_HELP" />Google'a gönderilir<ph name="END_LINK_HELP" />. Yazıcılarınızı ve yazıcı geçmişinizi <ph name="BEGIN_LINK_DASHBOARD" />Google Cloud Print kontrol panelinde<ph name="END_LINK_DASHBOARD" /> görüntüleyebilir, düzenleyebilir ve yönetebilirsiniz.</translation>
+<translation id="4210048056321123003">Sanal makine indiriliyor</translation>
 <translation id="421182450098841253">Yer İşaretleri Ç&amp;ubuğunu Göster</translation>
 <translation id="4211851069413100178">Kullanım ve teşhis verilerini gönder. Teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a göndererek Android deneyiminizin iyileştirilmesine yardımcı olun. Bu veriler, sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" />, cihazın sahibi tarafından zorunlu kılınmıştır. Cihazın sahibi bu cihazın teşhis ve kullanım verilerini Google'a göndermeyi seçebilir. Ek Web ve Uygulama Etkinliği açıksa bu veriler Google hesabınıza kaydedilebilir. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Dışa Aktar</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">Kavun</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, bir pencereyi paylaşıyor.</translation>
 <translation id="4364830672918311045">Bildirimleri görüntüleme</translation>
-<translation id="4365673000813822030">Hata, Senkronizasyonun çalışması durdu.</translation>
 <translation id="4366956553771076218"><ph name="APP_NAME" /> ile <ph name="ACTION_NAME" />.</translation>
 <translation id="4370975561335139969">Girdiğiniz e-posta ve şifre eşleşmiyor</translation>
 <translation id="437184764829821926">Gelişmiş yazı tipi ayarları</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">Bağlanıyor...</translation>
 <translation id="4378556263712303865">Cihaz talebi</translation>
 <translation id="4380648069038809855">Tam ekrana girildi</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 hesap daha}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> hesap daha}}</translation>
 <translation id="4384312707950789900">Tercih edilenlere ekle</translation>
 <translation id="4384652540891215547">Uzantıyı etkinleştir</translation>
 <translation id="438503109373656455">Şimşek</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">Dosyada şu sunucuları tanımlayan sertifikalarınız var</translation>
 <translation id="4598556348158889687">Depolama alanı yönetimi</translation>
 <translation id="4598776695426288251">Kablosuz bağlantı çeşitli cihazlar üzerinden kullanılabilir</translation>
+<translation id="4599134080475764833">Eklenti sanal makinesi kullanıma hazır</translation>
 <translation id="4602466770786743961"><ph name="HOST" /> sitesinin kamerama ve mikrofonuma erişmesine her zaman izin ver</translation>
 <translation id="4608500690299898628">&amp;Bul...</translation>
 <translation id="4608520674724523647">Başarılı kayıt resmi</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">Bu yer işaretini iPhone'unuzla paylaşın</translation>
 <translation id="4663373278480897665">Kameraya izin veriliyor</translation>
 <translation id="4664482161435122549">PKCS #12 Dışa Aktarma Hatası</translation>
+<translation id="4664736447097490764">Kerberos yapılandırma dosyasını burada düzenleyin.</translation>
 <translation id="4665014895760275686">Üretici</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> web sitesinin depoladığı tüm veriler silinecektir.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> eklentisini etkinleştirmek için tıklayın</translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">OS güncellemesini yükleyin</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> cihazınız <ph name="NETWORK_NAME" /> ile İnternet'e bağlanamıyor. Lütfen başka bir ağ seçin. <ph name="LEARN_MORE_LINK_START" />Daha fazla bilgi edinin<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome, istenen kaynağa erişemiyor.</translation>
-<translation id="4835836146030131423">Oturum açma hatası.</translation>
 <translation id="4837926214103741331">Bu cihazı kullanma yetkiniz yok. Oturum açma izni almak için lütfen cihaz sahibiyle iletişime geçin.</translation>
 <translation id="4837952862063191349">Kilidi açmak ve yerel verilerinizi geri yüklemek için lütfen eski <ph name="DEVICE_TYPE" /> şifrenizi girin.</translation>
 <translation id="4838836835474292213">Pano okuma erişimine izin verildi</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">Kopyayı temizle</translation>
 <translation id="5030338702439866405">Veren:</translation>
 <translation id="5033266061063942743">Geometrik şekiller</translation>
-<translation id="5033619151015094114">Şirketiniz veya kuruluşunuz bu cihazı güncellemenizi zorunlu tutuyor</translation>
 <translation id="503498442187459473"><ph name="HOST" /> kameranızı ve mikrofonunuzu kullanmak istiyor</translation>
 <translation id="5036662165765606524">Hiçbir sitenin otomatik olarak birden fazla dosya indirmesine izin verme</translation>
 <translation id="5037676449506322593">Tümünü Seç</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">Tekrar oturum açın</translation>
 <translation id="5256861893479663409">Tüm Sitelerde</translation>
 <translation id="5258992782919386492">Bu cihaza yükle</translation>
+<translation id="5260334392110301220">Akıllı Tırnaklar</translation>
 <translation id="5260508466980570042">Maalesef, e-posta adresiniz veya şifreniz doğrulanamadı. Lütfen tekrar deneyin.</translation>
 <translation id="5261683757250193089">Web Mağazası'nda aç</translation>
 <translation id="5264148714798105376">Bu işlem bir dakika kadar sürebilir.</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">Misafir olarak giriliyor.</translation>
 <translation id="5301954838959518834">Tamam, anladım</translation>
 <translation id="5302048478445481009">Dil</translation>
+<translation id="5302932258331363306">Değişiklikleri Göster</translation>
 <translation id="5305688511332277257">Hiç sertifika yüklenmedi</translation>
 <translation id="5307030433605830021">Kaynak desteklenmiyor</translation>
 <translation id="5308380583665731573">Bağlan</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">Geçersiz</translation>
 <translation id="5457459357461771897">Bilgisayarınızdaki fotoğrafları, müzikleri ve diğer medyaları okuma ve silme</translation>
 <translation id="5457599981699367932">Misafir olarak Göz At</translation>
+<translation id="5457991019809708398">Açık, dolaşımda değil</translation>
 <translation id="5458998536542739734">Kilit ekranı notları</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> dizini</translation>
 <translation id="5463856536939868464">Gizlenmiş yer işaretlerini içeren menü</translation>
@@ -3137,6 +3150,7 @@
 <translation id="5799508265798272974">Linux Sanal Makinesi: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Hedef dosya en son indirilmesinden sonra kesilmiş veya kaldırılmış.</translation>
 <translation id="5801568494490449797">Tercihler</translation>
+<translation id="5804175651771201311">Dolaşım kapalı</translation>
 <translation id="5804241973901381774">İzinler</translation>
 <translation id="5805697420284793859">Pencere yöneticisi</translation>
 <translation id="5811750797187914944">Hazır</translation>
@@ -3484,6 +3498,7 @@
 <translation id="6317318380444133405">Artık desteklenmiyor.</translation>
 <translation id="6317369057005134371">Uygulama penceresi bekleniyor...</translation>
 <translation id="6318407754858604988">İndirme işlemi başladı</translation>
+<translation id="6318944945640833942">Yazıcı algılanamadı. Lütfen yazıcı adresini tekrar girin.</translation>
 <translation id="6322653941595359182">Chromebook'unuzdan kısa mesaj gönderin ve alın</translation>
 <translation id="6324916366299863871">Kısayolu düzenleyin</translation>
 <translation id="6325191661371220117">Otomatik başlatmayı devre dışı bırak</translation>
@@ -3740,6 +3755,7 @@
 <translation id="6725073593266469338">Kullanıcı arayüzü hizmeti</translation>
 <translation id="6725206449694821596">İnternet Yazdırma Protokolü (IPP)</translation>
 <translation id="67269783048918309">Kullanım ve teşhis verilerini gönder. Bu cihaz şu anda teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a gönderiyor. Bu veriler, çocuğunuzun kimliğini tespit etmek için kullanılmaz; sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" />, cihazın sahibi tarafından zorunlu kılınmıştır. Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google hesabına kaydedilebilir. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Bağlandı, %<ph name="BATTERY_PERCENTAGE" /> pil</translation>
 <translation id="6732801395666424405">Sertifikalar yüklenmedi</translation>
 <translation id="6732900235521116609">Kısayol kaldırılamıyor</translation>
 <translation id="6735304988756581115">Çerezleri ve diğer site verilerini göster...</translation>
@@ -3832,6 +3848,7 @@
 <translation id="6876155724392614295">Bisiklet</translation>
 <translation id="6877460900831874810">Kilit ekranında Chrome medya oynatmayı etkinleştir</translation>
 <translation id="6878422606530379992">Sensörlere izin verildi</translation>
+<translation id="6878665006737889642">Tekrar yüklemeyi deneyin</translation>
 <translation id="6880587130513028875">Bu sayfadaki resimler engellendi.</translation>
 <translation id="6883319974225028188">Hay aksi! Sistem cihaz yapılandırmasını kaydedemedi.</translation>
 <translation id="6885771755599377173">Sistem Bilgisi Önizlemesi</translation>
@@ -4000,6 +4017,7 @@
 <translation id="7120865473764644444">Senkronizasyon sunucusuna bağlanılamadı. Yeniden deneniyor…</translation>
 <translation id="7121362699166175603">Geçmişi ve adres çubuğundaki otomatik tamamlamaları temizler. Google Hesabınızın <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> adresinde başka biçimlerde tarama geçmişi olabilir.</translation>
 <translation id="7121389946694989825">Kullanım ve teşhis verilerini gönder. Bu cihaz şu anda teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a gönderiyor. Bu veriler, çocuğunuzun kimliğini tespit etmek için kullanılmaz; sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google Hesabına kaydedilebilir. <ph name="BEGIN_LINK1" />Daha Fazla Bilgi<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Akıllı Kısa Çizgiler</translation>
 <translation id="7123360114020465152">Artık desteklenmiyor</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> yazdırılırken hata oluştu</translation>
 <translation id="7127980134843952133">İndirme geçmişi</translation>
@@ -4148,6 +4166,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> şimdi tam ekran görüntüleniyor.</translation>
 <translation id="7340650977506865820">Site, ekranınızı paylaşıyor</translation>
 <translation id="7341834142292923918">Bu siteye erişim izni istiyor</translation>
+<translation id="7344488796804562294">Gelişmiş Kerberos yapılandırması</translation>
 <translation id="7345706641791090287">Şifrenizi onaylayın</translation>
 <translation id="7346909386216857016">Tamam, anladım</translation>
 <translation id="7347751611463936647">Bu uzantıyı kullanmak için "<ph name="EXTENSION_KEYWORD" />" yazın, ardından SEKME tuşuna basın ve komutunuzu veya arama teriminizi girin.</translation>
@@ -4758,6 +4777,7 @@
 <translation id="8227119283605456246">Dosya ekle</translation>
 <translation id="8230134520748321204"><ph name="ORIGIN" /> için şifreniz kaydedilsin mi?</translation>
 <translation id="8234795456569844941">Lütfen mühendislerimizin bu sorunu çözmesine yardımcı olun. Profil hata mesajını almadan hemen önce ne yaptığınızı belirtin:</translation>
+<translation id="8236917170563564587">Onun yerine bu sekmeyi paylaş</translation>
 <translation id="8241040075392580210">Parçalı Bulutlu</translation>
 <translation id="8241806945692107836">Cihaz yapılandırması belirleniyor...</translation>
 <translation id="8241868517363889229">Yer işaretlerinizi okuma ve değiştirme</translation>
@@ -4769,6 +4789,7 @@
 <translation id="8249048954461686687">OEM klasörü</translation>
 <translation id="8249615410597138718">Cihazlarınıza Gönderin</translation>
 <translation id="8249672078237421304">Okuduğum dilde olmayan sayfaları çevirmeyi öner</translation>
+<translation id="8251441930213048644">Şimdi yenile</translation>
 <translation id="8251578425305135684">Küçük resim kaldırıldı.</translation>
 <translation id="8252569384384439529">Yükleniyor...</translation>
 <translation id="8253198102038551905">Ağ özelliklerini almak için "+" işaretini tıklayın</translation>
@@ -5146,6 +5167,7 @@
 <translation id="8827752199525959199">Diğer işlemler, <ph name="USERNAME" /> adlı kullanıcı için <ph name="DOMAIN" /> alanındaki şifre</translation>
 <translation id="882854468542856424">Hiçbir sitenin yakındaki Bluetooth cihazları bulmasına izin verme</translation>
 <translation id="8828933418460119530">DNS Adı</translation>
+<translation id="883062543841130884">Değişiklikler</translation>
 <translation id="8830796635868321089">Mevcut proxy ayarları kullanılarak yapılan güncelleme kontrolü başarısız oldu. Lütfen <ph name="PROXY_SETTINGS_LINK_START" />proxy ayarlarınızı<ph name="PROXY_SETTINGS_LINK_END" /> düzenleyin.</translation>
 <translation id="8831664945713891930">Uzantı ayarlarını aç</translation>
 <translation id="8834039744648160717">Ağ yapılandırması, <ph name="USER_EMAIL" /> tarafından kontrol ediliyor.</translation>
@@ -5166,6 +5188,7 @@
 <translation id="8862003515646449717">Hızlı bir tarayıcıya geç</translation>
 <translation id="8863753581171631212">Bağlantıyı yeni <ph name="APP" /> uygulamasında aç</translation>
 <translation id="8864055848767439877"><ph name="TAB_NAME" />, <ph name="APP_NAME" /> ile paylaşılıyor</translation>
+<translation id="8864458770072227512"><ph name="EMAIL" />, bu cihazdan kaldırıldı</translation>
 <translation id="8868626022555786497">Kullanımda</translation>
 <translation id="8870318296973696995">Ana sayfa</translation>
 <translation id="8870413625673593573">Son Kapatılan</translation>
@@ -5174,7 +5197,6 @@
 <translation id="8871974300055371298">İçerik ayarları</translation>
 <translation id="8872155268274985541">Geçersiz Kiosk harici güncelleme manifest dosyası bulundu. Kiosk uygulaması güncellenemedi. Lütfen USB çubuğunu çıkarın.</translation>
 <translation id="8874184842967597500">Bağlı değil</translation>
-<translation id="887550310442005096">Şirketiniz veya kuruluşunuz bu cihazı güncellemenizi istiyor</translation>
 <translation id="8876307312329369159">Bu ayar demo oturumunda değiştirilemez.</translation>
 <translation id="8877448029301136595">[üst dizin]</translation>
 <translation id="8879284080359814990">&amp;Sekme Olarak Göster</translation>
@@ -5289,6 +5311,7 @@
 <translation id="9044646465488564462">Şu ağa bağlanamadı: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Erişmeye çalıştığınız sayfanın web adresini Google'a gönderir</translation>
 <translation id="9046895021617826162">Bağlantı başarısız oldu</translation>
+<translation id="9047391224416514812">Bu kullanıcı adıyla bir hesap zaten var</translation>
 <translation id="9050666287014529139">Parola</translation>
 <translation id="9052208328806230490">Yazıcılarınızı, <ph name="EMAIL" /> hesabını kullanarak <ph name="CLOUD_PRINT_NAME" /> hizmetine kaydettirdiniz.</translation>
 <translation id="9052404922357793350">Engellemeye devam et</translation>
@@ -5336,6 +5359,7 @@
 <translation id="9121814364785106365">İğnelenmiş sekme olarak aç</translation>
 <translation id="9124003689441359348">Kayıtlı şifreleriniz burada görünür</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> tane kaldı)</translation>
+<translation id="9128317794749765148">Kurulum tamamlanamadı</translation>
 <translation id="9128870381267983090">Ağa bağlan</translation>
 <translation id="9130015405878219958">Geçersiz mod girildi</translation>
 <translation id="9131487537093447019">Bluetooth cihazlarına ileti gönderme ve Bluetooth cihazlarından gelen iletileri alma.</translation>
@@ -5404,6 +5428,7 @@
 <translation id="939598580284253335">Parolayı girin</translation>
 <translation id="939736085109172342">Yeni klasör</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" />, bir Chrome sekmesini ve sesi paylaşıyor.</translation>
+<translation id="945166830402967374">Kuruluşunuzun cihaz yöneticisiyle iletişime geçin</translation>
 <translation id="945522503751344254">Geri bildirim gönder</translation>
 <translation id="947329552760389097">Öğeleri &amp;İncele</translation>
 <translation id="952992212772159698">Etkin değil</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 631ceff..3e8d21ef 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1621,7 +1621,6 @@
 <translation id="3454157711543303649">Активацію завершено</translation>
 <translation id="3454213325559396544">Це останнє автоматичне оновлення програмного забезпечення й системи безпеки на пристрої <ph name="DEVICE_TYPE" />. Щоб отримувати оновлення надалі, придбайте новішу модель.</translation>
 <translation id="345693547134384690">Відкрити &amp;зображення в новій вкладці</translation>
-<translation id="3457500881955698515">Ваша компанія чи організація вимагає, щоб ви негайно оновили пристрій</translation>
 <translation id="3459509316159669723">Друк</translation>
 <translation id="3459697287128633276">Щоб надати своєму обліковому запису доступ до Google Play, автентифікуйтеся за допомогою постачальника ідентифікаторів.</translation>
 <translation id="3459774175445953971">Оновлено:</translation>
@@ -2238,7 +2237,6 @@
 <translation id="4364327530094270451">Диня</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> транслює вікно.</translation>
 <translation id="4364830672918311045">Показувати сповіщення</translation>
-<translation id="4365673000813822030">На жаль, синхронізація перестала працювати.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> у додатку <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Введені електронна адреса та пароль не збігаються</translation>
 <translation id="437184764829821926">Розширені налаштування шрифтів</translation>
@@ -2520,7 +2518,6 @@
 <translation id="4830502475412647084">Установлюється оновлення ОС</translation>
 <translation id="4830573902900904548">Ваш <ph name="DEVICE_TYPE" /> не може під’єднатися до Інтернету через мережу "<ph name="NETWORK_NAME" />". Виберіть іншу. <ph name="LEARN_MORE_LINK_START" />Докладніше<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome не має доступу до потрібного ресурсу.</translation>
-<translation id="4835836146030131423">Помилка входу.</translation>
 <translation id="4837926214103741331">Ви не маєте права використовувати цей пристрій. Зверніться до його власника, щоб отримати дозвіл на вхід.</translation>
 <translation id="4837952862063191349">Щоб розблокувати пристрій <ph name="DEVICE_TYPE" /> і відновити локальні дані, введіть старий пароль.</translation>
 <translation id="4838836835474292213">Дозволено переглядати буфер обміну</translation>
@@ -2655,7 +2652,6 @@
 <translation id="5029568752722684782">Видалити копію</translation>
 <translation id="5030338702439866405">Ким видано:</translation>
 <translation id="5033266061063942743">Геометричні фігури</translation>
-<translation id="5033619151015094114">Ваша компанія чи організація вимагає, щоб ви оновили цей пристрій</translation>
 <translation id="503498442187459473">Сайт <ph name="HOST" /> хоче отримати доступ до ваших камери й мікрофона</translation>
 <translation id="5036662165765606524">Заборонити всім сайтам автоматично завантажувати декілька файлів</translation>
 <translation id="5037676449506322593">Вибрати всі</translation>
@@ -5201,7 +5197,6 @@
 <translation id="8871974300055371298">Веб-контент</translation>
 <translation id="8872155268274985541">Знайдено недійсний зовнішній файл маніфесту оновлення термінала. Помилка оновлення додатка-термінала. Витягніть носій USB.</translation>
 <translation id="8874184842967597500">Не під’єднано</translation>
-<translation id="887550310442005096">Ваша компанія чи організація просить вас оновити цей пристрій</translation>
 <translation id="8876307312329369159">Це налаштування не можна змінити в демонстраційному сеансі.</translation>
 <translation id="8877448029301136595">[батьківський каталог]</translation>
 <translation id="8879284080359814990">&amp;Показати як вкладку</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index d28b1de6..e35eb2b0 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">Đã xảy ra lỗi với giấy phép thiết bị ở chế độ minh họa.</translation>
 <translation id="126710816202626562">Ngôn ngữ dịch:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">Cấu hình nâng cao</translation>
 <translation id="1272079795634619415">Dừng</translation>
 <translation id="1272978324304772054">Tài khoản người dùng này không thuộc về miền mà thiết bị được đăng ký. Nếu bạn muốn đăng ký miền khác, bạn cần tìm thiết bị trước tiên.</translation>
 <translation id="1274977772557788323">Cài đặt bộ nhớ của Adobe Flash Player</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">Đã chọn <ph name="NUMBER_OF_ITEMS_SELECTED" /></translation>
 <translation id="1444628761356461360">Cài đặt này do chủ sở hữu thiết bị, <ph name="OWNER_EMAIL" /> quản lý.</translation>
 <translation id="144518587530125858">Không thể tải '<ph name="IMAGE_PATH" />' cho chủ đề.</translation>
+<translation id="1445693676523799095">Quá trình này có thể mất chút thời gian</translation>
 <translation id="1451375123200651445">Trang web, Tệp đơn</translation>
 <translation id="1451917004835509682">Thêm người được giám sát</translation>
 <translation id="1454223536435069390">&amp;Chụp ảnh màn hình</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">Chỉ có thể thêm ứng dụng/tiện ích này từ <ph name="CHROME_WEB_STORE" /></translation>
 <translation id="1877520246462554164">Không nhận được mã thông báo xác thực. Vui lòng đăng xuất rồi đăng nhập lại để thử lại.</translation>
 <translation id="1877860345998737529">Gán công tắc cho hành động</translation>
+<translation id="1878541307036593717">Thiết lập các quyền</translation>
 <translation id="1879000426787380528">Đăng nhập bằng</translation>
 <translation id="1880905663253319515">Xóa chứng chỉ "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="1886996562706621347">Cho phép các trang web yêu cầu trở thành trình xử lý mặc định cho giao thức (nên chọn)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">Còn <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">Tắt</translation>
 <translation id="1895934970388272448">Bạn phải xác nhận đăng ký trên máy in của mình để hoàn tất quy trình này - hãy kiểm tra đăng ký ngay.</translation>
+<translation id="1899826437968063457">Máy chủ ảo plugin cần có quyền chạy</translation>
 <translation id="1901303067676059328">Chọn &amp;tất cả</translation>
 <translation id="1902576642799138955">Thời gian Có hiệu lực</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{Tắt tiếng tab}other{Tắt tiếng các tab}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">Phiên ẩn danh hiện tại (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">Đầu trang và chân trang</translation>
 <translation id="2322318151094136999">Hỏi khi có trang web muốn truy cập vào cổng nối tiếp (khuyên dùng)</translation>
+<translation id="2325444234681128157">Ghi nhớ mật khẩu</translation>
 <translation id="2326931316514688470">Tải &amp;lại ứng dụng</translation>
 <translation id="2327492829706409234">Bật ứng dụng</translation>
 <translation id="2329597144923131178">Đăng nhập để sử dụng dấu trang, lịch sử hoạt động, mật khẩu và các tùy chọn cài đặt khác trên tất cả thiết bị của bạn.</translation>
@@ -946,6 +951,7 @@
 <translation id="2433452467737464329">Thêm một tham số truy vấn trong URL để tự động làm mới trang: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Hình thức</translation>
 <translation id="2433836460518180625">Chỉ mở khóa thiết bị</translation>
+<translation id="2434449159125086437">Không thể thiết lập máy in. Vui lòng kiểm tra cấu hình rồi thử lại.</translation>
 <translation id="2435248616906486374">Mạng đã bị ngắt kết nối</translation>
 <translation id="2435457462613246316">Hiển thị mật khẩu</translation>
 <translation id="2436186046335138073">Cho phép <ph name="HANDLER_HOSTNAME" /> mở tất cả liên kết <ph name="PROTOCOL" />?</translation>
@@ -1098,6 +1104,7 @@
 <translation id="2649045351178520408">ASCII được mã hóa base64, chuỗi chứng chỉ</translation>
 <translation id="2653033005692233957">Không tìm kiếm được</translation>
 <translation id="2653266418988778031">Nếu bạn xóa chứng chỉ của Tổ chức phát hành chứng chỉ (CA), trình duyệt của bạn sẽ không còn tin vào bất kỳ chứng chỉ nào do CA cấp nữa.</translation>
+<translation id="2653275834716714682">Thay thế văn bản</translation>
 <translation id="2653659639078652383">Gửi</translation>
 <translation id="265390580714150011">Giá trị Trường</translation>
 <translation id="2654166010170466751">Cho phép các trang web cài đặt trình xử lý thanh toán</translation>
@@ -1306,6 +1313,7 @@
 <translation id="29488703364906173">Trình duyệt web nhanh, đơn giản và an toàn dành cho web hiện đại.</translation>
 <translation id="2949289451367477459">Sử dụng thông tin vị trí. Cho phép ứng dụng và dịch vụ có quyền vị trí sử dụng thông tin vị trí của thiết bị này. Google có thể định kỳ thu thập dữ liệu vị trí và sử dụng dữ liệu này theo cách ẩn danh để cải thiện độ chính xác của vị trí và các dịch vụ dựa trên vị trí. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">Cảnh báo đóng gói tiện ích</translation>
+<translation id="2959842337402130152">Không thể khôi phục do thiếu dung lượng bộ nhớ. Hãy giải phóng <ph name="SPACE_REQUIRED" /> khỏi thiết bị rồi thử lại.</translation>
 <translation id="296026337010986570">Xong! Đã xóa phần mềm độc hại. Để bật lại tiện ích, hãy truy cập vào mục &lt;a href="chrome://extensions"&gt;Tiện ích&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (đã cung cấp tiện ích)</translation>
 <translation id="2961695502793809356">Nhấp vào để tiến, giữ để xem lịch sử</translation>
@@ -1613,7 +1621,6 @@
 <translation id="3454157711543303649">Đã kích hoạt xong</translation>
 <translation id="3454213325559396544">Đây là bản tự động cập nhật bảo mật và phần mềm mới nhất cho <ph name="DEVICE_TYPE" /> này. Để nhận các bản cập nhật trong tương lai, hãy nâng cấp lên mẫu thiết bị mới hơn.</translation>
 <translation id="345693547134384690">Mở &amp;hình ảnh trong tab mới</translation>
-<translation id="3457500881955698515">Công ty hoặc tổ chức của bạn yêu cầu bạn cập nhật thiết bị này ngay bây giờ</translation>
 <translation id="3459509316159669723">In</translation>
 <translation id="3459697287128633276">Để cho phép tài khoản của bạn truy cập vào Cửa hàng Google Play, vui lòng xác thực với Nhà cung cấp danh tính của bạn.</translation>
 <translation id="3459774175445953971">Sửa đổi lần cuối:</translation>
@@ -1990,6 +1997,7 @@
 <translation id="3966072572894326936">Chọn một thư mục khác...</translation>
 <translation id="3967822245660637423">Tải xuống hoàn tất</translation>
 <translation id="3967919079500697218">Quản trị viên của bạn đã tắt tính năng chụp ảnh màn hình.</translation>
+<translation id="3969092967100188979">Bật, chuyển vùng</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">Đang tính...</translation>
 <translation id="3975565978598857337">Không kết nối được với máy chủ của vùng</translation>
@@ -2051,6 +2059,7 @@
 <translation id="4068776064906523561">Vân tay đã lưu</translation>
 <translation id="407173827865827707">Khi nhấp chuột</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{Bỏ ghim tab}other{Bỏ ghim các tab}}</translation>
+<translation id="4072805772816336153">Thử lại sau</translation>
 <translation id="4074900173531346617">Chứng chỉ Người ký Email</translation>
 <translation id="407520071244661467">Tỷ lệ</translation>
 <translation id="4075639477629295004">Không thể truyền <ph name="FILE_NAME" />.</translation>
@@ -2139,6 +2148,7 @@
 <translation id="4209092469652827314">Lớn</translation>
 <translation id="4209251085232852247">Đang tắt</translation>
 <translation id="4209464433672152343">Tài liệu được <ph name="BEGIN_LINK_HELP" />gửi tới Google<ph name="END_LINK_HELP" /> để chuẩn bị in. Xem, chỉnh sửa và quản lý máy in và lịch sử in của bạn trên <ph name="BEGIN_LINK_DASHBOARD" />trang tổng quan của Google Cloud Print<ph name="END_LINK_DASHBOARD" />.</translation>
+<translation id="4210048056321123003">Đang tải máy ảo xuống</translation>
 <translation id="421182450098841253">&amp;Hiển thị thanh dấu trang</translation>
 <translation id="4211851069413100178">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Giúp cải thiện trải nghiệm Android của bạn bằng cách tự động gửi dữ liệu chẩn đoán cũng như dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Mục <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này do chủ sở hữu thực thi. Chủ sở hữu có thể chọn gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng của thiết bị này cho Google. Nếu bạn bật mục cài đặt bổ sung Hoạt động web và ứng dụng thì dữ liệu này có thể được lưu vào Tài khoản Google của bạn. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Xuất</translation>
@@ -2227,7 +2237,6 @@
 <translation id="4364327530094270451">Quả dưa</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation>
 <translation id="4364830672918311045">Hiển thị thông báo</translation>
-<translation id="4365673000813822030">Rất tiếc, Đồng bộ hóa đã ngừng hoạt động.</translation>
 <translation id="4366956553771076218"><ph name="ACTION_NAME" /> qua <ph name="APP_NAME" />.</translation>
 <translation id="4370975561335139969">Email và mật khẩu bạn nhập không khớp</translation>
 <translation id="437184764829821926">Cài đặt phông chữ nâng cao</translation>
@@ -2238,6 +2247,7 @@
 <translation id="4378551569595875038">Đang kết nối…</translation>
 <translation id="4378556263712303865">Yêu cầu thiết bị</translation>
 <translation id="4380648069038809855">Đã chuyển sang chế độ toàn màn hình</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />, +1 tài khoản nữa}other{<ph name="EMAIL" />, +<ph name="EXTRA_ACCOUNTS" /> tài khoản nữa}}</translation>
 <translation id="4384312707950789900">Thêm vào ưa thích</translation>
 <translation id="4384652540891215547">Kích hoạt tiện ích</translation>
 <translation id="438503109373656455">Ngựa đua Saratoga</translation>
@@ -2368,6 +2378,7 @@
 <translation id="4596295440756783523">Bạn có các chứng chỉ trên tệp có thể nhận dạng các máy chủ này</translation>
 <translation id="4598556348158889687">Quản lý bộ nhớ</translation>
 <translation id="4598776695426288251">Wi-Fi khả dụng qua nhiều thiết bị</translation>
+<translation id="4599134080475764833">Máy chủ ảo plugin đã sẵn sàng sử dụng</translation>
 <translation id="4602466770786743961">Luôn cho phép <ph name="HOST" /> truy cập vào máy ảnh và micrô của bạn</translation>
 <translation id="4608500690299898628">&amp;Tìm...</translation>
 <translation id="4608520674724523647">Minh họa đăng ký thành công</translation>
@@ -2405,6 +2416,7 @@
 <translation id="4662788913887017617">Chia sẻ dấu trang này với iPhone của bạn</translation>
 <translation id="4663373278480897665">Cho phép máy ảnh</translation>
 <translation id="4664482161435122549">Lỗi xuất PKCS #12</translation>
+<translation id="4664736447097490764">Chỉnh sửa tệp cấu hình Kerberos tại đây.</translation>
 <translation id="4665014895760275686">Nhà sản xuất</translation>
 <translation id="4665446389743427678">Tất cả dữ liệu do <ph name="SITE" /> lưu trữ sẽ bị xóa.</translation>
 <translation id="4668721319092543482">Nhấp để bật <ph name="PLUGIN_NAME" /></translation>
@@ -2506,7 +2518,6 @@
 <translation id="4830502475412647084">Đang cài đặt bản cập nhật hệ điều hành</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> của bạn không thể kết nối Internet bằng cách sử dụng <ph name="NETWORK_NAME" />. Vui lòng chọn mạng khác. <ph name="LEARN_MORE_LINK_START" />Tìm hiểu thêm<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome không có quyền truy cập vào tài nguyên đã yêu cầu.</translation>
-<translation id="4835836146030131423">Lỗi khi đăng nhập.</translation>
 <translation id="4837926214103741331">Bạn không được phép sử dụng thiết bị này. Vui lòng liên hệ với chủ sở hữu thiết bị để có quyền đăng nhập.</translation>
 <translation id="4837952862063191349">Để mở khóa và khôi phục dữ liệu cục bộ của bạn, vui lòng nhập mật khẩu <ph name="DEVICE_TYPE" /> cũ của bạn.</translation>
 <translation id="4838836835474292213">Đã cho phép truy cập đọc khay nhớ tạm</translation>
@@ -2641,7 +2652,6 @@
 <translation id="5029568752722684782">Xóa bản sao</translation>
 <translation id="5030338702439866405">Cấp bởi</translation>
 <translation id="5033266061063942743">Hình dạng hình học</translation>
-<translation id="5033619151015094114">Công ty hoặc tổ chức của bạn yêu cầu cập nhật thiết bị này</translation>
 <translation id="503498442187459473"><ph name="HOST" /> muốn sử dụng máy ảnh và micrô của bạn</translation>
 <translation id="5036662165765606524">Không cho phép bất kỳ trang web nào tự động tải nhiều tệp xuống</translation>
 <translation id="5037676449506322593">Chọn Tất cả</translation>
@@ -2778,6 +2788,7 @@
 <translation id="5255859108402770436">Đăng nhập lại</translation>
 <translation id="5256861893479663409">Trên tất cả các trang web</translation>
 <translation id="5258992782919386492">Cài đặt trên thiết bị này</translation>
+<translation id="5260334392110301220">Dấu ngoặc kép thông minh</translation>
 <translation id="5260508466980570042">Rất tiếc, không thể xác minh được email hoặc mật khẩu của bạn. Vui lòng thử lại.</translation>
 <translation id="5261683757250193089">Mở trong Cửa hàng trực tuyến</translation>
 <translation id="5264148714798105376">Quá trình này có thể mất một vài phút.</translation>
@@ -2812,6 +2823,7 @@
 <translation id="5301751748813680278">Đăng nhập với tư cách khách.</translation>
 <translation id="5301954838959518834">Ok</translation>
 <translation id="5302048478445481009">Ngôn ngữ</translation>
+<translation id="5302932258331363306">Hiển thị ký tự thay thế</translation>
 <translation id="5305688511332277257">Chưa cài đặt chứng chỉ nào</translation>
 <translation id="5307030433605830021">Nguồn không được hỗ trợ</translation>
 <translation id="5308380583665731573">Kết nối</translation>
@@ -2911,6 +2923,7 @@
 <translation id="5457113250005438886">Không hợp lệ</translation>
 <translation id="5457459357461771897">Đọc và xóa ảnh, nhạc và các phương tiện khác khỏi máy tính của bạn</translation>
 <translation id="5457599981699367932">Duyệt với tư cách Khách</translation>
+<translation id="5457991019809708398">Bật, không chuyển vùng</translation>
 <translation id="5458998536542739734">Ghi chú trên màn hình khóa</translation>
 <translation id="5463275305984126951">Chỉ mục của <ph name="LOCATION" /></translation>
 <translation id="5463856536939868464">Menu chứa các dấu trang bị ẩn</translation>
@@ -3136,6 +3149,7 @@
 <translation id="5799508265798272974">Máy ảo Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">Tệp đích đã bị cắt bớt hoặc xóa kể từ lần tải xuống cuối cùng.</translation>
 <translation id="5801568494490449797">Tùy chọn</translation>
+<translation id="5804175651771201311">Chế độ chuyển vùng đang tắt</translation>
 <translation id="5804241973901381774">Quyền</translation>
 <translation id="5805697420284793859">Trình quản lý cửa sổ</translation>
 <translation id="5811750797187914944">Đã hoàn tất</translation>
@@ -3483,6 +3497,7 @@
 <translation id="6317318380444133405">Không còn được hỗ trợ.</translation>
 <translation id="6317369057005134371">Đang đợi cửa sổ ứng dụng...</translation>
 <translation id="6318407754858604988">Đã bắt đầu tải xuống</translation>
+<translation id="6318944945640833942">Không thể phát hiện máy in. Vui lòng nhập lại địa chỉ máy in.</translation>
 <translation id="6322653941595359182">Gửi và nhận tin nhắn văn bản từ Chromebook của bạn</translation>
 <translation id="6324916366299863871">Chỉnh sửa phím tắt</translation>
 <translation id="6325191661371220117">Tắt tính năng tự động chạy</translation>
@@ -3739,6 +3754,7 @@
 <translation id="6725073593266469338">Dịch vụ giao diện người dùng</translation>
 <translation id="6725206449694821596">Giao thức in qua Internet (IPP)</translation>
 <translation id="67269783048918309">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Thiết bị này hiện tự động gửi dữ liệu chẩn đoán, dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Mục <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này do chủ sở hữu thực thi. Nếu bạn bật mục cài đặt bổ sung Hoạt động web và ứng dụng cho con mình thì dữ liệu này có thể được lưu vào Tài khoản Google của trẻ. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">Đã kết nối, <ph name="BATTERY_PERCENTAGE" />% pin</translation>
 <translation id="6732801395666424405">Không tải được chứng chỉ</translation>
 <translation id="6732900235521116609">Không thể xóa lối tắt</translation>
 <translation id="6735304988756581115">Hiển thị cookie và dữ liệu trang web khác...</translation>
@@ -3831,6 +3847,7 @@
 <translation id="6876155724392614295">Xe đạp</translation>
 <translation id="6877460900831874810">Bật tùy chọn phát nội dung đa phương tiện trên Chrome ở màn hình khóa</translation>
 <translation id="6878422606530379992">Được phép sử dụng cảm biến</translation>
+<translation id="6878665006737889642">Thử cài đặt lại</translation>
 <translation id="6880587130513028875">Hình ảnh đã bị chặn trên trang này.</translation>
 <translation id="6883319974225028188">Rất tiếc! Hệ thống không lưu được cấu hình thiết bị.</translation>
 <translation id="6885771755599377173">Xem trước thông tin hệ thống</translation>
@@ -3999,6 +4016,7 @@
 <translation id="7120865473764644444">Không thể kết nối với máy chủ đồng bộ hóa. Đang thử lại...</translation>
 <translation id="7121362699166175603">Xóa lịch sử duyệt web và nội dung tự động hoàn thành trong thanh địa chỉ. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121389946694989825">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Thiết bị này hiện tự động gửi dữ liệu chẩn đoán, dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Nếu bạn bật mục cài đặt bổ sung Hoạt động web và ứng dụng cho con mình thì dữ liệu này có thể được lưu vào Tài khoản Google của trẻ. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">Dấu gạch ngang thông minh</translation>
 <translation id="7123360114020465152">Không còn được hỗ trợ</translation>
 <translation id="7124929488592184705">Lỗi khi in <ph name="DOCUMENT_NAME" /></translation>
 <translation id="7127980134843952133">Lịch sử tải xuống</translation>
@@ -4147,6 +4165,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> hiện ở chế độ toàn màn hình.</translation>
 <translation id="7340650977506865820">Trang web đang chia sẻ màn hình của bạn</translation>
 <translation id="7341834142292923918">Muốn truy cập vào trang web này</translation>
+<translation id="7344488796804562294">Cấu hình Kerberos nâng cao</translation>
 <translation id="7345706641791090287">Xác nhận mật khẩu của bạn</translation>
 <translation id="7346909386216857016">Ok</translation>
 <translation id="7347751611463936647">Để sử dụng tiện ích này, nhập "<ph name="EXTENSION_KEYWORD" />", sau đó nhấn TAB rồi câu lệnh hoặc tìm kiếm của bạn.</translation>
@@ -4758,6 +4777,7 @@
 <translation id="8227119283605456246">Đính kèm tệp</translation>
 <translation id="8230134520748321204">Bạn có muốn lưu mật khẩu cho <ph name="ORIGIN" /> không?</translation>
 <translation id="8234795456569844941">Hãy giúp các kỹ sư của chúng tôi khắc phục sự cố này. Hãy cho chúng tôi biết điều gì đã xảy ra ngay trước khi bạn nhận được thông báo lỗi hồ sơ:</translation>
+<translation id="8236917170563564587">Chia sẻ tab này</translation>
 <translation id="8241040075392580210">Bóng mát</translation>
 <translation id="8241806945692107836">Đang xác định cấu hình thiết bị...</translation>
 <translation id="8241868517363889229">Đọc và thay đổi dấu trang của bạn</translation>
@@ -4769,6 +4789,7 @@
 <translation id="8249048954461686687">Thư mục OEM</translation>
 <translation id="8249615410597138718">Gửi đến các thiết bị của bạn</translation>
 <translation id="8249672078237421304">Đề xuất dịch các trang không phải bằng ngôn ngữ bạn đã đọc</translation>
+<translation id="8251441930213048644">Làm mới ngay</translation>
 <translation id="8251578425305135684">Đã xóa hình thu nhỏ.</translation>
 <translation id="8252569384384439529">Đang tải lên...</translation>
 <translation id="8253198102038551905">Hãy nhấp vào '+' để nhận thuộc tính mạng</translation>
@@ -5146,6 +5167,7 @@
 <translation id="8827752199525959199">Thao tác khác, mật khẩu cho <ph name="USERNAME" /> trên <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">Không cho phép bất kỳ trang web nào tìm các thiết bị Bluetooth ở gần</translation>
 <translation id="8828933418460119530">Tên DNS</translation>
+<translation id="883062543841130884">Ký tự thay thế</translation>
 <translation id="8830796635868321089">Kiểm tra cập nhật không thành công khi sử dụng cài đặt proxy hiện tại. Vui lòng điều chỉnh <ph name="PROXY_SETTINGS_LINK_START" />cài đặt proxy<ph name="PROXY_SETTINGS_LINK_END" /> của bạn.</translation>
 <translation id="8831664945713891930">Mở Cài đặt tiện ích</translation>
 <translation id="8834039744648160717">Cấu hình mạng do <ph name="USER_EMAIL" /> kiểm soát.</translation>
@@ -5166,6 +5188,7 @@
 <translation id="8862003515646449717">Chuyển sang một trình duyệt nhanh</translation>
 <translation id="8863753581171631212">Mở liên kết trong <ph name="APP" /> mới</translation>
 <translation id="8864055848767439877">Đang chia sẻ <ph name="TAB_NAME" /> với <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512">Đã xóa <ph name="EMAIL" /> khỏi thiết bị này</translation>
 <translation id="8868626022555786497">Được dùng</translation>
 <translation id="8870318296973696995">Trang chủ</translation>
 <translation id="8870413625673593573">Các tab đã Đóng gần đây</translation>
@@ -5174,7 +5197,6 @@
 <translation id="8871974300055371298">Cài đặt nội dung</translation>
 <translation id="8872155268274985541">Đã tìm thấy tệp kê khai cập nhật bên ngoài Kiosk không hợp lệ. Không cập nhật được ứng dụng Kiosk. Vui lòng rút thẻ USB.</translation>
 <translation id="8874184842967597500">Chưa kết nối</translation>
-<translation id="887550310442005096">Công ty hoặc tổ chức của bạn yêu cầu bạn cập nhật thiết bị này</translation>
 <translation id="8876307312329369159">Không thể thay đổi tùy chọn cài đặt này trong phiên minh họa.</translation>
 <translation id="8877448029301136595">[thư mục cha]</translation>
 <translation id="8879284080359814990">&amp;Hiển thị Dưới dạng Tab</translation>
@@ -5289,6 +5311,7 @@
 <translation id="9044646465488564462">Không kết nối được với mạng: <ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">Gửi cho Google địa chỉ web của trang mà bạn đang cố gắng truy cập</translation>
 <translation id="9046895021617826162">Kết nối không thành công</translation>
+<translation id="9047391224416514812">Tài khoản có tên người dùng này đã tồn tại</translation>
 <translation id="9050666287014529139">Cụm mật khẩu</translation>
 <translation id="9052208328806230490">Bạn vừa đăng ký máy in của mình với <ph name="CLOUD_PRINT_NAME" /> bằng tài khoản <ph name="EMAIL" /></translation>
 <translation id="9052404922357793350">Tiếp tục chặn</translation>
@@ -5336,6 +5359,7 @@
 <translation id="9121814364785106365">Mở dưới dạng tab được ghim</translation>
 <translation id="9124003689441359348">Mật khẩu đã lưu của bạn sẽ xuất hiện ở đây</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> giấy phép còn lại)</translation>
+<translation id="9128317794749765148">Không thể hoàn tất quá trình thiết lập</translation>
 <translation id="9128870381267983090">Kết nối đến mạng</translation>
 <translation id="9130015405878219958">Chế độ không hợp lệ được nhập.</translation>
 <translation id="9131487537093447019">Gửi tin nhắn tới và nhận tin nhắn từ thiết bị Bluetooth.</translation>
@@ -5404,6 +5428,7 @@
 <translation id="939598580284253335">Nhập cụm mật khẩu</translation>
 <translation id="939736085109172342">Thư mục mới</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> đang chia sẻ âm thanh và một tab trong Chrome.</translation>
+<translation id="945166830402967374">Liên hệ với quản trị viên thiết bị của tổ chức bạn</translation>
 <translation id="945522503751344254">Gửi phản hồi</translation>
 <translation id="947329552760389097">&amp;Kiểm tra các yếu tố</translation>
 <translation id="952992212772159698">Chưa được kích hoạt</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 39bf394..eb31f06 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">演示模式设备许可出问题了。</translation>
 <translation id="126710816202626562">翻译语言:</translation>
 <translation id="126768002343224824">16 倍</translation>
+<translation id="1269405567167332785">高级配置</translation>
 <translation id="1272079795634619415">停止</translation>
 <translation id="1272978324304772054">此用户帐号不属于设备所注册的域。如果想注册其他域,那么您首先需要执行设备恢复。</translation>
 <translation id="1274977772557788323">Adobe Flash Player 存储设置</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">已选择 <ph name="NUMBER_OF_ITEMS_SELECTED" /> 项</translation>
 <translation id="1444628761356461360">此设置由设备所有者<ph name="OWNER_EMAIL" />管理。</translation>
 <translation id="144518587530125858">无法加载主题背景的路径“<ph name="IMAGE_PATH" />”。</translation>
+<translation id="1445693676523799095">该过程可能需要一点时间</translation>
 <translation id="1451375123200651445">网页(单个文件)</translation>
 <translation id="1451917004835509682">添加受监管用户</translation>
 <translation id="1454223536435069390">屏幕截图(&amp;A)</translation>
@@ -591,6 +593,7 @@
 <translation id="1875387611427697908">只能通过<ph name="CHROME_WEB_STORE" />添加此项内容</translation>
 <translation id="1877520246462554164">未能获取身份验证令牌。请退出并重新登录,然后重试。</translation>
 <translation id="1877860345998737529">指定开关操作</translation>
+<translation id="1878541307036593717">设置权限</translation>
 <translation id="1879000426787380528">登录身份</translation>
 <translation id="1880905663253319515">要删除证书“<ph name="CERTIFICATE_NAME" />”吗?</translation>
 <translation id="1886996562706621347">允许网站要求成为协议的默认处理程序(推荐)</translation>
@@ -603,6 +606,7 @@
 <translation id="1895252664692693738">还剩 <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">关机</translation>
 <translation id="1895934970388272448">您必须在自己的打印机上确认注册才能完成此进程 - 立即查看。</translation>
+<translation id="1899826437968063457">插件虚拟机需要权限才能运行</translation>
 <translation id="1901303067676059328">全选(&amp;A)</translation>
 <translation id="1902576642799138955">有效期</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{将这个标签页静音}other{将这些标签页静音}}</translation>
@@ -876,6 +880,7 @@
 <translation id="2318923050469484167">当前的隐身会话(<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">页眉和页脚</translation>
 <translation id="2322318151094136999">在网站想访问串行端口时询问您(推荐)</translation>
+<translation id="2325444234681128157">记住密码</translation>
 <translation id="2326931316514688470">重新加载应用(&amp;R)</translation>
 <translation id="2327492829706409234">启用应用</translation>
 <translation id="2329597144923131178">登录后可获取您所有设备上保存的书签、历史记录、密码和其他设置。</translation>
@@ -942,6 +947,7 @@
 <translation id="2433452467737464329">在网址中添加查询参数以便自动刷新网页:chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">外观</translation>
 <translation id="2433836460518180625">仅解锁设备</translation>
+<translation id="2434449159125086437">无法设置打印机。请检查配置,然后重试。</translation>
 <translation id="2435248616906486374">网络连接已断开</translation>
 <translation id="2435457462613246316">显示密码</translation>
 <translation id="2436186046335138073">允许<ph name="HANDLER_HOSTNAME" />打开所有<ph name="PROTOCOL" />链接?</translation>
@@ -1093,6 +1099,7 @@
 <translation id="2649045351178520408">Base64 编码 ASCII,证书链</translation>
 <translation id="2653033005692233957">搜索失败</translation>
 <translation id="2653266418988778031">如果您删除了某个证书授权中心 (CA) 证书,则浏览器不会再信任该 CA 颁发的任何证书。</translation>
+<translation id="2653275834716714682">替换文字</translation>
 <translation id="2653659639078652383">提交</translation>
 <translation id="265390580714150011">字段值</translation>
 <translation id="2654166010170466751">允许网站安装付款处理程序</translation>
@@ -1301,6 +1308,7 @@
 <translation id="29488703364906173">一款快速、简单且安全的网络浏览器,能很好满足现代网络对浏览器的要求。</translation>
 <translation id="2949289451367477459">使用位置信息。允许具有位置权限的应用和服务使用此设备的位置信息。Google 可能会定期收集位置数据,并以匿名方式使用这类数据,从而提高位置信息精确度并改善基于地理位置的服务。<ph name="BEGIN_LINK1" />了解详情<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">打包扩展程序警告</translation>
+<translation id="2959842337402130152">存储空间不足,因此无法恢复。请从设备中释放 <ph name="SPACE_REQUIRED" /> 空间,然后重试。</translation>
 <translation id="296026337010986570">大功告成!已移除有害软件。要想重新开启扩展程序,请前往&lt;a href="chrome://extensions"&gt;扩展程序&lt;/a&gt;页面。</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" />(已提供扩展功能)</translation>
 <translation id="2961695502793809356">点击可前进,按住可查看历史记录</translation>
@@ -1606,7 +1614,6 @@
 <translation id="3454157711543303649">激活已完成</translation>
 <translation id="3454213325559396544">这是最后一次为此 <ph name="DEVICE_TYPE" /> 提供自动的软件和安全更新。要想接收以后的更新,请升级至较新的型号。</translation>
 <translation id="345693547134384690">在新标签页中打开图片(&amp;I)</translation>
-<translation id="3457500881955698515">您的公司或组织要求立刻更新此设备</translation>
 <translation id="3459509316159669723">打印</translation>
 <translation id="3459697287128633276">若想让您的帐号有权访问 Google Play 商店,请通过您的身份提供商进行身份验证。</translation>
 <translation id="3459774175445953971">最后修改日期:</translation>
@@ -1982,6 +1989,7 @@
 <translation id="3966072572894326936">选择其他文件夹...</translation>
 <translation id="3967822245660637423">下载完毕</translation>
 <translation id="3967919079500697218">您的管理员已停用屏幕截图功能。</translation>
+<translation id="3969092967100188979">已启用,正在使用漫游服务</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">正在计算...</translation>
 <translation id="3975565978598857337">无法连接到指定领域的服务器</translation>
@@ -2043,6 +2051,7 @@
 <translation id="4068776064906523561">已保存的指纹</translation>
 <translation id="407173827865827707">点击时</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{取消固定这个标签页}other{取消固定这些标签页}}</translation>
+<translation id="4072805772816336153">请稍后重试</translation>
 <translation id="4074900173531346617">电子邮件签名人证书</translation>
 <translation id="407520071244661467">缩放</translation>
 <translation id="4075639477629295004">无法投射“<ph name="FILE_NAME" />”。</translation>
@@ -2131,6 +2140,7 @@
 <translation id="4209092469652827314">大</translation>
 <translation id="4209251085232852247">已关闭</translation>
 <translation id="4209464433672152343">相关文档会<ph name="BEGIN_LINK_HELP" />发送至 Google<ph name="END_LINK_HELP" /> 以便为打印做好准备。您可在 <ph name="BEGIN_LINK_DASHBOARD" />Google 云打印信息中心<ph name="END_LINK_DASHBOARD" />内查看、修改和管理自己的打印机和打印记录。</translation>
+<translation id="4210048056321123003">正在下载虚拟机</translation>
 <translation id="421182450098841253">显示书签栏(&amp;S)</translation>
 <translation id="4211851069413100178">发送使用情况数据和诊断数据。通过自动向 Google 发送诊断数据、设备数据和应用使用情况数据,帮助改善您的 Android 使用体验。这些数据会被用来帮助提高系统和应用的稳定性以及实现其他方面的改进。部分汇总数据也会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。这项<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />是由此设备的所有者强制指定的。此设备的所有者可以选择向 Google 发送此设备的诊断数据和使用情况数据。如果您已开启“其他网络与应用活动记录”设置,这些数据可能会被保存到您的 Google 帐号中。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">导出</translation>
@@ -2219,7 +2229,6 @@
 <translation id="4364327530094270451">甜瓜</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共享窗口。</translation>
 <translation id="4364830672918311045">显示通知</translation>
-<translation id="4365673000813822030">糟糕,同步已停止。</translation>
 <translation id="4366956553771076218">使用<ph name="APP_NAME" /><ph name="ACTION_NAME" />。</translation>
 <translation id="4370975561335139969">您输入的电子邮件地址和密码不匹配。</translation>
 <translation id="437184764829821926">高级字体设置</translation>
@@ -2230,6 +2239,7 @@
 <translation id="4378551569595875038">正在连接…</translation>
 <translation id="4378556263712303865">设备申请</translation>
 <translation id="4380648069038809855">已进入全屏模式</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" />,以及另外 1 个帐号}other{<ph name="EMAIL" />,以及另外 <ph name="EXTRA_ACCOUNTS" /> 个帐号}}</translation>
 <translation id="4384312707950789900">添加到首选网络列表</translation>
 <translation id="4384652540891215547">激活该扩展程序</translation>
 <translation id="438503109373656455">小马</translation>
@@ -2360,6 +2370,7 @@
 <translation id="4596295440756783523">您有证书可标识以下服务器</translation>
 <translation id="4598556348158889687">存储空间管理</translation>
 <translation id="4598776695426288251">可通过多部设备使用 Wi-Fi</translation>
+<translation id="4599134080475764833">插件虚拟机可以使用了</translation>
 <translation id="4602466770786743961">始终允许 <ph name="HOST" /> 使用您的摄像头和麦克风</translation>
 <translation id="4608500690299898628">查找(&amp;F)...</translation>
 <translation id="4608520674724523647">注册成功图示</translation>
@@ -2397,6 +2408,7 @@
 <translation id="4662788913887017617">将此书签共享给您的 iPhone</translation>
 <translation id="4663373278480897665">已允许使用摄像头</translation>
 <translation id="4664482161435122549">PKCS #12 导出错误</translation>
+<translation id="4664736447097490764">请在此处修改 Kerberos 配置文件。</translation>
 <translation id="4665014895760275686">制造商</translation>
 <translation id="4665446389743427678">即将删除 <ph name="SITE" /> 存储的所有数据。</translation>
 <translation id="4668721319092543482">点击即可启用 <ph name="PLUGIN_NAME" /></translation>
@@ -2498,7 +2510,6 @@
 <translation id="4830502475412647084">正在安装操作系统更新</translation>
 <translation id="4830573902900904548">您的<ph name="DEVICE_TYPE" />无法通过<ph name="NETWORK_NAME" />连接到互联网,请选择其他网络。<ph name="LEARN_MORE_LINK_START" />了解详情<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome 无权访问请求的资源。</translation>
-<translation id="4835836146030131423">登录发生错误。</translation>
 <translation id="4837926214103741331">您无权使用此设备。请向此设备的所有者申请登录权限。</translation>
 <translation id="4837952862063191349">要解锁并恢复您的本地数据,请输入旧的<ph name="DEVICE_TYPE" />密码。</translation>
 <translation id="4838836835474292213">已获准读取剪贴板</translation>
@@ -2633,7 +2644,6 @@
 <translation id="5029568752722684782">清除副本</translation>
 <translation id="5030338702439866405">颁发者</translation>
 <translation id="5033266061063942743">几何图形</translation>
-<translation id="5033619151015094114">您的公司或组织要求更新此设备</translation>
 <translation id="503498442187459473"><ph name="HOST" /> 想使用您的摄像头和麦克风</translation>
 <translation id="5036662165765606524">禁止任何网站自动下载多个文件</translation>
 <translation id="5037676449506322593">全选</translation>
@@ -2770,6 +2780,7 @@
 <translation id="5255859108402770436">重新登录</translation>
 <translation id="5256861893479663409">在所有网站上</translation>
 <translation id="5258992782919386492">在此设备上安装</translation>
+<translation id="5260334392110301220">智能引号</translation>
 <translation id="5260508466980570042">抱歉,您的电子邮件地址或密码无法进行验证,请重试。</translation>
 <translation id="5261683757250193089">在 Chrome 网上应用店中打开</translation>
 <translation id="5264148714798105376">这可能需要 1 分钟左右。</translation>
@@ -2804,6 +2815,7 @@
 <translation id="5301751748813680278">以访客身份登录。</translation>
 <translation id="5301954838959518834">知道了</translation>
 <translation id="5302048478445481009">语言</translation>
+<translation id="5302932258331363306">显示替换项目</translation>
 <translation id="5305688511332277257">未安装任何证书</translation>
 <translation id="5307030433605830021">来源不受支持</translation>
 <translation id="5308380583665731573">连接</translation>
@@ -2903,6 +2915,7 @@
 <translation id="5457113250005438886">无效</translation>
 <translation id="5457459357461771897">读取和删除您计算机上的照片、音乐和其他媒体</translation>
 <translation id="5457599981699367932">以访客身份浏览</translation>
+<translation id="5457991019809708398">已启用,未使用漫游服务</translation>
 <translation id="5458998536542739734">锁定屏幕备注</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> 的索引</translation>
 <translation id="5463856536939868464">包含隐藏书签的菜单</translation>
@@ -3128,6 +3141,7 @@
 <translation id="5799508265798272974">Linux 虚拟机:<ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">目标文件在上次下载后被截断或删除。</translation>
 <translation id="5801568494490449797">偏好设置</translation>
+<translation id="5804175651771201311">漫游服务已关闭</translation>
 <translation id="5804241973901381774">权限</translation>
 <translation id="5805697420284793859">窗口管理器</translation>
 <translation id="5811750797187914944">设置完毕</translation>
@@ -3475,6 +3489,7 @@
 <translation id="6317318380444133405">已不再受支持。</translation>
 <translation id="6317369057005134371">等待应用窗口…</translation>
 <translation id="6318407754858604988">已开始下载</translation>
+<translation id="6318944945640833942">无法检测到打印机。请重新输入打印机地址。</translation>
 <translation id="6322653941595359182">通过您的 Chromebook 收发短信</translation>
 <translation id="6324916366299863871">修改快捷方式</translation>
 <translation id="6325191661371220117">停用自动启动</translation>
@@ -3731,6 +3746,7 @@
 <translation id="6725073593266469338">界面服务</translation>
 <translation id="6725206449694821596">互联网打印协议 (IPP)</translation>
 <translation id="67269783048918309">发送使用情况数据和诊断数据。目前,此设备会自动向 Google 发送诊断数据、设备数据和应用使用情况数据。这些数据不会被用来辨识您孩子的身份,而是会被用来帮助提高系统和应用的稳定性以及实现其他方面的改进。部分汇总数据也会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。这项<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />是由此设备的所有者强制指定的。如果您已为孩子开启“其他网络与应用活动记录”设置,这些数据可能会被保存到其 Google 帐号中。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">已连接,剩余电量为 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6732801395666424405">未加载证书</translation>
 <translation id="6732900235521116609">无法移除快捷方式</translation>
 <translation id="6735304988756581115">显示 Cookie 和其他网站数据…</translation>
@@ -3823,6 +3839,7 @@
 <translation id="6876155724392614295">自行车</translation>
 <translation id="6877460900831874810">允许在锁定屏幕上播放 Chrome 中的媒体</translation>
 <translation id="6878422606530379992">已获准使用传感器</translation>
+<translation id="6878665006737889642">请尝试重新安装</translation>
 <translation id="6880587130513028875">已拦截此网页上的图片。</translation>
 <translation id="6883319974225028188">糟糕!系统未能保存设备配置。</translation>
 <translation id="6885771755599377173">系统信息预览</translation>
@@ -3991,6 +4008,7 @@
 <translation id="7120865473764644444">无法连接到同步服务器。正在重试…</translation>
 <translation id="7121362699166175603">清除历史记录和地址栏中的自动填充项。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation>
 <translation id="7121389946694989825">发送使用情况数据和诊断数据。目前,此设备会自动向 Google 发送诊断数据、设备数据和应用使用情况数据。这些数据不会被用来辨识您孩子的身份,而是会被用来帮助提高系统和应用的稳定性以及实现其他方面的改进。部分汇总数据也会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。如果您已为孩子开启“其他网络与应用活动记录”设置,这些数据可能会被保存到其 Google 帐号中。<ph name="BEGIN_LINK1" />了解详情<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">智能破折号</translation>
 <translation id="7123360114020465152">已不再受支持</translation>
 <translation id="7124929488592184705">打印 <ph name="DOCUMENT_NAME" /> 时出错</translation>
 <translation id="7127980134843952133">下载记录</translation>
@@ -4139,6 +4157,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> 现处于全屏模式。</translation>
 <translation id="7340650977506865820">该网站正在共享您的屏幕</translation>
 <translation id="7341834142292923918">想要访问此网站</translation>
+<translation id="7344488796804562294">高级 Kerberos 配置</translation>
 <translation id="7345706641791090287">确认您的密码</translation>
 <translation id="7346909386216857016">知道了</translation>
 <translation id="7347751611463936647">要使用该扩展程序,请依次键入“<ph name="EXTENSION_KEYWORD" />”和 TAB,然后键入您的命令或搜索。</translation>
@@ -4747,6 +4766,7 @@
 <translation id="8227119283605456246">附上文件</translation>
 <translation id="8230134520748321204">要保存 <ph name="ORIGIN" /> 的密码吗?</translation>
 <translation id="8234795456569844941">请告诉我们在您收到个人资料错误消息之前发生的情况,以帮助我们的工程师解决此问题:</translation>
+<translation id="8236917170563564587">改为分享此标签页</translation>
 <translation id="8241040075392580210">晴间多云</translation>
 <translation id="8241806945692107836">正在确定设备配置…</translation>
 <translation id="8241868517363889229">读取和更改您的书签</translation>
@@ -4758,6 +4778,7 @@
 <translation id="8249048954461686687">OEM文件夹</translation>
 <translation id="8249615410597138718">发送到您的设备</translation>
 <translation id="8249672078237421304">询问是否翻译非您所用语言的网页</translation>
+<translation id="8251441930213048644">立即刷新</translation>
 <translation id="8251578425305135684">已删除缩略图。</translation>
 <translation id="8252569384384439529">正在上传…</translation>
 <translation id="8253198102038551905">点击“+”可查看网络属性</translation>
@@ -5135,6 +5156,7 @@
 <translation id="8827752199525959199">更多操作,<ph name="USERNAME" /> 在 <ph name="DOMAIN" /> 上的密码</translation>
 <translation id="882854468542856424">不允许任何网站发现附近的蓝牙设备</translation>
 <translation id="8828933418460119530">DNS 名称</translation>
+<translation id="883062543841130884">替换项目</translation>
 <translation id="8830796635868321089">无法使用当前代理设置来检查更新,请调整您的<ph name="PROXY_SETTINGS_LINK_START" />代理设置<ph name="PROXY_SETTINGS_LINK_END" />。</translation>
 <translation id="8831664945713891930">打开扩展程序设置</translation>
 <translation id="8834039744648160717">网络配置由 <ph name="USER_EMAIL" /> 控制。</translation>
@@ -5155,6 +5177,7 @@
 <translation id="8862003515646449717">改用极速浏览器</translation>
 <translation id="8863753581171631212">在<ph name="APP" />的新窗口中打开链接</translation>
 <translation id="8864055848767439877">正在将“<ph name="TAB_NAME" />”分享到 <ph name="APP_NAME" /></translation>
+<translation id="8864458770072227512"><ph name="EMAIL" /> 已从此设备中移除</translation>
 <translation id="8868626022555786497">已使用</translation>
 <translation id="8870318296973696995">主页</translation>
 <translation id="8870413625673593573">最近关闭的标签页</translation>
@@ -5163,7 +5186,6 @@
 <translation id="8871974300055371298">内容设置</translation>
 <translation id="8872155268274985541">发现无效的自助服务终端外部更新清单文件,未能成功更新自助服务终端应用。请拔下 U 盘。</translation>
 <translation id="8874184842967597500">未连接</translation>
-<translation id="887550310442005096">您的公司或组织要求您更新此设备</translation>
 <translation id="8876307312329369159">在演示会话中,此设置无法更改。</translation>
 <translation id="8877448029301136595">[上级目录]</translation>
 <translation id="8879284080359814990">显示为标签页(&amp;S)</translation>
@@ -5278,6 +5300,7 @@
 <translation id="9044646465488564462">无法连接到网络:<ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">将您尝试访问的网页的网址发送至 Google</translation>
 <translation id="9046895021617826162">连接失败</translation>
+<translation id="9047391224416514812">已存在使用此用户名的帐号</translation>
 <translation id="9050666287014529139">密码</translation>
 <translation id="9052208328806230490">您已使用帐号 <ph name="EMAIL" /> 将您的打印机注册为<ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="9052404922357793350">继续拦截</translation>
@@ -5325,6 +5348,7 @@
 <translation id="9121814364785106365">在固定标签页中打开</translation>
 <translation id="9124003689441359348">已保存的密码将显示在这里</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" />(剩余 <ph name="LICENSE_COUNT" /> 项)</translation>
+<translation id="9128317794749765148">无法完成设置</translation>
 <translation id="9128870381267983090">连接到网络</translation>
 <translation id="9130015405878219958">输入的模式无效。</translation>
 <translation id="9131487537093447019">向蓝牙设备发送消息,以及接收来自蓝牙设备的消息。</translation>
@@ -5393,6 +5417,7 @@
 <translation id="939598580284253335">请输入密码</translation>
 <translation id="939736085109172342">新建文件夹</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共享 Chrome 标签页和音频。</translation>
+<translation id="945166830402967374">请与您单位的设备管理员联系</translation>
 <translation id="945522503751344254">发送反馈</translation>
 <translation id="947329552760389097">检查元素(&amp;I)</translation>
 <translation id="952992212772159698">未激活</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index c46eb77..78371f3 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -188,6 +188,7 @@
 <translation id="126156426083987769">示範模式的裝置授權發生問題。</translation>
 <translation id="126710816202626562">翻譯語言:</translation>
 <translation id="126768002343224824">16x</translation>
+<translation id="1269405567167332785">進階設定</translation>
 <translation id="1272079795634619415">停止</translation>
 <translation id="1272978324304772054">裝置註冊的網域中沒有這個使用者帳戶。如果你要使用其他網域進行註冊,必須先完成裝置修復作業。</translation>
 <translation id="1274977772557788323">Adobe Flash Player 儲存設定</translation>
@@ -300,6 +301,7 @@
 <translation id="144283815522798837">已選取 <ph name="NUMBER_OF_ITEMS_SELECTED" /> 個項目</translation>
 <translation id="1444628761356461360">這項設定是由裝置擁有者「<ph name="OWNER_EMAIL" />」管理。</translation>
 <translation id="144518587530125858"> 無法載入主題的「<ph name="IMAGE_PATH" />」。</translation>
+<translation id="1445693676523799095">請稍待片刻</translation>
 <translation id="1451375123200651445">另存為單一檔案網頁</translation>
 <translation id="1451917004835509682">新增受監管的使用者</translation>
 <translation id="1454223536435069390">擷取螢幕畫面(&amp;A)</translation>
@@ -594,6 +596,7 @@
 <translation id="1875387611427697908">只能從 <ph name="CHROME_WEB_STORE" /> 新增</translation>
 <translation id="1877520246462554164">無法取得驗證憑證。請先登出,然後重新登入再試一次。</translation>
 <translation id="1877860345998737529">開關動作指派</translation>
+<translation id="1878541307036593717">設定權限</translation>
 <translation id="1879000426787380528">登入身分</translation>
 <translation id="1880905663253319515">要刪除憑證「<ph name="CERTIFICATE_NAME" />」嗎?</translation>
 <translation id="1886996562706621347">允許網站要求成為通訊協定的預設處理常式 (建議)</translation>
@@ -606,6 +609,7 @@
 <translation id="1895252664692693738">剩餘時間:<ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">關閉</translation>
 <translation id="1895934970388272448">你必須在印表機上確認註冊,才能完成這個程序。請立即查看。</translation>
+<translation id="1899826437968063457">Plugin VM 需要取得權限才能執行</translation>
 <translation id="1901303067676059328">選取全部(&amp;A)</translation>
 <translation id="1902576642799138955">有效期間</translation>
 <translation id="1904394285866191268">{NUM_TABS,plural, =1{關閉分頁音訊}other{關閉多個分頁的音訊}}</translation>
@@ -879,6 +883,7 @@
 <translation id="2318923050469484167">目前的無痕模式工作階段 (<ph name="EMBEDDING" />)</translation>
 <translation id="2322193970951063277">頁首及頁尾</translation>
 <translation id="2322318151094136999">當網站要存取序列埠時,必須先詢問你 (建議)</translation>
+<translation id="2325444234681128157">記住密碼</translation>
 <translation id="2326931316514688470">重新載入應用程式(&amp;R)</translation>
 <translation id="2327492829706409234">啟用應用程式</translation>
 <translation id="2329597144923131178">登入後,即可從您使用的任何裝置取得自己的書籤、歷史記錄、密碼和其他設定。</translation>
@@ -945,6 +950,7 @@
 <translation id="2433452467737464329">在網址中新增查詢參數即可自動重新整理網頁:chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">外觀</translation>
 <translation id="2433836460518180625">僅限解鎖裝置</translation>
+<translation id="2434449159125086437">無法設定印表機,請檢查設定後再試一次。</translation>
 <translation id="2435248616906486374">網路已中斷連線</translation>
 <translation id="2435457462613246316">顯示密碼</translation>
 <translation id="2436186046335138073">要允許 <ph name="HANDLER_HOSTNAME" /> 開啟所有<ph name="PROTOCOL" />連結嗎?</translation>
@@ -1097,6 +1103,7 @@
 <translation id="2649045351178520408">Base64 編碼 ASCII,憑證鏈結</translation>
 <translation id="2653033005692233957">搜尋失敗</translation>
 <translation id="2653266418988778031">如果你刪除了憑證授權單位 (CA) 的憑證,你的瀏覽器就不會再信任該憑證授權單位所核發的任何憑證。</translation>
+<translation id="2653275834716714682">替換文字</translation>
 <translation id="2653659639078652383">提交</translation>
 <translation id="265390580714150011">欄位值</translation>
 <translation id="2654166010170466751">允許網站安裝付款處理常式</translation>
@@ -1305,6 +1312,7 @@
 <translation id="29488703364906173">一款快速、簡單又安全的新世代網路瀏覽器。</translation>
 <translation id="2949289451367477459">使用定位服務。允許具有位置存取權的應用程式和服務使用這個裝置的位置資訊。Google 可能會定期收集位置資料,並以匿名方式使用這類資料,藉此提高定位精確度及改善適地性服務。<ph name="BEGIN_LINK1" />瞭解詳情<ph name="END_LINK1" /></translation>
 <translation id="2958721676848865875">封裝擴充功能警告</translation>
+<translation id="2959842337402130152">儲存空間不足,因此無法復原。請釋出 <ph name="SPACE_REQUIRED" /> 的裝置儲存空間,然後再試一次。</translation>
 <translation id="296026337010986570">大功告成!有害軟體已移除。如要重新開啟擴充功能,請造訪&lt;a href="chrome://extensions"&gt;擴充功能&lt;/a&gt;。</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (擴充功能已提供)</translation>
 <translation id="2961695502793809356">按一下到下一頁,按住可查看記錄</translation>
@@ -1612,7 +1620,6 @@
 <translation id="3454157711543303649">啟用完成</translation>
 <translation id="3454213325559396544">這是這部 <ph name="DEVICE_TYPE" /> 最後一次自動更新軟體和安全性。如要取得後續更新,請升級為較新的型號。</translation>
 <translation id="345693547134384690">在新分頁中開啟圖片(&amp;I)</translation>
-<translation id="3457500881955698515">你的公司或機構要求立即更新這部裝置</translation>
 <translation id="3459509316159669723">列印</translation>
 <translation id="3459697287128633276">如要使用你的帳戶存取 Google Play 商店,請透過識別資訊提供者進行驗證。</translation>
 <translation id="3459774175445953971">最後修改日期:</translation>
@@ -1988,6 +1995,7 @@
 <translation id="3966072572894326936">選擇其他資料夾...</translation>
 <translation id="3967822245660637423">下載完成</translation>
 <translation id="3967919079500697218">你的管理員已停用拍攝螢幕擷取畫面功能。</translation>
+<translation id="3969092967100188979">已啟用,正在使用漫遊服務</translation>
 <translation id="3970114302595058915">ID</translation>
 <translation id="397105322502079400">計算中…</translation>
 <translation id="3975565978598857337">無法連線至指定領域的伺服器</translation>
@@ -2049,6 +2057,7 @@
 <translation id="4068776064906523561">已儲存的指紋</translation>
 <translation id="407173827865827707">點擊時</translation>
 <translation id="4072793381000095">{NUM_TABS,plural, =1{取消固定分頁}other{取消固定多個分頁}}</translation>
+<translation id="4072805772816336153">請稍後再試</translation>
 <translation id="4074900173531346617">電子郵件簽署者憑證</translation>
 <translation id="407520071244661467">縮放比例</translation>
 <translation id="4075639477629295004">無法投放「<ph name="FILE_NAME" />」。</translation>
@@ -2137,6 +2146,7 @@
 <translation id="4209092469652827314">大</translation>
 <translation id="4209251085232852247">已關閉</translation>
 <translation id="4209464433672152343">已將文件<ph name="BEGIN_LINK_HELP" />傳送至 Google<ph name="END_LINK_HELP" /> 準備列印。如要查看、編輯或管理你的印表機和列印記錄,請前往 <ph name="BEGIN_LINK_DASHBOARD" />Google 雲端列印資訊主頁<ph name="END_LINK_DASHBOARD" />。</translation>
+<translation id="4210048056321123003">正在下載虛擬機器</translation>
 <translation id="421182450098841253">顯示書籤列(&amp;S)</translation>
 <translation id="4211851069413100178">傳送使用狀況與診斷資料。讓系統自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google,協助改善你的 Android 使用體驗。這些資料將有助於系統和應用程式提高穩定性及做出其他改善。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />是由裝置擁有者執行。擁有者可選擇將這個裝置的診斷資料與使用狀況資料傳送給 Google。如果你的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到你的 Google 帳戶。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">匯出</translation>
@@ -2225,7 +2235,6 @@
 <translation id="4364327530094270451">瓜</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation>
 <translation id="4364830672918311045">顯示通知</translation>
-<translation id="4365673000813822030">糟糕,同步處理已停止運作。</translation>
 <translation id="4366956553771076218">使用「<ph name="APP_NAME" />」<ph name="ACTION_NAME" />。</translation>
 <translation id="4370975561335139969">您所輸入的電子郵件和密碼不相符</translation>
 <translation id="437184764829821926">進階字型設定</translation>
@@ -2236,6 +2245,7 @@
 <translation id="4378551569595875038">連線中…</translation>
 <translation id="4378556263712303865">裝置申請</translation>
 <translation id="4380648069038809855">已開啟全螢幕模式</translation>
+<translation id="4382131447572146376">{COUNT,plural, =0{<ph name="EMAIL" />}=1{<ph name="EMAIL" /> 和另外 1 個帳戶}other{<ph name="EMAIL" /> 和另外 <ph name="EXTRA_ACCOUNTS" /> 個帳戶}}</translation>
 <translation id="4384312707950789900">加入慣用網路</translation>
 <translation id="4384652540891215547">啟用擴充功能</translation>
 <translation id="438503109373656455">赤兔馬</translation>
@@ -2366,6 +2376,7 @@
 <translation id="4596295440756783523">您儲存了這些伺服器的識別憑證</translation>
 <translation id="4598556348158889687">儲存空間管理</translation>
 <translation id="4598776695426288251">可透過多部裝置使用 Wi-Fi</translation>
+<translation id="4599134080475764833">Plugin VM 已可供使用</translation>
 <translation id="4602466770786743961">一律允許 <ph name="HOST" /> 存取你的攝影機和麥克風</translation>
 <translation id="4608500690299898628">尋找(&amp;F)...</translation>
 <translation id="4608520674724523647">註冊成功插圖</translation>
@@ -2403,6 +2414,7 @@
 <translation id="4662788913887017617">在 iPhone 上取得這個書籤</translation>
 <translation id="4663373278480897665">可使用攝影機</translation>
 <translation id="4664482161435122549">PKCS #12 匯出錯誤</translation>
+<translation id="4664736447097490764">請在這裡編輯 Kerberos 設定檔。</translation>
 <translation id="4665014895760275686">製造商</translation>
 <translation id="4665446389743427678"><ph name="SITE" /> 儲存的所有資料都將遭到刪除。</translation>
 <translation id="4668721319092543482">按一下即可啟用「<ph name="PLUGIN_NAME" />」</translation>
@@ -2504,7 +2516,6 @@
 <translation id="4830502475412647084">正在安裝作業系統更新</translation>
 <translation id="4830573902900904548">您的 <ph name="DEVICE_TYPE" /> 無法透過 <ph name="NETWORK_NAME" /> 連線至網際網路,請選擇其他網路。<ph name="LEARN_MORE_LINK_START" />瞭解詳情<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4835385943915508971">Chrome 無法存取要求的資源。</translation>
-<translation id="4835836146030131423">登入發生錯誤。</translation>
 <translation id="4837926214103741331">您未獲得授權,無法使用這個裝置。如需登入權限,請與裝置擁有者聯絡。</translation>
 <translation id="4837952862063191349">如要解鎖並還原您的本機資料,請輸入舊的 <ph name="DEVICE_TYPE" /> 密碼。</translation>
 <translation id="4838836835474292213">已允許讀取剪貼簿</translation>
@@ -2639,7 +2650,6 @@
 <translation id="5029568752722684782">清除複本</translation>
 <translation id="5030338702439866405">發行者</translation>
 <translation id="5033266061063942743">幾何形狀</translation>
-<translation id="5033619151015094114">你的公司或機構要求更新這部裝置</translation>
 <translation id="503498442187459473"><ph name="HOST" /> 要求使用攝影機和麥克風</translation>
 <translation id="5036662165765606524">禁止任何網站自動下載多個檔案</translation>
 <translation id="5037676449506322593">全選</translation>
@@ -2776,6 +2786,7 @@
 <translation id="5255859108402770436">重新登入</translation>
 <translation id="5256861893479663409">在所有網站上</translation>
 <translation id="5258992782919386492">安裝到這部裝置</translation>
+<translation id="5260334392110301220">智慧型引號</translation>
 <translation id="5260508466980570042">抱歉,系統無法驗證你的電子郵件地址或密碼,請再試一次。</translation>
 <translation id="5261683757250193089">開啟線上應用程式商店</translation>
 <translation id="5264148714798105376">請稍候片刻。</translation>
@@ -2810,6 +2821,7 @@
 <translation id="5301751748813680278">正在以訪客身分登入。</translation>
 <translation id="5301954838959518834">好,我知道了</translation>
 <translation id="5302048478445481009">語言</translation>
+<translation id="5302932258331363306">顯示替代項目</translation>
 <translation id="5305688511332277257">未安裝任何憑證</translation>
 <translation id="5307030433605830021">不支援的來源</translation>
 <translation id="5308380583665731573">連線</translation>
@@ -2909,6 +2921,7 @@
 <translation id="5457113250005438886">無效</translation>
 <translation id="5457459357461771897">讀取及刪除你電腦中的相片、音樂及其他媒體</translation>
 <translation id="5457599981699367932">以訪客身分瀏覽</translation>
+<translation id="5457991019809708398">已啟用,未使用漫遊服務</translation>
 <translation id="5458998536542739734">螢幕鎖定時的記事設定</translation>
 <translation id="5463275305984126951"><ph name="LOCATION" /> 的索引</translation>
 <translation id="5463856536939868464">選單包含隱藏的書籤</translation>
@@ -3134,6 +3147,7 @@
 <translation id="5799508265798272974">Linux 虛擬機器:<ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">上次下載之後,目標檔案已遭截斷或移除。</translation>
 <translation id="5801568494490449797">偏好設定</translation>
+<translation id="5804175651771201311">已關閉漫遊服務</translation>
 <translation id="5804241973901381774">權限</translation>
 <translation id="5805697420284793859">視窗管理員</translation>
 <translation id="5811750797187914944">設定完成</translation>
@@ -3481,6 +3495,7 @@
 <translation id="6317318380444133405">已停止支援。</translation>
 <translation id="6317369057005134371">正在等待應用程式視窗...</translation>
 <translation id="6318407754858604988">已開始下載</translation>
+<translation id="6318944945640833942">偵測不到印表機,請再次輸入印表機位址。</translation>
 <translation id="6322653941595359182">透過你的 Chromebook 收發簡訊</translation>
 <translation id="6324916366299863871">編輯捷徑</translation>
 <translation id="6325191661371220117">停用自動啟動功能</translation>
@@ -3737,6 +3752,7 @@
 <translation id="6725073593266469338">UI 服務</translation>
 <translation id="6725206449694821596">網際網路列印通訊協定 (IPP)</translation>
 <translation id="67269783048918309">傳送使用狀況與診斷資料。這個裝置目前會自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google。這些資料將有助於系統和應用程式提高穩定性及做出其他改善,並不會用於識別貴子女的身分。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />是由裝置擁有者執行。如果貴子女的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到他們的 Google 帳戶。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
+<translation id="6727969043791803658">已連線,電量為 <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6732801395666424405">未載入憑證</translation>
 <translation id="6732900235521116609">無法移除捷徑</translation>
 <translation id="6735304988756581115">顯示 Cookie 和其他網站資料...</translation>
@@ -3829,6 +3845,7 @@
 <translation id="6876155724392614295">自行車</translation>
 <translation id="6877460900831874810">在螢幕鎖定畫面啟用 Chrome 媒體播放功能</translation>
 <translation id="6878422606530379992">可使用感應器</translation>
+<translation id="6878665006737889642">請嘗試重新安裝</translation>
 <translation id="6880587130513028875">系統已封鎖此網頁的圖片。</translation>
 <translation id="6883319974225028188">糟糕!  系統無法儲存裝置設定。</translation>
 <translation id="6885771755599377173">預覽系統資訊</translation>
@@ -3997,6 +4014,7 @@
 <translation id="7120865473764644444">無法連上同步處理伺服器。重試中...</translation>
 <translation id="7121362699166175603">將歷史記錄和自動即時查詢從網址列中清除。你的 Google 帳戶可能會儲存其他形式的瀏覽記錄,請參閱 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />。</translation>
 <translation id="7121389946694989825">傳送使用狀況與診斷資料。這個裝置目前會自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google。這些資料將有助於系統和應用程式提高穩定性及做出其他改善,並不會用於識別貴子女的身分。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。如果貴子女的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到他們的 Google 帳戶。<ph name="BEGIN_LINK1" />瞭解詳情<ph name="END_LINK1" /></translation>
+<translation id="7121728544325372695">智慧型破折號</translation>
 <translation id="7123360114020465152">已停止支援</translation>
 <translation id="7124929488592184705">列印「<ph name="DOCUMENT_NAME" />」時發生錯誤</translation>
 <translation id="7127980134843952133">下載記錄</translation>
@@ -4145,6 +4163,7 @@
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕。</translation>
 <translation id="7340650977506865820">網站正在分享你的螢幕畫面</translation>
 <translation id="7341834142292923918">需要這個網站的存取權限</translation>
+<translation id="7344488796804562294">Kerberos 進階設定</translation>
 <translation id="7345706641791090287">確認您的密碼</translation>
 <translation id="7346909386216857016">好,我知道了</translation>
 <translation id="7347751611463936647">如要使用這個擴充功能,請輸入「<ph name="EXTENSION_KEYWORD" />」,然後按 TAB 鍵,接著再輸入你的指令或搜尋項目。</translation>
@@ -4754,6 +4773,7 @@
 <translation id="8227119283605456246">附加檔案</translation>
 <translation id="8230134520748321204">要儲存 <ph name="ORIGIN" /> 的密碼嗎?</translation>
 <translation id="8234795456569844941">請告訴我們在你收到設定檔錯誤訊息前執行的動作,以協助工程師修正此問題:</translation>
+<translation id="8236917170563564587">改為分享這個分頁</translation>
 <translation id="8241040075392580210">晴時多雲</translation>
 <translation id="8241806945692107836">正在確定裝置設定...</translation>
 <translation id="8241868517363889229">讀取及變更你的書籤</translation>
@@ -4765,6 +4785,7 @@
 <translation id="8249048954461686687">OEM 資料夾</translation>
 <translation id="8249615410597138718">傳送至你的裝置</translation>
 <translation id="8249672078237421304">詢問是否將網頁翻譯成你慣用的語言</translation>
+<translation id="8251441930213048644">立即重新整理</translation>
 <translation id="8251578425305135684">已移除縮圖。</translation>
 <translation id="8252569384384439529">上傳中...</translation>
 <translation id="8253198102038551905">按一下 [+] 即可查看網路屬性</translation>
@@ -5142,6 +5163,7 @@
 <translation id="8827752199525959199">更多動作,<ph name="USERNAME" /> 在 <ph name="DOMAIN" /> 上的密碼</translation>
 <translation id="882854468542856424">不允許任何網站搜尋附近的藍牙裝置</translation>
 <translation id="8828933418460119530">DNS 名稱</translation>
+<translation id="883062543841130884">替代項目</translation>
 <translation id="8830796635868321089">無法以目前的 Proxy 設定啟動更新檢查,請調整 <ph name="PROXY_SETTINGS_LINK_START" />Proxy 設定<ph name="PROXY_SETTINGS_LINK_END" />。</translation>
 <translation id="8831664945713891930">開啟擴充功能設定</translation>
 <translation id="8834039744648160717">網路設定由 <ph name="USER_EMAIL" /> 控制。</translation>
@@ -5162,6 +5184,7 @@
 <translation id="8862003515646449717">改用速度飛快的瀏覽器</translation>
 <translation id="8863753581171631212">另外在「<ph name="APP" />」中開啟連結</translation>
 <translation id="8864055848767439877">正在與 <ph name="APP_NAME" /> 共用 <ph name="TAB_NAME" /></translation>
+<translation id="8864458770072227512">已將 <ph name="EMAIL" /> 從這個裝置中移除</translation>
 <translation id="8868626022555786497">已使用的空間</translation>
 <translation id="8870318296973696995">首頁</translation>
 <translation id="8870413625673593573">最近關閉的分頁</translation>
@@ -5170,7 +5193,6 @@
 <translation id="8871974300055371298">內容設定</translation>
 <translation id="8872155268274985541">找到的 Kiosk 外部更新資訊清單檔案無效,無法更新 Kiosk 應用程式。請移除 USB 隨身碟。</translation>
 <translation id="8874184842967597500">未連線</translation>
-<translation id="887550310442005096">你的公司或機構要求更新這部裝置</translation>
 <translation id="8876307312329369159">這項設定無法在示範工作階段中變更。</translation>
 <translation id="8877448029301136595">[父目錄]</translation>
 <translation id="8879284080359814990">以分頁顯示(&amp;S)</translation>
@@ -5285,6 +5307,7 @@
 <translation id="9044646465488564462">無法連線至網路:<ph name="DETAILS" /></translation>
 <translation id="9045430190527754450">將你嘗試瀏覽的網頁網址傳送給 Google</translation>
 <translation id="9046895021617826162">連線失敗</translation>
+<translation id="9047391224416514812">已有帳戶使用這個使用者名稱</translation>
 <translation id="9050666287014529139">通關密語</translation>
 <translation id="9052208328806230490">你已透過 <ph name="EMAIL" /> 帳戶並使用 <ph name="CLOUD_PRINT_NAME" /> 為你的印表機註冊</translation>
 <translation id="9052404922357793350">繼續封鎖</translation>
@@ -5332,6 +5355,7 @@
 <translation id="9121814364785106365">在固定分頁中開啟</translation>
 <translation id="9124003689441359348">你所儲存的密碼會顯示在這裡</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (還剩 <ph name="LICENSE_COUNT" /> 個)</translation>
+<translation id="9128317794749765148">無法完成設定</translation>
 <translation id="9128870381267983090">連線至網路</translation>
 <translation id="9130015405878219958">輸入的模式無效。</translation>
 <translation id="9131487537093447019">透過藍牙裝置收發訊息。</translation>
@@ -5400,6 +5424,7 @@
 <translation id="939598580284253335">請輸入通關密語</translation>
 <translation id="939736085109172342">新增資料夾</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共用 Chrome 分頁和音訊。</translation>
+<translation id="945166830402967374">請與貴機構的裝置管理員聯絡</translation>
 <translation id="945522503751344254">提供意見</translation>
 <translation id="947329552760389097">檢查元素 (&amp;I)</translation>
 <translation id="952992212772159698">未啟用</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 57daee10..31034813 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -119,7 +119,7 @@
 <translation id="4050175100176540509">Vigtige sikkerhedsforbedringer og nye funktioner er tilgængelige i den seneste version.</translation>
 <translation id="4053720452172726777">Tilpas Google Chrome</translation>
 <translation id="4143243756087420366">Chrome-navn og -billede</translation>
-<translation id="4147555960264124640">Du er ved at logge ind med en administreret konto og give dens administrator kontrol over din profil i Google Chrome. Dine Chrome-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. <ph name="LEARN_MORE" /></translation>
+<translation id="4147555960264124640">Du er ved at logge ind med en mangerstyret konto og give dens administrator kontrol over din profil i Google Chrome. Dine Chrome-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">Installationsprogrammet kunne ikke pakke arkivet ud. Download Google Chrome igen.</translation>
 <translation id="4191857738314598978">{0,plural, =1{Genstart Chrome inden for én dag}one{Genstart Chrome inden for # dag}other{Genstart Chrome inden for # dage}}</translation>
 <translation id="424864128008805179">Vil du logge ud af Chrome?</translation>
@@ -209,7 +209,7 @@
 <translation id="7098166902387133879">Google Chrome bruger din mikrofon.</translation>
 <translation id="7106741999175697885">Jobliste – Google Chrome</translation>
 <translation id="7164397146364144019">Du kan hjælpe med at gøre Chrome sikrere og nemmere at bruge ved automatisk at rapportere oplysninger om mulige sikkerhedsproblemer til Google.</translation>
-<translation id="7242029209006116544">Du er ved at logge ind med en administreret konto og give dens administrator kontrol over din profil i Google Chrome. Dine Chrome-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. Du kan eventuelt oprette en ny profil for at holde dine eksisterende Chrome-data adskilt. <ph name="LEARN_MORE" /></translation>
+<translation id="7242029209006116544">Du er ved at logge ind med en mangerstyret konto og give dens administrator kontrol over din profil i Google Chrome. Dine Chrome-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via betjeningspanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. Du kan eventuelt oprette en ny profil for at holde dine eksisterende Chrome-data adskilt. <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Dette sprog bruges til at vise Google Chrome-brugerfladen</translation>
 <translation id="7296210096911315575">Vigtige oplysninger om brug og sikkerhed</translation>
 <translation id="7308322188646931570">Chrome skal have lageradgang for at downloade filer</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index ecea062..fc29a38 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -968,11 +968,17 @@
 const FeatureEntry::FeatureParam kResamplingInputEventsKalmanEnabled[] = {
     {"predictor", "kalman"}};
 
+const FeatureEntry::FeatureParam
+    kResamplingInputEventsKalmanTimeFilteredEnabled[] = {
+        {"predictor", "kalman_time_filtered"}};
+
 const FeatureEntry::FeatureVariation kResamplingInputEventsFeatureVariations[] =
     {{"lsq", kResamplingInputEventsLSQEnabled,
       base::size(kResamplingInputEventsLSQEnabled), nullptr},
      {"kalman", kResamplingInputEventsKalmanEnabled,
-      base::size(kResamplingInputEventsKalmanEnabled), nullptr}};
+      base::size(kResamplingInputEventsKalmanEnabled), nullptr},
+     {"kalman time filtered", kResamplingInputEventsKalmanTimeFilteredEnabled,
+      base::size(kResamplingInputEventsKalmanTimeFilteredEnabled), nullptr}};
 
 #if defined(OS_ANDROID)
 const FeatureEntry::FeatureParam kBottomOfflineIndicatorEnabled[] = {
@@ -2124,6 +2130,10 @@
      flag_descriptions::kPasswordsMigrateLinuxToLoginDBName,
      flag_descriptions::kPasswordsMigrateLinuxToLoginDBDescription, kOsLinux,
      FEATURE_VALUE_TYPE(password_manager::features::kMigrateLinuxToLoginDB)},
+    {"enable-dbus-and-x11-status-icons",
+     flag_descriptions::kEnableDbusAndX11StatusIconsName,
+     flag_descriptions::kEnableDbusAndX11StatusIconsDescription, kOsLinux,
+     FEATURE_VALUE_TYPE(features::kEnableDbusAndX11StatusIcons)},
 #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
     {"enable-experimental-accessibility-features",
      flag_descriptions::kExperimentalAccessibilityFeaturesName,
@@ -3972,6 +3982,11 @@
      flag_descriptions::kFontSrcLocalMatchingDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kFontSrcLocalMatching)},
 
+    {"mouse-subframe-no-implicit-capture",
+     flag_descriptions::kMouseSubframeNoImplicitCaptureName,
+     flag_descriptions::kMouseSubframeNoImplicitCaptureDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kMouseSubframeNoImplicitCapture)},
+
     // 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
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm
index 0a0bf508b..313b3554 100644
--- a/chrome/browser/app_controller_mac_browsertest.mm
+++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -41,6 +41,7 @@
 #include "chrome/browser/ui/search/local_ntp_test_utils.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/user_manager.h"
+#include "chrome/browser/ui/webui/welcome/nux_helper.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -471,6 +472,8 @@
 class AppControllerOpenShortcutBrowserTest : public InProcessBrowserTest {
  protected:
   AppControllerOpenShortcutBrowserTest() {
+    scoped_feature_list_.InitWithFeatures({nux::kNuxOnboardingForceEnabled},
+                                          {});
   }
 
   void SetUpInProcessBrowserTestFixture() override {
@@ -510,6 +513,9 @@
     // append about:blank as default url.
     command_line->AppendArg(chrome::kChromeUINewTabURL);
   }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(AppControllerOpenShortcutBrowserTest,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 2e5e477..0b3320f 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -102,6 +102,7 @@
     "//chromeos/dbus/auth_policy:authpolicy_proto",
     "//chromeos/dbus/biod",
     "//chromeos/dbus/constants",
+    "//chromeos/dbus/cros_healthd",
     "//chromeos/dbus/cryptohome",
     "//chromeos/dbus/cryptohome:attestation_proto",
     "//chromeos/dbus/cryptohome:cryptohome_proto",
@@ -125,6 +126,8 @@
     "//chromeos/login/login_state",
     "//chromeos/login/session",
     "//chromeos/network",
+    "//chromeos/services/cros_healthd/public/cpp",
+    "//chromeos/services/cros_healthd/public/mojom",
     "//chromeos/services/device_sync/public/cpp",
     "//chromeos/services/ime/public/mojom",
     "//chromeos/services/machine_learning/public/cpp",
@@ -769,8 +772,6 @@
     "dbus/kiosk_info_service_provider.h",
     "dbus/libvda_service_provider.cc",
     "dbus/libvda_service_provider.h",
-    "dbus/machine_learning_decision_service_provider.cc",
-    "dbus/machine_learning_decision_service_provider.h",
     "dbus/metrics_event_service_provider.cc",
     "dbus/metrics_event_service_provider.h",
     "dbus/plugin_vm_service_provider.cc",
@@ -1326,8 +1327,6 @@
     "login/screens/recommend_apps_screen.h",
     "login/screens/reset_screen.cc",
     "login/screens/reset_screen.h",
-    "login/screens/supervision_onboarding_screen.cc",
-    "login/screens/supervision_onboarding_screen.h",
     "login/screens/supervision_transition_screen.cc",
     "login/screens/supervision_transition_screen.h",
     "login/screens/sync_consent_screen.cc",
@@ -1981,19 +1980,6 @@
     "smb_client/temp_file_manager.h",
     "startup_settings_cache.cc",
     "startup_settings_cache.h",
-    "supervision/kiosk_next_flow_observer.cc",
-    "supervision/kiosk_next_flow_observer.h",
-    "supervision/onboarding_constants.cc",
-    "supervision/onboarding_constants.h",
-    "supervision/onboarding_controller_impl.cc",
-    "supervision/onboarding_controller_impl.h",
-    "supervision/onboarding_delegate.h",
-    "supervision/onboarding_flow_model.cc",
-    "supervision/onboarding_flow_model.h",
-    "supervision/onboarding_logger.cc",
-    "supervision/onboarding_logger.h",
-    "supervision/onboarding_presenter.cc",
-    "supervision/onboarding_presenter.h",
     "system/automatic_reboot_manager.cc",
     "system/automatic_reboot_manager.h",
     "system/automatic_reboot_manager_observer.h",
@@ -2192,7 +2178,6 @@
     "dbus/org.chromium.DriveFileStreamService.conf",
     "dbus/org.chromium.KioskAppService.conf",
     "dbus/org.chromium.LibvdaService.conf",
-    "dbus/org.chromium.MachineLearningDecisionService.conf",
     "dbus/org.chromium.MetricsEventService.conf",
     "dbus/org.chromium.NetworkProxyService.conf",
     "dbus/org.chromium.PluginVmService.conf",
@@ -2686,7 +2671,6 @@
     "smb_client/smb_url_unittest.cc",
     "smb_client/temp_file_manager_unittest.cc",
     "startup_settings_cache_unittest.cc",
-    "supervision/onboarding_controller_impl_unittest.cc",
     "system/automatic_reboot_manager_unittest.cc",
     "system/device_disabling_manager_unittest.cc",
     "system/procfs_util_unittest.cc",
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc
index f52ecba1..f6f079be 100644
--- a/chrome/browser/chromeos/assistant/assistant_util.cc
+++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/interfaces/voice_interaction_controller.mojom-shared.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -92,9 +91,6 @@
   if (prefs->GetBoolean(::assistant::prefs::kAssistantDisabledByPolicy))
     return ash::mojom::AssistantAllowedState::DISALLOWED_BY_POLICY;
 
-  if (prefs->GetBoolean(ash::prefs::kKioskNextShellEnabled))
-    return ash::mojom::AssistantAllowedState::DISALLOWED_BY_KIOSK_NEXT;
-
   // Bypass the account type check when using fake gaia login, e.g. in Tast
   // tests, or the account is logged in a device with a physical Assistant key
   // on keyboard.
diff --git a/chrome/browser/chromeos/assistant/assistant_util_unittest.cc b/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
index 3c8a1573..89f9a2e 100644
--- a/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
+++ b/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "ash/public/cpp/ash_pref_names.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/test/scoped_command_line.h"
 #include "base/test/scoped_feature_list.h"
@@ -273,14 +272,4 @@
             IsAssistantAllowedForProfile(profile()));
 }
 
-TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForKioskNext) {
-  ScopedLogIn login(GetFakeUserManager(),
-                    AccountId::FromUserEmailGaiaId(
-                        profile()->GetProfileUserName(), kTestGaiaId));
-  profile()->GetPrefs()->SetBoolean(ash::prefs::kKioskNextShellEnabled, true);
-
-  EXPECT_EQ(ash::mojom::AssistantAllowedState::DISALLOWED_BY_KIOSK_NEXT,
-            IsAssistantAllowedForProfile(profile()));
-}
-
 }  // namespace assistant
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 43dcafe..8f384fe2 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -51,7 +51,6 @@
 #include "chrome/browser/chromeos/dbus/drive_file_stream_service_provider.h"
 #include "chrome/browser/chromeos/dbus/kiosk_info_service_provider.h"
 #include "chrome/browser/chromeos/dbus/libvda_service_provider.h"
-#include "chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h"
 #include "chrome/browser/chromeos/dbus/metrics_event_service_provider.h"
 #include "chrome/browser/chromeos/dbus/plugin_vm_service_provider.h"
 #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h"
@@ -91,6 +90,7 @@
 #include "chrome/browser/chromeos/power/freezer_cgroup_process_manager.h"
 #include "chrome/browser/chromeos/power/idle_action_warning_observer.h"
 #include "chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_controller.h"
 #include "chrome/browser/chromeos/power/power_data_collector.h"
 #include "chrome/browser/chromeos/power/power_metrics_reporter.h"
 #include "chrome/browser/chromeos/power/process_data_collector.h"
@@ -294,9 +294,6 @@
                                 ? nullptr
                                 : DBusThreadManager::Get()->GetSystemBus();
 
-    // See also PostBrowserStart() where machine_learning_decision_service_ is
-    // initialized.
-
     proxy_resolution_service_ = CrosDBusService::Create(
         system_bus, kNetworkProxyServiceName,
         dbus::ObjectPath(kNetworkProxyServicePath),
@@ -389,19 +386,6 @@
         OwnerSettingsServiceChromeOSFactory::GetInstance()->GetOwnerKeyUtil());
   }
 
-  void CreateMachineLearningDecisionProvider() {
-    dbus::Bus* system_bus = DBusThreadManager::Get()->IsUsingFakes()
-                                ? nullptr
-                                : DBusThreadManager::Get()->GetSystemBus();
-    // TODO(alanlxl): update Ml here to MachineLearning after powerd is
-    // uprevved.
-    machine_learning_decision_service_ = CrosDBusService::Create(
-        system_bus, machine_learning::kMlDecisionServiceName,
-        dbus::ObjectPath(machine_learning::kMlDecisionServicePath),
-        CrosDBusService::CreateServiceProviderList(
-            std::make_unique<MachineLearningDecisionServiceProvider>()));
-  }
-
   ~DBusServices() {
     NetworkHandler::Shutdown();
     cryptohome::AsyncMethodCaller::Shutdown();
@@ -418,7 +402,6 @@
     chrome_features_service_.reset();
     vm_applications_service_.reset();
     drive_file_stream_service_.reset();
-    machine_learning_decision_service_.reset();
     ProcessDataCollector::Shutdown();
     PowerDataCollector::Shutdown();
     PowerPolicyController::Shutdown();
@@ -437,7 +420,6 @@
   std::unique_ptr<CrosDBusService> vm_applications_service_;
   std::unique_ptr<CrosDBusService> drive_file_stream_service_;
   std::unique_ptr<CrosDBusService> libvda_service_;
-  std::unique_ptr<CrosDBusService> machine_learning_decision_service_;
 
   DISALLOW_COPY_AND_ASSIGN(DBusServices);
 };
@@ -1044,10 +1026,8 @@
   }
 
   if (base::FeatureList::IsEnabled(::features::kUserActivityEventLogging)) {
-    // MachineLearningDecisionServiceProvider needs to be created after
-    // UserActivityController which depends on UserActivityDetector, not
-    // available until PostBrowserStart.
-    dbus_services_->CreateMachineLearningDecisionProvider();
+    user_activity_controller_ =
+        std::make_unique<power::ml::UserActivityController>();
   }
 
   auto_screen_brightness_controller_ =
@@ -1118,6 +1098,7 @@
   ScreenLocker::ShutDownClass();
   low_disk_notification_.reset();
   demo_mode_resources_remover_.reset();
+  user_activity_controller_.reset();
   adaptive_screen_brightness_manager_.reset();
   scheduler_configuration_manager_.reset();
   auto_screen_brightness_controller_.reset();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index 653ec18..b89d8bcb45 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -70,6 +70,7 @@
 namespace power {
 namespace ml {
 class AdaptiveScreenBrightnessManager;
+class UserActivityController;
 }  // namespace ml
 
 namespace auto_screen_brightness {
@@ -155,6 +156,7 @@
   std::unique_ptr<power::ml::AdaptiveScreenBrightnessManager>
       adaptive_screen_brightness_manager_;
 
+  std::unique_ptr<power::ml::UserActivityController> user_activity_controller_;
   std::unique_ptr<power::auto_screen_brightness::Controller>
       auto_screen_brightness_controller_;
 
diff --git a/chrome/browser/chromeos/dbus/dbus_helper.cc b/chrome/browser/chromeos/dbus/dbus_helper.cc
index e51a78d..60eee42 100644
--- a/chrome/browser/chromeos/dbus/dbus_helper.cc
+++ b/chrome/browser/chromeos/dbus/dbus_helper.cc
@@ -14,6 +14,7 @@
 #include "chromeos/dbus/audio/cras_audio_client.h"
 #include "chromeos/dbus/auth_policy/auth_policy_client.h"
 #include "chromeos/dbus/biod/biod_client.h"
+#include "chromeos/dbus/cros_healthd/cros_healthd_client.h"
 #include "chromeos/dbus/cups_proxy/cups_proxy_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/initialize_dbus_client.h"
@@ -59,6 +60,7 @@
   InitializeDBusClient<AuthPolicyClient>(bus);
   InitializeDBusClient<BiodClient>(bus);  // For device::Fingerprint.
   InitializeDBusClient<CrasAudioClient>(bus);
+  InitializeDBusClient<CrosHealthdClient>(bus);
   InitializeDBusClient<CryptohomeClient>(bus);
   InitializeDBusClient<CupsProxyClient>(bus);
   InitializeDBusClient<KerberosClient>(bus);
@@ -98,6 +100,7 @@
   KerberosClient::Shutdown();
   CupsProxyClient::Shutdown();
   CryptohomeClient::Shutdown();
+  CrosHealthdClient::Shutdown();
   CrasAudioClient::Shutdown();
   BiodClient::Shutdown();
   AuthPolicyClient::Shutdown();
diff --git a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.cc b/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.cc
deleted file mode 100644
index 9f8b1fa..0000000
--- a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.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 "chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h"
-
-#include "base/bind.h"
-#include "chrome/browser/chromeos/power/ml/user_activity_controller.h"
-#include "dbus/bus.h"
-#include "dbus/message.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-namespace chromeos {
-
-MachineLearningDecisionServiceProvider::MachineLearningDecisionServiceProvider()
-    : user_activity_controller_(
-          std::make_unique<power::ml::UserActivityController>()),
-      weak_ptr_factory_(this) {}
-
-MachineLearningDecisionServiceProvider::
-    ~MachineLearningDecisionServiceProvider() = default;
-
-void MachineLearningDecisionServiceProvider::Start(
-    scoped_refptr<dbus::ExportedObject> exported_object) {
-  exported_object->ExportMethod(
-      machine_learning::kMlDecisionServiceInterface,
-      machine_learning::kShouldDeferScreenDimMethod,
-      base::BindRepeating(
-          &MachineLearningDecisionServiceProvider::ShouldDeferScreenDim,
-          weak_ptr_factory_.GetWeakPtr()),
-      base::BindRepeating(&MachineLearningDecisionServiceProvider::OnExported,
-                          weak_ptr_factory_.GetWeakPtr()));
-}
-
-void MachineLearningDecisionServiceProvider::OnExported(
-    const std::string& interface_name,
-    const std::string& method_name,
-    bool success) {
-  if (!success) {
-    LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
-  }
-}
-
-void MachineLearningDecisionServiceProvider::ShouldDeferScreenDim(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-
-  user_activity_controller_->ShouldDeferScreenDim(base::BindOnce(
-      &MachineLearningDecisionServiceProvider::SendSmartDimDecision,
-      weak_ptr_factory_.GetWeakPtr(), std::move(response),
-      std::move(response_sender)));
-}
-
-void MachineLearningDecisionServiceProvider::SendSmartDimDecision(
-    std::unique_ptr<dbus::Response> response,
-    dbus::ExportedObject::ResponseSender response_sender,
-    bool defer_dimming) {
-  dbus::MessageWriter writer(response.get());
-  writer.AppendBool(defer_dimming);
-  response_sender.Run(std::move(response));
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h b/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h
deleted file mode 100644
index 74d479be..0000000
--- a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h
+++ /dev/null
@@ -1,86 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
-#define CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "chromeos/dbus/services/cros_dbus_service.h"
-#include "dbus/exported_object.h"
-
-namespace dbus {
-
-class MethodCall;
-
-}  // namespace dbus
-
-namespace chromeos {
-namespace power {
-namespace ml {
-
-class UserActivityController;
-
-}  // namespace ml
-}  // namespace power
-
-// This class processes machine learning decision requests from Chrome OS side.
-//
-// ShouldDeferScreenDim:
-// % dbus-send --system --type=method_call --print-reply
-//     --dest=org.chromium.MlDecisionService
-//     /org/chromium/MlDecisionService
-//     org.chromium.MlDecisionService.ShouldDeferScreenDim
-//     boolean: true or false
-//
-// % (True means smart dim decides to defer the imminent screen dimming.)
-//
-// Now it only exports ShouldDeferScreenDim for powerd. New machine learning
-// related methods can be added when required.
-class MachineLearningDecisionServiceProvider
-    : public CrosDBusService::ServiceProviderInterface {
- public:
-  MachineLearningDecisionServiceProvider();
-  ~MachineLearningDecisionServiceProvider() override;
-
-  // CrosDBusService::ServiceProviderInterface overrides:
-  void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
-
- private:
-  // Called from ExportedObject when a handler is exported as a D-Bus
-  // method or failed to be exported.
-  void OnExported(const std::string& interface_name,
-                  const std::string& method_name,
-                  bool success);
-
-  // Called on UI thread in response to D-Bus requests.
-  void ShouldDeferScreenDim(
-      dbus::MethodCall* method_call,
-      dbus::ExportedObject::ResponseSender response_sender);
-
-  // Sends |defer_dimming| as the response to a ShouldDeferScreenDim method
-  // call.
-  void SendSmartDimDecision(
-      std::unique_ptr<dbus::Response> response,
-      dbus::ExportedObject::ResponseSender response_sender,
-      bool defer_dimming);
-
-  // The real provider of ShouldDeferScreenDim
-  std::unique_ptr<power::ml::UserActivityController> user_activity_controller_;
-
-  // Keep this last so that all weak pointers will be invalidated at the
-  // beginning of destruction.
-  base::WeakPtrFactory<MachineLearningDecisionServiceProvider>
-      weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(MachineLearningDecisionServiceProvider);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
diff --git a/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf b/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf
deleted file mode 100644
index 09f45ee..0000000
--- a/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
-  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<!--
-  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.
--->
-<busconfig>
-  <policy user="chronos">
-    <allow own="org.chromium.MlDecisionService"/>
-  </policy>
-
-  <!--
-    powerd uses this service to ask Chrome whether to defer the imminent screen
-    dimming.
-  -->
-  <policy user="power">
-    <allow send_destination="org.chromium.MlDecisionService"
-           send_interface="org.chromium.MlDecisionService"/>
-  </policy>
-
-  <!--
-    upstart and tast run as root.
-  -->
-  <policy user="root">
-    <allow send_destination="org.chromium.MlDecisionService"
-           send_interface="org.chromium.MlDecisionService"/>
-  </policy>
-</busconfig>
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
deleted file mode 100644
index 763dbad..0000000
--- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
+++ /dev/null
@@ -1,69 +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 "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
-
-#include "base/logging.h"
-#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
-#include "chrome/common/channel_info.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "components/user_manager/user_manager.h"
-#include "components/version_info/version_info.h"
-
-namespace chromeos {
-
-SupervisionOnboardingScreen::SupervisionOnboardingScreen(
-    SupervisionOnboardingScreenView* view,
-    const ScreenExitCallback& exit_callback)
-    : BaseScreen(SupervisionOnboardingScreenView::kScreenId),
-      view_(view),
-      exit_callback_(exit_callback) {
-  if (view_)
-    view_->Bind(this);
-}
-
-SupervisionOnboardingScreen::~SupervisionOnboardingScreen() {
-  if (view_)
-    view_->Unbind();
-}
-
-void SupervisionOnboardingScreen::Show() {
-#if defined(KIOSK_NEXT)
-  const user_manager::UserManager* user_manager =
-      user_manager::UserManager::Get();
-  DCHECK(user_manager->IsUserLoggedIn());
-
-  version_info::Channel channel = chrome::GetChannel();
-  if (view_ && channel <= version_info::Channel::DEV &&
-      base::FeatureList::IsEnabled(
-          features::kSupervisionOnboardingEligibility) &&
-      user_manager->IsLoggedInAsChildUser()) {
-    view_->Show();
-    return;
-  }
-#endif
-
-  SkipOnboarding();
-}
-
-void SupervisionOnboardingScreen::Hide() {
-  if (view_)
-    view_->Hide();
-}
-
-void SupervisionOnboardingScreen::OnViewDestroyed(
-    SupervisionOnboardingScreenView* view) {
-  if (view_ == view)
-    view_ = nullptr;
-}
-
-void SupervisionOnboardingScreen::SkipOnboarding() {
-  exit_callback_.Run(Result::kSkipped);
-}
-
-void SupervisionOnboardingScreen::FinishOnboarding() {
-  exit_callback_.Run(Result::kFinished);
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h
deleted file mode 100644
index 258f02a..0000000
--- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h
+++ /dev/null
@@ -1,54 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
-#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "chrome/browser/chromeos/login/screens/base_screen.h"
-#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
-
-namespace chromeos {
-
-class SupervisionOnboardingScreenView;
-
-class SupervisionOnboardingScreen : public BaseScreen,
-                                    public supervision::OnboardingDelegate {
- public:
-  enum class Result {
-    // User reached the end of the flow and exited successfully.
-    kFinished,
-    // User chose to skip the flow or we skipped the flow for internal reasons.
-    kSkipped,
-  };
-  using ScreenExitCallback = base::RepeatingCallback<void(Result result)>;
-
-  SupervisionOnboardingScreen(SupervisionOnboardingScreenView* view,
-                              const ScreenExitCallback& exit_callback);
-  ~SupervisionOnboardingScreen() override;
-
-  // BaseScreen:
-  void Show() override;
-  void Hide() override;
-
-  // Called when view is destroyed so there's no dead reference to it.
-  void OnViewDestroyed(SupervisionOnboardingScreenView* view);
-
- private:
-  // supervision::OnboardingDelegate:
-  void SkipOnboarding() override;
-  void FinishOnboarding() override;
-
-  SupervisionOnboardingScreenView* view_;
-  ScreenExitCallback exit_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreen);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
deleted file mode 100644
index dc6ea70..0000000
--- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
+++ /dev/null
@@ -1,428 +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 "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
-
-#include <initializer_list>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/run_loop.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/login/login_wizard.h"
-#include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/test/embedded_test_server_mixin.h"
-#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
-#include "chrome/browser/chromeos/login/test/js_checker.h"
-#include "chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h"
-#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
-#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
-#include "chrome/browser/chromeos/login/test/user_policy_mixin.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
-#include "chrome/browser/chromeos/supervision/onboarding_constants.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "google_apis/gaia/gaia_urls.h"
-#include "net/dns/mock_host_resolver.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/test/embedded_test_server/http_request.h"
-#include "net/test/embedded_test_server/http_response.h"
-
-using net::test_server::BasicHttpResponse;
-using net::test_server::HttpRequest;
-using net::test_server::HttpResponse;
-
-namespace chromeos {
-
-namespace {
-
-chromeos::OobeUI* GetOobeUI() {
-  auto* host = chromeos::LoginDisplayHost::default_host();
-  return host ? host->GetOobeUI() : nullptr;
-}
-
-}  // namespace
-
-// Fake HTTP server that returns the data necessary to render the Supervision
-// Onboarding pages. It provides methods to customize the HTTP responses to
-// include/omit custom HTTP headers that are expected by the flow.
-class FakeSupervisionServer {
- public:
-  explicit FakeSupervisionServer(net::EmbeddedTestServer* test_server) {
-    test_server_ = test_server;
-
-    test_server_->RegisterRequestHandler(base::BindRepeating(
-        &FakeSupervisionServer::HandleRequest, base::Unretained(this)));
-  }
-
-  ~FakeSupervisionServer() = default;
-
-  // Sets the custom HTTP header that will be sent back in responses.
-  void set_custom_http_header_value(
-      const std::string& custom_http_header_value) {
-    custom_http_header_value_ = custom_http_header_value;
-  }
-
-  // Stops sending the custom header in responses.
-  void clear_custom_http_header_value() {
-    custom_http_header_value_ = base::nullopt;
-  }
-
-  const std::string& last_request_url() { return last_request_url_; }
-
-  size_t GetReceivedRequestsCount() const {
-    // It's safe to use the size of the access token list as a proxy to the
-    // number of requests. This server asserts that all requests contain an
-    // authentication header.
-    return received_auth_header_values_.size();
-  }
-
- private:
-  std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
-    // We are not interested in other URLs hitting the server at this point.
-    // This will filter bogus requests like favicon fetches and stop us from
-    // handling requests that are targeting gaia.
-    if (!base::StartsWith(request.relative_url, "/kids/deviceonboarding",
-                          base::CompareCase::INSENSITIVE_ASCII)) {
-      return nullptr;
-    }
-
-    UpdateVerificationData(request);
-    auto response = std::make_unique<BasicHttpResponse>();
-    if (custom_http_header_value_.has_value()) {
-      response->AddCustomHeader(supervision::kExperimentHeaderName,
-                                custom_http_header_value_.value());
-    }
-
-    response->set_code(net::HTTP_OK);
-    response->set_content("Test Supervision Onboarding content");
-    response->set_content_type("text/plain");
-    return std::move(response);
-  }
-
-  void UpdateVerificationData(const HttpRequest& request) {
-    auto auth_header =
-        request.headers.find(net::HttpRequestHeaders::kAuthorization);
-    ASSERT_NE(auth_header, request.headers.end());
-    ASSERT_EQ(auth_header->second,
-              base::StringPrintf("Bearer %s",
-                                 FakeGaiaMixin::kFakeAllScopeAccessToken));
-
-    received_auth_header_values_.push_back(auth_header->second);
-    last_request_url_ = request.relative_url;
-  }
-
-  net::EmbeddedTestServer* test_server_;
-  std::vector<std::string> received_auth_header_values_;
-  std::string last_request_url_;
-
-  base::Optional<std::string> custom_http_header_value_ = base::nullopt;
-};
-
-class SupervisionOnboardingBaseTest : public MixinBasedInProcessBrowserTest {
- public:
-  SupervisionOnboardingBaseTest() = default;
-  ~SupervisionOnboardingBaseTest() override = default;
-
-  virtual bool IsFeatureOn() const = 0;
-  virtual bool IsChild() const = 0;
-
-  void SetUp() override {
-    if (IsFeatureOn()) {
-      feature_list_.InitWithFeatures(
-          {features::kSupervisionOnboardingEligibility,
-           features::kSupervisionOnboardingScreens},
-          {});
-    } else {
-      feature_list_.InitWithFeatures(
-          {}, {features::kSupervisionOnboardingEligibility,
-               features::kSupervisionOnboardingScreens});
-    }
-
-    MixinBasedInProcessBrowserTest::SetUp();
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    if (IsFeatureOn()) {
-      // To turn on the feature properly we also ask the server to return the
-      // expected custom http header value. Tests that want to simulate other
-      // server responses can call these methods again to override this
-      // behavior.
-      supervision_server()->set_custom_http_header_value(
-          supervision::kDeviceOnboardingExperimentName);
-    }
-
-    // Even with the feature turned off we need to override the server url.
-    // Otherwise tests that end up pinging the server (but shouldn't) will
-    // only timeout instead of failing for the correct reason.
-    command_line->AppendSwitchASCII(switches::kSupervisionOnboardingUrlPrefix,
-                                    embedded_test_server()->base_url().spec());
-
-    MixinBasedInProcessBrowserTest::SetUpCommandLine(command_line);
-  }
-
-  void SetUpOnMainThread() override {
-    host_resolver()->AddRule("*", "127.0.0.1");
-
-    AccountId id =
-        IsChild() ? child_user_.account_id : regular_user_.account_id;
-    fake_gaia_.SetupFakeGaiaForLogin(id.GetUserEmail(), id.GetGaiaId(),
-                                     FakeGaiaMixin::kFakeRefreshToken);
-
-    LoginManagerMixin::TestUserInfo user_info =
-        IsChild() ? child_user_ : regular_user_;
-    UserContext user_context =
-        LoginManagerMixin::CreateDefaultUserContext(user_info);
-    user_context.SetRefreshToken(FakeGaiaMixin::kFakeRefreshToken);
-    login_manager_.LoginAndWaitForActiveSession(user_context);
-
-    ShowLoginWizard(OobeScreen::SCREEN_TEST_NO_WINDOW);
-    WizardController::default_controller()
-        ->screen_manager()
-        ->DeleteScreenForTesting(SupervisionOnboardingScreenView::kScreenId);
-    auto supervision_onboarding_screen =
-        std::make_unique<SupervisionOnboardingScreen>(
-            GetOobeUI()->GetView<SupervisionOnboardingScreenHandler>(),
-            base::BindRepeating(
-                &SupervisionOnboardingBaseTest::HandleScreenExit,
-                base::Unretained(this)));
-    supervision_onboarding_screen_ = supervision_onboarding_screen.get();
-    WizardController::default_controller()
-        ->screen_manager()
-        ->SetScreenForTesting(std::move(supervision_onboarding_screen));
-
-    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-  }
-
-  void ShowScreen() { supervision_onboarding_screen_->Show(); }
-
-  void WaitForPageWithUrl(const std::string& requested_url) {
-    // Wait for the request...
-    while (supervision_server()->last_request_url() != requested_url) {
-      base::RunLoop run_loop;
-      // Avoid RunLoop::RunUntilIdle() because this is in a loop and
-      // could end up being a busy loop when there are no pending tasks.
-      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-          FROM_HERE, run_loop.QuitClosure(),
-          base::TimeDelta::FromMilliseconds(100));
-      run_loop.Run();
-    }
-
-    // Now wait for the UI to be updated with the response.
-    test::OobeJS()
-        .CreateVisibilityWaiter(
-            true, {"supervision-onboarding", "supervision-onboarding-content"})
-        ->Wait();
-  }
-
-  void ClickButton(const std::string& button_id) {
-    std::initializer_list<base::StringPiece> button_path = {
-        "supervision-onboarding", button_id};
-    test::OobeJS().CreateVisibilityWaiter(true, button_path)->Wait();
-    test::OobeJS().TapOnPath(button_path);
-  }
-
-  void WaitForScreenExit() {
-    if (screen_exited_)
-      return;
-
-    base::RunLoop run_loop;
-    screen_exit_callback_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
-  // Shows the screen and navigates to the start page.
-  // This will also expect that we will make the correct requests to load the
-  // start page.
-  void NavigateToStartPage() {
-    ShowScreen();
-    OobeScreenWaiter screen_waiter(SupervisionOnboardingScreenView::kScreenId);
-    screen_waiter.set_assert_next_screen();
-    screen_waiter.Wait();
-    WaitForPageWithUrl(supervision::kOnboardingStartPageRelativeUrl);
-
-    EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
-  }
-
-  // Navigates to the details page by first going through the start page.
-  void NavigateToDetailsPage() {
-    NavigateToStartPage();
-
-    ClickButton("supervision-onboarding-next-button");
-    WaitForPageWithUrl(supervision::kOnboardingDetailsPageRelativeUrl);
-
-    EXPECT_EQ(2u, supervision_server()->GetReceivedRequestsCount());
-  }
-
-  // Navigates to the "All Set!" page by going through the Start and Details
-  // pages.
-  void NavigateToAllSetPage() {
-    NavigateToDetailsPage();
-
-    ClickButton("supervision-onboarding-next-button");
-    WaitForPageWithUrl(supervision::kOnboardingAllSetPageRelativeUrl);
-
-    EXPECT_EQ(3u, supervision_server()->GetReceivedRequestsCount());
-  }
-
-  FakeSupervisionServer* supervision_server() { return &supervision_server_; }
-
-  SupervisionOnboardingScreen* supervision_onboarding_screen_;
-
- private:
-  void HandleScreenExit(SupervisionOnboardingScreen::Result result) {
-    ASSERT_FALSE(screen_exited_);
-    screen_exited_ = true;
-    if (screen_exit_callback_)
-      std::move(screen_exit_callback_).Run();
-  }
-
-  base::test::ScopedFeatureList feature_list_;
-  bool screen_exited_ = false;
-  base::OnceClosure screen_exit_callback_;
-
-  const LoginManagerMixin::TestUserInfo regular_user_{
-      AccountId::FromUserEmailGaiaId("test-regular-user@gmail.com",
-                                     "test-regular-user-gaia-id")};
-  const LoginManagerMixin::TestUserInfo child_user_{
-      AccountId::FromUserEmailGaiaId("test-child-user@gmail.com",
-                                     "test-child-user-gaia-id"),
-      user_manager::USER_TYPE_CHILD};
-
-  EmbeddedTestServerSetupMixin embedded_test_server_{&mixin_host_,
-                                                     embedded_test_server()};
-  FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
-  LoginManagerMixin login_manager_{&mixin_host_, {regular_user_, child_user_}};
-  LocalPolicyTestServerMixin local_policy_mixin_{&mixin_host_};
-  UserPolicyMixin user_policy_{&mixin_host_, child_user_.account_id,
-                               &local_policy_mixin_};
-
-  FakeSupervisionServer supervision_server_{embedded_test_server()};
-};
-
-class SupervisionOnboardingRegularUserTest
-    : public SupervisionOnboardingBaseTest {
- public:
-  SupervisionOnboardingRegularUserTest() = default;
-  ~SupervisionOnboardingRegularUserTest() override = default;
-
-  bool IsFeatureOn() const override { return true; }
-
-  bool IsChild() const override { return false; }
-};
-
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingRegularUserTest,
-                       FlowExitsImmediately) {
-  ShowScreen();
-
-  WaitForScreenExit();
-  EXPECT_EQ(0u, supervision_server()->GetReceivedRequestsCount());
-}
-
-class SupervisionOnboardingFeatureTurnedOffTest
-    : public SupervisionOnboardingBaseTest {
- public:
-  SupervisionOnboardingFeatureTurnedOffTest() = default;
-  ~SupervisionOnboardingFeatureTurnedOffTest() override = default;
-
-  bool IsFeatureOn() const override { return false; }
-
-  bool IsChild() const override { return true; }
-};
-
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingFeatureTurnedOffTest,
-                       FlowExitsImmediately) {
-  ShowScreen();
-
-  WaitForScreenExit();
-  EXPECT_EQ(0u, supervision_server()->GetReceivedRequestsCount());
-}
-
-class SupervisionOnboardingTest : public SupervisionOnboardingBaseTest {
- public:
-  SupervisionOnboardingTest() = default;
-  ~SupervisionOnboardingTest() override = default;
-
-  bool IsFeatureOn() const override { return true; }
-
-  bool IsChild() const override { return true; }
-};
-
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       ExitWhenServerDoesNotReturnHeader) {
-  supervision_server()->clear_custom_http_header_value();
-
-  ShowScreen();
-  WaitForScreenExit();
-
-  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
-}
-
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       ExitWhenServerSendsWrongHeader) {
-  supervision_server()->set_custom_http_header_value("wrong_header_value");
-
-  ShowScreen();
-  WaitForScreenExit();
-
-  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
-}
-
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       NavigateToStartPageAndSkipFlow) {
-  NavigateToStartPage();
-
-  ClickButton("supervision-onboarding-skip-button");
-  WaitForScreenExit();
-}
-
-// TODO(crbug.com/971696) Re-enable this test when the setup time is within
-// acceptable ranges.
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       DISABLED_NavigateToDetailsPageAndBack) {
-  NavigateToDetailsPage();
-
-  ClickButton("supervision-onboarding-back-button");
-  WaitForPageWithUrl(supervision::kOnboardingStartPageRelativeUrl);
-
-  ClickButton("supervision-onboarding-skip-button");
-  WaitForScreenExit();
-}
-
-// TODO(crbug.com/971696) Re-enable this test when the setup time is within
-// acceptable ranges.
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       DISABLED_NavigateToAllSetPageAndBack) {
-  NavigateToAllSetPage();
-
-  ClickButton("supervision-onboarding-back-button");
-  WaitForPageWithUrl(supervision::kOnboardingDetailsPageRelativeUrl);
-
-  ClickButton("supervision-onboarding-back-button");
-  WaitForPageWithUrl(supervision::kOnboardingStartPageRelativeUrl);
-
-  ClickButton("supervision-onboarding-skip-button");
-  WaitForScreenExit();
-}
-
-// TODO(crbug.com/971696) Re-enable this test when the setup time is within
-// acceptable ranges.
-IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       DISABLED_NavigateToAllSetPageAndFinishFlow) {
-  NavigateToAllSetPage();
-
-  ClickButton("supervision-onboarding-next-button");
-  WaitForScreenExit();
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index f1bfbb14..72383a3 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -115,7 +115,6 @@
 #include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
-#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
index ac19405..ebfc464a 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
@@ -92,6 +92,16 @@
   boot_clock_ = std::move(test_boot_clock);
 }
 
+void IdleEventNotifier::AddObserver(Observer* observer) {
+  DCHECK(observer);
+  observers_.AddObserver(observer);
+}
+
+void IdleEventNotifier::RemoveObserver(Observer* observer) {
+  DCHECK(observer);
+  observers_.RemoveObserver(observer);
+}
+
 void IdleEventNotifier::LidEventReceived(
     chromeos::PowerManagerClient::LidState state,
     const base::TimeTicks& /* timestamp */) {
@@ -109,6 +119,15 @@
   }
 }
 
+void IdleEventNotifier::ScreenDimImminent() {
+  // powerd should not dim the screen if video is playing.
+  DCHECK(!video_playing_);
+  const ActivityData data = ConvertActivityData(*internal_data_);
+
+  for (auto& observer : observers_)
+    observer.OnIdleEventObserved(data);
+  ResetTimestampsForRecentActivity();
+}
 
 void IdleEventNotifier::SuspendDone(const base::TimeDelta& sleep_duration) {
   // SuspendDone is triggered by user opening the lid (or other user
@@ -169,16 +188,6 @@
   UpdateActivityData(ActivityType::VIDEO);
 }
 
-IdleEventNotifier::ActivityData IdleEventNotifier::GetActivityDataAndReset() {
-  const ActivityData data = ConvertActivityData(*internal_data_);
-  ResetTimestampsForRecentActivity();
-  return data;
-}
-
-IdleEventNotifier::ActivityData IdleEventNotifier::GetActivityData() const {
-  return ConvertActivityData(*internal_data_);
-}
-
 IdleEventNotifier::ActivityData IdleEventNotifier::ConvertActivityData(
     const ActivityDataInternal& internal_data) const {
   const base::TimeDelta time_since_boot = boot_clock_->GetTimeSinceBoot();
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier.h b/chrome/browser/chromeos/power/ml/idle_event_notifier.h
index 5b70648..cbd0adb 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier.h
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier.h
@@ -95,6 +95,15 @@
     int touch_events_in_last_hour = 0;
   };
 
+  class Observer {
+   public:
+    // Called when an idle event is observed.
+    virtual void OnIdleEventObserved(const ActivityData& activity_data) = 0;
+
+   protected:
+    virtual ~Observer() {}
+  };
+
   IdleEventNotifier(PowerManagerClient* power_client,
                     ui::UserActivityDetector* detector,
                     viz::mojom::VideoDetectorObserverRequest request);
@@ -105,10 +114,15 @@
                           base::Clock* test_clock,
                           std::unique_ptr<BootClock> test_boot_clock);
 
+  // Adds or removes an observer.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
   // chromeos::PowerManagerClient::Observer overrides:
   void LidEventReceived(chromeos::PowerManagerClient::LidState state,
                         const base::TimeTicks& timestamp) override;
   void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
+  void ScreenDimImminent() override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
   // ui::UserActivityObserver overrides:
@@ -118,14 +132,6 @@
   void OnVideoActivityStarted() override;
   void OnVideoActivityEnded() override;
 
-  // Called in UserActivityController::ShouldDeferScreenDim to prepare activity
-  // data for making Smart Dim decision.
-  ActivityData GetActivityDataAndReset();
-
-  // Get activity data only, do not mutate the class, may be used by machine
-  // learning internal page.
-  ActivityData GetActivityData() const;
-
  private:
   FRIEND_TEST_ALL_PREFIXES(IdleEventNotifierTest, CheckInitialValues);
   friend class IdleEventNotifierTest;
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
index 16d42a7..0cd10063 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
@@ -24,19 +24,6 @@
 
 namespace {
 
-base::TimeDelta GetTimeSinceMidnight(base::Time time) {
-  return time - time.LocalMidnight();
-}
-
-UserActivityEvent_Features_DayOfWeek GetDayOfWeek(base::Time time) {
-  base::Time::Exploded exploded;
-  time.LocalExplode(&exploded);
-  return static_cast<UserActivityEvent_Features_DayOfWeek>(
-      exploded.day_of_week);
-}
-
-}  // namespace
-
 bool operator==(const IdleEventNotifier::ActivityData& x,
                 const IdleEventNotifier::ActivityData& y) {
   return x.last_activity_day == y.last_activity_day &&
@@ -53,6 +40,42 @@
          x.touch_events_in_last_hour == y.touch_events_in_last_hour;
 }
 
+base::TimeDelta GetTimeSinceMidnight(base::Time time) {
+  return time - time.LocalMidnight();
+}
+
+UserActivityEvent_Features_DayOfWeek GetDayOfWeek(base::Time time) {
+  base::Time::Exploded exploded;
+  time.LocalExplode(&exploded);
+  return static_cast<UserActivityEvent_Features_DayOfWeek>(
+      exploded.day_of_week);
+}
+
+class TestObserver : public IdleEventNotifier::Observer {
+ public:
+  TestObserver() : idle_event_count_(0) {}
+  ~TestObserver() override {}
+
+  int idle_event_count() const { return idle_event_count_; }
+  const IdleEventNotifier::ActivityData& activity_data() const {
+    return activity_data_;
+  }
+
+  // IdleEventNotifier::Observer overrides:
+  void OnIdleEventObserved(
+      const IdleEventNotifier::ActivityData& activity_data) override {
+    ++idle_event_count_;
+    activity_data_ = activity_data;
+  }
+
+ private:
+  int idle_event_count_;
+  IdleEventNotifier::ActivityData activity_data_;
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+}  // namespace
+
 class IdleEventNotifierTest : public testing::Test {
  public:
   IdleEventNotifierTest()
@@ -74,6 +97,7 @@
         const_cast<base::Clock*>(scoped_task_env_.GetMockClock()),
         std::make_unique<FakeBootClock>(&scoped_task_env_,
                                         base::TimeDelta::FromSeconds(10)));
+    idle_event_notifier_->AddObserver(&test_observer_);
     ac_power_.set_external_power(
         power_manager::PowerSupplyProperties_ExternalPower_AC);
     disconnected_power_.set_external_power(
@@ -86,8 +110,21 @@
   }
 
  protected:
+  void ReportScreenDimImminent() {
+    FakePowerManagerClient::Get()->SendScreenDimImminent();
+  }
+
+  void ReportIdleEventAndCheckResults(
+      int expected_idle_count,
+      const IdleEventNotifier::ActivityData& expected_activity_data) {
+    ReportScreenDimImminent();
+    EXPECT_EQ(expected_idle_count, test_observer_.idle_event_count());
+    EXPECT_TRUE(expected_activity_data == test_observer_.activity_data());
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_env_;
 
+  TestObserver test_observer_;
   std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
   power_manager::PowerSupplyProperties ac_power_;
   power_manager::PowerSupplyProperties disconnected_power_;
@@ -114,7 +151,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // PowerChanged signal is received but source isn't changed, so it won't change
@@ -128,11 +165,11 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
   idle_event_notifier_->PowerChanged(ac_power_);
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data);
 }
 
 // PowerChanged signal is received and source is changed, so a different
@@ -146,7 +183,7 @@
   data_1.last_activity_time_of_day = time_of_day_1;
   data_1.last_user_activity_time_of_day = time_of_day_1;
   data_1.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(100));
   base::Time now_2 = scoped_task_env_.GetMockClock()->Now();
@@ -157,7 +194,7 @@
   data_2.last_activity_time_of_day = time_of_day_2;
   data_2.last_user_activity_time_of_day = time_of_day_2;
   data_2.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 // Short sleep duration does not break up recent time active.
@@ -178,7 +215,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = now_2 - now_1;
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // Long sleep duration recalc recent time active.
@@ -201,7 +238,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = now_2 - now_1;
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityKey) {
@@ -217,7 +254,7 @@
   data.time_since_last_key = base::TimeDelta::FromSeconds(10);
   data.key_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityMouse) {
@@ -235,7 +272,7 @@
   data.time_since_last_mouse = base::TimeDelta::FromSeconds(10);
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityOther) {
@@ -251,7 +288,7 @@
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // Two consecutive activities separated by 2sec only. Only 1 idle event with
@@ -279,7 +316,7 @@
   data.key_events_in_last_hour = 1;
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, ActivityAfterVideoStarts) {
@@ -306,7 +343,7 @@
   data.time_since_video_ended = base::TimeDelta::FromSeconds(10);
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, IdleEventFieldReset) {
@@ -331,7 +368,7 @@
   data_1.key_events_in_last_hour = 1;
   data_1.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   idle_event_notifier_->PowerChanged(ac_power_);
   base::Time now_3 = scoped_task_env_.GetMockClock()->Now();
@@ -348,7 +385,7 @@
   data_2.key_events_in_last_hour = 1;
   data_2.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(20));
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, TwoConsecutiveVideoPlaying) {
@@ -384,7 +421,7 @@
   data.time_since_video_ended =
       base::TimeDelta::FromSeconds(25) + now_3 - now_2;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(25));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingFarApartOneIdleEvent) {
@@ -419,7 +456,7 @@
   data.video_playing_time = now_3 - now_2;
   data.time_since_video_ended = base::TimeDelta::FromSeconds(25);
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(25));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingFarApartTwoIdleEvents) {
@@ -441,7 +478,7 @@
       IdleEventNotifier::kIdleDelay + base::TimeDelta::FromSeconds(10);
   scoped_task_env_.FastForwardBy(IdleEventNotifier::kIdleDelay +
                                  base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   base::Time now_3 = scoped_task_env_.GetMockClock()->Now();
   idle_event_notifier_->OnVideoActivityStarted();
@@ -455,7 +492,7 @@
   data_2.recent_time_active = now_4 - now_3;
   data_2.video_playing_time = now_4 - now_3;
   data_2.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingSeparatedByAnIdleEvent) {
@@ -475,7 +512,7 @@
   data_1.video_playing_time = kNow2 - kNow1;
   data_1.time_since_video_ended = base::TimeDelta::FromSeconds(1);
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(1));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   const base::Time kNow3 = scoped_task_env_.GetMockClock()->Now();
   idle_event_notifier_->OnVideoActivityStarted();
@@ -489,7 +526,7 @@
   data_2.recent_time_active = kNow4 - kNow3;
   data_2.video_playing_time = kNow4 - kNow3;
   data_2.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, VideoPlayingPausedByShortSuspend) {
@@ -511,7 +548,7 @@
   data.recent_time_active = now_3 - now_1;
   data.video_playing_time = now_3 - now_1;
   data.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, VideoPlayingPausedByLongSuspend) {
@@ -532,7 +569,7 @@
   data.recent_time_active = now_2 - now_1;
   data.video_playing_time = now_2 - now_1;
   data.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserInputEventsOneIdleEvent) {
@@ -595,7 +632,7 @@
   data.touch_events_in_last_hour = 3;
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(30));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserInputEventsTwoIdleEvents) {
@@ -617,7 +654,7 @@
   data_1.time_since_last_key = base::TimeDelta::FromSeconds(30);
   data_1.key_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(30));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromMinutes(11));
   base::Time last_key_time = scoped_task_env_.GetMockClock()->Now();
@@ -664,7 +701,7 @@
   data_2.mouse_events_in_last_hour = 2;
   data_2.touch_events_in_last_hour = 3;
 
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 }  // namespace ml
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.cc b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
index d4b1bb08..32345e5 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
@@ -44,8 +44,9 @@
 
   viz::mojom::VideoDetectorObserverPtr video_observer_user_logger;
   user_activity_manager_ = std::make_unique<UserActivityManager>(
-      &user_activity_ukm_logger_, detector, power_manager_client,
-      session_manager, mojo::MakeRequest(&video_observer_user_logger),
+      &user_activity_ukm_logger_, idle_event_notifier_.get(), detector,
+      power_manager_client, session_manager,
+      mojo::MakeRequest(&video_observer_user_logger),
       chromeos::ChromeUserManager::Get(), &smart_dim_model_);
   aura::Env::GetInstance()
       ->context_factory_private()
@@ -55,12 +56,6 @@
 
 UserActivityController::~UserActivityController() = default;
 
-void UserActivityController::ShouldDeferScreenDim(
-    base::OnceCallback<void(bool)> callback) {
-  user_activity_manager_->UpdateAndGetSmartDimDecision(
-      idle_event_notifier_->GetActivityDataAndReset(), std::move(callback));
-}
-
 }  // namespace ml
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.h b/chrome/browser/chromeos/power/ml/user_activity_controller.h
index 30e2ba0..e1c3325 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "base/callback.h"
 #include "chrome/browser/chromeos/power/ml/idle_event_notifier.h"
 #include "chrome/browser/chromeos/power/ml/smart_dim/model_impl.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_manager.h"
@@ -25,10 +24,6 @@
   UserActivityController();
   ~UserActivityController();
 
-  // Prepares features, makes smart dim decision and returns the result via
-  // |callback|.
-  void ShouldDeferScreenDim(base::OnceCallback<void(bool)> callback);
-
  private:
   std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
   UserActivityUkmLoggerImpl user_activity_ukm_logger_;
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index a752563..aee7c9c 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -88,9 +88,6 @@
 
 }  // namespace
 
-// TODO(alanlxl): Fix the variable names and comments related to screen dim
-// imminent signals, because after powerd refactor (https://crrev.com/c/1601992)
-// ScreenDimImminent signals are deprecated.
 struct UserActivityManager::PreviousIdleEventData {
   // Gap between two ScreenDimImminent signals.
   base::TimeDelta dim_imminent_signal_interval;
@@ -104,6 +101,7 @@
 
 UserActivityManager::UserActivityManager(
     UserActivityUkmLogger* ukm_logger,
+    IdleEventNotifier* idle_event_notifier,
     ui::UserActivityDetector* detector,
     chromeos::PowerManagerClient* power_manager_client,
     session_manager::SessionManager* session_manager,
@@ -113,6 +111,7 @@
     : boot_clock_(std::make_unique<RealBootClock>()),
       ukm_logger_(ukm_logger),
       smart_dim_model_(smart_dim_model),
+      idle_event_observer_(this),
       user_activity_observer_(this),
       power_manager_client_observer_(this),
       session_manager_observer_(this),
@@ -122,6 +121,8 @@
       power_manager_client_(power_manager_client),
       weak_ptr_factory_(this) {
   DCHECK(ukm_logger_);
+  DCHECK(idle_event_notifier);
+  idle_event_observer_.Add(idle_event_notifier);
 
   DCHECK(detector);
   user_activity_observer_.Add(detector);
@@ -236,17 +237,16 @@
                 UserActivityEvent::Event::VIDEO_ACTIVITY);
 }
 
-void UserActivityManager::UpdateAndGetSmartDimDecision(
-    const IdleEventNotifier::ActivityData& activity_data,
-    base::OnceCallback<void(bool)> callback) {
+void UserActivityManager::OnIdleEventObserved(
+    const IdleEventNotifier::ActivityData& activity_data) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::TimeDelta now = boot_clock_->GetTimeSinceBoot();
   if (waiting_for_final_action_) {
     if (waiting_for_model_decision_) {
       CancelDimDecisionRequest();
     } else {
-      // Smart dim request comes again after an earlier request event without
-      // any user action/suspend in between.
+      // ScreenDimImminent is received again after an earlier ScreenDimImminent
+      // event without any user action/suspend in between.
       PopulatePreviousEventData(now);
     }
   }
@@ -273,15 +273,13 @@
     waiting_for_model_decision_ = true;
     time_dim_decision_requested_ = base::TimeTicks::Now();
     smart_dim_model_->RequestDimDecision(
-        features_,
-        base::BindOnce(&UserActivityManager::HandleSmartDimDecision,
-                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+        features_, base::Bind(&UserActivityManager::ApplyDimDecision,
+                              weak_ptr_factory_.GetWeakPtr()));
   }
   waiting_for_final_action_ = true;
 }
 
-void UserActivityManager::HandleSmartDimDecision(
-    base::OnceCallback<void(bool)> callback,
+void UserActivityManager::ApplyDimDecision(
     UserActivityEvent::ModelPrediction prediction) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   waiting_for_model_decision_ = false;
@@ -293,6 +291,7 @@
   // previously deferred.
   if (prediction.response() == UserActivityEvent::ModelPrediction::NO_DIM &&
       !dim_deferred_) {
+    power_manager_client_->DeferScreenDim();
     dim_deferred_ = true;
     prediction.set_model_applied(true);
   } else {
@@ -302,8 +301,8 @@
                                      UserActivityEvent::ModelPrediction::DIM &&
                                  !dim_deferred_);
   }
+
   model_prediction_ = prediction;
-  std::move(callback).Run(dim_deferred_);
 }
 
 void UserActivityManager::OnSessionStateChanged() {
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.h b/chrome/browser/chromeos/power/ml/user_activity_manager.h
index d0f2a9b..7d72f605 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.h
@@ -74,11 +74,13 @@
 // Logs user activity after an idle event is observed.
 // TODO(renjieliu): Add power-related activity as well.
 class UserActivityManager : public ui::UserActivityObserver,
+                            public IdleEventNotifier::Observer,
                             public PowerManagerClient::Observer,
                             public viz::mojom::VideoDetectorObserver,
                             public session_manager::SessionManagerObserver {
  public:
   UserActivityManager(UserActivityUkmLogger* ukm_logger,
+                      IdleEventNotifier* idle_event_notifier,
                       ui::UserActivityDetector* detector,
                       chromeos::PowerManagerClient* power_manager_client,
                       session_manager::SessionManager* session_manager,
@@ -106,15 +108,13 @@
   void OnVideoActivityStarted() override;
   void OnVideoActivityEnded() override {}
 
-  // Called in UserActivityController::ShouldDeferScreenDim to make smart dim
-  // decision and response via |callback|.
-  void UpdateAndGetSmartDimDecision(const IdleEventNotifier::ActivityData& data,
-                                    base::OnceCallback<void(bool)> callback);
+  // IdleEventNotifier::Observer overrides.
+  void OnIdleEventObserved(
+      const IdleEventNotifier::ActivityData& data) override;
 
-  // Converts a Smart Dim model |prediction| into a yes/no decision about
-  // whether to defer the screen dim and provides the result via |callback|.
-  void HandleSmartDimDecision(base::OnceCallback<void(bool)> callback,
-                              UserActivityEvent::ModelPrediction prediction);
+  // Decides whether or not to instruct the power manager to dim the screen
+  // given a |prediction| from the Smart Dim predictor.
+  void ApplyDimDecision(UserActivityEvent::ModelPrediction prediction);
 
   // session_manager::SessionManagerObserver overrides:
   void OnSessionStateChanged() override;
@@ -193,6 +193,8 @@
 
   SmartDimModel* const smart_dim_model_;
 
+  ScopedObserver<IdleEventNotifier, IdleEventNotifier::Observer>
+      idle_event_observer_;
   ScopedObserver<ui::UserActivityDetector, ui::UserActivityObserver>
       user_activity_observer_;
   ScopedObserver<chromeos::PowerManagerClient,
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
index 97ccaa427..7e59d7a1c 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
@@ -183,10 +183,13 @@
 
     PowerManagerClient::InitializeFake();
     viz::mojom::VideoDetectorObserverPtr observer;
+    idle_event_notifier_ = std::make_unique<IdleEventNotifier>(
+        PowerManagerClient::Get(), &user_activity_detector_,
+        mojo::MakeRequest(&observer));
     activity_logger_ = std::make_unique<UserActivityManager>(
-        &delegate_, &user_activity_detector_, PowerManagerClient::Get(),
-        &session_manager_, mojo::MakeRequest(&observer), &fake_user_manager_,
-        &model_);
+        &delegate_, idle_event_notifier_.get(), &user_activity_detector_,
+        PowerManagerClient::Get(), &session_manager_,
+        mojo::MakeRequest(&observer), &fake_user_manager_, &model_);
     activity_logger_->SetTaskRunnerForTesting(
         thread_bundle()->GetMainThreadTaskRunner(),
         std::make_unique<FakeBootClock>(thread_bundle(),
@@ -195,6 +198,7 @@
 
   void TearDown() override {
     activity_logger_.reset();
+    idle_event_notifier_.reset();
     PowerManagerClient::Shutdown();
     ChromeRenderViewHostTestHarness::TearDown();
   }
@@ -204,17 +208,8 @@
     activity_logger_->OnUserActivity(event);
   }
 
-  // Requests a smart dim decision from UserActivityManager based on |data|.
-  // Populates |*should_defer| with the result once it is provided.
-  void ReportIdleEvent(const IdleEventNotifier::ActivityData& data,
-                       bool* should_defer = nullptr) {
-    activity_logger_->UpdateAndGetSmartDimDecision(
-        data, base::BindOnce(
-                  [](bool* should_defer, bool decision) {
-                    if (should_defer)
-                      *should_defer = decision;
-                  },
-                  should_defer));
+  void ReportIdleEvent(const IdleEventNotifier::ActivityData& data) {
+    activity_logger_->OnIdleEventObserved(data);
   }
 
   void ReportLidEvent(chromeos::PowerManagerClient::LidState state) {
@@ -264,6 +259,10 @@
     FakePowerManagerClient::Get()->SetInactivityDelays(proto);
   }
 
+  int GetNumberOfDeferredDims() {
+    return FakePowerManagerClient::Get()->num_defer_screen_dim_calls();
+  }
+
   TabProperty UpdateOpenTabURL() {
     return activity_logger_->UpdateOpenTabURL();
   }
@@ -986,11 +985,10 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1027,10 +1025,9 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1053,13 +1050,12 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   // Report user activity immediately after the idle event, so that
   // the SmartDimModel doesn't get a chance to run.
   ReportUserActivity(nullptr);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string hist_complete("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(hist_complete, 0);
@@ -1086,13 +1082,11 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer_1 = false;
-  bool should_defer_2 = false;
-  ReportIdleEvent(data, &should_defer_1);
-  ReportIdleEvent(data, &should_defer_2);
+  ReportIdleEvent(data);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_NE(should_defer_1, should_defer_2);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string hist_complete("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(hist_complete, 1);
@@ -1131,11 +1125,10 @@
   model_.set_decision_threshold(50);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1165,10 +1158,9 @@
   model_.set_inactivity_score(40);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(6));
   ReportSuspend(power_manager::SuspendImminent_Reason_IDLE,
@@ -1177,9 +1169,9 @@
   // 2nd ScreenDimImminent is not deferred despite model score says so.
   model_.set_inactivity_score(20);
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(10));
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 2);
@@ -1240,17 +1232,16 @@
   // 1st ScreenDimImminent gets deferred
   model_.set_inactivity_score(40);
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   // 2nd ScreenDimImminent is not deferred despite model score says so.
   model_.set_inactivity_score(20);
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(10));
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 2);
@@ -1307,11 +1298,10 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
diff --git a/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.cc b/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.cc
deleted file mode 100644
index 81bcc51..0000000
--- a/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.cc
+++ /dev/null
@@ -1,51 +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 "chrome/browser/chromeos/supervision/kiosk_next_flow_observer.h"
-
-#include "ash/public/cpp/ash_pref_names.h"
-#include "chrome/browser/extensions/component_loader.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "components/prefs/pref_service.h"
-#include "extensions/browser/extension_system.h"
-
-namespace chromeos {
-namespace supervision {
-
-KioskNextFlowObserver::KioskNextFlowObserver(Profile* profile,
-                                             OnboardingFlowModel* flow_model)
-    : profile_(profile), flow_model_(flow_model) {
-  flow_model_->AddObserver(this);
-}
-
-KioskNextFlowObserver::~KioskNextFlowObserver() {
-  flow_model_->RemoveObserver(this);
-}
-
-void KioskNextFlowObserver::StepFinishedLoading(
-    OnboardingFlowModel::Step step) {
-  if (step == OnboardingFlowModel::Step::kStart)
-    profile_->GetPrefs()->SetBoolean(ash::prefs::kKioskNextShellEligible, true);
-}
-
-void KioskNextFlowObserver::WillExitFlow(
-    OnboardingFlowModel::Step step,
-    OnboardingFlowModel::ExitReason reason) {
-  if (reason == OnboardingFlowModel::ExitReason::kUserReachedEnd)
-    EnableKioskNext();
-}
-
-void KioskNextFlowObserver::EnableKioskNext() {
-  profile_->GetPrefs()->SetBoolean(ash::prefs::kKioskNextShellEnabled, true);
-
-  extensions::ExtensionSystem::Get(profile_)
-      ->extension_service()
-      ->component_loader()
-      ->AddKioskNextExtension();
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.h b/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.h
deleted file mode 100644
index a165e36..0000000
--- a/chrome/browser/chromeos/supervision/kiosk_next_flow_observer.h
+++ /dev/null
@@ -1,44 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_KIOSK_NEXT_FLOW_OBSERVER_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_KIOSK_NEXT_FLOW_OBSERVER_H_
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "chrome/browser/chromeos/supervision/onboarding_flow_model.h"
-
-class Profile;
-
-namespace chromeos {
-namespace supervision {
-
-// Observes the Supervision Onboarding flow and sets prefs related to
-// Kiosk Next.
-class KioskNextFlowObserver : public OnboardingFlowModel::Observer {
- public:
-  explicit KioskNextFlowObserver(Profile* profile,
-                                 OnboardingFlowModel* flow_model);
-  ~KioskNextFlowObserver() override;
-
- private:
-  // OnboardingFlowModel::Observer:
-  void StepFinishedLoading(OnboardingFlowModel::Step step) override;
-  void WillExitFlow(OnboardingFlowModel::Step step,
-                    OnboardingFlowModel::ExitReason reason) override;
-
-  // Enables Kiosk Next by loading its extension and setting the relevant
-  // prefs.
-  void EnableKioskNext();
-
-  Profile* profile_;
-  OnboardingFlowModel* flow_model_;
-
-  DISALLOW_COPY_AND_ASSIGN(KioskNextFlowObserver);
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_KIOSK_NEXT_FLOW_OBSERVER_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_constants.cc b/chrome/browser/chromeos/supervision/onboarding_constants.cc
deleted file mode 100644
index 888cc76..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_constants.cc
+++ /dev/null
@@ -1,31 +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 "chrome/browser/chromeos/supervision/onboarding_constants.h"
-
-namespace chromeos {
-namespace supervision {
-
-// Default URL prefix for the Supervision Onboarding pages.
-const char kSupervisionServerUrlPrefix[] = "https://families.google.com/";
-
-// Relative URL for the onboarding start page.
-const char kOnboardingStartPageRelativeUrl[] = "/kids/deviceonboarding/start";
-
-// Relative URL for the onboarding details page.
-const char kOnboardingDetailsPageRelativeUrl[] =
-    "/kids/deviceonboarding/details";
-
-// Relative URL for the onboarding "All set" page.
-const char kOnboardingAllSetPageRelativeUrl[] = "/kids/deviceonboarding/allset";
-
-// Name of the custom HTTP header returned by the Supervision server containing
-// a list of experiments that this version of the onboarding supports.
-const char kExperimentHeaderName[] = "supervision-experiments";
-
-// Experiment name for the first version of the onboarding flow.
-const char kDeviceOnboardingExperimentName[] = "DeviceOnboardingV1";
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_constants.h b/chrome/browser/chromeos/supervision/onboarding_constants.h
deleted file mode 100644
index 6ae6b258..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_constants.h
+++ /dev/null
@@ -1,23 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONSTANTS_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONSTANTS_H_
-
-namespace chromeos {
-namespace supervision {
-
-extern const char kSupervisionServerUrlPrefix[];
-
-extern const char kOnboardingStartPageRelativeUrl[];
-extern const char kOnboardingDetailsPageRelativeUrl[];
-extern const char kOnboardingAllSetPageRelativeUrl[];
-
-extern const char kExperimentHeaderName[];
-extern const char kDeviceOnboardingExperimentName[];
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONSTANTS_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc b/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc
deleted file mode 100644
index f0b484d..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc
+++ /dev/null
@@ -1,45 +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 "chrome/browser/chromeos/supervision/onboarding_controller_impl.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "chrome/browser/chromeos/supervision/kiosk_next_flow_observer.h"
-#include "chrome/browser/chromeos/supervision/onboarding_flow_model.h"
-#include "chrome/browser/chromeos/supervision/onboarding_logger.h"
-#include "chrome/browser/chromeos/supervision/onboarding_presenter.h"
-
-namespace chromeos {
-namespace supervision {
-
-OnboardingControllerImpl::OnboardingControllerImpl(Profile* profile,
-                                                   OnboardingDelegate* delegate)
-    : flow_model_(std::make_unique<OnboardingFlowModel>(profile, delegate)),
-      presenter_(std::make_unique<OnboardingPresenter>(flow_model_.get())),
-      logger_(std::make_unique<OnboardingLogger>(flow_model_.get())),
-      kiosk_next_observer_(
-          std::make_unique<KioskNextFlowObserver>(profile, flow_model_.get())) {
-  DCHECK(profile);
-}
-
-OnboardingControllerImpl::~OnboardingControllerImpl() = default;
-
-void OnboardingControllerImpl::BindRequest(
-    mojom::OnboardingControllerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void OnboardingControllerImpl::BindWebviewHost(
-    mojom::OnboardingWebviewHostPtr webview_host) {
-  flow_model_->StartWithWebviewHost(std::move(webview_host));
-}
-
-void OnboardingControllerImpl::HandleAction(mojom::OnboardingAction action) {
-  flow_model_->HandleAction(action);
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_controller_impl.h b/chrome/browser/chromeos/supervision/onboarding_controller_impl.h
deleted file mode 100644
index 7238d9b..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_controller_impl.h
+++ /dev/null
@@ -1,51 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONTROLLER_IMPL_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONTROLLER_IMPL_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-
-class Profile;
-
-namespace chromeos {
-namespace supervision {
-
-class OnboardingDelegate;
-class OnboardingFlowModel;
-class OnboardingPresenter;
-class OnboardingLogger;
-class KioskNextFlowObserver;
-
-class OnboardingControllerImpl : public mojom::OnboardingController {
- public:
-  explicit OnboardingControllerImpl(Profile* profile,
-                                    OnboardingDelegate* delegate);
-  ~OnboardingControllerImpl() override;
-
-  void BindRequest(mojom::OnboardingControllerRequest request);
-
- private:
-  // mojom::OnboardingController:
-  void BindWebviewHost(mojom::OnboardingWebviewHostPtr webview_host) override;
-  void HandleAction(mojom::OnboardingAction action) override;
-
-  mojo::BindingSet<mojom::OnboardingController> bindings_;
-
-  std::unique_ptr<OnboardingFlowModel> flow_model_;
-  std::unique_ptr<OnboardingPresenter> presenter_;
-  std::unique_ptr<OnboardingLogger> logger_;
-  std::unique_ptr<KioskNextFlowObserver> kiosk_next_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(OnboardingControllerImpl);
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_controller_impl_unittest.cc b/chrome/browser/chromeos/supervision/onboarding_controller_impl_unittest.cc
deleted file mode 100644
index 1e49684..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_controller_impl_unittest.cc
+++ /dev/null
@@ -1,633 +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 "chrome/browser/chromeos/supervision/onboarding_controller_impl.h"
-
-#include <memory>
-#include <vector>
-
-#include "ash/public/cpp/ash_pref_names.h"
-#include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "chrome/browser/chromeos/supervision/onboarding_constants.h"
-#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/test_extension_system.h"
-#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
-#include "chrome/test/base/testing_profile.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "net/base/net_errors.h"
-#include "services/identity/public/cpp/identity_manager.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace chromeos {
-namespace supervision {
-namespace {
-
-const char kTestAccountId[] = "test-account-id";
-const char kFakeAccessToken[] = "fake-access-token";
-
-}  // namespace
-
-class FakeOnboardingDelegate : public OnboardingDelegate {
- public:
-  ~FakeOnboardingDelegate() override {}
-
-  bool finished_onboarding() { return finished_; }
-
-  bool skipped_onboarding() { return skipped_; }
-
- private:
-  // OnboardingDelegate:
-  void SkipOnboarding() override {
-    ASSERT_FALSE(finished_);
-    ASSERT_FALSE(skipped_);
-    skipped_ = true;
-  }
-
-  void FinishOnboarding() override {
-    ASSERT_FALSE(finished_);
-    ASSERT_FALSE(skipped_);
-    finished_ = true;
-  }
-
-  bool skipped_ = false;
-  bool finished_ = false;
-};
-
-class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost {
- public:
-  explicit FakeOnboardingWebviewHost(
-      mojom::OnboardingWebviewHostRequest request)
-      : binding_(this, std::move(request)) {}
-
-  void ExpectPresentations(const std::vector<mojom::OnboardingPresentation>&
-                               expected_presentations) {
-    ASSERT_EQ(presentations_.size(), expected_presentations.size());
-
-    for (std::size_t i = 0; i < expected_presentations.size(); ++i) {
-      const auto& expected_presentation = expected_presentations[i];
-      const auto& presentation = presentations_[i];
-      EXPECT_TRUE(presentation->Equals(expected_presentation));
-
-      // To yield more readable errors, we also test each property individually.
-      EXPECT_EQ(expected_presentation.state, presentation->state);
-      EXPECT_EQ(expected_presentation.can_show_next_page,
-                presentation->can_show_next_page);
-      EXPECT_EQ(expected_presentation.can_show_previous_page,
-                presentation->can_show_previous_page);
-      EXPECT_EQ(expected_presentation.can_skip_flow,
-                presentation->can_skip_flow);
-    }
-  }
-
-  // Flushes the internal mojo message pipe.
-  void Flush() { binding_.FlushForTesting(); }
-
-  void Reset() {
-    page_loaded_ = base::nullopt;
-    presentations_.clear();
-  }
-
-  const base::Optional<mojom::OnboardingPage>& page_loaded() {
-    return page_loaded_;
-  }
-
-  void set_load_page_result(const mojom::OnboardingLoadPageResult& result) {
-    load_page_result_ = result;
-  }
-
- private:
-  void SetPresentation(mojom::OnboardingPresentationPtr presentation) override {
-    presentations_.push_back(std::move(presentation));
-  }
-
-  void LoadPage(mojom::OnboardingPagePtr page,
-                LoadPageCallback callback) override {
-    page_loaded_ = *page;
-
-    std::move(callback).Run(load_page_result_.Clone());
-  }
-
-  mojo::Binding<mojom::OnboardingWebviewHost> binding_;
-
-  mojom::OnboardingLoadPageResult load_page_result_{
-      net::Error::OK, kDeviceOnboardingExperimentName};
-
-  std::vector<mojom::OnboardingPresentationPtr> presentations_;
-  base::Optional<mojom::OnboardingPage> page_loaded_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeOnboardingWebviewHost);
-};
-
-class OnboardingControllerBaseTest : public testing::Test {
- protected:
-  void SetUp() override {
-    profile_ = IdentityTestEnvironmentProfileAdaptor::
-        CreateProfileForIdentityTestEnvironment();
-
-    identity_test_env_adaptor_ =
-        std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
-    identity_test_env()->MakeAccountAvailable(kTestAccountId);
-    identity_test_env()->SetPrimaryAccount(kTestAccountId);
-
-    // Setting up an extension service, because some observers need to load
-    // extensions.
-    extensions::TestExtensionSystem* extension_system(
-        static_cast<extensions::TestExtensionSystem*>(
-            extensions::ExtensionSystem::Get(profile())));
-    extension_system->CreateExtensionService(
-        base::CommandLine::ForCurrentProcess(), base::FilePath(),
-        /*autoupdate_enabled=*/false);
-
-    delegate_ = std::make_unique<FakeOnboardingDelegate>();
-    controller_impl_ =
-        std::make_unique<OnboardingControllerImpl>(profile(), delegate());
-    controller_impl_->BindRequest(mojo::MakeRequest(&controller_));
-  }
-
-  void BindWebviewHost() {
-    mojom::OnboardingWebviewHostPtr webview_host_proxy;
-    webview_host_ = std::make_unique<FakeOnboardingWebviewHost>(
-        mojo::MakeRequest(&webview_host_proxy));
-
-    controller_->BindWebviewHost(std::move(webview_host_proxy));
-  }
-
-  void SetUpPageLoad(const mojom::OnboardingLoadPageResult& result) {
-    webview_host()->set_load_page_result(result);
-    identity_test_env()
-        ->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-            kFakeAccessToken,
-            base::Time::Now() + base::TimeDelta::FromHours(1));
-
-    Flush();
-  }
-
-  void BindHostAndSetupFailedAuth() {
-    BindWebviewHost();
-
-    identity_test_env()
-        ->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
-            GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED));
-
-    Flush();
-  }
-
-  void BindHostAndReturnLoadPageSuccess() {
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = net::Error::OK;
-    result.custom_header_value = kDeviceOnboardingExperimentName;
-
-    BindWebviewHost();
-    SetUpPageLoad(result);
-  }
-
-  void BindHostAndReturnLoadPageError() {
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = net::Error::ERR_FAILED;
-    result.custom_header_value = kDeviceOnboardingExperimentName;
-
-    BindWebviewHost();
-    SetUpPageLoad(result);
-  }
-
-  void BindHostAndReturnMissingCustomHeader() {
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = net::Error::OK;
-    result.custom_header_value = base::nullopt;
-
-    BindWebviewHost();
-    SetUpPageLoad(result);
-  }
-
-  void BindHostAndReturnWrongCustomHeader() {
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = net::Error::OK;
-    result.custom_header_value = "clearly-wrong-header-value";
-
-    BindWebviewHost();
-    SetUpPageLoad(result);
-  }
-
-  void HandleAction(mojom::OnboardingAction action) {
-    controller_->HandleAction(action);
-    Flush();
-  }
-
-  void Flush() {
-    controller_.FlushForTesting();
-    webview_host()->Flush();
-  }
-
-  Profile* profile() { return profile_.get(); }
-
-  identity::IdentityTestEnvironment* identity_test_env() {
-    return identity_test_env_adaptor_->identity_test_env();
-  }
-
-  FakeOnboardingDelegate* delegate() { return delegate_.get(); }
-
-  FakeOnboardingWebviewHost* webview_host() { return webview_host_.get(); }
-
- private:
-  content::TestBrowserThreadBundle test_browser_thread_bundle_;
-  std::unique_ptr<TestingProfile> profile_;
-  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor>
-      identity_test_env_adaptor_;
-  std::unique_ptr<FakeOnboardingDelegate> delegate_;
-  std::unique_ptr<OnboardingControllerImpl> controller_impl_;
-  mojom::OnboardingControllerPtr controller_;
-  std::unique_ptr<FakeOnboardingWebviewHost> webview_host_;
-};
-
-class OnboardingControllerFlowDisabledTest
-    : public OnboardingControllerBaseTest {
- protected:
-  void SetUp() override {
-    scoped_feature_list_.InitAndDisableFeature(
-        features::kSupervisionOnboardingScreens);
-
-    OnboardingControllerBaseTest::SetUp();
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_F(OnboardingControllerFlowDisabledTest, ExitFlowWhenFlowIsDisabled) {
-  BindHostAndReturnLoadPageSuccess();
-
-  EXPECT_TRUE(delegate()->skipped_onboarding());
-}
-
-TEST_F(OnboardingControllerFlowDisabledTest,
-       PresentOnlyLoadingStateWhenFlowIsDisabled) {
-  BindHostAndReturnLoadPageSuccess();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  webview_host()->ExpectPresentations({loading});
-}
-
-TEST_F(OnboardingControllerFlowDisabledTest,
-       SetEligibleForKioskNextWhenFlowIsDisabled) {
-  BindHostAndReturnLoadPageSuccess();
-
-  EXPECT_TRUE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-class OnboardingControllerTest : public OnboardingControllerBaseTest {
- protected:
-  void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(
-        features::kSupervisionOnboardingScreens);
-
-    OnboardingControllerBaseTest::SetUp();
-  }
-
-  // Navigates to the details page by first loading the Start page, then faking
-  // a user pressing the "Next" button. It can optionally fake a failed page
-  // load for the Details page.
-  // Note: To make tests simpler we also reset the data from the
-  // FakeWebviewHost, this way we can write tests that only focus on the page
-  // being handled.
-  void NavigateToDetailsPage(bool return_error = false) {
-    BindHostAndReturnLoadPageSuccess();
-    webview_host()->Reset();
-
-    HandleAction(mojom::OnboardingAction::kShowNextPage);
-
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = return_error ? net::Error::ERR_FAILED : net::Error::OK;
-    SetUpPageLoad(result);
-  }
-
-  // Navigates to the "All Set!" page by first navigating to the Details page,
-  // then faking a user pressing the "Next" button. It can optionally fake a
-  // failed page load for the "All Set!" page.
-  // Note: To make tests simpler we also reset the data from the
-  // FakeWebviewHost, this way we can write tests that only focus on the page
-  // being handled.
-  void NavigateToAllSetPage(bool return_error = false) {
-    NavigateToDetailsPage();
-    webview_host()->Reset();
-
-    HandleAction(mojom::OnboardingAction::kShowNextPage);
-    mojom::OnboardingLoadPageResult result;
-    result.net_error = return_error ? net::Error::ERR_FAILED : net::Error::OK;
-    SetUpPageLoad(result);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_F(OnboardingControllerTest, RequestWebviewHostToLoadStartPageCorrectly) {
-  BindHostAndReturnLoadPageSuccess();
-
-  ASSERT_TRUE(webview_host()->page_loaded().has_value());
-  EXPECT_EQ(webview_host()->page_loaded()->url,
-            GURL("https://families.google.com/kids/deviceonboarding/start"));
-  EXPECT_EQ(webview_host()->page_loaded()->access_token, kFakeAccessToken);
-  EXPECT_EQ(webview_host()->page_loaded()->custom_header_name,
-            kExperimentHeaderName);
-  EXPECT_EQ(webview_host()->page_loaded()->allowed_urls_prefix,
-            "https://families.google.com/");
-}
-
-TEST_F(OnboardingControllerTest, OverridePageUrlsByCommandLine) {
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      chromeos::switches::kSupervisionOnboardingUrlPrefix,
-      "https://example.com/");
-
-  BindHostAndReturnLoadPageSuccess();
-
-  ASSERT_TRUE(webview_host()->page_loaded().has_value());
-  EXPECT_EQ(webview_host()->page_loaded()->url,
-            GURL("https://example.com/kids/deviceonboarding/start"));
-  EXPECT_EQ(webview_host()->page_loaded()->access_token, kFakeAccessToken);
-  EXPECT_EQ(webview_host()->page_loaded()->custom_header_name,
-            kExperimentHeaderName);
-  EXPECT_EQ(webview_host()->page_loaded()->allowed_urls_prefix,
-            "https://example.com/");
-}
-
-TEST_F(OnboardingControllerTest, StayInFlowWhenLoadSucceeds) {
-  BindHostAndReturnLoadPageSuccess();
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, PresentReadyStateWhenLoadSucceeds) {
-  BindHostAndReturnLoadPageSuccess();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation ready;
-  ready.state = mojom::OnboardingPresentationState::kReady;
-  ready.can_show_next_page = true;
-  ready.can_skip_flow = true;
-
-  webview_host()->ExpectPresentations({loading, ready});
-}
-
-TEST_F(OnboardingControllerTest, SetEligibleForKioskNextWhenLoadSucceeds) {
-  BindHostAndReturnLoadPageSuccess();
-
-  EXPECT_TRUE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-TEST_F(OnboardingControllerTest, StayInFlowOnAuthError) {
-  BindHostAndSetupFailedAuth();
-
-  EXPECT_FALSE(webview_host()->page_loaded().has_value());
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, PresentRetryStateOnAuthError) {
-  BindHostAndSetupFailedAuth();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation retry;
-  retry.state = mojom::OnboardingPresentationState::kPageLoadFailed;
-  retry.can_retry_page_load = true;
-  webview_host()->ExpectPresentations({loading, retry});
-}
-
-TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnAuthError) {
-  BindHostAndSetupFailedAuth();
-
-  EXPECT_FALSE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-TEST_F(OnboardingControllerTest, StayInFlowOnLoadPageError) {
-  BindHostAndReturnLoadPageError();
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, PresentRetryStateOnLoadPageError) {
-  BindHostAndReturnLoadPageError();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation retry;
-  retry.state = mojom::OnboardingPresentationState::kPageLoadFailed;
-  retry.can_retry_page_load = true;
-  webview_host()->ExpectPresentations({loading, retry});
-}
-
-TEST_F(OnboardingControllerTest, PresentSkipButtonIfLoadFailsTooManyTimes) {
-  BindHostAndReturnLoadPageError();
-
-  mojom::OnboardingLoadPageResult result;
-  result.net_error = net::Error::ERR_FAILED;
-  HandleAction(mojom::OnboardingAction::kRetryPageLoad);
-  SetUpPageLoad(result);
-  HandleAction(mojom::OnboardingAction::kRetryPageLoad);
-  SetUpPageLoad(result);
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation retry;
-  retry.state = mojom::OnboardingPresentationState::kPageLoadFailed;
-  retry.can_retry_page_load = true;
-
-  mojom::OnboardingPresentation retry_with_skip;
-  retry_with_skip.state = mojom::OnboardingPresentationState::kPageLoadFailed;
-  retry_with_skip.can_retry_page_load = true;
-  retry_with_skip.can_skip_flow = true;
-
-  webview_host()->ExpectPresentations({
-      // First try.
-      loading,
-      retry,
-      // Second try.
-      loading,
-      retry,
-      // On the third try we now show the skip button.
-      loading,
-      retry_with_skip,
-  });
-}
-
-TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnLoadPageError) {
-  BindHostAndReturnLoadPageError();
-
-  EXPECT_FALSE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsMissing) {
-  BindHostAndReturnMissingCustomHeader();
-
-  EXPECT_TRUE(delegate()->skipped_onboarding());
-}
-
-TEST_F(OnboardingControllerTest,
-       PresentOnlyLoadingStateWhenHeaderValueIsMissing) {
-  BindHostAndReturnMissingCustomHeader();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  webview_host()->ExpectPresentations({loading});
-}
-
-TEST_F(OnboardingControllerTest,
-       SetNotEligibleForKioskNextWhenHeaderValueIsMissing) {
-  BindHostAndReturnMissingCustomHeader();
-
-  EXPECT_FALSE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsWrong) {
-  BindHostAndReturnWrongCustomHeader();
-
-  EXPECT_TRUE(delegate()->skipped_onboarding());
-}
-
-TEST_F(OnboardingControllerTest,
-       PresentOnlyLoadingStateWhenHeaderValueIsWrong) {
-  BindHostAndReturnWrongCustomHeader();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  webview_host()->ExpectPresentations({loading});
-}
-
-TEST_F(OnboardingControllerTest,
-       SetNotEligibleForKioskNextWhenHeaderValueIsWrong) {
-  BindHostAndReturnWrongCustomHeader();
-
-  EXPECT_FALSE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-}
-
-TEST_F(OnboardingControllerTest, ExitFlowWhenHandlingSkipAction) {
-  BindHostAndReturnLoadPageSuccess();
-
-  HandleAction(mojom::OnboardingAction::kSkipFlow);
-
-  EXPECT_TRUE(delegate()->skipped_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToDetailsPage) {
-  NavigateToDetailsPage();
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, DetailsPageStaysInFlowOnFailedPageLoad) {
-  NavigateToDetailsPage(/*return_error=*/true);
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, DetailsPageIsPresentedCorrectly) {
-  NavigateToDetailsPage();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation ready;
-  ready.state = mojom::OnboardingPresentationState::kReady;
-  ready.can_show_next_page = true;
-  ready.can_show_previous_page = true;
-
-  webview_host()->ExpectPresentations({loading, ready});
-}
-
-TEST_F(OnboardingControllerTest, DetailsPageIsLoadedCorrectly) {
-  NavigateToDetailsPage();
-
-  ASSERT_TRUE(webview_host()->page_loaded().has_value());
-  EXPECT_EQ(webview_host()->page_loaded()->url,
-            GURL("https://families.google.com/kids/deviceonboarding/details"));
-  EXPECT_EQ(webview_host()->page_loaded()->access_token, kFakeAccessToken);
-  EXPECT_EQ(webview_host()->page_loaded()->custom_header_name, base::nullopt);
-  EXPECT_EQ(webview_host()->page_loaded()->allowed_urls_prefix,
-            "https://families.google.com/");
-}
-
-TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToAllSetPage) {
-  NavigateToAllSetPage();
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, AllSetPageStaysInFlowOnFailedPageLoad) {
-  NavigateToAllSetPage(/*return_error=*/true);
-
-  EXPECT_FALSE(delegate()->skipped_onboarding());
-  EXPECT_FALSE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, AllSetPageIsPresentedCorrectly) {
-  NavigateToAllSetPage();
-
-  mojom::OnboardingPresentation loading;
-  loading.state = mojom::OnboardingPresentationState::kLoading;
-
-  mojom::OnboardingPresentation ready;
-  ready.state = mojom::OnboardingPresentationState::kReady;
-  ready.can_show_next_page = true;
-  ready.can_show_previous_page = true;
-
-  webview_host()->ExpectPresentations({loading, ready});
-}
-
-TEST_F(OnboardingControllerTest, AllSetPageIsLoadedCorrectly) {
-  NavigateToAllSetPage();
-
-  ASSERT_TRUE(webview_host()->page_loaded().has_value());
-  EXPECT_EQ(webview_host()->page_loaded()->url,
-            GURL("https://families.google.com/kids/deviceonboarding/allset"));
-  EXPECT_EQ(webview_host()->page_loaded()->access_token, kFakeAccessToken);
-  EXPECT_EQ(webview_host()->page_loaded()->custom_header_name, base::nullopt);
-  EXPECT_EQ(webview_host()->page_loaded()->allowed_urls_prefix,
-            "https://families.google.com/");
-}
-
-TEST_F(OnboardingControllerTest, AllSetPageCanFinishFlow) {
-  NavigateToAllSetPage();
-
-  EXPECT_FALSE(delegate()->finished_onboarding());
-  HandleAction(mojom::OnboardingAction::kShowNextPage);
-  EXPECT_TRUE(delegate()->finished_onboarding());
-}
-
-TEST_F(OnboardingControllerTest, AllSetPageEnablesKioskNext) {
-  NavigateToAllSetPage();
-
-  EXPECT_FALSE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEnabled));
-  HandleAction(mojom::OnboardingAction::kShowNextPage);
-
-  EXPECT_TRUE(
-      profile()->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEnabled));
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_delegate.h b/chrome/browser/chromeos/supervision/onboarding_delegate.h
deleted file mode 100644
index ea2cd89f..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_delegate.h
+++ /dev/null
@@ -1,31 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_DELEGATE_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_DELEGATE_H_
-
-namespace chromeos {
-namespace supervision {
-
-// Interface for classes that host the Supervision Onboarding flow. Since the
-// flow might be hosted by different WebUIs, this is the common interface used
-// to communicate between internal onboarding classes and their WebUI handlers.
-class OnboardingDelegate {
- public:
-  virtual ~OnboardingDelegate() {}
-
-  // Called when we want to skip the onboarding flow. This can happen if the
-  // user actively skipped the flow or we decided that the flow should be
-  // skipped for other reasons (errors, missing flags, eligibility, etc).
-  virtual void SkipOnboarding() = 0;
-
-  // Called when the user successfully finishes the onboarding flow by reaching
-  // its conclusion.
-  virtual void FinishOnboarding() = 0;
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_DELEGATE_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_flow_model.cc b/chrome/browser/chromeos/supervision/onboarding_flow_model.cc
deleted file mode 100644
index e7f072a..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_flow_model.cc
+++ /dev/null
@@ -1,225 +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 "chrome/browser/chromeos/supervision/onboarding_flow_model.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "chrome/browser/chromeos/supervision/onboarding_constants.h"
-#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
-#include "chrome/browser/signin/identity_manager_factory.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "services/identity/public/cpp/primary_account_access_token_fetcher.h"
-#include "url/gurl.h"
-
-namespace chromeos {
-namespace supervision {
-namespace {
-
-// OAuth scope necessary to access the Supervision server.
-const char kSupervisionScope[] =
-    "https://www.googleapis.com/auth/kid.family.readonly";
-
-GURL SupervisionServerBaseUrl() {
-  GURL command_line_prefix(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kSupervisionOnboardingUrlPrefix));
-
-  if (command_line_prefix.is_valid())
-    return command_line_prefix;
-
-  if (!command_line_prefix.is_empty())
-    DLOG(ERROR) << "Supervision server base URL prefix is invalid: "
-                << command_line_prefix.possibly_invalid_spec();
-
-  return GURL(kSupervisionServerUrlPrefix);
-}
-
-}  // namespace
-
-OnboardingFlowModel::OnboardingFlowModel(Profile* profile,
-                                         OnboardingDelegate* delegate)
-    : profile_(profile), delegate_(delegate) {}
-
-OnboardingFlowModel::~OnboardingFlowModel() = default;
-
-void OnboardingFlowModel::AddObserver(Observer* observer) {
-  observer_list_.AddObserver(observer);
-}
-
-void OnboardingFlowModel::RemoveObserver(Observer* observer) {
-  observer_list_.RemoveObserver(observer);
-}
-
-void OnboardingFlowModel::StartWithWebviewHost(
-    mojom::OnboardingWebviewHostPtr webview_host) {
-  webview_host_ = std::move(webview_host);
-
-  LoadStep(Step::kStart);
-}
-
-void OnboardingFlowModel::HandleAction(mojom::OnboardingAction action) {
-  switch (action) {
-    case mojom::OnboardingAction::kShowNextPage:
-      ShowNextPage();
-      return;
-    case mojom::OnboardingAction::kShowPreviousPage:
-      ShowPreviousPage();
-      return;
-    case mojom::OnboardingAction::kSkipFlow:
-      ExitFlow(ExitReason::kFlowSkipped);
-      return;
-    case mojom::OnboardingAction::kRetryPageLoad:
-      LoadStep(current_step_);
-      return;
-  }
-}
-
-void OnboardingFlowModel::ExitFlow(ExitReason reason) {
-  DCHECK(webview_host_);
-
-  for (auto& observer : observer_list_) {
-    observer.WillExitFlow(current_step_, reason);
-  }
-
-  webview_host_ = nullptr;
-  if (reason == ExitReason::kUserReachedEnd) {
-    delegate_->FinishOnboarding();
-    return;
-  }
-
-  delegate_->SkipOnboarding();
-}
-
-mojom::OnboardingWebviewHost& OnboardingFlowModel::GetWebviewHost() {
-  DCHECK(webview_host_);
-  return *webview_host_;
-}
-
-//------------------------------------------------------------------------------
-// Private methods
-
-mojom::OnboardingPagePtr OnboardingFlowModel::MakePage(
-    Step step,
-    const std::string& access_token) {
-  auto page = mojom::OnboardingPage::New();
-  page->access_token = access_token;
-  page->allowed_urls_prefix = SupervisionServerBaseUrl().spec();
-
-  std::string relative_page_url;
-  switch (step) {
-    case Step::kStart:
-      page->custom_header_name = kExperimentHeaderName;
-      relative_page_url = kOnboardingStartPageRelativeUrl;
-      break;
-    case Step::kDetails:
-      relative_page_url = kOnboardingDetailsPageRelativeUrl;
-      break;
-    case Step::kAllSet:
-      relative_page_url = kOnboardingAllSetPageRelativeUrl;
-      break;
-  }
-
-  page->url = SupervisionServerBaseUrl().Resolve(relative_page_url);
-  return page;
-}
-
-void OnboardingFlowModel::ShowNextPage() {
-  switch (current_step_) {
-    case Step::kStart:
-      LoadStep(Step::kDetails);
-      return;
-    case Step::kDetails:
-      LoadStep(Step::kAllSet);
-      return;
-    case Step::kAllSet:
-      ExitFlow(ExitReason::kUserReachedEnd);
-      return;
-  }
-}
-
-void OnboardingFlowModel::ShowPreviousPage() {
-  switch (current_step_) {
-    case Step::kStart:
-      NOTREACHED();
-      return;
-    case Step::kDetails:
-      LoadStep(Step::kStart);
-      return;
-    case Step::kAllSet:
-      LoadStep(Step::kDetails);
-      return;
-  }
-}
-
-void OnboardingFlowModel::LoadStep(Step step) {
-  current_step_ = step;
-
-  for (auto& observer : observer_list_) {
-    observer.StepStartedLoading(current_step_);
-  }
-
-  OAuth2TokenService::ScopeSet scopes{kSupervisionScope};
-
-  // base::Unretained is safe here since |access_token_fetcher_| is owned by
-  // |this|.
-  access_token_fetcher_ =
-      std::make_unique<identity::PrimaryAccountAccessTokenFetcher>(
-          "supervision_onboarding_flow",
-          IdentityManagerFactory::GetForProfile(profile_), scopes,
-          base::BindOnce(&OnboardingFlowModel::AccessTokenCallback,
-                         base::Unretained(this)),
-          identity::PrimaryAccountAccessTokenFetcher::Mode::kImmediate);
-}
-
-void OnboardingFlowModel::AccessTokenCallback(
-    GoogleServiceAuthError error,
-    identity::AccessTokenInfo access_token_info) {
-  DCHECK(webview_host_);
-  if (error.state() != GoogleServiceAuthError::NONE) {
-    for (auto& observer : observer_list_) {
-      observer.StepFailedToLoadDueToAuthError(current_step_, error);
-    }
-    return;
-  }
-
-  webview_host_->LoadPage(MakePage(current_step_, access_token_info.token),
-                          base::BindOnce(&OnboardingFlowModel::LoadPageCallback,
-                                         base::Unretained(this)));
-}
-
-void OnboardingFlowModel::LoadPageCallback(
-    mojom::OnboardingLoadPageResultPtr result) {
-  DCHECK(webview_host_);
-
-  if (result->net_error != net::Error::OK) {
-    for (auto& observer : observer_list_) {
-      observer.StepFailedToLoadDueToNetworkError(
-          current_step_, static_cast<net::Error>(result->net_error));
-    }
-    return;
-  }
-
-  bool has_experiment =
-      result->custom_header_value.has_value() &&
-      base::EqualsCaseInsensitiveASCII(result->custom_header_value.value(),
-                                       kDeviceOnboardingExperimentName);
-
-  // Only the start step requires the experiment.
-  if (current_step_ == Step::kStart && !has_experiment) {
-    ExitFlow(ExitReason::kUserNotEligible);
-    return;
-  }
-
-  for (auto& observer : observer_list_) {
-    observer.StepFinishedLoading(current_step_);
-  }
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_flow_model.h b/chrome/browser/chromeos/supervision/onboarding_flow_model.h
deleted file mode 100644
index e5105e7..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_flow_model.h
+++ /dev/null
@@ -1,115 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_FLOW_MODEL_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_FLOW_MODEL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "net/base/net_errors.h"
-#include "services/identity/public/cpp/identity_manager.h"
-
-class Profile;
-
-namespace identity {
-class PrimaryAccountAccessTokenFetcher;
-}
-
-namespace chromeos {
-namespace supervision {
-
-class OnboardingDelegate;
-
-// Class that manages the onboarding flow state, handling user actions and
-// loading new pages. It notifies its observers of flow changes.
-class OnboardingFlowModel {
- public:
-  explicit OnboardingFlowModel(Profile* profile, OnboardingDelegate* delegate);
-  ~OnboardingFlowModel();
-
-  // Represents each onboarding flow step.
-  enum class Step {
-    // First page, informs the user about supervision features. Has a button to
-    // skip the whole flow.
-    kStart,
-    // Second page, shows additional details about supervision.
-    kDetails,
-    // Third and final page, presented when all previous steps have been
-    // successful.
-    kAllSet,
-  };
-
-  // Represents possible reasons for the flow to exit.
-  enum class ExitReason {
-    // The user navigated through the whole flow and exited successfully.
-    kUserReachedEnd,
-    // User chose to skip the flow.
-    kFlowSkipped,
-    // The user is not eligible to see the flow.
-    kUserNotEligible,
-    // The onboarding flow screens should not be shown since their feature is
-    // disabled.
-    kFeatureDisabled,
-  };
-
-  class Observer : public base::CheckedObserver {
-   public:
-    // Step loading notifications. They are called before and after a step has
-    // successfully loaded, which includes fetching an access token and
-    // loading a new onboarding page. It is safe to call other flow model
-    // methods after receiving these notifications.
-    virtual void StepStartedLoading(Step step) {}
-    virtual void StepFinishedLoading(Step step) {}
-
-    virtual void StepFailedToLoadDueToAuthError(Step step,
-                                                GoogleServiceAuthError error) {}
-    virtual void StepFailedToLoadDueToNetworkError(Step step,
-                                                   net::Error error) {}
-
-    // If we are exiting the flow for any reason, we first notify our observers
-    // through this method. Observers should *NOT* call other methods in the
-    // flow model while receiving this notification.
-    virtual void WillExitFlow(Step current_step, ExitReason reason) {}
-  };
-
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-
-  void StartWithWebviewHost(mojom::OnboardingWebviewHostPtr webview_host);
-  void HandleAction(mojom::OnboardingAction action);
-  void ExitFlow(ExitReason reason);
-
-  mojom::OnboardingWebviewHost& GetWebviewHost();
-
- private:
-  mojom::OnboardingPagePtr MakePage(Step step, const std::string& access_token);
-  void ShowNextPage();
-  void ShowPreviousPage();
-
-  void LoadStep(Step step);
-
-  void AccessTokenCallback(GoogleServiceAuthError error,
-                           identity::AccessTokenInfo access_token_info);
-
-  void LoadPageCallback(mojom::OnboardingLoadPageResultPtr result);
-
-  Profile* profile_;
-  OnboardingDelegate* delegate_;
-  mojom::OnboardingWebviewHostPtr webview_host_;
-  Step current_step_ = Step::kStart;
-  base::ObserverList<Observer> observer_list_;
-  std::unique_ptr<identity::PrimaryAccountAccessTokenFetcher>
-      access_token_fetcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(OnboardingFlowModel);
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_FLOW_MODEL_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_logger.cc b/chrome/browser/chromeos/supervision/onboarding_logger.cc
deleted file mode 100644
index 2b335ee..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_logger.cc
+++ /dev/null
@@ -1,83 +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 "chrome/browser/chromeos/supervision/onboarding_logger.h"
-
-#include "base/logging.h"
-#include "google_apis/gaia/google_service_auth_error.h"
-
-namespace chromeos {
-namespace supervision {
-namespace {
-
-const char* StepDescription(OnboardingFlowModel::Step step) {
-  switch (step) {
-    case OnboardingFlowModel::Step::kStart:
-      return "Start";
-    case OnboardingFlowModel::Step::kDetails:
-      return "Details";
-    case OnboardingFlowModel::Step::kAllSet:
-      return "AllSet";
-  }
-}
-
-const char* ExitReasonDescription(OnboardingFlowModel::ExitReason reason) {
-  switch (reason) {
-    case OnboardingFlowModel::ExitReason::kUserReachedEnd:
-      return "User reached the end of the flow successfuly.";
-    case OnboardingFlowModel::ExitReason::kFlowSkipped:
-      return "User chose to skip the flow.";
-    case OnboardingFlowModel::ExitReason::kUserNotEligible:
-      return "User is not eligible to go through the flow.";
-    case OnboardingFlowModel::ExitReason::kFeatureDisabled:
-      return "Feature is disabled, we can't present flow pages.";
-  }
-}
-
-}  // namespace
-
-OnboardingLogger::OnboardingLogger(OnboardingFlowModel* flow_model)
-    : flow_model_(flow_model) {
-  flow_model_->AddObserver(this);
-}
-
-OnboardingLogger::~OnboardingLogger() {
-  flow_model_->RemoveObserver(this);
-}
-
-void OnboardingLogger::StepStartedLoading(OnboardingFlowModel::Step step) {
-  DVLOG(1) << "Supervision Onboarding started loading step: "
-           << StepDescription(step);
-}
-
-void OnboardingLogger::StepFinishedLoading(OnboardingFlowModel::Step step) {
-  DVLOG(1) << "Supervision Onboarding successfuly loaded step: "
-           << StepDescription(step);
-}
-
-void OnboardingLogger::StepFailedToLoadDueToAuthError(
-    OnboardingFlowModel::Step step,
-    GoogleServiceAuthError error) {
-  LOG(WARNING)
-      << "Supervision Onboarding step failed to load due to auth error. "
-      << "Step: " << StepDescription(step)
-      << " Error: " << error.error_message();
-}
-
-void OnboardingLogger::StepFailedToLoadDueToNetworkError(
-    OnboardingFlowModel::Step step,
-    net::Error error) {
-  LOG(WARNING) << "Supervision Onboarding step failed to load due to a network "
-               << "error. Step: " << StepDescription(step)
-               << " Error: " << net::ErrorToString(error);
-}
-
-void OnboardingLogger::WillExitFlow(OnboardingFlowModel::Step step,
-                                    OnboardingFlowModel::ExitReason reason) {
-  DVLOG(1) << "Supervision Onboarding exiting. "
-           << ExitReasonDescription(reason);
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_logger.h b/chrome/browser/chromeos/supervision/onboarding_logger.h
deleted file mode 100644
index 4c7331c..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_logger.h
+++ /dev/null
@@ -1,44 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_LOGGER_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_LOGGER_H_
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "chrome/browser/chromeos/supervision/onboarding_flow_model.h"
-
-namespace chromeos {
-namespace supervision {
-
-// Records onboarding flow changes.
-//
-// TODO(crbug.com/958995): Update UMA metrics as well. We want to see how many
-// users get errors, have missing header values or actually end up seeing the
-// page.
-class OnboardingLogger : public OnboardingFlowModel::Observer {
- public:
-  explicit OnboardingLogger(OnboardingFlowModel* flow_model);
-  ~OnboardingLogger() override;
-
- private:
-  // OnboardingFlowModel::Observer:
-  void StepStartedLoading(OnboardingFlowModel::Step step) override;
-  void StepFinishedLoading(OnboardingFlowModel::Step step) override;
-  void StepFailedToLoadDueToAuthError(OnboardingFlowModel::Step step,
-                                      GoogleServiceAuthError error) override;
-  void StepFailedToLoadDueToNetworkError(OnboardingFlowModel::Step step,
-                                         net::Error error) override;
-  void WillExitFlow(OnboardingFlowModel::Step step,
-                    OnboardingFlowModel::ExitReason reason) override;
-
-  OnboardingFlowModel* flow_model_;
-
-  DISALLOW_COPY_AND_ASSIGN(OnboardingLogger);
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_LOGGER_H_
diff --git a/chrome/browser/chromeos/supervision/onboarding_presenter.cc b/chrome/browser/chromeos/supervision/onboarding_presenter.cc
deleted file mode 100644
index e1160e8..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_presenter.cc
+++ /dev/null
@@ -1,85 +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 "chrome/browser/chromeos/supervision/onboarding_presenter.h"
-
-#include <utility>
-
-#include "chromeos/constants/chromeos_features.h"
-
-namespace chromeos {
-namespace supervision {
-namespace {
-
-// Minimum number of failed page loads before we show the Skip flow button.
-constexpr int kMinFailedLoadCountForSkipAction = 3;
-
-}  // namespace
-
-OnboardingPresenter::OnboardingPresenter(OnboardingFlowModel* flow_model)
-    : flow_model_(flow_model) {
-  flow_model_->AddObserver(this);
-}
-
-OnboardingPresenter::~OnboardingPresenter() {
-  flow_model_->RemoveObserver(this);
-}
-
-void OnboardingPresenter::StepStartedLoading(OnboardingFlowModel::Step step) {
-  auto presentation = mojom::OnboardingPresentation::New();
-  presentation->state = mojom::OnboardingPresentationState::kLoading;
-
-  flow_model_->GetWebviewHost().SetPresentation(std::move(presentation));
-}
-
-void OnboardingPresenter::StepFinishedLoading(OnboardingFlowModel::Step step) {
-  failed_loads_count_ = 0;
-
-  if (!base::FeatureList::IsEnabled(features::kSupervisionOnboardingScreens)) {
-    flow_model_->ExitFlow(OnboardingFlowModel::ExitReason::kFeatureDisabled);
-    return;
-  }
-
-  auto presentation = mojom::OnboardingPresentation::New();
-  presentation->state = mojom::OnboardingPresentationState::kReady;
-  presentation->can_show_next_page = true;
-  switch (step) {
-    case OnboardingFlowModel::Step::kStart:
-      presentation->can_skip_flow = true;
-      break;
-    case OnboardingFlowModel::Step::kDetails:
-    case OnboardingFlowModel::Step::kAllSet:
-      presentation->can_show_previous_page = true;
-      break;
-  }
-
-  flow_model_->GetWebviewHost().SetPresentation(std::move(presentation));
-}
-
-void OnboardingPresenter::StepFailedToLoadDueToAuthError(
-    OnboardingFlowModel::Step step,
-    GoogleServiceAuthError error) {
-  PresentErrorState();
-}
-
-void OnboardingPresenter::StepFailedToLoadDueToNetworkError(
-    OnboardingFlowModel::Step step,
-    net::Error error) {
-  PresentErrorState();
-}
-
-void OnboardingPresenter::PresentErrorState() {
-  failed_loads_count_++;
-
-  auto presentation = mojom::OnboardingPresentation::New();
-  presentation->state = mojom::OnboardingPresentationState::kPageLoadFailed;
-  presentation->can_retry_page_load = true;
-  if (failed_loads_count_ >= kMinFailedLoadCountForSkipAction)
-    presentation->can_skip_flow = true;
-
-  flow_model_->GetWebviewHost().SetPresentation(std::move(presentation));
-}
-
-}  // namespace supervision
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/onboarding_presenter.h b/chrome/browser/chromeos/supervision/onboarding_presenter.h
deleted file mode 100644
index f912aa9c..0000000
--- a/chrome/browser/chromeos/supervision/onboarding_presenter.h
+++ /dev/null
@@ -1,44 +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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_PRESENTER_H_
-#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_PRESENTER_H_
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "chrome/browser/chromeos/supervision/onboarding_flow_model.h"
-#include "net/base/net_errors.h"
-
-class GoogleServiceAuthError;
-
-namespace chromeos {
-namespace supervision {
-
-// Sets the onboarding presentation based on observed flow changes.
-class OnboardingPresenter : public OnboardingFlowModel::Observer {
- public:
-  explicit OnboardingPresenter(OnboardingFlowModel* flow_model);
-  ~OnboardingPresenter() override;
-
- private:
-  // OnboardingFlowModel::Observer:
-  void StepStartedLoading(OnboardingFlowModel::Step step) override;
-  void StepFinishedLoading(OnboardingFlowModel::Step step) override;
-  void StepFailedToLoadDueToAuthError(OnboardingFlowModel::Step step,
-                                      GoogleServiceAuthError error) override;
-  void StepFailedToLoadDueToNetworkError(OnboardingFlowModel::Step step,
-                                         net::Error error) override;
-
-  void PresentErrorState();
-
-  OnboardingFlowModel* flow_model_;
-  int failed_loads_count_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(OnboardingPresenter);
-};
-
-}  // namespace supervision
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_PRESENTER_H_
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
index ece41e96..b2ff6db3 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
@@ -53,7 +53,7 @@
 WebRequestInfoInitParams CreateRequestParams(const GURL& url) {
   WebRequestInfoInitParams info;
   info.url = url;
-  info.is_browser_side_navigation = true;
+  info.is_navigation_request = true;
   info.type = content::ResourceType::kMainFrame;
   info.web_request_type = WebRequestResourceType::MAIN_FRAME;
   return info;
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 69d45ae7..484ab0f 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -484,8 +484,6 @@
       settings_api::PrefType::PREF_TYPE_NUMBER;
 
   // Ash settings.
-  (*s_whitelist)[ash::prefs::kKioskNextShellEnabled] =
-      settings_api::PrefType::PREF_TYPE_BOOLEAN;
   (*s_whitelist)[ash::prefs::kEnableStylusTools] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
   (*s_whitelist)[ash::prefs::kLaunchPaletteOnEjectEvent] =
diff --git a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
index eea86d67..c486cbe8 100644
--- a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -127,14 +127,14 @@
   auto create_request_params =
       [&example_com](const url::Origin& initiator, content::ResourceType type,
                      extensions::WebRequestResourceType web_request_type,
-                     bool is_browser_side_navigation) {
+                     bool is_navigation_request) {
         WebRequestInfoInitParams info_params;
         info_params.url = example_com;
         info_params.initiator = initiator;
         info_params.render_process_id = -1;
         info_params.type = type;
         info_params.web_request_type = web_request_type;
-        info_params.is_browser_side_navigation = is_browser_side_navigation;
+        info_params.is_navigation_request = is_navigation_request;
         return info_params;
       };
 
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index edce68d..a9e024c2 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -1318,78 +1318,6 @@
   }
 }
 
-// Tests that worker ref count increments while extension API function is
-// active.
-IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, WorkerRefCount) {
-  // Extensions APIs from SW are only enabled on trunk.
-  ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
-  const Extension* extension = LoadExtensionWithFlags(
-      test_data_dir_.AppendASCII("service_worker/api_worker_ref_count"),
-      kFlagNone);
-  ASSERT_TRUE(extension);
-  ui_test_utils::NavigateToURL(browser(),
-                               extension->GetResourceURL("page.html"));
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-
-  ExtensionTestMessageListener worker_start_listener("WORKER STARTED", false);
-  worker_start_listener.set_failure_message("FAILURE");
-  ASSERT_TRUE(
-      content::ExecuteScript(web_contents, "window.runServiceWorker()"));
-  ASSERT_TRUE(worker_start_listener.WaitUntilSatisfied());
-
-  // Service worker should have no pending requests because it hasn't peformed
-  // any extension API request yet.
-  EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
-
-  ExtensionTestMessageListener worker_listener("CHECK_REF_COUNT", true);
-  worker_listener.set_failure_message("FAILURE");
-  ASSERT_TRUE(content::ExecuteScript(web_contents, "window.testSendMessage()"));
-  ASSERT_TRUE(worker_listener.WaitUntilSatisfied());
-
-  // Service worker should have exactly one pending request because
-  // chrome.test.sendMessage() API call is in-flight.
-  EXPECT_EQ(1u, GetWorkerRefCount(extension->url()));
-
-  // Peform another extension API request while one is ongoing.
-  {
-    ExtensionTestMessageListener listener("CHECK_REF_COUNT", true);
-    listener.set_failure_message("FAILURE");
-    ASSERT_TRUE(
-        content::ExecuteScript(web_contents, "window.testSendMessage()"));
-    ASSERT_TRUE(listener.WaitUntilSatisfied());
-
-    // Service worker currently has two extension API requests in-flight.
-    EXPECT_EQ(2u, GetWorkerRefCount(extension->url()));
-    // Finish executing the nested chrome.test.sendMessage() first.
-    listener.Reply("Hello world");
-  }
-
-  ExtensionTestMessageListener worker_completion_listener("SUCCESS_FROM_WORKER",
-                                                          false);
-  // Finish executing chrome.test.sendMessage().
-  worker_listener.Reply("Hello world");
-  EXPECT_TRUE(worker_completion_listener.WaitUntilSatisfied());
-
-  // The following block makes sure we have received all the IPCs related to
-  // ref-count from the worker.
-  {
-    // The following roundtrip:
-    // browser->extension->worker->extension->browser
-    // will ensure that the worker sent the relevant ref count IPCs.
-    std::string result;
-    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-        web_contents, "window.roundtripToWorker();", &result));
-    EXPECT_EQ("roundtrip-succeeded", result);
-
-    // Ensure IO thread IPCs run.
-    content::RunAllTasksUntilIdle();
-  }
-
-  // The ref count should drop to 0.
-  EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
-}
-
 // This test loads a web page that has an iframe pointing to a
 // chrome-extension:// URL. The URL is listed in the extension's
 // web_accessible_resources. Initially the iframe is served from the extension's
@@ -1724,6 +1652,75 @@
   EXPECT_FALSE(ProcessManager::Get(profile())->HasServiceWorker(*worker_id));
 }
 
+// Tests that worker ref count increments while extension API function is
+// active.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, WorkerRefCount) {
+  ExtensionTestMessageListener worker_start_listener("WORKER STARTED", false);
+
+  const Extension* extension = LoadExtensionWithFlags(
+      test_data_dir_.AppendASCII(
+          "service_worker/worker_based_background/worker_ref_count"),
+      kFlagNone);
+  ASSERT_TRUE(extension);
+  ASSERT_TRUE(worker_start_listener.WaitUntilSatisfied());
+
+  ui_test_utils::NavigateToURL(browser(),
+                               extension->GetResourceURL("page.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  // Service worker should have no pending requests because it hasn't performed
+  // any extension API request yet.
+  EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
+
+  ExtensionTestMessageListener worker_listener("CHECK_REF_COUNT", true);
+  worker_listener.set_failure_message("FAILURE");
+  ASSERT_TRUE(content::ExecuteScript(web_contents, "window.testSendMessage()"));
+  ASSERT_TRUE(worker_listener.WaitUntilSatisfied());
+
+  // Service worker should have exactly one pending request because
+  // chrome.test.sendMessage() API call is in-flight.
+  EXPECT_EQ(1u, GetWorkerRefCount(extension->url()));
+
+  // Perform another extension API request while one is ongoing.
+  {
+    ExtensionTestMessageListener listener("CHECK_REF_COUNT", true);
+    listener.set_failure_message("FAILURE");
+    ASSERT_TRUE(
+        content::ExecuteScript(web_contents, "window.testSendMessage()"));
+    ASSERT_TRUE(listener.WaitUntilSatisfied());
+
+    // Service worker currently has two extension API requests in-flight.
+    EXPECT_EQ(2u, GetWorkerRefCount(extension->url()));
+    // Finish executing the nested chrome.test.sendMessage() first.
+    listener.Reply("Hello world");
+  }
+
+  ExtensionTestMessageListener worker_completion_listener("SUCCESS_FROM_WORKER",
+                                                          false);
+  // Finish executing chrome.test.sendMessage().
+  worker_listener.Reply("Hello world");
+  EXPECT_TRUE(worker_completion_listener.WaitUntilSatisfied());
+
+  // The following block makes sure we have received all the IPCs related to
+  // ref-count from the worker.
+  {
+    // The following roundtrip:
+    // browser->extension->worker->extension->browser
+    // will ensure that the worker sent the relevant ref count IPCs.
+    std::string result;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        web_contents, "window.roundtripToWorker();", &result));
+    EXPECT_EQ("roundtrip-succeeded", result);
+
+    // Ensure IO thread IPCs run.
+    content::RunAllTasksUntilIdle();
+  }
+
+  // The ref count should drop to 0.
+  EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
+}
+
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, UninstallSelf) {
   constexpr char kManifest[] =
       R"({
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
index 917d365..8cca4b5d 100644
--- a/chrome/browser/first_run/first_run.cc
+++ b/chrome/browser/first_run/first_run.cc
@@ -449,10 +449,8 @@
 }
 
 bool IsOnWelcomePage(content::WebContents* contents) {
-  const GURL welcome_page(chrome::kChromeUIWelcomeURL);
-  const GURL welcome_page_win10(chrome::kChromeUIWelcomeWin10URL);
-  const GURL current = contents->GetURL().GetWithEmptyPath();
-  return current == welcome_page || current == welcome_page_win10;
+  return contents->GetURL().GetWithEmptyPath() ==
+         GURL(chrome::kChromeUIWelcomeURL);
 }
 
 void SetShouldDoPersonalDataManagerFirstRun() {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 2c5939e..8c11379 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1196,6 +1196,11 @@
     "expiry_milestone": 78
   },
   {
+    "name": "enable-dbus-and-x11-status-icons",
+    "owners": [ "thestig", "thomasanderson" ],
+    "expiry_milestone": 80
+  },
+  {
     "name": "enable-implicit-root-scroller",
     "owners": [ "bokan", "input-dev" ],
     "expiry_milestone": 75
@@ -2243,6 +2248,11 @@
     "expiry_milestone": 80
   },
   {
+    "name": "mouse-subframe-no-implicit-capture",
+    "owners": [ "eirage", "input-dev" ],
+    "expiry_milestone": 78
+  },
+  {
     "name": "native-file-system-api",
     "owners": [ "mek", "pwnall" ],
     "expiry_milestone":  80
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 05aca60..63cf00f 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1204,6 +1204,11 @@
 const char kMobileIdentityConsistencyDescription[] =
     "Enables stronger identity consistency on mobile";
 
+const char kMouseSubframeNoImplicitCaptureName[] =
+    "Disable mouse implicit capture for iframe";
+const char kMouseSubframeNoImplicitCaptureDescription[] =
+    "When enable, mouse down does not implicit capture for iframe.";
+
 const char kNativeFileSystemAPIName[] = "Native File System API";
 const char kNativeFileSystemAPIDescription[] =
     "Enables the experimental Native File System API, giving websites access "
@@ -3470,6 +3475,17 @@
 
 #endif  // #if defined(WEBRTC_USE_PIPEWIRE)
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
+const char kEnableDbusAndX11StatusIconsName[] =
+    "Enable DBus and X11 status icons";
+const char kEnableDbusAndX11StatusIconsDescription[] =
+    "If enabled, uses Chromium's StatusNotifierItem (DBus) and system tray "
+    "(X11) implementations of status icons.  Otherwise, uses libappindicator's "
+    "and GTK's implementaitons.";
+
+#endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
 const char kAvoidFlashBetweenNavigationName[] =
     "Enable flash avoidance between same-origin navigations";
 const char kAvoidFlahsBetweenNavigationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b3a31ca..a78f28f 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -732,6 +732,9 @@
 extern const char kMobileIdentityConsistencyName[];
 extern const char kMobileIdentityConsistencyDescription[];
 
+extern const char kMouseSubframeNoImplicitCaptureName[];
+extern const char kMouseSubframeNoImplicitCaptureDescription[];
+
 extern const char kNativeFileSystemAPIName[];
 extern const char kNativeFileSystemAPIDescription[];
 
@@ -2114,6 +2117,13 @@
 
 #endif  // #if defined(WEBRTC_USE_PIPEWIRE)
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
+extern const char kEnableDbusAndX11StatusIconsName[];
+extern const char kEnableDbusAndX11StatusIconsDescription[];
+
+#endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
+
 // ============================================================================
 // Don't just add flags to the end, put them in the right section in
 // alphabetical order. See top instructions for more.
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h
index d80a29a..e6ec706 100644
--- a/chrome/browser/metrics/chrome_metrics_service_accessor.h
+++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -54,7 +54,7 @@
 }
 
 namespace nux {
-bool IsNuxOnboardingEnabled(Profile* profile);
+void JoinOnboardingGroup(Profile* profile);
 }
 
 namespace safe_browsing {
@@ -115,7 +115,7 @@
   friend class safe_browsing::SafeBrowsingUIManager;
   friend class ChromeMetricsServiceClient;
   friend class ChromePasswordManagerClient;
-  friend bool nux::IsNuxOnboardingEnabled(Profile* profile);
+  friend void nux::JoinOnboardingGroup(Profile* profile);
   friend class NavigationMetricsRecorder;
 
   // Testing related friends.
diff --git a/chrome/browser/notifications/scheduler/display_agent_android.cc b/chrome/browser/notifications/scheduler/display_agent_android.cc
index 01c8288..566ec98 100644
--- a/chrome/browser/notifications/scheduler/display_agent_android.cc
+++ b/chrome/browser/notifications/scheduler/display_agent_android.cc
@@ -60,20 +60,20 @@
 DisplayAgentAndroid::~DisplayAgentAndroid() = default;
 
 void DisplayAgentAndroid::ShowNotification(
-    std::unique_ptr<notifications::DisplayData> display_data) {
+    std::unique_ptr<notifications::NotificationData> notification_data) {
   // TODO(xingliu): Refactor and hook to NotificationDisplayService.
-  DCHECK(display_data);
+  DCHECK(notification_data);
   JNIEnv* env = base::android::AttachCurrentThread();
-  DCHECK(!display_data->icon.empty());
-  DCHECK(!display_data->notification_data.id.empty());
-  DCHECK(!display_data->notification_data.title.empty());
-  DCHECK(!display_data->notification_data.message.empty());
+  DCHECK(!notification_data->icon.empty());
+  DCHECK(!notification_data->id.empty());
+  DCHECK(!notification_data->title.empty());
+  DCHECK(!notification_data->message.empty());
 
-  auto java_display_data = Java_DisplayAgent_Constructor(
-      env, ConvertUTF8ToJavaString(env, display_data->notification_data.id),
-      ConvertUTF8ToJavaString(env, display_data->notification_data.title),
-      ConvertUTF8ToJavaString(env, display_data->notification_data.message),
-      gfx::ConvertToJavaBitmap(&display_data->icon));
+  auto java_notification_data = Java_DisplayAgent_Constructor(
+      env, ConvertUTF8ToJavaString(env, notification_data->id),
+      ConvertUTF8ToJavaString(env, notification_data->title),
+      ConvertUTF8ToJavaString(env, notification_data->message),
+      gfx::ConvertToJavaBitmap(&notification_data->icon));
 
-  Java_DisplayAgent_showNotification(env, java_display_data);
+  Java_DisplayAgent_showNotification(env, java_notification_data);
 }
diff --git a/chrome/browser/notifications/scheduler/display_agent_android.h b/chrome/browser/notifications/scheduler/display_agent_android.h
index 2fba2a8..40121a2d 100644
--- a/chrome/browser/notifications/scheduler/display_agent_android.h
+++ b/chrome/browser/notifications/scheduler/display_agent_android.h
@@ -16,8 +16,8 @@
   ~DisplayAgentAndroid() override;
 
  private:
-  void ShowNotification(
-      std::unique_ptr<notifications::DisplayData> display_data) override;
+  void ShowNotification(std::unique_ptr<notifications::NotificationData>
+                            notification_data) override;
 
   DISALLOW_COPY_AND_ASSIGN(DisplayAgentAndroid);
 };
diff --git a/chrome/browser/notifications/scheduler/internal/BUILD.gn b/chrome/browser/notifications/scheduler/internal/BUILD.gn
index 7535011..ff10cac 100644
--- a/chrome/browser/notifications/scheduler/internal/BUILD.gn
+++ b/chrome/browser/notifications/scheduler/internal/BUILD.gn
@@ -92,6 +92,7 @@
     "//chrome/browser/notifications/scheduler/public",
     "//chrome/browser/notifications/scheduler/test:test_lib",
     "//components/leveldb_proto:test_support",
+    "//skia",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.cc b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.cc
index 43d56b0..022dc63 100644
--- a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.cc
+++ b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.cc
@@ -35,13 +35,15 @@
                                    std::move(params)));
 }
 
-void InitAwareNotificationScheduler::OnStartTask() {
+void InitAwareNotificationScheduler::OnStartTask(
+    TaskFinishedCallback callback) {
   if (IsReady()) {
-    impl_->OnStartTask();
+    impl_->OnStartTask(std::move(callback));
     return;
   }
   MaybeCacheClosure(base::BindOnce(&InitAwareNotificationScheduler::OnStartTask,
-                                   weak_ptr_factory_.GetWeakPtr()));
+                                   weak_ptr_factory_.GetWeakPtr(),
+                                   std::move(callback)));
 }
 
 void InitAwareNotificationScheduler::OnStopTask() {
diff --git a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h
index 7c9613a..5e8e047 100644
--- a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h
+++ b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h
@@ -34,7 +34,7 @@
   void Init(InitCallback init_callback) override;
   void Schedule(
       std::unique_ptr<NotificationParams> notification_params) override;
-  void OnStartTask() override;
+  void OnStartTask(TaskFinishedCallback callback) override;
   void OnStopTask() override;
   void OnClick(const std::string& notification_id) override;
   void OnActionClick(const std::string& notification_id,
diff --git a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler_unittest.cc b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler_unittest.cc
index 8da1a75..0d97a766 100644
--- a/chrome/browser/notifications/scheduler/internal/init_aware_scheduler_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/init_aware_scheduler_unittest.cc
@@ -27,7 +27,7 @@
 
   MOCK_METHOD1(Init, void(InitCallback));
   MOCK_METHOD1(Schedule, void(std::unique_ptr<NotificationParams>));
-  MOCK_METHOD0(OnStartTask, void());
+  MOCK_METHOD1(OnStartTask, void(TaskFinishedCallback));
   MOCK_METHOD0(OnStopTask, void());
   MOCK_METHOD1(OnClick, void(const std::string&));
   MOCK_METHOD2(OnActionClick, void(const std::string&, ActionButtonType));
diff --git a/chrome/browser/notifications/scheduler/internal/notification_entry.cc b/chrome/browser/notifications/scheduler/internal/notification_entry.cc
index f793058..c8505e4 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_entry.cc
+++ b/chrome/browser/notifications/scheduler/internal/notification_entry.cc
@@ -21,6 +21,7 @@
   return type == other.type && guid == other.guid &&
          create_time == other.create_time &&
          notification_data == other.notification_data &&
+         icon_uuid == other.icon_uuid &&
          schedule_params == other.schedule_params;
 }
 
diff --git a/chrome/browser/notifications/scheduler/internal/notification_entry.h b/chrome/browser/notifications/scheduler/internal/notification_entry.h
index db27e00a..5ea0c83 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_entry.h
+++ b/chrome/browser/notifications/scheduler/internal/notification_entry.h
@@ -32,9 +32,15 @@
   // Creation timestamp.
   base::Time create_time;
 
-  // Contains information to construct the notification.
+  // Contains information to construct the notification. The icon data is
+  // persisted to disk and only loads into memory before the notification is
+  // shown.
   NotificationData notification_data;
 
+  // The unique identifier of the icon, which must be loaded asynchronously into
+  // memory.
+  std::string icon_uuid;
+
   // Scheduling details.
   ScheduleParams schedule_params;
 };
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
index 1c5dce7..f114c8e 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
+++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
@@ -32,8 +32,9 @@
   return this;
 }
 
-void NotificationScheduleServiceImpl::OnStartTask() {
-  scheduler_->OnStartTask();
+void NotificationScheduleServiceImpl::OnStartTask(
+    TaskFinishedCallback callback) {
+  scheduler_->OnStartTask(std::move(callback));
 }
 
 void NotificationScheduleServiceImpl::OnStopTask() {
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
index 88dbc10b..210e4f9 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
+++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
@@ -35,7 +35,7 @@
   UserActionHandler* GetUserActionHandler() override;
 
   // NotificationBackgroundTaskScheduler::Handler implementation.
-  void OnStartTask() override;
+  void OnStartTask(TaskFinishedCallback callback) override;
   void OnStopTask() override;
 
   // UserActionHandler implementation.
diff --git a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc
index 3850b2f..cbdb641 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc
+++ b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc
@@ -138,7 +138,7 @@
   }
 
   // NotificationBackgroundTaskScheduler::Handler implementation.
-  void OnStartTask() override {
+  void OnStartTask(TaskFinishedCallback callback) override {
     // Updates the impression data to compute daily notification shown budget.
     context_->impression_tracker()->AnalyzeImpressionHistory();
 
@@ -147,6 +147,8 @@
 
     // Schedule the next background task based on scheduled notifications.
     ScheduleBackgroundTask();
+
+    std::move(callback).Run(false /*need_reschedule*/);
   }
 
   void OnStopTask() override { ScheduleBackgroundTask(); }
@@ -154,6 +156,10 @@
   // ScheduledNotificationManager::Delegate implementation.
   void DisplayNotification(
       std::unique_ptr<NotificationEntry> notification) override {
+    if (!notification) {
+      DLOG(ERROR) << "Notification entry is null";
+      return;
+    }
     // TODO(xingliu): Inform the clients and show the notification.
     context_->impression_tracker()->AddImpression(notification->type,
                                                   notification->guid);
diff --git a/chrome/browser/notifications/scheduler/internal/proto_conversion.cc b/chrome/browser/notifications/scheduler/internal/proto_conversion.cc
index f0c4342..4d0df4e 100644
--- a/chrome/browser/notifications/scheduler/internal/proto_conversion.cc
+++ b/chrome/browser/notifications/scheduler/internal/proto_conversion.cc
@@ -176,7 +176,6 @@
   proto->set_id(notification_data->id);
   proto->set_title(notification_data->title);
   proto->set_message(notification_data->message);
-  proto->set_icon_uuid(notification_data->icon_uuid);
   proto->set_url(notification_data->url);
 }
 
@@ -186,7 +185,6 @@
   notification_data->id = proto->id();
   notification_data->title = proto->title();
   notification_data->message = proto->message();
-  notification_data->icon_uuid = proto->icon_uuid();
   notification_data->url = proto->url();
 }
 
@@ -313,6 +311,7 @@
   proto->set_create_time(TimeToMilliseconds(entry->create_time));
   auto* proto_notification_data = proto->mutable_notification_data();
   NotificationDataToProto(&entry->notification_data, proto_notification_data);
+  proto_notification_data->set_icon_uuid(entry->icon_uuid);
   auto* proto_schedule_params = proto->mutable_schedule_params();
   ScheduleParamsToProto(&entry->schedule_params, proto_schedule_params);
 }
@@ -324,6 +323,7 @@
   entry->create_time = MillisecondsToTime(proto->create_time());
   NotificationDataFromProto(proto->mutable_notification_data(),
                             &entry->notification_data);
+  entry->icon_uuid = proto->mutable_notification_data()->icon_uuid();
   ScheduleParamsFromProto(proto->mutable_schedule_params(),
                           &entry->schedule_params);
 }
diff --git a/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc b/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc
index 53a5e56..8bda062 100644
--- a/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc
@@ -172,7 +172,7 @@
   entry.notification_data.id = kGuid;
   entry.notification_data.title = "title";
   entry.notification_data.message = "message";
-  entry.notification_data.icon_uuid = "icon_uuid";
+  entry.icon_uuid = "icon_uuid";
   entry.notification_data.url = "url";
   TestNotificationEntryConversion(&entry);
 
diff --git a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
index 2cec11e..e6b726b1 100644
--- a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
+++ b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
@@ -78,9 +78,8 @@
       if (it->second.count(guid))
         entry = std::move(it->second[guid]);
     }
-    // TODO(hesen): Inform delegate failure of finding the data.
-    if (!entry)
-      return;
+
+    DCHECK(entry);
 
     notifications_[entry->type].erase(entry->guid);
     if (notifications_[entry->type].empty())
diff --git a/chrome/browser/notifications/scheduler/internal/webui_client.cc b/chrome/browser/notifications/scheduler/internal/webui_client.cc
index a511d7a..5cc401e 100644
--- a/chrome/browser/notifications/scheduler/internal/webui_client.cc
+++ b/chrome/browser/notifications/scheduler/internal/webui_client.cc
@@ -12,8 +12,9 @@
 
 WebUIClient::~WebUIClient() = default;
 
-void WebUIClient::ShowNotification(std::unique_ptr<DisplayData> display_data,
-                                   DisplayCallback callback) {
+void WebUIClient::ShowNotification(
+    std::unique_ptr<NotificationData> notification_data,
+    NotificationDataCallback callback) {
   NOTIMPLEMENTED();
 }
 
diff --git a/chrome/browser/notifications/scheduler/internal/webui_client.h b/chrome/browser/notifications/scheduler/internal/webui_client.h
index bf291f0e..a5936e5e 100644
--- a/chrome/browser/notifications/scheduler/internal/webui_client.h
+++ b/chrome/browser/notifications/scheduler/internal/webui_client.h
@@ -21,8 +21,8 @@
 
  private:
   // NotificationSchedulerClient implementation.
-  void ShowNotification(std::unique_ptr<DisplayData> display_data,
-                        DisplayCallback callback) override;
+  void ShowNotification(std::unique_ptr<NotificationData> notification_data,
+                        NotificationDataCallback callback) override;
   void OnSchedulerInitialized(bool success,
                               std::set<std::string> guids) override;
   void OnUserAction(UserActionType action_type,
diff --git a/chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.cc b/chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.cc
index a6b0595..11f2f8c 100644
--- a/chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.cc
+++ b/chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.h"
 
+#include "base/android/callback_android.h"
 #include "base/android/jni_android.h"
 #include "base/logging.h"
 #include "chrome/android/chrome_jni_headers/NotificationSchedulerTask_jni.h"
@@ -19,12 +20,14 @@
     const base::android::JavaParamRef<jobject>& j_caller,
     const base::android::JavaParamRef<jobject>& j_profile,
     const base::android::JavaParamRef<jobject>& j_callback) {
-  // TODO(Hesen): Pass task finish callback to the scheduler.
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
   auto* service =
       NotificationScheduleServiceFactory::GetForBrowserContext(profile);
   auto* handler = service->GetBackgroundTaskSchedulerHandler();
-  handler->OnStartTask();
+  auto callback =
+      base::BindOnce(&base::android::RunBooleanCallbackAndroid,
+                     base::android::ScopedJavaGlobalRef<jobject>(j_callback));
+  handler->OnStartTask(std::move(callback));
 }
 
 // static
diff --git a/chrome/browser/notifications/scheduler/public/display_agent.cc b/chrome/browser/notifications/scheduler/public/display_agent.cc
index 1f8fcf6..be1306e 100644
--- a/chrome/browser/notifications/scheduler/public/display_agent.cc
+++ b/chrome/browser/notifications/scheduler/public/display_agent.cc
@@ -15,7 +15,8 @@
   ~DisplayAgentDefault() override = default;
 
  private:
-  void ShowNotification(std::unique_ptr<DisplayData> display_data) override {
+  void ShowNotification(
+      std::unique_ptr<NotificationData> notification_data) override {
     NOTIMPLEMENTED();
   }
 
diff --git a/chrome/browser/notifications/scheduler/public/display_agent.h b/chrome/browser/notifications/scheduler/public/display_agent.h
index 4e9bae4c..c309b485 100644
--- a/chrome/browser/notifications/scheduler/public/display_agent.h
+++ b/chrome/browser/notifications/scheduler/public/display_agent.h
@@ -13,11 +13,6 @@
 
 namespace notifications {
 
-struct DisplayData {
-  NotificationData notification_data;
-  SkBitmap icon;
-};
-
 // Does actual work to show notification in the UI surface.
 class DisplayAgent {
  public:
@@ -25,7 +20,8 @@
   static std::unique_ptr<DisplayAgent> Create();
 
   // Shows the notification in UI.
-  virtual void ShowNotification(std::unique_ptr<DisplayData> display_data) = 0;
+  virtual void ShowNotification(
+      std::unique_ptr<NotificationData> notification_data) = 0;
 
   virtual ~DisplayAgent() = default;
 
diff --git a/chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h b/chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h
index 66911063..22c55a1 100644
--- a/chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h
+++ b/chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h
@@ -18,8 +18,9 @@
   // Interface used to handle background task events.
   class Handler {
    public:
+    using TaskFinishedCallback = base::OnceCallback<void(bool)>;
     // Called when the background task is started.
-    virtual void OnStartTask() = 0;
+    virtual void OnStartTask(TaskFinishedCallback callback) = 0;
 
     // Called when the background task is stopped by the OS when it wants to
     // reallocate resources, our task is not finished yet in this case. The
diff --git a/chrome/browser/notifications/scheduler/public/notification_data.cc b/chrome/browser/notifications/scheduler/public/notification_data.cc
index ec6b9283..fa3e04c 100644
--- a/chrome/browser/notifications/scheduler/public/notification_data.cc
+++ b/chrome/browser/notifications/scheduler/public/notification_data.cc
@@ -12,7 +12,7 @@
 
 bool NotificationData::operator==(const NotificationData& other) const {
   return id == other.id && title == other.title && message == other.message &&
-         icon_uuid == other.icon_uuid && url == other.url;
+         url == other.url;
 }
 
 NotificationData::~NotificationData() = default;
diff --git a/chrome/browser/notifications/scheduler/public/notification_data.h b/chrome/browser/notifications/scheduler/public/notification_data.h
index 2bd89848..e4d93cc 100644
--- a/chrome/browser/notifications/scheduler/public/notification_data.h
+++ b/chrome/browser/notifications/scheduler/public/notification_data.h
@@ -7,6 +7,8 @@
 
 #include <string>
 
+#include "third_party/skia/include/core/SkBitmap.h"
+
 namespace notifications {
 
 // Contains data used to display a scheduled notification. All fields will be
@@ -30,9 +32,8 @@
   // The body text of the notification.
   std::string message;
 
-  // The unique identifier of the icon, which must be loaded asynchronously into
-  // memory.
-  std::string icon_uuid;
+  // The bitmap for the small icon.
+  SkBitmap icon;
 
   // URL of the web site responsible for showing the notification.
   std::string url;
diff --git a/chrome/browser/notifications/scheduler/public/notification_scheduler_client.h b/chrome/browser/notifications/scheduler/public/notification_scheduler_client.h
index c9888336..a653d0de 100644
--- a/chrome/browser/notifications/scheduler/public/notification_scheduler_client.h
+++ b/chrome/browser/notifications/scheduler/public/notification_scheduler_client.h
@@ -22,11 +22,6 @@
 // The client interface to receive events from notification scheduler.
 class NotificationSchedulerClient {
  public:
-  struct DisplayData {
-    NotificationData notification_data;
-    SkBitmap icon;
-  };
-
   // Defines user actions type.
   enum class UserActionType {
     // The user clicks on the notification body.
@@ -46,17 +41,18 @@
     ActionButtonType type = ActionButtonType::kUnknownAction;
   };
 
-  using DisplayCallback =
-      base::OnceCallback<void(std::unique_ptr<DisplayData>)>;
+  using NotificationDataCallback =
+      base::OnceCallback<void(std::unique_ptr<NotificationData>)>;
 
   NotificationSchedulerClient() = default;
   virtual ~NotificationSchedulerClient() = default;
 
   // Called when the notification should be displayed to the user. The clients
-  // can overwrite data in |display_data| and return the updated data in
+  // can overwrite data in |notification_data| and return the updated data in
   // |callback|.
-  virtual void ShowNotification(std::unique_ptr<DisplayData> display_data,
-                                DisplayCallback callback) = 0;
+  virtual void ShowNotification(
+      std::unique_ptr<NotificationData> notification_data,
+      NotificationDataCallback callback) = 0;
 
   // Called when scheduler is initialized, number of notification scheduled for
   // this type is reported if initialization succeeded.
diff --git a/chrome/browser/notifications/scheduler/test/BUILD.gn b/chrome/browser/notifications/scheduler/test/BUILD.gn
index 38c2aaf..51babb20 100644
--- a/chrome/browser/notifications/scheduler/test/BUILD.gn
+++ b/chrome/browser/notifications/scheduler/test/BUILD.gn
@@ -23,5 +23,6 @@
     "//base",
     "//chrome/browser/notifications/scheduler/internal:lib",
     "//chrome/browser/notifications/scheduler/public",
+    "//skia",
   ]
 }
diff --git a/chrome/browser/notifications/scheduler/test/test_utils.cc b/chrome/browser/notifications/scheduler/test/test_utils.cc
index d28fbd8..8ffa6b7 100644
--- a/chrome/browser/notifications/scheduler/test/test_utils.cc
+++ b/chrome/browser/notifications/scheduler/test/test_utils.cc
@@ -83,7 +83,7 @@
   std::ostringstream stream;
   stream << " Notification Data: \n id:" << data->id
          << " \n title:" << data->title << "\n message:" << data->message
-         << " \n icon_id:" << data->icon_uuid << " \n url:" << data->url;
+         << " \n url:" << data->url;
   return stream.str();
 }
 
@@ -94,6 +94,7 @@
          << " \n guid: " << entry->guid << "\n create_time: "
          << entry->create_time.ToDeltaSinceWindowsEpoch().InMicroseconds()
          << " \n notification_data:" << DebugString(&entry->notification_data)
+         << " \n icon_id:" << entry->icon_uuid
          << " \n schedule params: priority:"
          << static_cast<int>(entry->schedule_params.priority);
   return stream.str();
diff --git a/chrome/browser/offline_pages/android/downloads/offline_page_share_helper.cc b/chrome/browser/offline_pages/android/downloads/offline_page_share_helper.cc
index 9cfb952..60a5882 100644
--- a/chrome/browser/offline_pages/android/downloads/offline_page_share_helper.cc
+++ b/chrome/browser/offline_pages/android/downloads/offline_page_share_helper.cc
@@ -109,9 +109,8 @@
     return;
   // Publish the page.
   model_->PublishInternalArchive(
-      pages[0], std::make_unique<OfflinePageMHTMLArchiver>(),
-      base::BindOnce(&OfflinePageShareHelper::OnPagePublished,
-                     weak_ptr_factory_.GetWeakPtr()));
+      pages[0], base::BindOnce(&OfflinePageShareHelper::OnPagePublished,
+                               weak_ptr_factory_.GetWeakPtr()));
 }
 
 void OfflinePageShareHelper::OnPagePublished(const base::FilePath& file_path,
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.cc b/chrome/browser/offline_pages/android/offline_page_bridge.cc
index 77d3c8f..6a3d704 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.cc
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.cc
@@ -758,9 +758,8 @@
     return;
   }
 
-  std::unique_ptr<OfflinePageArchiver> archiver(new OfflinePageMHTMLArchiver());
   offline_page_model->PublishInternalArchive(
-      *offline_page, std::move(archiver),
+      *offline_page,
       base::BindOnce(&PublishPageDone, std::move(j_callback_obj)));
 }
 
diff --git a/chrome/browser/offline_pages/android/offline_page_model_factory.cc b/chrome/browser/offline_pages/android/offline_page_model_factory.cc
index c6fd30d..cf5a2d3 100644
--- a/chrome/browser/offline_pages/android/offline_page_model_factory.cc
+++ b/chrome/browser/offline_pages/android/offline_page_model_factory.cc
@@ -72,19 +72,22 @@
   }
 
   ProfileKey* profile_key = ProfileKey::FromSimpleFactoryKey(key);
-  std::unique_ptr<ArchiveManager> archive_manager(new DownloadArchiveManager(
+  auto archive_manager = std::make_unique<DownloadArchiveManager>(
       temporary_archives_dir, persistent_archives_dir,
       DownloadPrefs::GetDefaultDownloadDirectory(), background_task_runner,
-      profile_key->GetPrefs()));
+      profile_key->GetPrefs());
   auto clock = std::make_unique<base::DefaultClock>();
 
-  std::unique_ptr<SystemDownloadManager> download_manager(
-      new android::OfflinePagesDownloadManagerBridge());
+  auto download_manager =
+      std::make_unique<android::OfflinePagesDownloadManagerBridge>();
+  auto publisher = std::make_unique<OfflinePageArchivePublisher>(
+      archive_manager.get(), download_manager.get());
 
   std::unique_ptr<OfflinePageModelTaskified> model =
       std::make_unique<OfflinePageModelTaskified>(
           std::move(metadata_store), std::move(archive_manager),
-          std::move(download_manager), background_task_runner);
+          std::move(download_manager), std::move(publisher),
+          background_task_runner);
 
   CctOriginObserver::AttachToOfflinePageModel(model.get());
 
diff --git a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
index 00b370a2..a690241 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
@@ -37,6 +37,8 @@
 #include "components/offline_pages/core/client_namespace_constants.h"
 #include "components/offline_pages/core/model/offline_page_model_taskified.h"
 #include "components/offline_pages/core/offline_page_metadata_store.h"
+#include "components/offline_pages/core/offline_page_test_archive_publisher.h"
+#include "components/offline_pages/core/offline_page_test_archiver.h"
 #include "components/offline_pages/core/request_header/offline_page_navigation_ui_data.h"
 #include "components/offline_pages/core/stub_system_download_manager.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -146,53 +148,6 @@
   DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier);
 };
 
-// TODO(jianli, carlosk): This should be removed in favor of using with
-// OfflinePageTestArchiver.
-class TestOfflinePageArchiver : public OfflinePageArchiver {
- public:
-  TestOfflinePageArchiver(const GURL& url,
-                          const base::FilePath& archive_file_path,
-                          int archive_file_size,
-                          const std::string& digest)
-      : url_(url),
-        archive_file_path_(archive_file_path),
-        archive_file_size_(archive_file_size),
-        digest_(digest) {}
-  ~TestOfflinePageArchiver() override {}
-
-  void CreateArchive(const base::FilePath& archives_dir,
-                     const CreateArchiveParams& create_archive_params,
-                     content::WebContents* web_contents,
-                     CreateArchiveCallback callback) override {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(callback),
-                                  ArchiverResult::SUCCESSFULLY_CREATED, url_,
-                                  archive_file_path_, base::string16(),
-                                  archive_file_size_, digest_));
-  }
-
-  void PublishArchive(
-      const OfflinePageItem& offline_page,
-      const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
-      const base::FilePath& new_file_path,
-      SystemDownloadManager* download_manager,
-      PublishArchiveDoneCallback publish_done_callback) override {
-    publish_archive_result_.move_result = SavePageResult::SUCCESS;
-    publish_archive_result_.new_file_path = offline_page.file_path;
-    publish_archive_result_.download_id = 0;
-    std::move(publish_done_callback).Run(offline_page, publish_archive_result_);
-  }
-
- private:
-  const GURL url_;
-  const base::FilePath archive_file_path_;
-  const int archive_file_size_;
-  const std::string digest_;
-  PublishArchiveResult publish_archive_result_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestOfflinePageArchiver);
-};
-
 class TestURLLoaderClient : public network::mojom::URLLoaderClient {
  public:
   class Observer {
@@ -900,8 +855,10 @@
   static int item_counter = 0;
   ++item_counter;
 
-  std::unique_ptr<TestOfflinePageArchiver> archiver(
-      new TestOfflinePageArchiver(url, file_path, file_size, digest));
+  auto archiver = std::make_unique<OfflinePageTestArchiver>(
+      nullptr, url, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED,
+      base::string16(), file_size, digest, base::ThreadTaskRunnerHandle::Get());
+  archiver->set_filename(file_path);
 
   async_operation_completed_ = false;
   OfflinePageModel::SavePageParams save_page_params;
@@ -928,18 +885,23 @@
       key->GetPath().Append(chrome::kOfflinePageMetadataDirname);
   std::unique_ptr<OfflinePageMetadataStore> metadata_store(
       new OfflinePageMetadataStore(task_runner, store_path));
-  std::unique_ptr<SystemDownloadManager> download_manager(
-      new StubSystemDownloadManager(kDownloadId, true));
+  auto download_manager =
+      std::make_unique<StubSystemDownloadManager>(kDownloadId, true);
 
   // Since we're not saving page into temporary dir, it's set the same as the
   // private dir.
-  std::unique_ptr<ArchiveManager> archive_manager(
-      new ArchiveManager(private_archives_dir_, private_archives_dir_,
-                         public_archives_dir_, task_runner));
+  auto archive_manager = std::make_unique<ArchiveManager>(
+      private_archives_dir_, private_archives_dir_, public_archives_dir_,
+      task_runner);
+
+  auto archive_publisher = std::make_unique<OfflinePageTestArchivePublisher>(
+      archive_manager.get(), download_manager.get());
+  // TODO(iwells): Figure out how to make use_verbatim_archive_path go away.
+  archive_publisher->use_verbatim_archive_path(true);
 
   return std::unique_ptr<KeyedService>(new OfflinePageModelTaskified(
       std::move(metadata_store), std::move(archive_manager),
-      std::move(download_manager), task_runner));
+      std::move(download_manager), std::move(archive_publisher), task_runner));
 }
 
 // static
diff --git a/chrome/browser/offline_pages/test_offline_page_model_builder.cc b/chrome/browser/offline_pages/test_offline_page_model_builder.cc
index 9919d938..5003dde 100644
--- a/chrome/browser/offline_pages/test_offline_page_model_builder.cc
+++ b/chrome/browser/offline_pages/test_offline_page_model_builder.cc
@@ -16,6 +16,7 @@
 #include "components/offline_pages/core/archive_manager.h"
 #include "components/offline_pages/core/model/offline_page_model_taskified.h"
 #include "components/offline_pages/core/offline_page_metadata_store.h"
+#include "components/offline_pages/core/offline_page_test_archive_publisher.h"
 #include "components/offline_pages/core/stub_system_download_manager.h"
 
 namespace {
@@ -43,15 +44,18 @@
     temporary_archives_dir =
         temporary_archives_dir.Append(chrome::kOfflinePageArchivesDirname);
   }
-  std::unique_ptr<ArchiveManager> archive_manager(
-      new ArchiveManager(temporary_archives_dir, private_archives_dir,
-                         public_archives_dir, task_runner));
-  std::unique_ptr<SystemDownloadManager> stub_download_manager(
-      new StubSystemDownloadManager(kDownloadId, true));
+  auto archive_manager = std::make_unique<ArchiveManager>(
+      temporary_archives_dir, private_archives_dir, public_archives_dir,
+      task_runner);
+  auto stub_download_manager =
+      std::make_unique<StubSystemDownloadManager>(kDownloadId, true);
+
+  auto publisher = std::make_unique<OfflinePageTestArchivePublisher>(
+      archive_manager.get(), stub_download_manager.get());
 
   return std::unique_ptr<KeyedService>(new OfflinePageModelTaskified(
       std::move(metadata_store), std::move(archive_manager),
-      std::move(stub_download_manager), task_runner));
+      std::move(stub_download_manager), std::move(publisher), task_runner));
 }
 
 }  // namespace offline_pages
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index e6c1886f..a7f67aa 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -100,6 +100,7 @@
 #include "chrome/browser/ui/search/local_ntp_test_utils.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
+#include "chrome/browser/ui/webui/welcome/nux_helper.h"
 #include "chrome/browser/usb/usb_chooser_context.h"
 #include "chrome/browser/usb/usb_chooser_context_factory.h"
 #include "chrome/common/chrome_constants.h"
@@ -6732,7 +6733,10 @@
     : public PolicyTest,
       public testing::WithParamInterface<BooleanPolicy> {
  protected:
-  PromotionalTabsEnabledPolicyTest() = default;
+  PromotionalTabsEnabledPolicyTest() {
+    scoped_feature_list_.InitWithFeatures({nux::kNuxOnboardingForceEnabled},
+                                          {});
+  }
   ~PromotionalTabsEnabledPolicyTest() = default;
 
   void SetUp() override {
@@ -6772,6 +6776,8 @@
   }
 
  private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
   DISALLOW_COPY_AND_ASSIGN(PromotionalTabsEnabledPolicyTest);
 };
 
diff --git a/chrome/browser/printing/cloud_print/cloud_print_proxy_service.cc b/chrome/browser/printing/cloud_print/cloud_print_proxy_service.cc
index 5cbacd4..30be1e0 100644
--- a/chrome/browser/printing/cloud_print/cloud_print_proxy_service.cc
+++ b/chrome/browser/printing/cloud_print/cloud_print_proxy_service.cc
@@ -81,7 +81,7 @@
   pref_change_registrar_.Init(profile_->GetPrefs());
   pref_change_registrar_.Add(
       prefs::kCloudPrintProxyEnabled,
-      base::Bind(
+      base::BindRepeating(
           base::IgnoreResult(
               &CloudPrintProxyService::ApplyCloudPrintConnectorPolicy),
           base::Unretained(this)));
@@ -90,8 +90,8 @@
 void CloudPrintProxyService::RefreshStatusFromService() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   InvokeServiceTask(
-      base::Bind(&CloudPrintProxyService::RefreshCloudPrintProxyStatus,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&CloudPrintProxyService::RefreshCloudPrintProxyStatus,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void CloudPrintProxyService::EnableForUserWithRobot(
@@ -117,8 +117,8 @@
                             ServiceProcessControl::SERVICE_EVENT_DISABLE,
                             ServiceProcessControl::SERVICE_EVENT_MAX);
   InvokeServiceTask(
-      base::Bind(&CloudPrintProxyService::DisableCloudPrintProxy,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&CloudPrintProxyService::DisableCloudPrintProxy,
+                     weak_factory_.GetWeakPtr()));
 }
 
 bool CloudPrintProxyService::ApplyCloudPrintConnectorPolicy() {
diff --git a/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc b/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc
index c0377cc3..9c68968 100644
--- a/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc
+++ b/chrome/browser/printing/cloud_print/cloud_print_proxy_service_unittest.cc
@@ -151,8 +151,9 @@
         &process_control_.remote_interfaces());
     test_api.SetBinderForName(
         "cloud_print.mojom.CloudPrint",
-        base::Bind(&TestCloudPrintProxyService::HandleCloudPrintProxyRequest,
-                   base::Unretained(this)));
+        base::BindRepeating(
+            &TestCloudPrintProxyService::HandleCloudPrintProxyRequest,
+            base::Unretained(this)));
     service_manager::mojom::InterfaceProviderPtr handle;
     mojo::MakeRequest(&handle);
     process_control_.SetMojoHandle(std::move(handle));
diff --git a/chrome/browser/printing/cloud_print/privet_confirm_api_flow.cc b/chrome/browser/printing/cloud_print/privet_confirm_api_flow.cc
index b877102..8485c06 100644
--- a/chrome/browser/printing/cloud_print/privet_confirm_api_flow.cc
+++ b/chrome/browser/printing/cloud_print/privet_confirm_api_flow.cc
@@ -14,28 +14,31 @@
 
 namespace cloud_print {
 
-PrivetConfirmApiCallFlow::PrivetConfirmApiCallFlow(
-    const std::string& token,
-    const ResponseCallback& callback)
-    : callback_(callback), token_(token) {
-}
+PrivetConfirmApiCallFlow::PrivetConfirmApiCallFlow(const std::string& token,
+                                                   ResponseCallback callback)
+    : callback_(std::move(callback)), token_(token) {}
 
 PrivetConfirmApiCallFlow::~PrivetConfirmApiCallFlow() {
 }
 
 void PrivetConfirmApiCallFlow::OnGCDApiFlowError(GCDApiFlow::Status status) {
-  callback_.Run(status);
+  if (callback_)
+    std::move(callback_).Run(status);
 }
 
 void PrivetConfirmApiCallFlow::OnGCDApiFlowComplete(
     const base::DictionaryValue& value) {
+  if (!callback_)
+    return;
+
   bool success = false;
   if (!value.GetBoolean(cloud_print::kSuccessValue, &success)) {
-    callback_.Run(GCDApiFlow::ERROR_MALFORMED_RESPONSE);
+    std::move(callback_).Run(GCDApiFlow::ERROR_MALFORMED_RESPONSE);
     return;
   }
 
-  callback_.Run(success ? GCDApiFlow::SUCCESS : GCDApiFlow::ERROR_FROM_SERVER);
+  std::move(callback_).Run(success ? GCDApiFlow::SUCCESS
+                                   : GCDApiFlow::ERROR_FROM_SERVER);
 }
 
 GURL PrivetConfirmApiCallFlow::GetURL() {
diff --git a/chrome/browser/printing/cloud_print/privet_confirm_api_flow.h b/chrome/browser/printing/cloud_print/privet_confirm_api_flow.h
index 97a1e0a4..5594ddb 100644
--- a/chrome/browser/printing/cloud_print/privet_confirm_api_flow.h
+++ b/chrome/browser/printing/cloud_print/privet_confirm_api_flow.h
@@ -14,11 +14,10 @@
 // API call flow for server-side communication with CloudPrint for registration.
 class PrivetConfirmApiCallFlow : public CloudPrintApiFlowRequest {
  public:
-  using ResponseCallback = base::Callback<void(GCDApiFlow::Status)>;
+  using ResponseCallback = base::OnceCallback<void(GCDApiFlow::Status)>;
 
   // Create an OAuth2-based confirmation
-  PrivetConfirmApiCallFlow(const std::string& token,
-                           const ResponseCallback& callback);
+  PrivetConfirmApiCallFlow(const std::string& token, ResponseCallback callback);
   ~PrivetConfirmApiCallFlow() override;
 
   // CloudPrintApiFlowRequest implementation:
diff --git a/chrome/browser/printing/cloud_print/privet_confirm_api_flow_unittest.cc b/chrome/browser/printing/cloud_print/privet_confirm_api_flow_unittest.cc
index 19cd9dc..7480357c 100644
--- a/chrome/browser/printing/cloud_print/privet_confirm_api_flow_unittest.cc
+++ b/chrome/browser/printing/cloud_print/privet_confirm_api_flow_unittest.cc
@@ -46,7 +46,8 @@
 TEST(PrivetConfirmApiFlowTest, Parsing) {
   StrictMock<MockDelegate> delegate;
   PrivetConfirmApiCallFlow confirmation(
-      "123", base::Bind(&MockDelegate::Callback, base::Unretained(&delegate)));
+      "123",
+      base::BindOnce(&MockDelegate::Callback, base::Unretained(&delegate)));
   EXPECT_CALL(delegate, Callback(GCDApiFlow::SUCCESS)).Times(1);
 
   base::Optional<base::Value> value =
@@ -56,12 +57,15 @@
   ASSERT_TRUE(value->GetAsDictionary(&dictionary));
   confirmation.OnGCDApiFlowComplete(*dictionary);
 
+  PrivetConfirmApiCallFlow confirmation2(
+      "123",
+      base::BindOnce(&MockDelegate::Callback, base::Unretained(&delegate)));
   EXPECT_CALL(delegate, Callback(GCDApiFlow::ERROR_FROM_SERVER)).Times(1);
 
   value = base::JSONReader::Read(kFailedConfirmResponse);
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->GetAsDictionary(&dictionary));
-  confirmation.OnGCDApiFlowComplete(*dictionary);
+  confirmation2.OnGCDApiFlowComplete(*dictionary);
 }
 
 }  // namespace
diff --git a/chrome/browser/printing/cloud_print/privet_http.h b/chrome/browser/printing/cloud_print/privet_http.h
index 1c83708..230e7ef 100644
--- a/chrome/browser/printing/cloud_print/privet_http.h
+++ b/chrome/browser/printing/cloud_print/privet_http.h
@@ -32,8 +32,8 @@
 class PrivetJSONOperation {
  public:
   // If value is null, the operation failed.
-  typedef base::RepeatingCallback<void(const base::DictionaryValue* /*value*/)>
-      ResultCallback;
+  using ResultCallback =
+      base::OnceCallback<void(const base::DictionaryValue* /*value*/)>;
 
   virtual ~PrivetJSONOperation() {}
 
@@ -52,7 +52,7 @@
 
   // Creates operation to query basic information about local device.
   virtual std::unique_ptr<PrivetJSONOperation> CreateInfoOperation(
-      const PrivetJSONOperation::ResultCallback& callback) = 0;
+      PrivetJSONOperation::ResultCallback callback) = 0;
 
   // Creates a URL loader for PrivetV1.
   virtual std::unique_ptr<PrivetURLLoader> CreateURLLoader(
@@ -168,7 +168,7 @@
 
   // Creates operation to query basic information about local device.
   virtual std::unique_ptr<PrivetJSONOperation> CreateInfoOperation(
-      const PrivetJSONOperation::ResultCallback& callback) = 0;
+      PrivetJSONOperation::ResultCallback callback) = 0;
 
   // Creates operation to register local device using Privet v1 protocol.
   virtual std::unique_ptr<PrivetRegisterOperation> CreateRegisterOperation(
@@ -177,7 +177,7 @@
 
   // Creates operation to query capabilities of local printer.
   virtual std::unique_ptr<PrivetJSONOperation> CreateCapabilitiesOperation(
-      const PrivetJSONOperation::ResultCallback& callback) = 0;
+      PrivetJSONOperation::ResultCallback callback) = 0;
 
   // Creates operation to submit print job to local printer.
   virtual std::unique_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation(
diff --git a/chrome/browser/printing/cloud_print/privet_http_impl.cc b/chrome/browser/printing/cloud_print/privet_http_impl.cc
index fd82147..690646d 100644
--- a/chrome/browser/printing/cloud_print/privet_http_impl.cc
+++ b/chrome/browser/printing/cloud_print/privet_http_impl.cc
@@ -94,8 +94,8 @@
 
 PrivetInfoOperationImpl::PrivetInfoOperationImpl(
     PrivetHTTPClient* privet_client,
-    const PrivetJSONOperation::ResultCallback& callback)
-    : privet_client_(privet_client), callback_(callback) {}
+    PrivetJSONOperation::ResultCallback callback)
+    : privet_client_(privet_client), callback_(std::move(callback)) {}
 
 PrivetInfoOperationImpl::~PrivetInfoOperationImpl() {
 }
@@ -116,13 +116,15 @@
 
 void PrivetInfoOperationImpl::OnError(int response_code,
                                       PrivetURLLoader::ErrorType error) {
-  callback_.Run(nullptr);
+  if (callback_)
+    std::move(callback_).Run(nullptr);
 }
 
 void PrivetInfoOperationImpl::OnParsedJson(int response_code,
                                            const base::DictionaryValue& value,
                                            bool has_error) {
-  callback_.Run(&value);
+  if (callback_)
+    std::move(callback_).Run(&value);
 }
 
 // static
@@ -303,7 +305,7 @@
 }
 
 void PrivetRegisterOperationImpl::StartInfoOperation() {
-  info_operation_ = privet_client_->CreateInfoOperation(base::BindRepeating(
+  info_operation_ = privet_client_->CreateInfoOperation(base::BindOnce(
       &PrivetRegisterOperationImpl::OnPrivetInfoDone, base::Unretained(this)));
   info_operation_->Start();
 }
@@ -339,11 +341,11 @@
     PrivetHTTPClient* privet_client,
     const std::string& path,
     const std::string& query_params,
-    const PrivetJSONOperation::ResultCallback& callback)
+    PrivetJSONOperation::ResultCallback callback)
     : privet_client_(privet_client),
       path_(path),
       query_params_(query_params),
-      callback_(callback) {}
+      callback_(std::move(callback)) {}
 
 PrivetJSONOperationImpl::~PrivetJSONOperationImpl() {
 }
@@ -361,13 +363,15 @@
 
 void PrivetJSONOperationImpl::OnError(int response_code,
                                       PrivetURLLoader::ErrorType error) {
-  callback_.Run(nullptr);
+  if (callback_)
+    std::move(callback_).Run(nullptr);
 }
 
 void PrivetJSONOperationImpl::OnParsedJson(int response_code,
                                            const base::DictionaryValue& value,
                                            bool has_error) {
-  callback_.Run(&value);
+  if (callback_)
+    std::move(callback_).Run(&value);
 }
 
 void PrivetJSONOperationImpl::OnNeedPrivetToken(
@@ -408,8 +412,8 @@
   // We need to get the /info response so we can know which APIs are available.
   // TODO(noamsml): Use cached info when available.
   info_operation_ = privet_client_->CreateInfoOperation(
-      base::BindRepeating(&PrivetLocalPrintOperationImpl::OnPrivetInfoDone,
-                          weak_factory_.GetWeakPtr()));
+      base::BindOnce(&PrivetLocalPrintOperationImpl::OnPrivetInfoDone,
+                     weak_factory_.GetWeakPtr()));
   info_operation_->Start();
   started_ = true;
 }
@@ -692,8 +696,8 @@
 }
 
 std::unique_ptr<PrivetJSONOperation> PrivetHTTPClientImpl::CreateInfoOperation(
-    const PrivetJSONOperation::ResultCallback& callback) {
-  return std::make_unique<PrivetInfoOperationImpl>(this, callback);
+    PrivetJSONOperation::ResultCallback callback) {
+  return std::make_unique<PrivetInfoOperationImpl>(this, std::move(callback));
 }
 
 std::unique_ptr<PrivetURLLoader> PrivetHTTPClientImpl::CreateURLLoader(
@@ -743,7 +747,7 @@
   if (info_operation_)
     return;
 
-  info_operation_ = CreateInfoOperation(base::BindRepeating(
+  info_operation_ = CreateInfoOperation(base::BindOnce(
       &PrivetHTTPClientImpl::OnPrivetInfoDone, base::Unretained(this)));
   info_operation_->Start();
 }
@@ -778,8 +782,8 @@
 
 std::unique_ptr<PrivetJSONOperation>
 PrivetV1HTTPClientImpl::CreateInfoOperation(
-    const PrivetJSONOperation::ResultCallback& callback) {
-  return info_client_->CreateInfoOperation(callback);
+    PrivetJSONOperation::ResultCallback callback) {
+  return info_client_->CreateInfoOperation(std::move(callback));
 }
 
 std::unique_ptr<PrivetRegisterOperation>
@@ -792,9 +796,9 @@
 
 std::unique_ptr<PrivetJSONOperation>
 PrivetV1HTTPClientImpl::CreateCapabilitiesOperation(
-    const PrivetJSONOperation::ResultCallback& callback) {
+    PrivetJSONOperation::ResultCallback callback) {
   return std::make_unique<PrivetJSONOperationImpl>(
-      info_client_.get(), kPrivetCapabilitiesPath, "", callback);
+      info_client_.get(), kPrivetCapabilitiesPath, "", std::move(callback));
 }
 
 std::unique_ptr<PrivetLocalPrintOperation>
diff --git a/chrome/browser/printing/cloud_print/privet_http_impl.h b/chrome/browser/printing/cloud_print/privet_http_impl.h
index 7c70752..24692df 100644
--- a/chrome/browser/printing/cloud_print/privet_http_impl.h
+++ b/chrome/browser/printing/cloud_print/privet_http_impl.h
@@ -36,7 +36,7 @@
                                 public PrivetURLLoader::Delegate {
  public:
   PrivetInfoOperationImpl(PrivetHTTPClient* privet_client,
-                          const PrivetJSONOperation::ResultCallback& callback);
+                          PrivetJSONOperation::ResultCallback callback);
   ~PrivetInfoOperationImpl() override;
 
   // PrivetJSONOperation:
@@ -138,7 +138,7 @@
   PrivetJSONOperationImpl(PrivetHTTPClient* privet_client,
                           const std::string& path,
                           const std::string& query_params,
-                          const PrivetJSONOperation::ResultCallback& callback);
+                          PrivetJSONOperation::ResultCallback callback);
   ~PrivetJSONOperationImpl() override;
 
   // PrivetJSONOperation:
@@ -258,7 +258,7 @@
   // PrivetHTTPClient:
   const std::string& GetName() override;
   std::unique_ptr<PrivetJSONOperation> CreateInfoOperation(
-      const PrivetJSONOperation::ResultCallback& callback) override;
+      PrivetJSONOperation::ResultCallback callback) override;
   std::unique_ptr<PrivetURLLoader> CreateURLLoader(
       const GURL& url,
       const std::string& request_type,
@@ -290,12 +290,12 @@
   // PrivetV1HTTPClient:
   const std::string& GetName() override;
   std::unique_ptr<PrivetJSONOperation> CreateInfoOperation(
-      const PrivetJSONOperation::ResultCallback& callback) override;
+      PrivetJSONOperation::ResultCallback callback) override;
   std::unique_ptr<PrivetRegisterOperation> CreateRegisterOperation(
       const std::string& user,
       PrivetRegisterOperation::Delegate* delegate) override;
   std::unique_ptr<PrivetJSONOperation> CreateCapabilitiesOperation(
-      const PrivetJSONOperation::ResultCallback& callback) override;
+      PrivetJSONOperation::ResultCallback callback) override;
   std::unique_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation(
       PrivetLocalPrintOperation::Delegate* delegate) override;
 
diff --git a/chrome/browser/printing/cloud_print/privet_http_unittest.cc b/chrome/browser/printing/cloud_print/privet_http_unittest.cc
index a41e05d..2d64da9 100644
--- a/chrome/browser/printing/cloud_print/privet_http_unittest.cc
+++ b/chrome/browser/printing/cloud_print/privet_http_unittest.cc
@@ -373,8 +373,8 @@
 
   const base::DictionaryValue* value() { return value_.get(); }
   PrivetJSONOperation::ResultCallback callback() {
-    return base::Bind(&MockJSONCallback::OnPrivetJSONDone,
-                      base::Unretained(this));
+    return base::BindOnce(&MockJSONCallback::OnPrivetJSONDone,
+                          base::Unretained(this));
   }
  protected:
   std::unique_ptr<base::DictionaryValue> value_;
@@ -1008,7 +1008,6 @@
   std::unique_ptr<EmbeddedTestServer> server_;
   std::unique_ptr<PrivetHTTPClientImpl> client_;
   scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory_;
-  base::Closure quit_;
 };
 
 class MockPrivetURLLoaderDelegate : public PrivetURLLoader::Delegate {
diff --git a/chrome/browser/printing/cloud_print/privet_local_printer_lister.cc b/chrome/browser/printing/cloud_print/privet_local_printer_lister.cc
index 61323d4..fa0812a2 100644
--- a/chrome/browser/printing/cloud_print/privet_local_printer_lister.cc
+++ b/chrome/browser/printing/cloud_print/privet_local_printer_lister.cc
@@ -72,8 +72,8 @@
   device_contexts_[name] = std::move(context);
   context_ptr->privet_resolution->Start(
       description.address,
-      base::Bind(&PrivetLocalPrinterLister::OnPrivetResolved,
-                 base::Unretained(this), name));
+      base::BindOnce(&PrivetLocalPrinterLister::OnPrivetResolved,
+                     base::Unretained(this), name));
 }
 
 void PrivetLocalPrinterLister::DeviceCacheFlushed() {
@@ -92,7 +92,7 @@
   auto it = device_contexts_.find(http_client->GetName());
   DCHECK(it != device_contexts_.end());
 
-  it->second->info_operation = http_client->CreateInfoOperation(base::Bind(
+  it->second->info_operation = http_client->CreateInfoOperation(base::BindOnce(
       &PrivetLocalPrinterLister::OnPrivetInfoDone, base::Unretained(this),
       it->second.get(), http_client->GetName()));
   it->second->privet_client = std::move(http_client);
diff --git a/chrome/browser/printing/cloud_print/privet_notifications.cc b/chrome/browser/printing/cloud_print/privet_notifications.cc
index 2258d612..07a78128 100644
--- a/chrome/browser/printing/cloud_print/privet_notifications.cc
+++ b/chrome/browser/printing/cloud_print/privet_notifications.cc
@@ -116,8 +116,8 @@
       privet_http_factory_->CreatePrivetHTTP(name);
   device_context->privet_http_resolution->Start(
       description.address,
-      base::Bind(&PrivetNotificationsListener::CreateInfoOperation,
-                 base::Unretained(this)));
+      base::BindOnce(&PrivetNotificationsListener::CreateInfoOperation,
+                     base::Unretained(this)));
 }
 
 void PrivetNotificationsListener::CreateInfoOperation(
@@ -134,9 +134,8 @@
   DeviceContext* device = it->second.get();
   device->privet_http.swap(http_client);
   device->info_operation = device->privet_http->CreateInfoOperation(
-      base::Bind(&PrivetNotificationsListener::OnPrivetInfoDone,
-                 base::Unretained(this),
-                 device));
+      base::BindOnce(&PrivetNotificationsListener::OnPrivetInfoDone,
+                     base::Unretained(this), device));
   device->info_operation->Start();
 }
 
@@ -245,8 +244,8 @@
 
   NotificationDisplayService::GetForProfile(
       Profile::FromBrowserContext(profile_))
-      ->GetDisplayed(base::Bind(&PrivetNotificationService::AddNotification,
-                                AsWeakPtr(), devices_active, added));
+      ->GetDisplayed(base::BindOnce(&PrivetNotificationService::AddNotification,
+                                    AsWeakPtr(), devices_active, added));
 }
 
 void PrivetNotificationService::AddNotification(
@@ -318,8 +317,9 @@
   enable_privet_notification_member_.Init(
       prefs::kLocalDiscoveryNotificationsEnabled,
       Profile::FromBrowserContext(profile_)->GetPrefs(),
-      base::Bind(&PrivetNotificationService::OnNotificationsEnabledChanged,
-                 base::Unretained(this)));
+      base::BindRepeating(
+          &PrivetNotificationService::OnNotificationsEnabledChanged,
+          base::Unretained(this)));
   OnNotificationsEnabledChanged();
 }
 
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
index 481743a..b9d85db 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
@@ -80,7 +80,7 @@
 
 PrivetTrafficDetector::PrivetTrafficDetector(
     content::BrowserContext* profile,
-    const base::RepeatingClosure& on_traffic_detected)
+    base::RepeatingClosure on_traffic_detected)
     : helper_(new Helper(profile, on_traffic_detected)) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   content::GetNetworkConnectionTracker()->AddNetworkConnectionObserver(this);
@@ -108,7 +108,7 @@
 
 PrivetTrafficDetector::Helper::Helper(
     content::BrowserContext* profile,
-    const base::RepeatingClosure& on_traffic_detected)
+    base::RepeatingClosure on_traffic_detected)
     : profile_(profile),
       on_traffic_detected_(on_traffic_detected),
       restart_attempts_(kMaxRestartAttempts),
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.h b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
index 86df41d..932e3bb 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.h
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
@@ -34,7 +34,7 @@
  public:
   // Called on the UI thread.
   PrivetTrafficDetector(content::BrowserContext* profile,
-                        const base::RepeatingClosure& on_traffic_detected);
+                        base::RepeatingClosure on_traffic_detected);
   ~PrivetTrafficDetector() override;
 
   // network::NetworkConnectionTracker::NetworkConnectionObserver:
@@ -46,7 +46,7 @@
   class Helper : public network::mojom::UDPSocketReceiver {
    public:
     Helper(content::BrowserContext* profile,
-           const base::RepeatingClosure& on_traffic_detected);
+           base::RepeatingClosure on_traffic_detected);
     ~Helper() override;
 
     // network::mojom::UDPSocketReceiver:
diff --git a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
index e0de7b4e..9efd50b 100644
--- a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
+++ b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
@@ -176,8 +176,8 @@
           WithoutArgs(Invoke(g_service_process, &::ServiceProcess::Shutdown))));
 }
 
-typedef base::Callback<void(MockServiceIPCServer* server)>
-    SetExpectationsCallback;
+using SetExpectationsCallback =
+    base::OnceCallback<void(MockServiceIPCServer* server)>;
 
 // The return value from this routine is used as the exit code for the mock
 // service process. Any non-zero return value will be printed out and can help
@@ -228,11 +228,11 @@
   MockServiceIPCServer server(&service_process,
                               service_process.io_task_runner(),
                               service_process.GetShutdownEventForTesting());
-  server.binder_registry().AddInterface(base::Bind(
+  server.binder_registry().AddInterface(base::BindRepeating(
       &cloud_print::CloudPrintMessageHandler::Create, &service_process));
 
   // Here is where the expectations/mock responses need to be set up.
-  set_expectations.Run(&server);
+  std::move(set_expectations).Run(&server);
 
   EXPECT_TRUE(server.Init());
   EXPECT_TRUE(state->SignalReady(service_process.io_task_runner().get(),
@@ -273,7 +273,7 @@
 
 MULTIPROCESS_TEST_MAIN(CloudPrintMockService_StartEnabledWaitForQuit) {
   return CloudPrintMockService_Main(
-      base::Bind(&SetServiceEnabledExpectations));
+      base::BindOnce(&SetServiceEnabledExpectations));
 }
 
 class CloudPrintProxyPolicyStartupTest : public base::MultiProcessTest,
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index dd69b35..3b33b3a 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -59,7 +59,6 @@
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
-#include "chrome/browser/ui/webui/welcome/nux_helper.h"
 #include "chrome/browser/unified_consent/unified_consent_service_factory.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_constants.h"
@@ -145,14 +144,9 @@
 #include "chrome/browser/profiles/profile_statistics_factory.h"
 #endif
 
-#if defined(OS_WIN)
-#include "base/enterprise_util.h"
-
-#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+#if defined(OS_WIN) && BUILDFLAG(ENABLE_DICE_SUPPORT)
 #include "chrome/browser/signin/signin_util_win.h"
-#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
-
-#endif  // defined(OS_WIN)
+#endif  // defined(OS_WIN) && BUILDFLAG(ENABLE_DICE_SUPPORT)
 
 using base::UserMetricsAction;
 using content::BrowserThread;
@@ -1081,13 +1075,6 @@
   // before profile creation.)
   if (profile->IsNewProfile() || first_run::IsChromeFirstRun()) {
     profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, false);
-#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
-    // Enterprise users should not be included in any NUX/Navi flow.
-    if (!base::IsMachineExternallyManaged()) {
-      profile->GetPrefs()->SetString(prefs::kNaviOnboardGroup,
-                                     nux::GetOnboardingGroup(profile));
-    }
-#endif  // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
   }
 #endif  // !defined(OS_ANDROID)
 }
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn
index 060fd4ba..587c3ab 100644
--- a/chrome/browser/resources/chromeos/BUILD.gn
+++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -43,7 +43,6 @@
     "internet_detail_dialog:closure_compile",
     "kiosk_next_home:closure_compile",
     "login:closure_compile",
-    "login:closure_compile_supervision",
     "machine_learning:closure_compile",
     "multidevice_setup:closure_compile",
     "network_ui:closure_compile",
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
index bf0f2fdb..df3ae5c 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -1975,3 +1975,45 @@
     press(9  /* tab */)();
   });
 });
+
+TEST_F('ChromeVoxBackgroundTest', 'PopUpButtonSetSize', function() {
+  var mockFeedback = this.createMockFeedback();
+  this.runWithLoadedTree(function() {/*!
+    <div>
+    <select id="button">
+      <option value="Apple">Apple</option>
+      <option value="Banana">Banana</option>
+    </select>
+    </div>
+    <script>
+      var button = document.getElementById('button');
+      var expanded = false;
+      button.addEventListener('click', function(e) {
+        console.error('Heelooo');
+        if (expanded)
+          button.setAttribute('aria-expanded', false);
+        else
+          button.setAttribute('aria-expanded', true);
+        expanded = !expanded;
+      });
+    </script>
+  */}, function(root) {
+    var button = root.find({role: RoleType.POP_UP_BUTTON});
+    var click = button.doDefault.bind(button);
+    var focus = button.focus.bind(button);
+    mockFeedback.call(focus)
+      .expectSpeech('Apple')
+      .expectSpeech('Button')
+      .expectSpeech('has pop up')
+      .expectSpeech('Press Search+Space to activate.')
+      .call(click)
+      .expectSpeech('Apple')
+      .expectSpeech('Button')
+      .expectSpeech('has pop up')
+      // SetSize is only reported if popup button is expanded.
+      .expectSpeech('with 2 items')
+      .expectSpeech('Expanded')
+      .expectSpeech('Press Search+Space to activate.')
+      .replay();
+  });
+});
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 870f266..3af25d6b 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -513,7 +513,8 @@
     paragraph: {speak: `$nameOrDescendants`},
     popUpButton: {
       speak: `$if($value, $value, $descendants) $name $role @aria_has_popup
-          $state $restriction $description`
+          $if($expanded, @@list_with_items($setSize)) $state $restriction
+          $description`
     },
     radioButton: {
       speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF))
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
index 3a239189..369f5d4 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
@@ -61,7 +61,8 @@
               share-allow-enable="[[shareAllowEnable_]]"
               share-default="[[shareDefault_]]"
               error="{{error_}}"
-              on-close="close_">
+              on-close="close_"
+              connect-on-enter>
           </network-config>
         </div>
 
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 13c0d8f..e38b6086 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -52,20 +52,6 @@
   ]
 }
 
-# We need to keep the supervision_onboarding compilation separate from the main
-# target since they depend on incompatible extern files.
-#
-# The main compilation target bundles the networking_private.js externs, it
-# gets that transitively from its :network_select_login dep.
-#
-# Supervision needs the chrome_extensions.js extern, but they end up declaring
-# the same types, so compilation fails.
-js_type_check("closure_compile_supervision") {
-  deps = [
-    ":supervision_onboarding",
-  ]
-}
-
 js2gtest("login_unitjs_tests") {
   # These could be unit tests, except they need a browser context in order
   # to construct a DOMParser object - so they are webui tests.
@@ -159,20 +145,6 @@
   ]
 }
 
-js_library("supervision_onboarding") {
-  deps = [
-    ":login_screen_behavior",
-    ":oobe_dialog_host_behavior",
-    "//chrome/browser/chromeos/supervision/mojom:mojom_js_library_for_compile",
-    "//ui/webui/resources/js:cr",
-  ]
-
-  externs_list = [
-    "$externs_path/chrome_extensions.js",
-    "$externs_path/webview_tag.js",
-  ]
-}
-
 js_library("active_directory_password_change") {
 }
 
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.html b/chrome/browser/resources/chromeos/login/custom_elements_login.html
index 280f17d3..c9d86d00 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_login.html
+++ b/chrome/browser/resources/chromeos/login/custom_elements_login.html
@@ -34,6 +34,5 @@
 <include src="marketing_opt_in.html">
 <include src="../assistant_optin/assistant_optin_flow.html">
 <include src="multidevice_setup_first_run.html">
-<include src="supervision_onboarding.html">
 
 <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.js b/chrome/browser/resources/chromeos/login/custom_elements_login.js
index 93c1d26..bba2c5d 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_login.js
+++ b/chrome/browser/resources/chromeos/login/custom_elements_login.js
@@ -38,6 +38,5 @@
 // <include src="marketing_opt_in.js">
 // <include src="../assistant_optin/assistant_optin_flow.js">
 // <include src="multidevice_setup_first_run.js">
-// <include src="supervision_onboarding.js">
 // <include src="enrollment_license_card.js">
 // <include src="enterprise_enrollment.js">
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
index 5a3a32cd..f3f3ee16 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
+++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
@@ -44,6 +44,5 @@
 <include src="marketing_opt_in.html">
 <include src="../assistant_optin/assistant_optin_flow.html">
 <include src="multidevice_setup_first_run.html">
-<include src="supervision_onboarding.html">
 
 <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
index 7659f64..787435f4 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
+++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
@@ -55,4 +55,3 @@
 // <include src="marketing_opt_in.js">
 // <include src="../assistant_optin/assistant_optin_flow.js">
 // <include src="multidevice_setup_first_run.js">
-// <include src="supervision_onboarding.js">
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.css b/chrome/browser/resources/chromeos/login/supervision_onboarding.css
deleted file mode 100644
index 7bfd844..0000000
--- a/chrome/browser/resources/chromeos/login/supervision_onboarding.css
+++ /dev/null
@@ -1,13 +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. */
-
-#supervision-onboarding-back-button,
-#supervision-onboarding-skip-button {
-  padding-inline-end: 6px;
-}
-
-#supervisionOnboardingWebview {
-  height: 560px;
-}
-
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.html b/chrome/browser/resources/chromeos/login/supervision_onboarding.html
deleted file mode 100644
index 40859b59..0000000
--- a/chrome/browser/resources/chromeos/login/supervision_onboarding.html
+++ /dev/null
@@ -1,125 +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. -->
-
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://oobe/custom_elements.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
-<link rel="import" href="chrome://resources/mojo/url/mojom/url.mojom.html">
-<script src="chrome://oobe/supervision/onboarding_controller.mojom-lite.js">
-</script>
-
-<iron-iconset-svg name="supervision-onboarding-retry-32" size="32">
-  <svg>
-    <defs>
-      <g id="alert" fill-rule="evenodd">
-        <defs>
-          <path id="a" d="M14.667 20h2.666v2.667h-2.666V20zm0-10.667h2.666v8h-2.666v-8zm1.32-6.666C8.627 2.667 2.667 8.64 2.667 16s5.96 13.333 13.32 13.333c7.373 0 13.346-5.973 13.346-13.333S23.36 2.667 15.987 2.667zm.013 24c-5.893 0-10.667-4.774-10.667-10.667S10.107 5.333 16 5.333 26.667 10.107 26.667 16 21.893 26.667 16 26.667z"></path>
-        </defs>
-        <g fill="none" fill-rule="evenodd">
-          <path d="M0 0h32v32H0z"></path>
-          <use fill="#1A73E8" fill-rule="nonzero" xlink:href="#a"></use>
-        </g>
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
-
-<iron-iconset-svg name="supervision-onboarding-retry-64" size="64">
-  <svg>
-    <defs>
-      <g id="alert" fill-rule="evenodd">
-        <defs>
-          <path id="a" d="M29.333 40h5.334v5.333h-5.334V40zm0-21.333h5.334v16h-5.334v-16zm2.64-13.334C17.253 5.333 5.333 17.28 5.333 32c0 14.72 11.92 26.667 26.64 26.667C46.72 58.667 58.667 46.72 58.667 32c0-14.72-11.947-26.667-26.694-26.667zm.027 48c-11.787 0-21.333-9.546-21.333-21.333 0-11.787 9.546-21.333 21.333-21.333 11.787 0 21.333 9.546 21.333 21.333 0 11.787-9.546 21.333-21.333 21.333z"></path>
-        </defs>
-        <g fill="none" fill-rule="evenodd">
-          <path d="M0 0h64v64H0z"></path>
-          <use fill="#1A73E8" fill-rule="nonzero" xlink:href="#a"></use>
-        </g>
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
-
-<!--
-  UI for the Supervision Onboarding flow that's displayed for the first login
-  or OOBE of supervised users. -->
-<dom-module id="supervision-onboarding">
-  <template>
-    <link rel="stylesheet" href="oobe_flex_layout.css">
-    <link rel="stylesheet" href="supervision_onboarding.css">
-    <div id="supervision-onboarding-flow-container">
-
-      <!--
-        Loading dialog. Shown while we load the onboarding page.
-        It just shows a spinner with a "Please wait" message. -->
-      <oobe-dialog id="loading-dialog" role="dialog" no-header no-footer-padding
-          hidden="[[hideLoadingDialog_]]">
-        <div slot="footer" class="flex layout vertical center center-justified">
-          <throbber-notice text="$i18n{supervisionOnboardingWaitMessage}">
-          </throbber-notice>
-        </div>
-      </oobe-dialog>
-
-      <!--
-        Retry dialog. Shown when we fail to load the onboarding page.
-        It shows a "Try again" button, but if the user keeps trying and we
-        keep failing, we add a button to skip the whole flow. -->
-      <oobe-dialog id="supervision-onboarding-retry-dialog" role="dialog"
-          aria-label$="$i18n{supervisionOnboardingRetryDialogTitle}"
-          has-buttons hidden="[[hideRetryDialog_]]">
-        <hd-iron-icon slot="oobe-icon" aria-hidden="true"
-            icon1x="supervision-onboarding-retry-32:alert"
-            icon2x="supervision-onboarding-retry-64:alert">
-        </hd-iron-icon>
-        <h1 slot="title">
-          $i18n{supervisionOnboardingRetryDialogTitle}
-        </h1>
-        <div slot="subtitle">
-          $i18n{supervisionOnboardingRetryDialogMessage}
-        </div>
-        <div slot="bottom-buttons" class="layout horizontal end-justified">
-          <div class="flex">
-          </div>
-          <oobe-text-button id="supervision-onboarding-bail-button" border
-              hidden="[[hideSkipButton_]]" on-tap="onSkip_">
-            <div i18n-content="supervisionOnboardingSkipButtonLabel"></div>
-          </oobe-text-button>
-          <oobe-text-button id="supervision-onboarding-retry-button" inverse
-              hidden="[[hideRetryButton_]]" on-tap="onRetry_">
-            <div i18n-content="supervisionOnboardingRetryButtonLabel"></div>
-          </oobe-text-button>
-        </div>
-      </oobe-dialog>
-
-      <!--
-        Content dialog. Shown when we successfully load an onboarding page.
-        It has up to three buttons to control the flow that depend on the
-        page.-->
-      <oobe-dialog id="supervision-onboarding-content" role="dialog" no-header
-          no-footer-padding has-buttons hidden="[[hideContent_]]">
-        <webview id="supervisionOnboardingWebview" slot="footer">
-        </webview>
-        <div id="supervision-onboarding-flow-buttons" slot="bottom-buttons"
-            class="layout horizontal end-justified">
-          <oobe-back-button id="supervision-onboarding-back-button"
-              hidden="[[hideBackButton_]]" on-click="onBack_">
-            <div i18n-content="supervisionOnboardingBackButtonLabel"></div>
-          </oobe-back-button>
-          <div class="flex">
-          </div>
-          <oobe-text-button id="supervision-onboarding-skip-button" border
-              hidden="[[hideSkipButton_]]" on-tap="onSkip_">
-            <div i18n-content="supervisionOnboardingSkipButtonLabel"></div>
-          </oobe-text-button>
-          <oobe-text-button id="supervision-onboarding-next-button" inverse
-              hidden="[[hideNextButton_]]" on-tap="onNext_">
-            <div i18n-content="supervisionOnboardingNextButtonLabel"></div>
-          </oobe-text-button>
-        </div>
-      </oobe-dialog>
-    </div>
-  </template>
-</dom-module>
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.js b/chrome/browser/resources/chromeos/login/supervision_onboarding.js
deleted file mode 100644
index 0303dcf..0000000
--- a/chrome/browser/resources/chromeos/login/supervision_onboarding.js
+++ /dev/null
@@ -1,350 +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.
-
-/**
- * @fileoverview Supervision Onboarding polymer element. It loads onboarding
- * pages from the web in a webview and forwards user actions to the
- * OnboardingController, which contains the full flow state machine.
- */
-
-{
-  /**
-   * Codes for network errors. Should follow same numbers as
-   * net/base/net_errors.h
-   * @const
-   * @enum {number}
-   */
-  const NetError = {
-    'OK': 0,
-    'ERR_FAILED': -2,
-    'ERR_ABORTED': -3,
-    'ERR_TIMED_OUT': -7,
-  };
-
-  /** @const {number} Timeout for page loads in milliseconds. */
-  const PAGE_LOAD_TIMEOUT_MS = 10000;
-
-  class WebviewLoader {
-    /** @param {!WebView} webview */
-    constructor(webview) {
-      this.webview_ = webview;
-
-      /**
-       * Page being currently loaded. If null we are not loading any page yet.
-       * @private {?chromeos.supervision.mojom.OnboardingPage}
-       */
-      this.page_ = null;
-
-      /**
-       * Pending callback for a webview page load. It will be called with the
-       * list of custom header values if asked by the controller, or an empty
-       * array otherwise.
-       * @private{?function({result:
-       *     !chromeos.supervision.mojom.OnboardingLoadPageResult})}
-       */
-      this.pendingLoadPageCallback_ = null;
-
-      /**
-       * Callers can optionally ask to extract the value from a custom HTTP
-       * header present in page loads. If they request it and we find the
-       * targeted header, we store it here.
-       * @private {?string}
-       */
-      this.customHeaderValue_ = null;
-
-      // We listen to all requests made to fetch the main frame, but note that
-      // we end up blocking requests to URLs that don't start with the expected
-      // server prefix (see onBeforeSendHeaders_).
-      // This is done because we will only know the prefix when we start to
-      // load the page, but we add listeners at mojo setup time.
-      const requestFilter = {urls: ['<all_urls>'], types: ['main_frame']};
-
-      this.webview_.request.onBeforeSendHeaders.addListener(
-          this.onBeforeSendHeaders_.bind(this), requestFilter,
-          ['blocking', 'requestHeaders']);
-      this.webview_.request.onHeadersReceived.addListener(
-          this.onHeadersReceived_.bind(this), requestFilter,
-          ['responseHeaders', 'extraHeaders']);
-
-      // These are for listeners that will be called when we finish loading the
-      // webview. We have their bound versions here so we can add and remove
-      // them as we try to load the page. This is necessary so we don't receive
-      // notifications from previous loads.
-      // For example, if we timeout and the user presses the retry button, the
-      // webview will send a loadabort event when we set a new src and start a
-      // new page load. We avoid this problem if we remove our listeners as soon
-      // as one of them fires.
-      this.loadStopListener_ = this.onLoadStop_.bind(this);
-      this.requestCompletedListener_ = this.onRequestCompleted_.bind(this);
-      this.loadAbortListener_ = this.onLoadAbort_.bind(this);
-      this.errorOccurredListener_ = this.onErrorOccurred_.bind(this);
-      this.timeoutListener_ = this.onTimeout_.bind(this);
-
-      this.timerId_ = 0;
-    }
-
-    /**
-     * @param {!chromeos.supervision.mojom.OnboardingPage} page
-     * @return {Promise<{
-     *     result: !chromeos.supervision.mojom.OnboardingLoadPageResult,
-     *  }>}
-     */
-    loadPage(page) {
-      if (this.pendingLoadPageCallback_) {
-        this.finishLoading_({netError: NetError.ERR_ABORTED});
-      }
-
-      this.page_ = page;
-      this.pendingLoadPageCallback_ = null;
-      this.customHeaderValue_ = null;
-
-      this.webview_.addEventListener('loadstop', this.loadStopListener_);
-      this.webview_.addEventListener('loadabort', this.loadAbortListener_);
-      this.webview_.request.onCompleted.addListener(
-          this.requestCompletedListener_,
-          {urls: ['<all_urls>'], types: ['main_frame']});
-      this.webview_.request.onErrorOccurred.addListener(
-          this.errorOccurredListener_,
-          {urls: ['<all_urls>'], types: ['main_frame']});
-      this.timerId_ =
-          window.setTimeout(this.timeoutListener_, PAGE_LOAD_TIMEOUT_MS);
-
-      this.webview_.src = page.url.url;
-
-      return new Promise(resolve => {
-        this.pendingLoadPageCallback_ = resolve;
-      });
-    }
-
-    /**
-     * Injects headers into the passed request.
-     *
-     * @param {!Object} requestEvent
-     * @return {!BlockingResponse} Modified headers.
-     * @private
-     */
-    onBeforeSendHeaders_(requestEvent) {
-      if (!this.page_ ||
-          !requestEvent.url.startsWith(this.page_.allowedUrlsPrefix)) {
-        return {cancel: true};
-      }
-
-      requestEvent.requestHeaders.push(
-          {name: 'Authorization', value: 'Bearer ' + this.page_.accessToken});
-
-      return /** @type {!BlockingResponse} */ ({
-        requestHeaders: requestEvent.requestHeaders,
-      });
-    }
-
-    /**
-     * @param {!Object<{responseHeaders: !chrome.webRequest.HttpHeaders}>}
-     *     responseEvent
-     * @return {!BlockingResponse}
-     * @private
-     */
-    onHeadersReceived_(responseEvent) {
-      if (!this.page_.customHeaderName) {
-        return {};
-      }
-
-      const header = responseEvent.responseHeaders.find(
-          h => h.name.toUpperCase() ==
-              this.page_.customHeaderName.toUpperCase());
-      if (header) {
-        this.customHeaderValue_ = header.value;
-      }
-
-      return {};
-    }
-
-    /**
-     * Called when the webview stops loading.
-     * @param {!Event} e
-     * @private
-     */
-    onLoadStop_(e) {
-      // If we got here, this means that all the error handling listeners did
-      // not fire, so just return a success result.
-      const result = {netError: NetError.OK};
-      if (this.customHeaderValue_) {
-        result.customHeaderValue = this.customHeaderValue_;
-      }
-      this.finishLoading_(result);
-    }
-
-    /**
-     * Called when the webview sends a loadabort event.
-     * @param {!Event} e
-     * @private
-     */
-    onLoadAbort_(e) {
-      const netError = e.code ? e.code : NetError.ERR_FAILED;
-      this.finishLoading_({netError: netError});
-    }
-
-    /**
-     * Called when the webview completes a page request.
-     * @param {!Object} requestDetails
-     * @private
-     */
-    onRequestCompleted_(requestDetails) {
-      if (!requestDetails.statusCode || requestDetails.statusCode == 200) {
-        // We don't finish loading with a success here because at this point the
-        // webview has finished the request, but it didn't render the results
-        // yet. If we call finishLoading and start showing the webview, we will
-        // flicker with the old results.
-        return;
-      }
-
-      // HTTP errors in the 4xx and 5xx range will hit here.
-      this.finishLoading_({netError: NetError.ERR_FAILED});
-    }
-
-    /**
-     * Called when the webview encounters an error.
-     * @private
-     */
-    onErrorOccurred_() {
-      this.finishLoading_({netError: NetError.ERR_FAILED});
-    }
-
-    /**
-     * Called when the webview load times out.
-     * @private
-     */
-    onTimeout_() {
-      this.finishLoading_({netError: NetError.ERR_TIMED_OUT});
-    }
-
-    /**
-     * Called to clean up the webview listeners and run the pending callback
-     * with the given result.
-     * @param {!chromeos.supervision.mojom.OnboardingLoadPageResult} result
-     */
-    finishLoading_(result) {
-      this.webview_.removeEventListener('loadstop', this.loadStopListener_);
-      this.webview_.removeEventListener('loadabort', this.loadAbortListener_);
-      this.webview_.request.onCompleted.removeListener(
-          this.requestCompletedListener_);
-      this.webview_.request.onErrorOccurred.removeListener(
-          this.errorOccurredListener_);
-      window.clearTimeout(this.timerId_);
-
-      this.pendingLoadPageCallback_({result: result});
-    }
-  }
-
-  Polymer({
-    is: 'supervision-onboarding',
-
-    behaviors: [LoginScreenBehavior, OobeDialogHostBehavior],
-
-    properties: {
-      /*
-       * Properties to hide the main dialogs used to present the flow. Only one
-       * of them can be shown at a time.
-       * Note: One of them needs to be visible when the element is being
-       * initialized, otherwise we risk having our width and height set to 0 by
-       * the display manager.
-       */
-      hideLoadingDialog_: {type: Boolean, value: false},
-      hideRetryDialog_: {type: Boolean, value: true},
-      hideContent_: {type: Boolean, value: true},
-
-      /*
-       * Properties to hide the buttons that can trigger flow actions.
-       */
-      hideBackButton_: {type: Boolean, value: true},
-      hideSkipButton_: {type: Boolean, value: true},
-      hideNextButton_: {type: Boolean, value: true},
-      hideRetryButton_: {type: Boolean, value: true},
-    },
-
-    /** Overridden from LoginScreenBehavior. */
-    EXTERNAL_API: [
-      'setupMojo',
-    ],
-
-    /** @private {?chromeos.supervision.mojom.OnboardingControllerProxy} */
-    controller_: null,
-
-    /**
-     * @private {?chromeos.supervision.mojom.
-     *     OnboardingWebviewHostCallbackRouter}
-     */
-    hostCallbackRouter_: null,
-
-    /** @private {?WebviewLoader} */
-    webviewLoader_: null,
-
-    setupMojo: function() {
-      this.webviewLoader_ =
-          new WebviewLoader(this.$.supervisionOnboardingWebview);
-
-      this.controller_ =
-          chromeos.supervision.mojom.OnboardingController.getProxy();
-
-      this.hostCallbackRouter_ =
-          new chromeos.supervision.mojom.OnboardingWebviewHostCallbackRouter();
-
-      this.hostCallbackRouter_.setPresentation.addListener(
-          this.setPresentation_.bind(this));
-      this.hostCallbackRouter_.loadPage.addListener(
-          this.webviewLoader_.loadPage.bind(this.webviewLoader_));
-
-      this.controller_.bindWebviewHost(this.hostCallbackRouter_.createProxy());
-    },
-
-    /** @override */
-    ready: function() {
-      this.initializeLoginScreen('SupervisionOnboardingScreen', {
-        resetAllowed: true,
-      });
-    },
-
-    /**
-     * @param {!chromeos.supervision.mojom.OnboardingPresentation} presentation
-     * @private
-     */
-    setPresentation_: function(presentation) {
-      this.hideContent_ = presentation.state !=
-          chromeos.supervision.mojom.OnboardingPresentationState.kReady;
-      this.hideRetryDialog_ = presentation.state !=
-          chromeos.supervision.mojom.OnboardingPresentationState
-              .kPageLoadFailed;
-      this.hideLoadingDialog_ = presentation.state !=
-          chromeos.supervision.mojom.OnboardingPresentationState.kLoading;
-
-      this.hideBackButton_ = !presentation.canShowPreviousPage;
-      this.hideSkipButton_ = !presentation.canSkipFlow;
-      this.hideNextButton_ = !presentation.canShowNextPage;
-      this.hideRetryButton_ = !presentation.canRetryPageLoad;
-    },
-
-    /** @private */
-    onBack_: function() {
-      this.controller_.handleAction(
-          chromeos.supervision.mojom.OnboardingAction.kShowPreviousPage);
-    },
-
-    /** @private */
-    onSkip_: function() {
-      this.controller_.handleAction(
-          chromeos.supervision.mojom.OnboardingAction.kSkipFlow);
-    },
-
-    /** @private */
-    onNext_: function() {
-      this.controller_.handleAction(
-          chromeos.supervision.mojom.OnboardingAction.kShowNextPage);
-    },
-
-    /** @private */
-    onRetry_: function() {
-      this.controller_.handleAction(
-          chromeos.supervision.mojom.OnboardingAction.kRetryPageLoad);
-    },
-  });
-}
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/back.svg b/chrome/browser/resources/chromeos/switch_access/icons/back.svg
index dca36f3..6d3ce94 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/back.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/back.svg
@@ -1,3 +1,7 @@
+<!-- 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. -->
+
 <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FFFFFF">
     <path fill="none" d="M0 0h24v24H0V0z"/>
     <path d="M19 15l-6 6-1.42-1.42L15.17 16H4V4h2v10h9.17l-3.59-3.58L13 9l6 6z"/>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/decrement.svg b/chrome/browser/resources/chromeos/switch_access/icons/decrement.svg
index c7135019..1fe4eec2 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/decrement.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/decrement.svg
@@ -1,4 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FFFFFF">
-    <path fill="none" d="M0 0h24v24H0V0z"/>
-    <path fill="#FFFFFF" d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/>
-</svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m14 9v2h-8v-2zm-4-7c-4.424 0-8 3.576-8 8s3.576 8 8 8 8-3.576 8-8-3.576-8-8-8zm0 14c-3.3075 0-6-2.6925-6-6s2.6925-6 6-6 6 2.6925 6 6-2.6925 6-6 6z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/dictation.svg b/chrome/browser/resources/chromeos/switch_access/icons/dictation.svg
index b2087ec6..ef8dd11 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/dictation.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/dictation.svg
@@ -1,6 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
-  <g fill="none" fill-rule="evenodd">
-    <polygon points="0 0 40 0 40 40 0 40"/>
-    <path fill="#fff" d="M24.4121429,20 C24.4121429,22.7666667 22.2271429,25 19.5,25 C16.7728571,25 14.5714286,22.7666667 14.5714286,20 L14.5714286,10 C14.5714286,7.23333333 16.7728571,5 19.5,5 C22.2271429,5 24.4285714,7.23333333 24.4285714,10 L24.4121429,20 Z M19.5,7.5 C18.1192881,7.5 17,8.61928813 17,10 L17,20 C17,21.3807119 18.1192881,22.5 19.5,22.5 C20.8807119,22.5 22,21.3807119 22,20 L22,10 C22,8.61928813 20.8807119,7.5 19.5,7.5 Z M28,20 C28,25.0526316 24.0342857,28.5789474 19.5,28.5789474 C14.9657143,28.5789474 11,25.0526316 11,20 L8,20 C8,25.76 12.6114286,30.6505263 18,31.4757895 L18,37 L21,37 L21,31.4757895 C26.3885714,30.6673684 31,25.76 31,20 L28,20 Z"/>
-  </g>
-</svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m12.5628571 9.5c0 1.3833333-1.14 2.5-2.5628571 2.5-1.42285714 0-2.57142857-1.1166667-2.57142857-2.5v-5c0-1.38333333 1.14857143-2.5 2.57142857-2.5 1.4228571 0 2.5714286 1.11666667 2.5714286 2.5zm-2.5080475-6c-.5535468 0-1.00349562.44643954-1.00782973.99996935l-.03915017 5.0000613c-.00002028.0025895-.00003041.00517906-.00003041.00776864 0 .54797731.44422339.99220071.99220071.99220071.5535468 0 1.0034956-.4464395 1.0078297-.99996935l.0391502-5.0000613c.0000202-.0025895.0000304-.00517906.0000304-.00776864 0-.54797732-.4442234-.99220071-.9922007-.99220071zm-.0548096 10.3736842c-2.36571429 0-4.54285714-1.768421-4.54285714-4.29473683h-1.45714286c0 2.88000003 2.33142857 5.24631583 5.14285714 5.65894733v2.7621053h1.71428576v-2.7621053c2.8114285-.4042105 5.1428571-2.7789473 5.1428571-5.65894733h-1.4571429c0 2.52631583-2.1771428 4.29473683-4.5428571 4.29473683z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/increment.svg b/chrome/browser/resources/chromeos/switch_access/icons/increment.svg
index 73b6b553..05129d68 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/increment.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/increment.svg
@@ -1,4 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FFFFFF">
-    <path fill="none" d="M0 0h24v24H0V0z"/>
-    <path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/>
-</svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m14 9v2h-3v3h-2v-3h-3v-2h3v-3h2v3zm-4-7c-4.424 0-8 3.576-8 8s3.576 8 8 8 8-3.576 8-8-3.576-8-8-8zm0 14c-3.3075 0-6-2.6925-6-6s2.6925-6 6-6 6 2.6925 6 6-2.6925 6-6 6z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/keyboard.svg b/chrome/browser/resources/chromeos/switch_access/icons/keyboard.svg
index 6885201..56f56a3 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/keyboard.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/keyboard.svg
@@ -1 +1,5 @@
+<!-- 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. -->
+
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0zm0 0h24v24H0V0z"/><path fill="white" d="M20 7v10H4V7h16m0-2H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2zm0 3h2v2h-2zM8 8h2v2H8zm0 3h2v2H8zm-3 0h2v2H5zm0-3h2v2H5zm3 6h8v2H8zm6-3h2v2h-2zm0-3h2v2h-2zm3 3h2v2h-2zm0-3h2v2h-2z"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/options.svg b/chrome/browser/resources/chromeos/switch_access/icons/options.svg
index af87651d..a1111e5 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/options.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/options.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><path fill="none" d="M0 0h20v20H0V0z"/><path fill="#fff" d="M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m14 10c0-1.104.896-2 2-2 1.105 0 2 .896 2 2 0 1.105-.895 2-2 2-1.104 0-2-.895-2-2zm-2 0c0 1.105-.895 2-2 2-1.104 0-2-.895-2-2 0-1.104.896-2 2-2 1.105 0 2 .896 2 2zm-6 0c0 1.105-.895 2-2 2-1.104 0-2-.895-2-2 0-1.104.896-2 2-2 1.105 0 2 .896 2 2z" fill="#5f6368" fill-rule="evenodd" transform="matrix(0 1 -1 0 20 0)"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/scrollDownOrForward.svg b/chrome/browser/resources/chromeos/switch_access/icons/scrollDownOrForward.svg
index 96b5e5da..099c833 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/scrollDownOrForward.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/scrollDownOrForward.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="white" d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"/><path fill="none" d="M0 0h24v24H0V0z"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m11 9.71012132 1.872-1.95466677 1.128 1.15363636-4 4.09090909-4-4.09090909 1.128-1.15363636 1.872 1.87363481v-6.62908936h2zm3 7.28987868h-8v-2h8z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/scrollLeft.svg b/chrome/browser/resources/chromeos/switch_access/icons/scrollLeft.svg
index fef8f907..99c3b2c 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/scrollLeft.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/scrollLeft.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="white" d="M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"/><path fill="none" d="M0 0h24v24H0V0z"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m10.2898787 11 1.9546668 1.872-1.1536364 1.128-4.0909091-4 4.0909091-4 1.1536364 1.128-1.8736349 1.872h6.6290894v2zm-7.2898787 3v-8h2v8z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/scrollRight.svg b/chrome/browser/resources/chromeos/switch_access/icons/scrollRight.svg
index 506f890..95b4116 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/scrollRight.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/scrollRight.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="white" d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/><path fill="none" d="M0 0h24v24H0V0z"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m11 9.71012132 1.872-1.95466677 1.128 1.15363636-4 4.09090909-4-4.09090909 1.128-1.15363636 1.872 1.87363481v-6.62908936h2zm3 7.28987868h-8v-2h8z" fill="#5f6368" fill-rule="evenodd" transform="matrix(0 -1 1 0 0 20)"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/scrollUpOrBackward.svg b/chrome/browser/resources/chromeos/switch_access/icons/scrollUpOrBackward.svg
index 6324b7d..0fe61678 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/scrollUpOrBackward.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/scrollUpOrBackward.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="white" d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m9 10.2898787-1.872 1.9546668-1.128-1.1536364 4-4.0909091 4 4.0909091-1.128 1.1536364-1.872-1.8736349v6.6290894h-2zm-3-7.2898787h8v2h-8z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/select.svg b/chrome/browser/resources/chromeos/switch_access/icons/select.svg
index b6e598b..a90933e 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/select.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/select.svg
@@ -1 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><defs><path fill="white" id="a" d="M0 0h24v24H0V0z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><path fill="white" d="M9 11.24V7.5C9 6.12 10.12 5 11.5 5S14 6.12 14 7.5v3.74c1.21-.81 2-2.18 2-3.74C16 5.01 13.99 3 11.5 3S7 5.01 7 7.5c0 1.56.79 2.93 2 3.74zm9.84 4.63l-4.54-2.26c-.17-.07-.35-.11-.54-.11H13v-6c0-.83-.67-1.5-1.5-1.5S10 6.67 10 7.5v10.74l-3.43-.72c-.08-.01-.15-.03-.24-.03-.31 0-.59.13-.79.33l-.79.8 4.94 4.94c.27.27.65.44 1.06.44h6.79c.75 0 1.33-.55 1.44-1.28l.75-5.27c.01-.07.02-.14.02-.2 0-.62-.38-1.16-.91-1.38z" clip-path="url(#b)"/></svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m3 3h2v2h-2zm0 4h2v2h-2zm0 4h2v2h-2zm0 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm0-4h2v2h-2zm0-4h2v2h-2zm0-4h2v2h-2zm-4 0h2v2h-2zm-4 0h2v2h-2z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/showContextMenu.svg b/chrome/browser/resources/chromeos/switch_access/icons/showContextMenu.svg
index 706db26d..eea6f9b 100644
--- a/chrome/browser/resources/chromeos/switch_access/icons/showContextMenu.svg
+++ b/chrome/browser/resources/chromeos/switch_access/icons/showContextMenu.svg
@@ -1,4 +1,5 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FFFFFF">
-    <path d="M0 0h24v24H0z" fill="none"/>
-    <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
-</svg>
+<!-- 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. -->
+
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m5 2h10c1.1045695 0 2 .8954305 2 2v12c0 1.1045695-.8954305 2-2 2h-10c-1.1045695 0-2-.8954305-2-2v-12c0-1.1045695.8954305-2 2-2zm0 2v12h10v-12zm2 2h6v2h-6zm0 3h6v2h-6zm0 3h4v2h-4z" fill="#5f6368" fill-rule="evenodd"/></svg>
diff --git a/chrome/browser/resources/extensions/manager.js b/chrome/browser/resources/extensions/manager.js
index 6095756..00a298ba 100644
--- a/chrome/browser/resources/extensions/manager.js
+++ b/chrome/browser/resources/extensions/manager.js
@@ -521,6 +521,9 @@
         });
       }
 
+      document.title = toPage == Page.DETAILS ?
+          `${loadTimeData.getString('title')} - ${this.detailViewItem_.name}` :
+          loadTimeData.getString('title');
       this.currentPage_ = newPage;
     },
 
diff --git a/chrome/browser/resources/print_preview/ui/advanced_settings_item.html b/chrome/browser/resources/print_preview/ui/advanced_settings_item.html
index 0b063c9..06a4b7e 100644
--- a/chrome/browser/resources/print_preview/ui/advanced_settings_item.html
+++ b/chrome/browser/resources/print_preview/ui/advanced_settings_item.html
@@ -48,6 +48,7 @@
       }
 
       .value > * {
+        display: flex;
         margin-inline-start: 10px;
       }
 
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index b2470f3..90c81d1 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -113,7 +113,6 @@
       "date_time_page:closure_compile",
       "device_page:closure_compile",
       "internet_page:closure_compile",
-      "kiosk_next_shell_page:closure_compile",
       "multidevice_page:closure_compile",
       "parental_controls_page:closure_compile",
       "plugin_vm_page:closure_compile",
diff --git a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
index 27b10e48..646f337 100644
--- a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
@@ -115,8 +115,7 @@
     </settings-toggle-button>
     <settings-toggle-button
         pref="{{prefs.settings.a11y.virtual_keyboard}}"
-        label="$i18n{onScreenKeyboardLabel}"
-        hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]">
+        label="$i18n{onScreenKeyboardLabel}">
     </settings-toggle-button>
     <settings-toggle-button
         pref="{{prefs.settings.a11y.dictation}}"
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index 3dbb638..4dbac5e 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -23,7 +23,6 @@
 <link rel="import" href="../bluetooth_page/bluetooth_page.html">
 <link rel="import" href="../crostini_page/crostini_page.html">
 <link rel="import" href="../plugin_vm_page/plugin_vm_page.html">
-<link rel="import" href="../kiosk_next_shell_page/kiosk_next_shell_page.html">
 <link rel="import" href="../device_page/device_page.html">
 <link rel="import" href="../internet_page/internet_page.html">
 <link rel="import" href="../multidevice_page/multidevice_page.html">
@@ -216,14 +215,6 @@
             </settings-android-apps-page>
           </settings-section>
         </template>
-        <template is="dom-if" if="[[showKioskNextShell]]" restamp>
-          <settings-section
-              page-title="$i18n{kioskNextShellPageTitle}"
-              section="kiosk-next-shell">
-            <settings-kiosk-next-shell-page prefs="{{prefs}}">
-            </settings-kiosk-next-shell-page>
-          </settings-section>
-        </template>
         <template is="dom-if" if="[[showCrostini]]" restamp>
           <settings-section page-title="$i18n{crostiniPageTitle}"
               section="crostini">
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
new file mode 100644
index 0000000..efbf96b0
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
@@ -0,0 +1,26 @@
+# 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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+  deps = [
+    ":os_about_page",
+  ]
+}
+
+js_library("os_about_page") {
+  deps = [
+    "../..:lifetime_browser_proxy",
+    "../..:route",
+    "../../about_page:about_page_browser_proxy",
+    "../../settings_page:main_page_behavior",
+    "../../settings_page:settings_animated_pages",
+    "//ui/webui/resources/js:assert",
+    "//ui/webui/resources/js:i18n_behavior",
+    "//ui/webui/resources/js:parse_html_subset",
+    "//ui/webui/resources/js:web_ui_listener_behavior",
+  ]
+  externs_list = [ "$externs_path/web_animations.js" ]
+}
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
new file mode 100644
index 0000000..254d501
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -0,0 +1,224 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="../../about_page/about_page_browser_proxy.html">
+<link rel="import" href="../../about_page/detailed_build_info.html">
+<link rel="import" href="../../about_page/update_warning_dialog.html">
+<link rel="import" href="../../i18n_setup.html">
+<link rel="import" href="../../icons.html">
+<link rel="import" href="../../lifetime_browser_proxy.html">
+<link rel="import" href="../../prefs/prefs.html">
+<link rel="import" href="../../route.html">
+<link rel="import" href="../../settings_page/main_page_behavior.html">
+<link rel="import" href="../../settings_page/settings_animated_pages.html">
+<link rel="import" href="../../settings_page/settings_section.html">
+<link rel="import" href="../../settings_page/settings_subpage.html">
+<link rel="import" href="../../settings_page_css.html">
+<link rel="import" href="../../settings_shared_css.html">
+<link rel="import" href="../os_reset_page/os_powerwash_dialog.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html">
+<link rel="import" href="chrome://resources/cr_elements/icons.html">
+<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+
+<dom-module id="os-settings-about-page">
+  <template>
+    <style include="settings-shared settings-page-styles">
+      :host {
+        --about-page-image-space: 10px;
+      }
+
+      .info-section {
+        margin-bottom: 12px;
+      }
+
+      .padded {
+        padding-bottom: 10px;
+        padding-top: 10px;
+      }
+
+      .product-title {
+        font-size: 153.85%;  /* 20px / 13px */
+        font-weight: 400;
+        margin-bottom: auto;
+        margin-top: auto;
+      }
+
+      img {
+        margin-inline-end: var(--about-page-image-space);
+      }
+
+      .icon-container {
+        margin-inline-end: var(--about-page-image-space);
+        min-width: 32px;  /* The width of the product-logo img. */
+        text-align: center;
+      }
+
+      iron-icon[icon='settings:check-circle'] {
+        fill: var(--cr-checked-color);
+      }
+
+      iron-icon[icon='cr:error'] {
+        fill: var(--settings-error-color);
+      }
+
+      .settings-box .start {
+        overflow-x: auto;
+      }
+
+      cr-button {
+        white-space: nowrap;
+      }
+
+      #regulatoryInfo img {
+        width: 330px;
+      }
+    </style>
+    <settings-section page-title="$i18n{aboutPageTitle}" section="about">
+      <settings-animated-pages id="pages" section="about"
+          focus-config="[[focusConfig_]]">
+        <div route-path="default">
+          <div class="settings-box two-line first">
+            <img id="product-logo" on-click="onProductLogoClick_"
+                srcset="chrome://theme/current-channel-logo@1x 1x,
+                        chrome://theme/current-channel-logo@2x 2x"
+                alt="$i18n{aboutProductLogoAlt}">
+            <h1 class="product-title">$i18n{aboutProductTitle}</h1>
+          </div>
+          <div class="settings-box two-line">
+            <!-- TODO(dpapad): Investigate why vulcanize does not handle well
+              a new line after "getThrobberSrcIfUpdating_(", causes incorrect
+              src URL -->
+            <!-- Set the icon from the iconset (when it's obsolete/EOL and
+              when update is done) or set the src (when it's updating). -->
+            <div class="icon-container"
+                hidden="[[!shouldShowIcons_(showUpdateStatus_)]]">
+              <iron-icon
+                  icon$="[[getUpdateStatusIcon_(
+                      hasEndOfLife_, currentUpdateStatusEvent_)]]"
+                  src="[[getThrobberSrcIfUpdating_(hasEndOfLife_, currentUpdateStatusEvent_)]]">
+              </iron-icon>
+            </div>
+            <div class="start padded">
+              <div id="updateStatusMessage" hidden="[[!showUpdateStatus_]]">
+                <div
+                    inner-h-t-m-l="[[getUpdateStatusMessage_(
+                        currentUpdateStatusEvent_, targetChannel_)]]"></div>
+                <a hidden$="[[!shouldShowLearnMoreLink_(
+                    currentUpdateStatusEvent_)]]" target="_blank"
+                    href="https://support.google.com/chrome?p=update_error">
+                  $i18n{learnMore}
+                </a>
+              </div>
+             <div id="endOfLifeMessageContainer" hidden="[[!hasEndOfLife_]]">
+               $i18n{endOfLifeMessage}
+               <a href="$i18n{endOfLifeLearnMoreURL}" target="_blank">
+                 $i18n{learnMore}
+               </a>
+             </div>
+              <div class="secondary">$i18n{aboutBrowserVersion}</div>
+            </div>
+            <div class="separator" hidden="[[!showButtonContainer_]]"></div>
+            <span id="buttonContainer" hidden="[[!showButtonContainer_]]">
+              <cr-button id="relaunch" hidden="[[!showRelaunch_]]"
+                  on-click="onRelaunchClick_">
+                $i18n{aboutRelaunch}
+              </cr-button>
+              <cr-button id="relaunchAndPowerwash"
+                  hidden="[[!showRelaunchAndPowerwash_]]"
+                  on-click="onRelaunchAndPowerwashClick_">
+                $i18n{aboutRelaunchAndPowerwash}
+              </cr-button>
+              <cr-button id="checkForUpdates" hidden="[[!showCheckUpdates_]]"
+                  on-click="onCheckUpdatesClick_">
+                $i18n{aboutCheckForUpdates}
+              </cr-button>
+            </span>
+          </div>
+          <div id="aboutTPMFirmwareUpdate" class="settings-box two-line"
+              hidden$="[[!showTPMFirmwareUpdateLineItem_]]"
+              on-click="onTPMFirmwareUpdateClick_" actionable>
+            <div class="start">
+              <div>$i18n{aboutTPMFirmwareUpdateTitle}</div>
+              <div class="secondary">
+                $i18n{aboutTPMFirmwareUpdateDescription}
+                <a href="$i18n{aboutTPMFirmwareUpdateLearnMoreURL}"
+                    target="_blank" on-click="onLearnMoreClick_">
+                  $i18n{learnMore}
+                </a>
+              </div>
+            </div>
+            <cr-icon-button class="subpage-arrow"
+                aria-labelledby="aboutTPMFirmwareUpdate"></cr-icon-button>
+          </div>
+          <cr-link-row class="hr" id="help" on-click="onHelpClick_"
+              label="$i18n{aboutGetHelpUsingChrome}" external></cr-link-row>
+<if expr="_google_chrome">
+          <cr-link-row class="hr" id="reportIssue"
+              on-click="onReportIssueClick_"
+              hidden="[[!prefs.feedback_allowed.value]]"
+              label="$i18n{aboutReportAnIssue}"></cr-link-row>
+</if>
+          <cr-link-row class="hr" id="detailed-build-info-trigger"
+              on-click="onDetailedBuildInfoClick_"
+              label="$i18n{aboutDetailedBuildInfo}"></cr-link-row>
+          <cr-link-row class="hr" on-click="onManagementPageClick_"
+              start-icon="cr:domain" label="$i18n{managementPage}"
+              hidden$="[[!isManaged_]]" external></cr-link-row>
+        </div>
+        <template is="dom-if" route-path="/help/details">
+          <settings-subpage page-title="$i18n{aboutDetailedBuildInfo}">
+            <settings-detailed-build-info></settings-detailed-build-info>
+          </settings-subpage>
+        </template>
+      </settings-animated-pages>
+    </settings-section>
+
+    <settings-section>
+      <div class="settings-box padded block first">
+        <div class="info-section">
+          <div class="secondary">$i18n{aboutProductTitle}</div>
+          <div class="secondary">$i18n{aboutProductCopyright}</div>
+        </div>
+
+        <div class="info-section">
+          <div class="secondary">$i18nRaw{aboutProductLicense}</div>
+          <div class="secondary"
+              inner-h-t-m-l="[[getAboutProductOsLicense_(
+                  showCrostiniLicense_)]]">
+          </div>
+        </div>
+<if expr="_google_chrome">
+        <div class="secondary">$i18nRaw{aboutProductTos}</div>
+</if>
+      </div>
+      <div class="settings-box padded block" id="regulatoryInfo"
+          hidden$="[[!shouldShowRegulatoryOrSafetyInfo_(regulatoryInfo_)]]">
+<if expr="_google_chrome">
+        <div class="secondary" hidden$="[[!shouldShowSafetyInfo_()]]">
+          <a target="_blank" href="$i18n{aboutProductSafetyURL}">
+            $i18nRaw{aboutProductSafety}
+          </a>
+        </div>
+</if>
+        <img src="[[regulatoryInfo_.url]]" alt="[[regulatoryInfo_.text]]"
+            hidden$="[[!shouldShowRegulatoryInfo_(regulatoryInfo_)]]">
+      </div>
+    </settings-section>
+    <template is="dom-if" if="[[showUpdateWarningDialog_]]" restamp>
+      <settings-update-warning-dialog update-info="[[updateInfo_]]"
+          on-close="onUpdateWarningDialogClose_">
+      </settings-update-warning-dialog>
+    </template>
+    <template is="dom-if" if="[[showTPMFirmwareUpdateDialog_]]"
+        restamp>
+      <os-settings-powerwash-dialog request-tpm-firmware-update
+          on-close="onPowerwashDialogClose_">
+      </os-settings-powerwash-dialog>
+    </template>
+  </template>
+  <script src="os_about_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
new file mode 100644
index 0000000..9a837df5
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -0,0 +1,572 @@
+// 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.
+
+/**
+ * @fileoverview 'settings-about-page' contains version and OS related
+ * information.
+ */
+
+Polymer({
+  is: 'os-settings-about-page',
+
+  behaviors: [
+    WebUIListenerBehavior,
+    settings.MainPageBehavior,
+    settings.RouteObserverBehavior,
+    I18nBehavior,
+  ],
+
+  properties: {
+    /** @private {?UpdateStatusChangedEvent} */
+    currentUpdateStatusEvent_: {
+      type: Object,
+      value: {
+        message: '',
+        progress: 0,
+        rollback: false,
+        status: UpdateStatus.DISABLED
+      },
+    },
+
+    /**
+     * Whether the browser/ChromeOS is managed by their organization
+     * through enterprise policies.
+     * @private
+     */
+    isManaged_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('isManaged');
+      },
+    },
+
+    /** @private */
+    hasCheckedForUpdates_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private {!BrowserChannel} */
+    currentChannel_: String,
+
+    /** @private {!BrowserChannel} */
+    targetChannel_: String,
+
+    /** @private {?RegulatoryInfo} */
+    regulatoryInfo_: Object,
+
+    /** @private */
+    hasEndOfLife_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showCrostini: Boolean,
+
+    /** @private */
+    showCrostiniLicense_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showUpdateStatus_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showButtonContainer_: Boolean,
+
+    /** @private */
+    showRelaunch_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showRelaunchAndPowerwash_: {
+      type: Boolean,
+      value: false,
+      computed: 'computeShowRelaunchAndPowerwash_(' +
+          'currentUpdateStatusEvent_, targetChannel_, currentChannel_)',
+    },
+
+    /** @private */
+    showCheckUpdates_: {
+      type: Boolean,
+      computed: 'computeShowCheckUpdates_(' +
+          'currentUpdateStatusEvent_, hasCheckedForUpdates_, hasEndOfLife_)',
+    },
+
+    /** @private {!Map<string, string>} */
+    focusConfig_: {
+      type: Object,
+      value: function() {
+        const map = new Map();
+        if (settings.routes.DETAILED_BUILD_INFO) {
+          map.set(
+              settings.routes.DETAILED_BUILD_INFO.path,
+              '#detailed-build-info-trigger');
+        }
+        return map;
+      },
+    },
+
+    /** @private */
+    showUpdateWarningDialog_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showTPMFirmwareUpdateLineItem_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    showTPMFirmwareUpdateDialog_: Boolean,
+
+    /** @private {!AboutPageUpdateInfo|undefined} */
+    updateInfo_: Object,
+  },
+
+  observers: [
+    'updateShowUpdateStatus_(' +
+        'hasEndOfLife_, currentUpdateStatusEvent_,' +
+        'hasCheckedForUpdates_)',
+    'updateShowRelaunch_(currentUpdateStatusEvent_, targetChannel_,' +
+        'currentChannel_)',
+    'updateShowButtonContainer_(' +
+        'showRelaunch_, showRelaunchAndPowerwash_, showCheckUpdates_)',
+    'handleCrostiniEnabledChanged_(prefs.crostini.enabled.value)',
+  ],
+
+  /** @private {?settings.AboutPageBrowserProxy} */
+  aboutBrowserProxy_: null,
+
+  /** @private {?settings.LifetimeBrowserProxy} */
+  lifetimeBrowserProxy_: null,
+
+  /** @override */
+  attached: function() {
+    this.aboutBrowserProxy_ = settings.AboutPageBrowserProxyImpl.getInstance();
+    this.aboutBrowserProxy_.pageReady();
+
+    this.lifetimeBrowserProxy_ =
+        settings.LifetimeBrowserProxyImpl.getInstance();
+
+    this.addEventListener('target-channel-changed', e => {
+      this.targetChannel_ = e.detail;
+    });
+
+    this.aboutBrowserProxy_.getChannelInfo().then(info => {
+      this.currentChannel_ = info.currentChannel;
+      this.targetChannel_ = info.targetChannel;
+      this.startListening_();
+    });
+
+    this.aboutBrowserProxy_.getRegulatoryInfo().then(info => {
+      this.regulatoryInfo_ = info;
+    });
+
+    this.aboutBrowserProxy_.getHasEndOfLife().then(result => {
+      this.hasEndOfLife_ = result;
+    });
+
+    if (settings.getQueryParameters().get('checkForUpdate') == 'true') {
+      this.onCheckUpdatesClick_();
+    }
+  },
+
+  /**
+   * @param {!settings.Route} newRoute
+   * @param {settings.Route} oldRoute
+   */
+  currentRouteChanged: function(newRoute, oldRoute) {
+    settings.MainPageBehavior.currentRouteChanged.call(
+        this, newRoute, oldRoute);
+  },
+
+  // Override settings.MainPageBehavior method.
+  containsRoute: function(route) {
+    return !route || settings.routes.ABOUT.contains(route);
+  },
+
+  /** @private */
+  startListening_: function() {
+    this.addWebUIListener(
+        'update-status-changed', this.onUpdateStatusChanged_.bind(this));
+    this.aboutBrowserProxy_.refreshUpdateStatus();
+    this.addWebUIListener(
+        'tpm-firmware-update-status-changed',
+        this.onTPMFirmwareUpdateStatusChanged_.bind(this));
+    this.aboutBrowserProxy_.refreshTPMFirmwareUpdateStatus();
+  },
+
+  /**
+   * @param {!UpdateStatusChangedEvent} event
+   * @private
+   */
+  onUpdateStatusChanged_: function(event) {
+    if (event.status == UpdateStatus.CHECKING) {
+      this.hasCheckedForUpdates_ = true;
+    } else if (event.status == UpdateStatus.NEED_PERMISSION_TO_UPDATE) {
+      this.showUpdateWarningDialog_ = true;
+      this.updateInfo_ = {version: event.version, size: event.size};
+    }
+    this.currentUpdateStatusEvent_ = event;
+  },
+
+  /**
+   * @param {!Event} event
+   * @private
+   */
+  onLearnMoreClick_: function(event) {
+    // Stop the propagation of events, so that clicking on links inside
+    // actionable items won't trigger action.
+    event.stopPropagation();
+  },
+
+  /** @private */
+  onHelpClick_: function() {
+    this.aboutBrowserProxy_.openHelpPage();
+  },
+
+  /** @private */
+  onRelaunchClick_: function() {
+    this.lifetimeBrowserProxy_.relaunch();
+  },
+
+  /** @private */
+  updateShowUpdateStatus_: function() {
+    // Do not show the "updated" status if we haven't checked yet or the update
+    // warning dialog is shown to user.
+    if (this.currentUpdateStatusEvent_.status == UpdateStatus.UPDATED &&
+        (!this.hasCheckedForUpdates_ || this.showUpdateWarningDialog_)) {
+      this.showUpdateStatus_ = false;
+      return;
+    }
+
+    // Do not show "updated" status if the device is end of life.
+    if (this.hasEndOfLife_) {
+      this.showUpdateStatus_ = false;
+      return;
+    }
+
+    this.showUpdateStatus_ =
+        this.currentUpdateStatusEvent_.status != UpdateStatus.DISABLED;
+  },
+
+  /**
+   * Hide the button container if all buttons are hidden, otherwise the
+   * container displays an unwanted border (see separator class).
+   * @private
+   */
+  updateShowButtonContainer_: function() {
+    this.showButtonContainer_ = this.showRelaunch_ ||
+        this.showRelaunchAndPowerwash_ || this.showCheckUpdates_;
+  },
+
+  /** @private */
+  updateShowRelaunch_: function() {
+    this.showRelaunch_ =
+        this.checkStatus_(UpdateStatus.NEARLY_UPDATED) && !this.isRollback_();
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowLearnMoreLink_: function() {
+    return this.currentUpdateStatusEvent_.status == UpdateStatus.FAILED;
+  },
+
+  /**
+   * @return {string}
+   * @private
+   */
+  getUpdateStatusMessage_: function() {
+    switch (this.currentUpdateStatusEvent_.status) {
+      case UpdateStatus.CHECKING:
+      case UpdateStatus.NEED_PERMISSION_TO_UPDATE:
+        return this.i18nAdvanced('aboutUpgradeCheckStarted');
+      case UpdateStatus.NEARLY_UPDATED:
+        if (this.currentChannel_ != this.targetChannel_) {
+          return this.i18nAdvanced('aboutUpgradeSuccessChannelSwitch');
+        }
+        if (this.currentUpdateStatusEvent_.rollback) {
+          return this.i18nAdvanced('aboutRollbackSuccess');
+        }
+        return this.i18nAdvanced('aboutUpgradeRelaunch');
+      case UpdateStatus.UPDATED:
+        return this.i18nAdvanced('aboutUpgradeUpToDate');
+      case UpdateStatus.UPDATING:
+        assert(typeof this.currentUpdateStatusEvent_.progress == 'number');
+        const progressPercent = this.currentUpdateStatusEvent_.progress + '%';
+
+        if (this.currentChannel_ != this.targetChannel_) {
+          return this.i18nAdvanced('aboutUpgradeUpdatingChannelSwitch', {
+            substitutions: [
+              this.i18nAdvanced(
+                  settings.browserChannelToI18nId(this.targetChannel_)),
+              progressPercent
+            ]
+          });
+        }
+        if (this.currentUpdateStatusEvent_.rollback) {
+          return this.i18nAdvanced('aboutRollbackInProgress', {
+            substitutions: [progressPercent],
+          });
+        }
+        if (this.currentUpdateStatusEvent_.progress > 0) {
+          // NOTE(dbeam): some platforms (i.e. Mac) always send 0% while
+          // updating (they don't support incremental upgrade progress). Though
+          // it's certainly quite possible to validly end up here with 0% on
+          // platforms that support incremental progress, nobody really likes
+          // seeing that they're 0% done with something.
+          return this.i18nAdvanced('aboutUpgradeUpdatingPercent', {
+            substitutions: [progressPercent],
+          });
+        }
+        return this.i18nAdvanced('aboutUpgradeUpdating');
+      default:
+        function formatMessage(msg) {
+          return parseHtmlSubset('<b>' + msg + '</b>', ['br', 'pre'])
+              .firstChild.innerHTML;
+        }
+        let result = '';
+        const message = this.currentUpdateStatusEvent_.message;
+        if (message) {
+          result += formatMessage(message);
+        }
+        const connectMessage = this.currentUpdateStatusEvent_.connectionTypes;
+        if (connectMessage) {
+          result += '<div>' + formatMessage(connectMessage) + '</div>';
+        }
+        return result;
+    }
+  },
+
+  /**
+   * @return {?string}
+   * @private
+   */
+  getUpdateStatusIcon_: function() {
+    // If Chrome OS has reached end of life, display a special icon and
+    // ignore UpdateStatus.
+    if (this.hasEndOfLife_) {
+      return 'settings:end-of-life';
+    }
+
+    switch (this.currentUpdateStatusEvent_.status) {
+      case UpdateStatus.DISABLED_BY_ADMIN:
+        return 'cr20:domain';
+      case UpdateStatus.FAILED:
+        return 'cr:error';
+      case UpdateStatus.UPDATED:
+      case UpdateStatus.NEARLY_UPDATED:
+        return 'settings:check-circle';
+      default:
+        return null;
+    }
+  },
+
+  /**
+   * @return {?string}
+   * @private
+   */
+  getThrobberSrcIfUpdating_: function() {
+    if (this.hasEndOfLife_) {
+      return null;
+    }
+
+    switch (this.currentUpdateStatusEvent_.status) {
+      case UpdateStatus.CHECKING:
+      case UpdateStatus.UPDATING:
+        return 'chrome://resources/images/throbber_small.svg';
+      default:
+        return null;
+    }
+  },
+
+  /**
+   * @param {!UpdateStatus} status
+   * @return {boolean}
+   * @private
+   */
+  checkStatus_: function(status) {
+    return this.currentUpdateStatusEvent_.status == status;
+  },
+
+  /** @private */
+  onManagementPageClick_: function() {
+    window.open('chrome://management');
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  isRollback_: function() {
+    assert(this.currentChannel_.length > 0);
+    assert(this.targetChannel_.length > 0);
+    if (this.currentUpdateStatusEvent_.rollback) {
+      return true;
+    }
+    // Channel switch to a more stable channel is also a rollback
+    return settings.isTargetChannelMoreStable(
+        this.currentChannel_, this.targetChannel_);
+  },
+
+  /** @private */
+  onDetailedBuildInfoClick_: function() {
+    settings.navigateTo(settings.routes.DETAILED_BUILD_INFO);
+  },
+
+  /** @private */
+  onRelaunchAndPowerwashClick_: function() {
+    if (this.currentUpdateStatusEvent_.rollback) {
+      // Wipe already initiated, simply relaunch.
+      this.lifetimeBrowserProxy_.relaunch();
+    } else {
+      this.lifetimeBrowserProxy_.factoryReset(
+          /* requestTpmFirmwareUpdate= */ false);
+    }
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  computeShowRelaunchAndPowerwash_: function() {
+    return this.checkStatus_(UpdateStatus.NEARLY_UPDATED) && this.isRollback_();
+  },
+
+  /** @private */
+  onCheckUpdatesClick_: function() {
+    this.onUpdateStatusChanged_({status: UpdateStatus.CHECKING});
+    this.aboutBrowserProxy_.requestUpdate();
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  computeShowCheckUpdates_: function() {
+    // Disable update button if the device is end of life.
+    if (this.hasEndOfLife_) {
+      return false;
+    }
+
+    // Enable the update button if we are in a stale 'updated' status or
+    // update has failed. Disable it otherwise.
+    const staleUpdatedStatus =
+        !this.hasCheckedForUpdates_ && this.checkStatus_(UpdateStatus.UPDATED);
+
+    return staleUpdatedStatus || this.checkStatus_(UpdateStatus.FAILED);
+  },
+
+  /**
+   * @param {boolean} showCrostiniLicense True if Crostini is enabled and
+   * Crostini UI is allowed.
+   * @return {string}
+   * @private
+   */
+  getAboutProductOsLicense_: function(showCrostiniLicense) {
+    return showCrostiniLicense ?
+        this.i18nAdvanced('aboutProductOsWithLinuxLicense') :
+        this.i18nAdvanced('aboutProductOsLicense');
+  },
+
+  /**
+   * @param {boolean} enabled True if Crostini is enabled.
+   * @private
+   */
+  handleCrostiniEnabledChanged_: function(enabled) {
+    this.showCrostiniLicense_ = enabled && this.showCrostini;
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowSafetyInfo_: function() {
+    return loadTimeData.getBoolean('shouldShowSafetyInfo');
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowRegulatoryInfo_: function() {
+    return this.regulatoryInfo_ !== null;
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowRegulatoryOrSafetyInfo_: function() {
+    return this.shouldShowSafetyInfo_() || this.shouldShowRegulatoryInfo_();
+  },
+
+  /** @private */
+  onUpdateWarningDialogClose_: function() {
+    this.showUpdateWarningDialog_ = false;
+    // Shows 'check for updates' button in case that the user cancels the
+    // dialog and then intends to check for update again.
+    this.hasCheckedForUpdates_ = false;
+  },
+
+  /**
+   * @param {!TPMFirmwareUpdateStatusChangedEvent} event
+   * @private
+   */
+  onTPMFirmwareUpdateStatusChanged_: function(event) {
+    this.showTPMFirmwareUpdateLineItem_ = event.updateAvailable;
+  },
+
+  /** @private */
+  onTPMFirmwareUpdateClick_: function() {
+    this.showTPMFirmwareUpdateDialog_ = true;
+  },
+
+  /** @private */
+  onPowerwashDialogClose_: function() {
+    this.showTPMFirmwareUpdateDialog_ = false;
+  },
+
+  /** @private */
+  onProductLogoClick_: function() {
+    this.$['product-logo'].animate(
+        {
+          transform: ['none', 'rotate(-10turn)'],
+        },
+        {
+          duration: 500,
+          easing: 'cubic-bezier(1, 0, 0, 1)',
+        });
+  },
+
+  // <if expr="_google_chrome">
+  /** @private */
+  onReportIssueClick_: function() {
+    this.aboutBrowserProxy_.openFeedbackDialog();
+  },
+  // </if>
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowIcons_: function() {
+    if (this.hasEndOfLife_) {
+      return true;
+    }
+    return this.showUpdateStatus_;
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
index 04b4cbd..9124cec4 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
@@ -241,8 +241,7 @@
           </div>
           <settings-toggle-button
               pref="{{prefs.settings.language.ime_menu_activated}}"
-              label="$i18n{showImeMenu}"
-              hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]">
+              label="$i18n{showImeMenu}">
           </settings-toggle-button>
         </iron-collapse>
         <cr-lazy-render id="menu">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
index f6b796ed..2413bab965 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
@@ -7,6 +7,7 @@
 <link rel="import" href="chrome://resources/html/promise_resolver.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+<link rel="import" href="../os_about_page/os_about_page.html">
 <link rel="import" href="../os_settings_page/os_settings_page.html">
 <link rel="import" href="../../i18n_setup.html">
 <link rel="import" href="../../prefs/prefs.html">
@@ -65,7 +66,6 @@
           show-apps="[[showApps]]"
           show-android-apps="[[showAndroidApps]]"
           show-assistant="[[showAssistant]]"
-          show-kiosk-next-shell="[[showKioskNextShell]]"
           show-crostini="[[showCrostini]]"
           show-plugin-vm="[[showPluginVm]]"
           have-play-store-app="[[havePlayStoreApp]]"
@@ -76,6 +76,15 @@
           advanced-toggle-expanded="{{advancedToggleExpanded}}">
       </os-settings-page>
     </template>
+    <template is="dom-if" if="[[showPages_.about]]">
+      <os-settings-about-page role="main"
+          in-search-mode="[[inSearchMode_]]"
+          on-subpage-expand="onShowingSubpage_"
+          on-showing-main-page="onShowingMainPage_"
+          prefs="{{prefs}}"
+          show-crostini="[[showCrostini]]">
+      </os-settings-about-page>
+    </template>
     <div id="overscroll" style="padding-bottom: [[overscroll_]]px"></div>
   </template>
   <script src="os_settings_main.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
index 097833b..66fec66 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
@@ -192,6 +192,7 @@
         </iron-selector>
       </iron-collapse>
       <div id="menuSeparator"></div>
+      <a id="about-menu" href="/help">$i18n{aboutPageTitle}</a>
     </iron-selector>
   </template>
   <script src="os_settings_menu.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
index 48e2fd4..b9419c9a 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -19,7 +19,6 @@
 <link rel="import" href="../../bluetooth_page/bluetooth_page.html">
 <link rel="import" href="../../crostini_page/crostini_page.html">
 <link rel="import" href="../../plugin_vm_page/plugin_vm_page.html">
-<link rel="import" href="../../kiosk_next_shell_page/kiosk_next_shell_page.html">
 <link rel="import" href="../../device_page/device_page.html">
 <link rel="import" href="../../internet_page/internet_page.html">
 <link rel="import" href="../../multidevice_page/multidevice_page.html">
@@ -185,14 +184,6 @@
             </settings-android-apps-page>
           </settings-section>
         </template>
-        <template is="dom-if" if="[[showKioskNextShell]]" restamp>
-          <settings-section
-              page-title="$i18n{kioskNextShellPageTitle}"
-              section="kiosk-next-shell">
-            <settings-kiosk-next-shell-page prefs="{{prefs}}">
-            </settings-kiosk-next-shell-page>
-          </settings-section>
-        </template>
         <template is="dom-if" if="[[showCrostini]]" restamp>
           <settings-section page-title="$i18n{crostiniPageTitle}"
               section="crostini">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
index 243efcf0..7c9807d 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -154,7 +154,6 @@
           show-apps="[[showApps_]]"
           show-android-apps="[[showAndroidApps_]]"
           show-assistant="[[showAssistant_]]"
-          show-kiosk-next-shell="[[showKioskNextShell_]]"
           show-crostini="[[showCrostini_]]"
           show-parental-controls="[[showParentalControls_]]"
           show-plugin-vm="[[showPluginVm_]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
index db637222..8838881 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
@@ -78,9 +78,6 @@
     showAssistant_: Boolean,
 
     /** @private */
-    showKioskNextShell_: Boolean,
-
-    /** @private */
     showCrostini_: Boolean,
 
     /** @private */
@@ -173,8 +170,6 @@
     this.showAndroidApps_ = loadTimeData.getBoolean('androidAppsVisible');
     // Assistant can be disallowed due to flag, policy, locale, etc.
     this.showAssistant_ = loadTimeData.getBoolean('isAssistantAllowed');
-    this.showKioskNextShell_ = loadTimeData.valueExists('showKioskNextShell') &&
-        loadTimeData.getBoolean('showKioskNextShell');
     this.showParentalControls_ =
         loadTimeData.valueExists('showParentalControls') &&
         loadTimeData.getBoolean('showParentalControls');
diff --git a/chrome/browser/resources/settings/device_page/stylus.html b/chrome/browser/resources/settings/device_page/stylus.html
index 6ec8eee..7dad79f 100644
--- a/chrome/browser/resources/settings/device_page/stylus.html
+++ b/chrome/browser/resources/settings/device_page/stylus.html
@@ -35,8 +35,7 @@
     <settings-toggle-button id="enableStylusToolsToggle"
         class="continuation"
         pref="{{prefs.settings.enable_stylus_tools}}"
-        label="$i18n{stylusEnableStylusTools}"
-        hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]">
+        label="$i18n{stylusEnableStylusTools}">
     </settings-toggle-button>
 
     <template is="dom-if" if="[[hasInternalStylus_]]">
@@ -44,8 +43,7 @@
           id ="launchPaletteOnEjectEventToggle"
           pref="{{prefs.settings.launch_palette_on_eject_event}}"
           label="$i18n{stylusAutoOpenStylusTools}"
-          disabled="[[!prefs.settings.enable_stylus_tools.value]]"
-          hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]">
+          disabled="[[!prefs.settings.enable_stylus_tools.value]]">
       </settings-toggle-button>
     </template>
 
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.html b/chrome/browser/resources/settings/internet_page/internet_config.html
index 3313aca..df873613 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.html
+++ b/chrome/browser/resources/settings/internet_page/internet_config.html
@@ -34,7 +34,8 @@
             share-allow-enable="[[shareAllowEnable_]]"
             share-default="[[shareDefault_]]"
             error="{{error_}}"
-            on-close="onClose_">
+            on-close="onClose_"
+            connect-on-enter="[[showConnect]]">
         </network-config>
       </div>
 
diff --git a/chrome/browser/resources/settings/kiosk_next_shell_page/BUILD.gn b/chrome/browser/resources/settings/kiosk_next_shell_page/BUILD.gn
deleted file mode 100644
index bde7e39..0000000
--- a/chrome/browser/resources/settings/kiosk_next_shell_page/BUILD.gn
+++ /dev/null
@@ -1,27 +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.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-js_type_check("closure_compile") {
-  deps = [
-    ":kiosk_next_shell_confirmation_dialog",
-    ":kiosk_next_shell_page",
-  ]
-}
-
-js_library("kiosk_next_shell_page") {
-  deps = [
-    "../prefs:prefs_behavior",
-    "//ui/webui/resources/js:load_time_data",
-  ]
-}
-
-js_library("kiosk_next_shell_confirmation_dialog") {
-  deps = [
-    "..:lifetime_browser_proxy",
-    "../prefs:prefs_behavior",
-    "//ui/webui/resources/js:load_time_data",
-  ]
-}
diff --git a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.html b/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.html
deleted file mode 100644
index 2c4f065..0000000
--- a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
-<link rel="import" href="../lifetime_browser_proxy.html">
-<link rel="import" href="../prefs/prefs_behavior.html">
-<link rel="import" href="../settings_shared_css.html">
-
-<dom-module id="settings-kiosk-next-shell-confirmation-dialog">
-  <template>
-    <style include="settings-shared"></style>
-    <cr-dialog id="dialog" close-text="$i18n{close}" ignore-enter-key>
-      <div slot="title">
-        [[getTitleText_(prefs.ash.kiosk_next_shell.enabled.value)]]
-      </div>
-      <div slot="body">
-        [[getBodyText_(prefs.ash.kiosk_next_shell.enabled.value)]]
-      </div>
-      <div slot="button-container">
-        <cr-button class="cancel-button"
-            on-click="onCancelClick_"
-            id="cancel">
-          $i18n{cancel}
-        </cr-button>
-        <cr-button class="action-button"
-            id="confirm"
-            on-click="onConfirmClick_">
-          [[getConfirmationText_(prefs.ash.kiosk_next_shell.enabled.value)]]
-        </cr-button>
-      </div>
-    </cr-dialog>
-  </template>
-  <script src="kiosk_next_shell_confirmation_dialog.js"></script>
-</dom-module>
diff --git a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.js b/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.js
deleted file mode 100644
index c4dd7f15..0000000
--- a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.js
+++ /dev/null
@@ -1,95 +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.
-
-/**
- * @fileoverview
- * 'settings-kiosk-next-shell-confirmation-dialog' is a dialog shown to confirm
- * if a Kiosk Next Shell change is really wanted. Since enabling/disabling the
- * shell requires a sign out, we need to provide this dialog to avoid surprising
- * users.
- */
-
-/**
- * Histogram name for KioskNextShell enabled state.
- * @type {string}
- */
-const KIOSK_NEXT_SHELL_ENABLED_STATE_UMA_NAME = 'KioskNextShell.EnabledState';
-
-Polymer({
-  is: 'settings-kiosk-next-shell-confirmation-dialog',
-
-  behaviors: [PrefsBehavior],
-
-  properties: {
-    /** Preferences state. */
-    prefs: {
-      type: Object,
-      notify: true,
-    },
-  },
-
-  /** @override */
-  attached: function() {
-    this.$.dialog.showModal();
-  },
-
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onCancelClick_: function(event) {
-    this.$.dialog.cancel();
-    event.stopPropagation();
-  },
-
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onConfirmClick_: function(event) {
-    const prefPath = 'ash.kiosk_next_shell.enabled';
-    // Toggle previous enabled state.
-    const isEnabled = !this.getPref(prefPath).value;
-    chrome.send(
-        'metricsHandler:recordBooleanHistogram',
-        [KIOSK_NEXT_SHELL_ENABLED_STATE_UMA_NAME, isEnabled]);
-    this.setPrefValue(prefPath, isEnabled);
-    settings.LifetimeBrowserProxyImpl.getInstance().signOutAndRestart();
-    this.$.dialog.close();
-    event.stopPropagation();
-  },
-
-  /**
-   * @param {boolean} kioskNextShellEnabled
-   * @return {string}
-   * @private
-   */
-  getTitleText_: function(kioskNextShellEnabled) {
-    return loadTimeData.getString(
-        kioskNextShellEnabled ? 'kioskNextShellEnabledDialogTitle' :
-                                'kioskNextShellDisabledDialogTitle');
-  },
-
-  /**
-   * @param {boolean} kioskNextShellEnabled
-   * @return {string}
-   * @private
-   */
-  getBodyText_: function(kioskNextShellEnabled) {
-    return loadTimeData.getString(
-        kioskNextShellEnabled ? 'kioskNextShellEnabledDialogBody' :
-                                'kioskNextShellDisabledDialogBody');
-  },
-
-  /**
-   * @param {boolean} kioskNextShellEnabled
-   * @return {string}
-   * @private
-   */
-  getConfirmationText_: function(kioskNextShellEnabled) {
-    return loadTimeData.getString(
-        kioskNextShellEnabled ? 'kioskNextShellTurnOff' :
-                                'kioskNextShellTurnOn');
-  },
-});
diff --git a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.html b/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.html
deleted file mode 100644
index caff569..0000000
--- a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
-<link rel="import" href="../i18n_setup.html">
-<link rel="import" href="../prefs/prefs_behavior.html">
-<link rel="import" href="../settings_shared_css.html">
-<link rel="import" href="kiosk_next_shell_confirmation_dialog.html">
-
-<dom-module id="settings-kiosk-next-shell-page">
-  <template>
-    <style include="settings-shared"></style>
-    <template is="dom-if" if="[[showConfirmationDialog_]]" restamp>
-      <settings-kiosk-next-shell-confirmation-dialog
-          id="dialog"
-          on-close="onConfirmationDialogClose_"
-          prefs="{{prefs}}">
-      </settings-kiosk-next-shell-confirmation-dialog>
-    </template>
-    <div id="kiosk-next-shell" class="settings-box two-line first">
-      <div class="start">
-        $i18n{kioskNextShellPageLabel}
-        <div class="secondary" id="secondaryText">
-          [[getSubtextLabel_(prefs.ash.kiosk_next_shell.enabled.value)]]
-        </div>
-      </div>
-      <div class="separator"></div>
-      <cr-button
-          on-click="onToggleButtonClick_"
-          aria-label="$i18n{kioskNextShellPageTitle}"
-          aria-describedby="secondaryText">
-        [[getButtonLabel_(prefs.ash.kiosk_next_shell.enabled.value)]]
-      </cr-button>
-    </div>
-  </template>
-  <script src="kiosk_next_shell_page.js"></script>
-</dom-module>
diff --git a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.js b/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.js
deleted file mode 100644
index 4485674..0000000
--- a/chrome/browser/resources/settings/kiosk_next_shell_page/kiosk_next_shell_page.js
+++ /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.
-
-/**
- * @fileoverview
- * 'settings-kiosk-next-shell-page' is the settings page for enabling the
- * Kiosk Next Shell.
- */
-Polymer({
-  is: 'settings-kiosk-next-shell-page',
-
-  behaviors: [PrefsBehavior],
-
-  properties: {
-    /** Preferences state. */
-    prefs: {
-      type: Object,
-      notify: true,
-    },
-
-    /** @private */
-    showConfirmationDialog_: Boolean,
-  },
-
-  /**
-   * @private
-   * @param {!Event} event
-   */
-  onToggleButtonClick_: function(event) {
-    this.showConfirmationDialog_ = true;
-    event.stopPropagation();
-  },
-
-  /**
-   * @private
-   * @param {!Event} event
-   */
-  onConfirmationDialogClose_: function(event) {
-    this.showConfirmationDialog_ = false;
-    event.stopPropagation();
-  },
-
-  /**
-   * @private
-   * @param {boolean} kioskNextShellEnabled
-   * @return {string}
-   */
-  getSubtextLabel_: function(kioskNextShellEnabled) {
-    return loadTimeData.getString(
-      kioskNextShellEnabled ? 'kioskNextShellPageSubtextDisable' :
-                              'kioskNextShellPageSubtextEnable');
-  },
-
-  /**
-   * @private
-   * @param {boolean} kioskNextShellEnabled
-   * @return {string}
-   */
-  getButtonLabel_: function(kioskNextShellEnabled) {
-    return loadTimeData.getString(
-      kioskNextShellEnabled ? 'kioskNextShellTurnOff' :
-                              'kioskNextShellTurnOn');
-  }
-});
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html
index c9d0976..01c30725 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.html
+++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -303,8 +303,7 @@
           </div>
           <settings-toggle-button
               pref="{{prefs.settings.language.ime_menu_activated}}"
-              label="$i18n{showImeMenu}"
-              hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]">
+              label="$i18n{showImeMenu}">
           </settings-toggle-button>
         </iron-collapse>
 </if>
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index 4f553c9..39b95af 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -42,6 +42,40 @@
       <structure name="IDR_OS_SETTINGS_MANIFEST"
                  file="os_settings_manifest.json"
                  type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_HTML"
+                 file="about_page/about_page_browser_proxy.html"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_JS"
+                 file="about_page/about_page_browser_proxy.js"
+                 type="chrome_html"
+                 preprocess="true" />
+      <structure name="IDR_OS_SETTINGS_ABOUT_PAGE_JS"
+                 file="chromeos/os_about_page/os_about_page.js"
+                 type="chrome_html"
+                 preprocess="true" />
+      <structure name="IDR_OS_SETTINGS_ABOUT_PAGE_HTML"
+                 file="chromeos/os_about_page/os_about_page.html"
+                 type="chrome_html"
+                 preprocess="true"
+                 allowexternalscript="true" />
+      <structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_HTML"
+                 file="about_page/channel_switcher_dialog.html"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_JS"
+                 file="about_page/channel_switcher_dialog.js"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_JS"
+                 file="about_page/detailed_build_info.js"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_HTML"
+                 file="about_page/detailed_build_info.html"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_HTML"
+                 file="about_page/update_warning_dialog.html"
+                 type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_JS"
+                 file="about_page/update_warning_dialog.js"
+                 type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_ADD_SITE_DIALOG_HTML"
                  file="site_settings/add_site_dialog.html"
                  type="chrome_html" />
@@ -967,18 +1001,6 @@
                  type="chrome_html"
                  preprocess="true"
                  allowexternalscript="true" />
-      <structure name="IDR_OS_SETTINGS_KIOSK_NEXT_SHELL_PAGE_HTML"
-                 file="kiosk_next_shell_page/kiosk_next_shell_page.html"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_KIOSK_NEXT_SHELL_PAGE_JS"
-                 file="kiosk_next_shell_page/kiosk_next_shell_page.js"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_KIOSK_NEXT_SHELL_CONFIRMATION_DIALOG_HTML"
-                 file="kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.html"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_KIOSK_NEXT_SHELL_CONFIRMATION_DIALOG_JS"
-                 file="kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.js"
-                 type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_BLUETOOTH_DEVICE_LIST_ITEM_HTML"
                  file="bluetooth_page/bluetooth_device_list_item.html"
                  type="chrome_html" />
diff --git a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.js b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.js
index 4a53b53..83e5c51 100644
--- a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.js
+++ b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog.js
@@ -521,8 +521,6 @@
 Polymer({
   is: 'settings-cups-add-printer-dialog',
 
-  behaviors: [WebUIListenerBehavior],
-
   properties: {
     /** @type {!CupsPrinterInfo} */
     newPrinter: {
@@ -570,15 +568,6 @@
     'no-detected-printer': 'onNoDetectedPrinter_',
   },
 
-  /** @override */
-  ready: function() {
-    this.addWebUIListener(
-        'on-manually-add-discovered-printer',
-        this.onManuallyAddDiscoveredPrinter_.bind(this));
-    this.addWebUIListener(
-        'on-add-or-edit-cups-printer', this.onAddPrinter_.bind(this));
-  },
-
   /** Opens the Add printer discovery dialog. */
   open: function() {
     this.resetData_();
@@ -623,8 +612,11 @@
     if (this.previousDialog_ == AddPrinterDialogs.DISCOVERY) {
       this.configuringDialogTitle =
           loadTimeData.getString('addPrintersNearbyTitle');
-      settings.CupsPrintersBrowserProxyImpl.getInstance().addDiscoveredPrinter(
-          this.newPrinter.printerId);
+      settings.CupsPrintersBrowserProxyImpl.getInstance()
+          .addDiscoveredPrinter(this.newPrinter.printerId)
+          .then(
+              this.onAddingDiscoveredPrinterSucceeded_.bind(this),
+              this.manuallyAddDiscoveredPrinter_.bind(this));
     } else {
       assertNotReached('Opening configuring dialog from invalid place');
     }
@@ -671,15 +663,27 @@
   },
 
   /**
+   * Handler for addDiscoveredPrinter.
+   * @param {!PrinterSetupResult} result
+   * @private
+   * */
+  onAddingDiscoveredPrinterSucceeded_: function(result) {
+    this.$$('add-printer-configuring-dialog').close();
+    this.fire(
+        'show-cups-printer-toast',
+        {resultCode: result, printerName: this.newPrinter.printerName});
+  },
+
+  /**
    * Use the given printer as the starting point for a user-driven
    * add of a printer.  This is called if we can't automatically configure
    * the printer, and need more information from the user.
    *
-   * @param {!CupsPrinterInfo} printer
+   * @param {*} printer
    * @private
    */
-  onManuallyAddDiscoveredPrinter_: function(printer) {
-    this.newPrinter = printer;
+  manuallyAddDiscoveredPrinter_: function(printer) {
+    this.newPrinter = /** @type {CupsPrinterInfo} */ (printer);
     this.switchToManufacturerDialog_();
   },
 
diff --git a/chrome/browser/resources/settings/printing_page/cups_printers.js b/chrome/browser/resources/settings/printing_page/cups_printers.js
index bbb209fc..30d77e0 100644
--- a/chrome/browser/resources/settings/printing_page/cups_printers.js
+++ b/chrome/browser/resources/settings/printing_page/cups_printers.js
@@ -62,8 +62,6 @@
 
   /** @override */
   attached: function() {
-    this.addWebUIListener('on-add-or-edit-cups-printer',
-                          this.onAddOrEditPrinter_.bind(this));
     this.addWebUIListener(
         'on-printers-changed', this.printersChanged_.bind(this));
     this.networksChangedListener_ = this.refreshNetworks_.bind(this);
@@ -111,17 +109,8 @@
     * @private
     */
    openResultToast_: function(event) {
-     this.onAddOrEditPrinter_(event.detail.resultCode,
-                              event.detail.printerName);
-   },
-
-  /**
-   * @param {PrinterSetupResult} result_code
-   * @param {string} printerName
-   * @private
-   */
-  onAddOrEditPrinter_: function(result_code, printerName) {
-    switch (result_code) {
+    const printerName = event.detail.printerName;
+    switch (event.detail.resultCode) {
       case PrinterSetupResult.SUCCESS:
         this.updateCupsPrintersList_();
         this.addPrinterResultText_ =
diff --git a/chrome/browser/resources/settings/printing_page/cups_printers_browser_proxy.js b/chrome/browser/resources/settings/printing_page/cups_printers_browser_proxy.js
index 24e4793..9f35ce6 100644
--- a/chrome/browser/resources/settings/printing_page/cups_printers_browser_proxy.js
+++ b/chrome/browser/resources/settings/printing_page/cups_printers_browser_proxy.js
@@ -175,6 +175,7 @@
 
     /**
      * @param{string} printerId
+     * @return {!Promise<!PrinterSetupResult>}
      */
     addDiscoveredPrinter(printerId) {}
 
@@ -259,7 +260,7 @@
 
     /** @override */
     addDiscoveredPrinter(printerId) {
-      chrome.send('addDiscoveredPrinter', [printerId]);
+      return cr.sendWithPromise('addDiscoveredPrinter', printerId);
     }
 
     /** @override */
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.html b/chrome/browser/resources/settings/settings_main/settings_main.html
index 0a3d392f..d75f667 100644
--- a/chrome/browser/resources/settings/settings_main/settings_main.html
+++ b/chrome/browser/resources/settings/settings_main/settings_main.html
@@ -65,7 +65,6 @@
           page-visibility="[[pageVisibility]]"
           show-apps="[[showApps]]"
           show-android-apps="[[showAndroidApps]]"
-          show-kiosk-next-shell="[[showKioskNextShell]]"
           show-crostini="[[showCrostini]]"
           show-parental-controls="[[showParentalControls]]"
           show-plugin-vm="[[showPluginVm]]"
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index de0d1031..f4f8663a 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -1314,18 +1314,6 @@
                    type="chrome_html"
                    preprocess="true"
                    allowexternalscript="true" />
-        <structure name="IDR_SETTINGS_KIOSK_NEXT_SHELL_PAGE_HTML"
-                   file="kiosk_next_shell_page/kiosk_next_shell_page.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_KIOSK_NEXT_SHELL_PAGE_JS"
-                   file="kiosk_next_shell_page/kiosk_next_shell_page.js"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_KIOSK_NEXT_SHELL_CONFIRMATION_DIALOG_HTML"
-                   file="kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_KIOSK_NEXT_SHELL_CONFIRMATION_DIALOG_JS"
-                   file="kiosk_next_shell_page/kiosk_next_shell_confirmation_dialog.js"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_BLUETOOTH_DEVICE_LIST_ITEM_HTML"
                    file="bluetooth_page/bluetooth_device_list_item.html"
                    type="chrome_html" />
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.html b/chrome/browser/resources/settings/settings_ui/settings_ui.html
index 0ec6aa2..200c059 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.html
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.html
@@ -158,7 +158,6 @@
           page-visibility="[[pageVisibility_]]"
           show-apps="[[showApps_]]"
           show-android-apps="[[showAndroidApps_]]"
-          show-kiosk-next-shell="[[showKioskNextShell_]]"
           show-crostini="[[showCrostini_]]"
           show-parental-controls="[[showParentalControls_]]"
           show-plugin-vm="[[showPluginVm_]]"
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.js b/chrome/browser/resources/settings/settings_ui/settings_ui.js
index ea9e0ad..9ef25dde 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.js
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.js
@@ -72,9 +72,6 @@
     showAndroidApps_: Boolean,
 
     /** @private */
-    showKioskNextShell_: Boolean,
-
-    /** @private */
     showCrostini_: Boolean,
 
     /** @private */
@@ -175,9 +172,6 @@
     this.showAndroidApps_ = showOSSettings &&
         loadTimeData.valueExists('androidAppsVisible') &&
         loadTimeData.getBoolean('androidAppsVisible');
-    this.showKioskNextShell_ = showOSSettings &&
-        loadTimeData.valueExists('showKioskNextShell') &&
-        loadTimeData.getBoolean('showKioskNextShell');
     this.showCrostini_ = showOSSettings &&
         loadTimeData.valueExists('showCrostini') &&
         loadTimeData.getBoolean('showCrostini');
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 917dedb..6cbb609f 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1728,8 +1728,6 @@
       "webui/chromeos/login/reset_screen_handler.h",
       "webui/chromeos/login/signin_screen_handler.cc",
       "webui/chromeos/login/signin_screen_handler.h",
-      "webui/chromeos/login/supervision_onboarding_screen_handler.cc",
-      "webui/chromeos/login/supervision_onboarding_screen_handler.h",
       "webui/chromeos/login/supervision_transition_screen_handler.cc",
       "webui/chromeos/login/supervision_transition_screen_handler.h",
       "webui/chromeos/login/sync_consent_screen_handler.cc",
diff --git a/chrome/browser/ui/ash/assistant/assistant_client.cc b/chrome/browser/ui/ash/assistant/assistant_client.cc
index fe8bf1f1..1fa685a 100644
--- a/chrome/browser/ui/ash/assistant/assistant_client.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_client.cc
@@ -22,15 +22,8 @@
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace {
-
 // Owned by ChromeBrowserMainChromeOS:
 AssistantClient* g_instance = nullptr;
-
-bool IsAssistantAllowed(Profile* profile) {
-  return assistant::IsAssistantAllowedForProfile(profile) ==
-         ash::mojom::AssistantAllowedState::ALLOWED;
-}
-
 }  // namespace
 
 // static
@@ -60,8 +53,10 @@
 }
 
 void AssistantClient::MaybeInit(Profile* profile) {
-  if (!IsAssistantAllowed(profile))
+  if (assistant::IsAssistantAllowedForProfile(profile) !=
+      ash::mojom::AssistantAllowedState::ALLOWED) {
     return;
+  }
 
   if (!profile_) {
     profile_ = profile;
@@ -92,18 +87,14 @@
 }
 
 void AssistantClient::MaybeStartAssistantOptInFlow() {
-  // We need to check if the Assistant is allowed here again, since the result
-  // might have changed from the last time we checked. This usually happens if
-  // any post-OOBE screen changes any property that determines Assistant
-  // availability.
-  if (!initialized_ || !IsAssistantAllowed(profile_))
+  if (!initialized_)
     return;
 
   assistant_setup_->MaybeStartAssistantOptInFlow();
 }
 
 void AssistantClient::OnAssistantStatusChanged(bool running) {
-  // |running| means assistant mojom service is running. This maps to
+  // |running| means assistent mojom service is running. This maps to
   // |STOPPED| and |NOT_READY|. |RUNNING| maps to UI is shown and an assistant
   // session is running.
   arc::VoiceInteractionControllerClient::Get()->NotifyStatusChanged(
diff --git a/chrome/browser/ui/page_info/page_info.cc b/chrome/browser/ui/page_info/page_info.cc
index 270d75c3..9139967 100644
--- a/chrome/browser/ui/page_info/page_info.cc
+++ b/chrome/browser/ui/page_info/page_info.cc
@@ -555,12 +555,12 @@
     content::WebContents* web_contents) {
 #if defined(FULL_SAFE_BROWSING)
   DCHECK(password_protection_service_);
-  DCHECK(site_identity_status_ == SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE ||
-         site_identity_status_ ==
-             SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE);
+  DCHECK(safe_browsing_status_ == SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE ||
+         safe_browsing_status_ ==
+             SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE);
   password_protection_service_->OnUserAction(
       web_contents,
-      site_identity_status_ == SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE
+      safe_browsing_status_ == SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE
           ? PasswordReuseEvent::SIGN_IN_PASSWORD
           : PasswordReuseEvent::ENTERPRISE_PASSWORD,
       safe_browsing::WarningUIType::PAGE_INFO,
@@ -572,12 +572,12 @@
     content::WebContents* web_contents) {
 #if defined(FULL_SAFE_BROWSING)
   DCHECK(password_protection_service_);
-  DCHECK(site_identity_status_ == SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE ||
-         site_identity_status_ ==
-             SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE);
+  DCHECK(safe_browsing_status_ == SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE ||
+         safe_browsing_status_ ==
+             SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE);
   password_protection_service_->OnUserAction(
       web_contents,
-      site_identity_status_ == SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE
+      safe_browsing_status_ == SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE
           ? PasswordReuseEvent::SIGN_IN_PASSWORD
           : PasswordReuseEvent::ENTERPRISE_PASSWORD,
       safe_browsing::WarningUIType::PAGE_INFO,
@@ -609,7 +609,7 @@
     // All about: URLs except about:blank are redirected.
     DCHECK_EQ(url::kAboutBlankURL, url.spec());
     site_identity_status_ = SITE_IDENTITY_STATUS_NO_CERT;
-    site_identity_details_ =
+    site_details_message_ =
         l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY);
     site_connection_status_ = SITE_CONNECTION_STATUS_UNENCRYPTED;
     site_connection_details_ = l10n_util::GetStringFUTF16(
@@ -620,7 +620,7 @@
 
   if (url.SchemeIs(content::kChromeUIScheme) || is_chrome_ui_native_scheme) {
     site_identity_status_ = SITE_IDENTITY_STATUS_INTERNAL_PAGE;
-    site_identity_details_ =
+    site_details_message_ =
         l10n_util::GetStringUTF16(IDS_PAGE_INFO_INTERNAL_PAGE);
     site_connection_status_ = SITE_CONNECTION_STATUS_INTERNAL_PAGE;
     return;
@@ -629,36 +629,14 @@
   // Identity section.
   certificate_ = visible_security_state.certificate;
 
-  if (visible_security_state.malicious_content_status !=
-      security_state::MALICIOUS_CONTENT_STATUS_NONE) {
-    // The site has been flagged by Safe Browsing as dangerous.
-    GetSiteIdentityByMaliciousContentStatus(
-        visible_security_state.malicious_content_status, &site_identity_status_,
-        &site_identity_details_);
-#if defined(FULL_SAFE_BROWSING)
-    bool old_show_change_pw_buttons = show_change_password_buttons_;
-#endif
-    show_change_password_buttons_ =
-        (visible_security_state.malicious_content_status ==
-             security_state::MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE ||
-         visible_security_state.malicious_content_status ==
-             security_state::
-                 MALICIOUS_CONTENT_STATUS_ENTERPRISE_PASSWORD_REUSE);
-#if defined(FULL_SAFE_BROWSING)
-    // Only record password reuse when adding the button, not on updates.
-    if (show_change_password_buttons_ && !old_show_change_pw_buttons) {
-      RecordPasswordReuseEvent();
-    }
-#endif
-  } else if (certificate_ &&
-             (!net::IsCertStatusError(visible_security_state.cert_status) ||
-              net::IsCertStatusMinorError(
-                  visible_security_state.cert_status))) {
+  if (certificate_ &&
+      (!net::IsCertStatusError(visible_security_state.cert_status) ||
+       net::IsCertStatusMinorError(visible_security_state.cert_status))) {
     // HTTPS with no or minor errors.
     if (security_level == security_state::SECURE_WITH_POLICY_INSTALLED_CERT) {
 #if defined(OS_CHROMEOS)
       site_identity_status_ = SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT;
-      site_identity_details_ = l10n_util::GetStringFUTF16(
+      site_details_message_ = l10n_util::GetStringFUTF16(
           IDS_CERT_POLICY_PROVIDED_CERT_MESSAGE, UTF8ToUTF16(url.host()));
 #else
       DCHECK(false) << "Policy certificates exist only on ChromeOS";
@@ -673,17 +651,17 @@
             IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY));
       }
 
-      site_identity_details_.assign(l10n_util::GetStringFUTF16(
+      site_details_message_.assign(l10n_util::GetStringFUTF16(
           IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_VERIFIED, issuer_name));
 
-      site_identity_details_ += ASCIIToUTF16("\n\n");
+      site_details_message_ += ASCIIToUTF16("\n\n");
       if (visible_security_state.cert_status &
           net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) {
-        site_identity_details_ += l10n_util::GetStringUTF16(
+        site_details_message_ += l10n_util::GetStringUTF16(
             IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION);
       } else if (visible_security_state.cert_status &
                  net::CERT_STATUS_NO_REVOCATION_MECHANISM) {
-        site_identity_details_ += l10n_util::GetStringUTF16(
+        site_details_message_ += l10n_util::GetStringUTF16(
             IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM);
       } else {
         NOTREACHED() << "Need to specify string for this warning";
@@ -700,7 +678,7 @@
         // state is "if any".
         DCHECK(!certificate_->subject().locality_name.empty());
         DCHECK(!certificate_->subject().country_name.empty());
-        site_identity_details_.assign(l10n_util::GetStringFUTF16(
+        site_details_message_.assign(l10n_util::GetStringFUTF16(
             IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_VERIFIED,
             organization_name_,
             UTF8ToUTF16(certificate_->subject().country_name)));
@@ -714,13 +692,13 @@
               IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY));
         }
 
-        site_identity_details_.assign(l10n_util::GetStringFUTF16(
+        site_details_message_.assign(l10n_util::GetStringFUTF16(
             IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_VERIFIED, issuer_name));
       }
       if (security_state::IsSHA1InChain(visible_security_state)) {
         site_identity_status_ =
             SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM;
-        site_identity_details_ +=
+        site_details_message_ +=
             UTF8ToUTF16("\n\n") +
             l10n_util::GetStringUTF16(
                 IDS_PAGE_INFO_SECURITY_TAB_DEPRECATED_SIGNATURE_ALGORITHM);
@@ -728,7 +706,7 @@
     }
   } else {
     // HTTP or HTTPS with errors (not warnings).
-    site_identity_details_.assign(l10n_util::GetStringUTF16(
+    site_details_message_.assign(l10n_util::GetStringUTF16(
         IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY));
     if (!security_state::IsSchemeCryptographic(visible_security_state.url) ||
         !visible_security_state.certificate) {
@@ -742,17 +720,40 @@
     ssl_errors::ErrorInfo::GetErrorsForCertStatus(
         certificate_, visible_security_state.cert_status, url, &errors);
     for (size_t i = 0; i < errors.size(); ++i) {
-      site_identity_details_ += bullet;
-      site_identity_details_ += errors[i].short_description();
+      site_details_message_ += bullet;
+      site_details_message_ += errors[i].short_description();
     }
 
     if (visible_security_state.cert_status & net::CERT_STATUS_NON_UNIQUE_NAME) {
-      site_identity_details_ += ASCIIToUTF16("\n\n");
-      site_identity_details_ +=
+      site_details_message_ += ASCIIToUTF16("\n\n");
+      site_details_message_ +=
           l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME);
     }
   }
 
+  if (visible_security_state.malicious_content_status !=
+      security_state::MALICIOUS_CONTENT_STATUS_NONE) {
+    // The site has been flagged by Safe Browsing. Takes precedence over TLS.
+    GetSafeBrowsingStatusByMaliciousContentStatus(
+        visible_security_state.malicious_content_status, &safe_browsing_status_,
+        &site_details_message_);
+#if defined(FULL_SAFE_BROWSING)
+    bool old_show_change_pw_buttons = show_change_password_buttons_;
+#endif
+    show_change_password_buttons_ =
+        (visible_security_state.malicious_content_status ==
+             security_state::MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE ||
+         visible_security_state.malicious_content_status ==
+             security_state::
+                 MALICIOUS_CONTENT_STATUS_ENTERPRISE_PASSWORD_REUSE);
+#if defined(FULL_SAFE_BROWSING)
+    // Only record password reuse when adding the button, not on updates.
+    if (show_change_password_buttons_ && !old_show_change_pw_buttons) {
+      RecordPasswordReuseEvent();
+    }
+#endif
+  }
+
   // Site Connection
   // We consider anything less than 80 bits encryption to be weak encryption.
   // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and
@@ -840,8 +841,13 @@
       ChromeSSLHostStateDelegateFactory::GetForProfile(profile_);
   DCHECK(delegate);
   // Only show an SSL decision revoke button if the user has chosen to bypass
-  // SSL host errors for this host in the past.
-  show_ssl_decision_revoke_button_ = delegate->HasAllowException(url.host());
+  // SSL host errors for this host in the past, and we're not presently on a
+  // Safe Browsing error (since otherwise it's confusing which warning you're
+  // re-enabling).
+  show_ssl_decision_revoke_button_ =
+      delegate->HasAllowException(url.host()) &&
+      visible_security_state.malicious_content_status ==
+          security_state::MALICIOUS_CONTENT_STATUS_NONE;
 }
 
 void PageInfo::PresentSitePermissions() {
@@ -955,7 +961,8 @@
   info.connection_status = site_connection_status_;
   info.connection_status_description = UTF16ToUTF8(site_connection_details_);
   info.identity_status = site_identity_status_;
-  info.identity_status_description = UTF16ToUTF8(site_identity_details_);
+  info.safe_browsing_status = safe_browsing_status_;
+  info.identity_status_description = UTF16ToUTF8(site_details_message_);
   info.certificate = certificate_;
   info.show_ssl_decision_revoke_button = show_ssl_decision_revoke_button_;
   info.show_change_password_buttons = show_change_password_buttons_;
@@ -976,7 +983,7 @@
     return;
   }
 
-  if (site_identity_status_ == SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE) {
+  if (safe_browsing_status_ == SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE) {
     safe_browsing::LogWarningAction(
         safe_browsing::WarningUIType::PAGE_INFO,
         safe_browsing::WarningAction::SHOWN,
@@ -1006,31 +1013,31 @@
   return permission_list;
 }
 
-void PageInfo::GetSiteIdentityByMaliciousContentStatus(
+void PageInfo::GetSafeBrowsingStatusByMaliciousContentStatus(
     security_state::MaliciousContentStatus malicious_content_status,
-    PageInfo::SiteIdentityStatus* status,
+    PageInfo::SafeBrowsingStatus* status,
     base::string16* details) {
   switch (malicious_content_status) {
     case security_state::MALICIOUS_CONTENT_STATUS_NONE:
       NOTREACHED();
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_MALWARE:
-      *status = PageInfo::SITE_IDENTITY_STATUS_MALWARE;
+      *status = PageInfo::SAFE_BROWSING_STATUS_MALWARE;
       *details = l10n_util::GetStringUTF16(IDS_PAGE_INFO_MALWARE_DETAILS);
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_SOCIAL_ENGINEERING:
-      *status = PageInfo::SITE_IDENTITY_STATUS_SOCIAL_ENGINEERING;
+      *status = PageInfo::SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING;
       *details =
           l10n_util::GetStringUTF16(IDS_PAGE_INFO_SOCIAL_ENGINEERING_DETAILS);
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_UNWANTED_SOFTWARE:
-      *status = PageInfo::SITE_IDENTITY_STATUS_UNWANTED_SOFTWARE;
+      *status = PageInfo::SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE;
       *details =
           l10n_util::GetStringUTF16(IDS_PAGE_INFO_UNWANTED_SOFTWARE_DETAILS);
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE:
 #if defined(FULL_SAFE_BROWSING)
-      *status = PageInfo::SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE;
+      *status = PageInfo::SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE;
       // |password_protection_service_| may be null in test.
       *details = password_protection_service_
                      ? password_protection_service_->GetWarningDetailText(
@@ -1040,7 +1047,7 @@
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_ENTERPRISE_PASSWORD_REUSE:
 #if defined(FULL_SAFE_BROWSING)
-      *status = PageInfo::SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE;
+      *status = PageInfo::SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE;
       // |password_protection_service_| maybe null in test.
       *details = password_protection_service_
                      ? password_protection_service_->GetWarningDetailText(
@@ -1049,7 +1056,7 @@
 #endif
       break;
     case security_state::MALICIOUS_CONTENT_STATUS_BILLING:
-      *status = PageInfo::SITE_IDENTITY_STATUS_BILLING;
+      *status = PageInfo::SAFE_BROWSING_STATUS_BILLING;
       *details = l10n_util::GetStringUTF16(IDS_PAGE_INFO_BILLING_DETAILS);
       break;
   }
diff --git a/chrome/browser/ui/page_info/page_info.h b/chrome/browser/ui/page_info/page_info.h
index 3e4fc1e..4af18b7 100644
--- a/chrome/browser/ui/page_info/page_info.h
+++ b/chrome/browser/ui/page_info/page_info.h
@@ -87,15 +87,20 @@
     // The website provided a valid certificate, but the certificate or chain
     // is using a deprecated signature algorithm.
     SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM,
+  };
+
+  // Safe Browsing status of a website.
+  enum SafeBrowsingStatus {
+    SAFE_BROWSING_STATUS_NONE = 0,
     // The website has been flagged by Safe Browsing as dangerous for
     // containing malware, social engineering, unwanted software, or password
     // reuse on a low reputation site.
-    SITE_IDENTITY_STATUS_MALWARE,
-    SITE_IDENTITY_STATUS_SOCIAL_ENGINEERING,
-    SITE_IDENTITY_STATUS_UNWANTED_SOFTWARE,
-    SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE,
-    SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE,
-    SITE_IDENTITY_STATUS_BILLING,
+    SAFE_BROWSING_STATUS_MALWARE,
+    SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING,
+    SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE,
+    SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE,
+    SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE,
+    SAFE_BROWSING_STATUS_BILLING,
   };
 
   // Events for UMA. Do not reorder or change! Exposed in header so enum is
@@ -192,8 +197,12 @@
     return site_identity_status_;
   }
 
-  const base::string16& site_identity_details() const {
-    return site_identity_details_;
+  const SafeBrowsingStatus& safe_browsing_status() const {
+    return safe_browsing_status_;
+  }
+
+  const base::string16& site_details_message() const {
+    return site_details_message_;
   }
 
   const base::string16& organization_name() const { return organization_name_; }
@@ -232,11 +241,12 @@
   void RecordPasswordReuseEvent();
 #endif
 
-  // Helper function to get the site identification status and details by
-  // malicious content status.
-  void GetSiteIdentityByMaliciousContentStatus(
+  // Helper function to get the Safe Browsing status and details by malicious
+  // content status.
+  // TODO(jdeblasio): Eliminate this and just use MaliciousContentStatus?
+  void GetSafeBrowsingStatusByMaliciousContentStatus(
       security_state::MaliciousContentStatus malicious_content_status,
-      PageInfo::SiteIdentityStatus* status,
+      PageInfo::SafeBrowsingStatus* status,
       base::string16* details);
 
   // Retrieves all the permissions that are shown in Page Info.
@@ -260,6 +270,9 @@
   // Status of the website's identity verification check.
   SiteIdentityStatus site_identity_status_;
 
+  // Safe Browsing status of the website.
+  SafeBrowsingStatus safe_browsing_status_;
+
   // For secure connection |certificate_| is set to the server certificate.
   scoped_refptr<net::X509Certificate> certificate_;
 
@@ -271,9 +284,9 @@
   // unnecessary UTF-8 string conversions.
 
   // Details about the website's identity. If the website's identity has been
-  // verified then |site_identity_details_| contains who verified the identity.
+  // verified then |site_details_message_| contains who verified the identity.
   // This string will be displayed in the UI.
-  base::string16 site_identity_details_;
+  base::string16 site_details_message_;
 
   // Set when the user has explicitly bypassed an SSL error for this host or
   // explicitly denied it (the latter of which is not currently possible in the
diff --git a/chrome/browser/ui/page_info/page_info_ui.cc b/chrome/browser/ui/page_info/page_info_ui.cc
index 11c54a4..70030d6 100644
--- a/chrome/browser/ui/page_info/page_info_ui.cc
+++ b/chrome/browser/ui/page_info/page_info_ui.cc
@@ -232,6 +232,7 @@
 
 PageInfoUI::IdentityInfo::IdentityInfo()
     : identity_status(PageInfo::SITE_IDENTITY_STATUS_UNKNOWN),
+      safe_browsing_status(PageInfo::SAFE_BROWSING_STATUS_NONE),
       connection_status(PageInfo::SITE_CONNECTION_STATUS_UNKNOWN),
       show_ssl_decision_revoke_button(false),
       show_change_password_buttons(false) {}
@@ -246,6 +247,41 @@
   std::unique_ptr<PageInfoUI::SecurityDescription> security_description(
       new PageInfoUI::SecurityDescription());
 
+  switch (identity_info.safe_browsing_status) {
+    case PageInfo::SAFE_BROWSING_STATUS_NONE:
+      break;
+    case PageInfo::SAFE_BROWSING_STATUS_MALWARE:
+      return CreateSecurityDescription(SecuritySummaryColor::RED,
+                                       IDS_PAGE_INFO_MALWARE_SUMMARY,
+                                       IDS_PAGE_INFO_MALWARE_DETAILS);
+    case PageInfo::SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING:
+      return CreateSecurityDescription(
+          SecuritySummaryColor::RED, IDS_PAGE_INFO_SOCIAL_ENGINEERING_SUMMARY,
+          IDS_PAGE_INFO_SOCIAL_ENGINEERING_DETAILS);
+    case PageInfo::SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE:
+      return CreateSecurityDescription(SecuritySummaryColor::RED,
+                                       IDS_PAGE_INFO_UNWANTED_SOFTWARE_SUMMARY,
+                                       IDS_PAGE_INFO_UNWANTED_SOFTWARE_DETAILS);
+    case PageInfo::SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE:
+#if defined(FULL_SAFE_BROWSING)
+      return CreateSecurityDescriptionForPasswordReuse(
+          /*is_enterprise_password=*/false);
+#endif
+      NOTREACHED();
+      break;
+    case PageInfo::SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE:
+#if defined(FULL_SAFE_BROWSING)
+      return CreateSecurityDescriptionForPasswordReuse(
+          /*is_enterprise_password=*/true);
+#endif
+      NOTREACHED();
+      break;
+    case PageInfo::SAFE_BROWSING_STATUS_BILLING:
+      return CreateSecurityDescription(SecuritySummaryColor::RED,
+                                       IDS_PAGE_INFO_BILLING_SUMMARY,
+                                       IDS_PAGE_INFO_BILLING_DETAILS);
+  }
+
   switch (identity_info.identity_status) {
     case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
 #if defined(OS_ANDROID)
@@ -285,32 +321,6 @@
                                            IDS_PAGE_INFO_SECURE_SUMMARY,
                                            IDS_PAGE_INFO_SECURE_DETAILS);
       }
-    case PageInfo::SITE_IDENTITY_STATUS_MALWARE:
-      return CreateSecurityDescription(SecuritySummaryColor::RED,
-                                       IDS_PAGE_INFO_MALWARE_SUMMARY,
-                                       IDS_PAGE_INFO_MALWARE_DETAILS);
-    case PageInfo::SITE_IDENTITY_STATUS_SOCIAL_ENGINEERING:
-      return CreateSecurityDescription(
-          SecuritySummaryColor::RED, IDS_PAGE_INFO_SOCIAL_ENGINEERING_SUMMARY,
-          IDS_PAGE_INFO_SOCIAL_ENGINEERING_DETAILS);
-    case PageInfo::SITE_IDENTITY_STATUS_UNWANTED_SOFTWARE:
-      return CreateSecurityDescription(SecuritySummaryColor::RED,
-                                       IDS_PAGE_INFO_UNWANTED_SOFTWARE_SUMMARY,
-                                       IDS_PAGE_INFO_UNWANTED_SOFTWARE_DETAILS);
-    case PageInfo::SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE:
-#if defined(FULL_SAFE_BROWSING)
-      return CreateSecurityDescriptionForPasswordReuse(
-          /*is_enterprise_password=*/false);
-#endif
-    case PageInfo::SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE:
-#if defined(FULL_SAFE_BROWSING)
-      return CreateSecurityDescriptionForPasswordReuse(
-          /*is_enterprise_password=*/true);
-#endif
-    case PageInfo::SITE_IDENTITY_STATUS_BILLING:
-      return CreateSecurityDescription(SecuritySummaryColor::RED,
-                                       IDS_PAGE_INFO_BILLING_SUMMARY,
-                                       IDS_PAGE_INFO_BILLING_DETAILS);
     case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
     case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
     case PageInfo::SITE_IDENTITY_STATUS_NO_CERT:
diff --git a/chrome/browser/ui/page_info/page_info_ui.h b/chrome/browser/ui/page_info/page_info_ui.h
index 75d32d06..fb10769 100644
--- a/chrome/browser/ui/page_info/page_info_ui.h
+++ b/chrome/browser/ui/page_info/page_info_ui.h
@@ -117,6 +117,8 @@
     std::string site_identity;
     // Status of the site's identity.
     PageInfo::SiteIdentityStatus identity_status;
+    // Site's Safe Browsing status.
+    PageInfo::SafeBrowsingStatus safe_browsing_status;
     // Textual description of the site's identity status that is displayed to
     // the user.
     std::string identity_status_description;
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc
index 545296d..e4836b29 100644
--- a/chrome/browser/ui/page_info/page_info_unittest.cc
+++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -442,8 +442,8 @@
 
   EXPECT_EQ(PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED,
             page_info()->site_connection_status());
-  EXPECT_EQ(PageInfo::SITE_IDENTITY_STATUS_MALWARE,
-            page_info()->site_identity_status());
+  EXPECT_EQ(PageInfo::SAFE_BROWSING_STATUS_MALWARE,
+            page_info()->safe_browsing_status());
 }
 
 TEST_F(PageInfoTest, SocialEngineering) {
@@ -454,8 +454,8 @@
 
   EXPECT_EQ(PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED,
             page_info()->site_connection_status());
-  EXPECT_EQ(PageInfo::SITE_IDENTITY_STATUS_SOCIAL_ENGINEERING,
-            page_info()->site_identity_status());
+  EXPECT_EQ(PageInfo::SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING,
+            page_info()->safe_browsing_status());
 }
 
 TEST_F(PageInfoTest, UnwantedSoftware) {
@@ -466,8 +466,8 @@
 
   EXPECT_EQ(PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED,
             page_info()->site_connection_status());
-  EXPECT_EQ(PageInfo::SITE_IDENTITY_STATUS_UNWANTED_SOFTWARE,
-            page_info()->site_identity_status());
+  EXPECT_EQ(PageInfo::SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE,
+            page_info()->safe_browsing_status());
 }
 
 #if defined(FULL_SAFE_BROWSING)
@@ -479,8 +479,8 @@
 
   EXPECT_EQ(PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED,
             page_info()->site_connection_status());
-  EXPECT_EQ(PageInfo::SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE,
-            page_info()->site_identity_status());
+  EXPECT_EQ(PageInfo::SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE,
+            page_info()->safe_browsing_status());
 }
 
 TEST_F(PageInfoTest, EnterprisePasswordReuse) {
@@ -491,8 +491,8 @@
 
   EXPECT_EQ(PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED,
             page_info()->site_connection_status());
-  EXPECT_EQ(PageInfo::SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE,
-            page_info()->site_identity_status());
+  EXPECT_EQ(PageInfo::SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE,
+            page_info()->safe_browsing_status());
 }
 #endif
 
@@ -768,7 +768,7 @@
   EXPECT_EQ(
       base::UTF8ToUTF16(
           "This page has been identified as being owned by Google Inc [US]."),
-      page_info()->site_identity_details());
+      page_info()->site_details_message());
 }
 
 TEST_F(PageInfoTest, HTTPSRevocationError) {
diff --git a/chrome/browser/ui/startup/startup_browser_creator.h b/chrome/browser/ui/startup/startup_browser_creator.h
index 187c30d..12d29fc6 100644
--- a/chrome/browser/ui/startup/startup_browser_creator.h
+++ b/chrome/browser/ui/startup/startup_browser_creator.h
@@ -33,6 +33,7 @@
 #if defined(OS_WIN)
     // chrome://welcome-win10/ if Chrome's default browser UX may be shown;
     // otherwise, see kWelcomeStandard.
+    // TODO(hcarmona): deprecate this enum.
     kWelcomeWin10,
 #endif
     // chrome://welcome/ if sign-in is allowed; otherwise, none.
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index 93760a8b..0d406a97 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -44,6 +44,7 @@
 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
 #include "chrome/browser/ui/startup/startup_tab_provider.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/webui/welcome/nux_helper.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
@@ -131,6 +132,7 @@
     profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true);
 
 #if defined(OS_WIN)
+  // TODO(hcarmona): deprecate this pref.
   g_browser_process->local_state()->SetBoolean(prefs::kHasSeenWin10PromoPage,
                                                true);
 #endif
@@ -1068,12 +1070,23 @@
 #if !defined(OS_CHROMEOS)
 
 class StartupBrowserCreatorFirstRunTest : public InProcessBrowserTest {
+ public:
+  StartupBrowserCreatorFirstRunTest() {
+    scoped_feature_list_.InitWithFeatures({nux::kNuxOnboardingForceEnabled},
+                                          {});
+  }
+
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override;
   void SetUpInProcessBrowserTestFixture() override;
 
   policy::MockConfigurationPolicyProvider provider_;
   policy::PolicyMap policy_map_;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreatorFirstRunTest);
 };
 
 void StartupBrowserCreatorFirstRunTest::SetUpCommandLine(
@@ -1251,23 +1264,6 @@
 
   TabStripModel* tab_strip = browser->tab_strip_model();
 
-  // Windows 10 has its own Welcome page; the standard Welcome page does not
-  // appear until second run.  However, if NuxOnboarding is enabled, the
-  // standard welcome URL should still be used.
-  bool is_navi_enabled = false;
-#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
-  is_navi_enabled = nux::IsNuxOnboardingEnabled(profile1_ptr);
-#endif
-  if (IsWindows10OrNewer() && !is_navi_enabled) {
-    ASSERT_EQ(1, tab_strip->count());
-    EXPECT_EQ(chrome::kChromeUIWelcomeWin10URL,
-              tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
-
-    browser = CloseBrowserAndOpenNew(browser, profile1_ptr);
-    ASSERT_TRUE(browser);
-    tab_strip = browser->tab_strip_model();
-  }
-
   // Ensure that the standard Welcome page appears on second run on Win 10, and
   // on first run on all other platforms.
   ASSERT_EQ(1, tab_strip->count());
@@ -1422,8 +1418,8 @@
                        WelcomeBackWin10NoPolicy) {
   ASSERT_NO_FATAL_FAILURE(StartBrowser(
       StartupBrowserCreator::WelcomeBackPage::kWelcomeWin10, PolicyVariant()));
-  ExpectUrlInBrowserAtPosition(
-      StartupTabProviderImpl::GetWin10WelcomePageUrl(false), 0);
+  ExpectUrlInBrowserAtPosition(StartupTabProviderImpl::GetWelcomePageUrl(false),
+                               0);
 }
 
 IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorWelcomeBackTest,
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index 619e3f1..111ae1f 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -608,6 +608,8 @@
     has_incompatible_applications =
         IncompatibleApplicationsUpdater::HasCachedApplications();
   }
+
+  nux::JoinOnboardingGroup(profile_);
 #endif
 
   // Presentation of promotional and/or educational tabs may be controlled via
@@ -630,16 +632,17 @@
         !SessionStartupPref::TypeHasRecommendedValue(profile_->GetPrefs());
   }
 
+  bool onboarding_enabled = true;
 #if !defined(OS_CHROMEOS)
-  // No promo if we *could* onboard, but have no modules to show.
-  if (nux::IsNuxOnboardingEnabled(profile_))
-    promotional_tabs_enabled &= nux::DoesOnboardingHaveModulesToShow(profile_);
+  onboarding_enabled = nux::IsNuxOnboardingEnabled(profile_) &&
+                       nux::DoesOnboardingHaveModulesToShow(profile_);
 #endif  // !defined(OS_CHROMEOS)
 
-  StartupTabs tabs = DetermineStartupTabs(
-      StartupTabProviderImpl(), cmd_line_tabs, process_startup,
-      is_incognito_or_guest, is_post_crash_launch,
-      has_incompatible_applications, promotional_tabs_enabled);
+  StartupTabs tabs =
+      DetermineStartupTabs(StartupTabProviderImpl(), cmd_line_tabs,
+                           process_startup, is_incognito_or_guest,
+                           is_post_crash_launch, has_incompatible_applications,
+                           promotional_tabs_enabled, onboarding_enabled);
 
   // Return immediately if we start an async restore, since the remainder of
   // that process is self-contained.
@@ -690,7 +693,8 @@
     bool is_incognito_or_guest,
     bool is_post_crash_launch,
     bool has_incompatible_applications,
-    bool promotional_tabs_enabled) {
+    bool promotional_tabs_enabled,
+    bool onboarding_enabled) {
   // Only the New Tab Page or command line URLs may be shown in incognito mode.
   // A similar policy exists for crash recovery launches, to prevent getting the
   // user stuck in a crash loop.
@@ -739,11 +743,13 @@
         profile_, browser_creator_, process_startup);
     AppendTabs(welcome_back_tabs, &tabs);
 
-    // Policies for onboarding (e.g., first run) may show promotional and
-    // introductory content depending on a number of system status factors,
-    // including OS and whether or not this is First Run.
-    onboarding_tabs = provider.GetOnboardingTabs(profile_);
-    AppendTabs(onboarding_tabs, &tabs);
+    if (onboarding_enabled) {
+      // Policies for onboarding (e.g., first run) may show promotional and
+      // introductory content depending on a number of system status factors,
+      // including OS and whether or not this is First Run.
+      onboarding_tabs = provider.GetOnboardingTabs(profile_);
+      AppendTabs(onboarding_tabs, &tabs);
+    }
   }
 
   // If the user has set the preference indicating URLs to show on opening,
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.h b/chrome/browser/ui/startup/startup_browser_creator_impl.h
index 998edee..ebc0cac 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.h
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.h
@@ -149,7 +149,8 @@
                                    bool is_ephemeral_profile,
                                    bool is_post_crash_launch,
                                    bool has_incompatible_applications,
-                                   bool promotional_tabs_enabled);
+                                   bool promotional_tabs_enabled,
+                                   bool onboarding_enabled);
 
   // Begins an asynchronous session restore if current state allows it (e.g.,
   // this is not process startup) and SessionService indicates that one is
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl_unittest.cc b/chrome/browser/ui/startup/startup_browser_creator_impl_unittest.cc
index 30d8b72..a9cc67f 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl_unittest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl_unittest.cc
@@ -109,8 +109,8 @@
                base::CommandLine(base::CommandLine::NO_PROGRAM),
                chrome::startup::IS_FIRST_RUN);
 
-  StartupTabs output = impl.DetermineStartupTabs(provider, StartupTabs(), true,
-                                                 false, false, false, true);
+  StartupTabs output = impl.DetermineStartupTabs(
+      provider, StartupTabs(), true, false, false, false, true, true);
   ASSERT_EQ(4U, output.size());
   EXPECT_EQ("reset-trigger", output[0].url.host());
   EXPECT_EQ("pinned", output[1].url.host());
@@ -119,7 +119,15 @@
 
   // No extra onboarding content for managed starts.
   output = impl.DetermineStartupTabs(provider, StartupTabs(), true, false,
-                                     false, false, false);
+                                     false, false, false, true);
+  ASSERT_EQ(3U, output.size());
+  EXPECT_EQ("reset-trigger", output[0].url.host());
+  EXPECT_EQ("pinned", output[1].url.host());
+  EXPECT_EQ("prefs", output[2].url.host());
+
+  // No onboarding if not enabled even if promo is allowed.
+  output = impl.DetermineStartupTabs(provider, StartupTabs(), true, false,
+                                     false, false, true, false);
   ASSERT_EQ(3U, output.size());
   EXPECT_EQ("reset-trigger", output[0].url.host());
   EXPECT_EQ("pinned", output[1].url.host());
@@ -136,8 +144,8 @@
                base::CommandLine(base::CommandLine::NO_PROGRAM),
                chrome::startup::IS_FIRST_RUN);
 
-  StartupTabs output = impl.DetermineStartupTabs(provider, StartupTabs(), true,
-                                                 true, false, false, true);
+  StartupTabs output = impl.DetermineStartupTabs(
+      provider, StartupTabs(), true, true, false, false, true, true);
   ASSERT_EQ(1U, output.size());
   // Check for the actual NTP URL, rather than the sentinel returned by the
   // fake, because the Provider is ignored entirely when short-circuited by
@@ -156,8 +164,8 @@
                chrome::startup::IS_FIRST_RUN);
 
   // Regular Crash Recovery case:
-  StartupTabs output = impl.DetermineStartupTabs(provider, StartupTabs(), true,
-                                                 false, true, false, true);
+  StartupTabs output = impl.DetermineStartupTabs(
+      provider, StartupTabs(), true, false, true, false, true, true);
   ASSERT_EQ(1U, output.size());
   // Check for the actual NTP URL, rather than the sentinel returned by the
   // fake, because the Provider is ignored entirely when short-circuited by
@@ -166,7 +174,7 @@
 
   // Crash Recovery case with problem applications:
   output = impl.DetermineStartupTabs(provider, StartupTabs(), true, false, true,
-                                     true, true);
+                                     true, true, true);
   ASSERT_EQ(1U, output.size());
   EXPECT_EQ(GURL("https://incompatible-applications"), output[0].url);
 }
@@ -181,8 +189,8 @@
                base::CommandLine(base::CommandLine::NO_PROGRAM),
                chrome::startup::IS_FIRST_RUN);
 
-  StartupTabs output = impl.DetermineStartupTabs(provider, StartupTabs(), true,
-                                                 false, false, false, true);
+  StartupTabs output = impl.DetermineStartupTabs(
+      provider, StartupTabs(), true, false, false, false, true, true);
   ASSERT_EQ(1U, output.size());
   EXPECT_EQ("distribution", output[0].url.host());
 }
@@ -199,8 +207,8 @@
 
   StartupTabs cmd_line_tabs = {StartupTab(GURL("https://cmd-line"), false)};
 
-  StartupTabs output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true,
-                                                 false, false, false, true);
+  StartupTabs output = impl.DetermineStartupTabs(
+      provider, cmd_line_tabs, true, false, false, false, true, true);
   ASSERT_EQ(3U, output.size());
   EXPECT_EQ("reset-trigger", output[0].url.host());
   EXPECT_EQ("pinned", output[1].url.host());
@@ -211,19 +219,19 @@
 
   // Incognito
   output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true, true, false,
-                                     false, true);
+                                     false, true, true);
   ASSERT_EQ(1U, output.size());
   EXPECT_EQ("cmd-line", output[0].url.host());
 
   // Crash Recovery
   output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true, false, true,
-                                     false, true);
+                                     false, true, true);
   ASSERT_EQ(1U, output.size());
   EXPECT_EQ("cmd-line", output[0].url.host());
 
   // Crash Recovery with incompatible applications.
   output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true, false, true,
-                                     true, true);
+                                     true, true, true);
   ASSERT_EQ(1U, output.size());
   EXPECT_EQ("cmd-line", output[0].url.host());
 }
@@ -237,8 +245,9 @@
                base::CommandLine(base::CommandLine::NO_PROGRAM),
                chrome::startup::IS_FIRST_RUN);
 
-  StartupTabs output = impl.DetermineStartupTabs(
-      provider_allows_ntp, StartupTabs(), true, false, false, false, true);
+  StartupTabs output =
+      impl.DetermineStartupTabs(provider_allows_ntp, StartupTabs(), true, false,
+                                false, false, true, true);
   ASSERT_EQ(3U, output.size());
   EXPECT_EQ("reset-trigger", output[0].url.host());
   EXPECT_EQ("pinned", output[1].url.host());
@@ -253,8 +262,9 @@
                base::CommandLine(base::CommandLine::NO_PROGRAM),
                chrome::startup::IS_FIRST_RUN);
 
-  StartupTabs output = impl.DetermineStartupTabs(
-      provider_allows_ntp, StartupTabs(), true, false, false, false, true);
+  StartupTabs output =
+      impl.DetermineStartupTabs(provider_allows_ntp, StartupTabs(), true, false,
+                                false, false, true, true);
   ASSERT_EQ(3U, output.size());
   EXPECT_EQ("pinned", output[0].url.host());
   EXPECT_EQ("welcome-back", output[1].url.host());
@@ -262,14 +272,14 @@
 
   // No welcome back for non-startup opens.
   output = impl.DetermineStartupTabs(provider_allows_ntp, StartupTabs(), false,
-                                     false, false, false, true);
+                                     false, false, false, true, true);
   ASSERT_EQ(2U, output.size());
   EXPECT_EQ("pinned", output[0].url.host());
   EXPECT_EQ("prefs", output[1].url.host());
 
   // No welcome back for managed starts even if first run.
   output = impl.DetermineStartupTabs(provider_allows_ntp, StartupTabs(), true,
-                                     false, false, false, false);
+                                     false, false, false, false, true);
   ASSERT_EQ(2U, output.size());
   EXPECT_EQ("pinned", output[0].url.host());
   EXPECT_EQ("prefs", output[1].url.host());
diff --git a/chrome/browser/ui/startup/startup_tab_provider.cc b/chrome/browser/ui/startup/startup_tab_provider.cc
index 872abd0..364603ff 100644
--- a/chrome/browser/ui/startup/startup_tab_provider.cc
+++ b/chrome/browser/ui/startup/startup_tab_provider.cc
@@ -34,19 +34,6 @@
 
 namespace {
 
-#if defined(OS_WIN)
-// Returns false if the in-product default browser UX is suppressed by install
-// mode (e.g., Chrome Canary) or by policy.
-bool SetDefaultBrowserAllowed(PrefService* local_state) {
-  if (!shell_integration::CanSetAsDefaultBrowser())
-    return false;
-  return !local_state ||
-         !local_state->IsManagedPreference(
-             prefs::kDefaultBrowserSettingEnabled) ||
-         local_state->GetBoolean(prefs::kDefaultBrowserSettingEnabled);
-}
-#endif  // defined(OS_WIN)
-
 // Attempts to find an existing, non-empty tabbed browser for this profile.
 bool ProfileHasOtherTabbedBrowser(Profile* profile) {
   BrowserList* browser_list = BrowserList::GetInstance();
@@ -80,33 +67,6 @@
   standard_params.is_supervised_user = profile->IsSupervised();
   standard_params.is_force_signin_enabled = signin_util::IsForceSigninEnabled();
 
-#if defined(OS_WIN)
-  // Windows 10 has unique onboarding policies and content. However, if
-  // NuxOnboarding is enabled, the standard welcome URL should still
-  // be used.
-  bool is_navi_enabled = false;
-#if defined(GOOGLE_CHROME_BUILD)
-  is_navi_enabled = nux::IsNuxOnboardingEnabled(profile);
-#endif
-  if (base::win::GetVersion() >= base::win::Version::WIN10 &&
-      !is_navi_enabled) {
-    Win10OnboardingTabsParams win10_params;
-    PrefService* local_state = g_browser_process->local_state();
-    const shell_integration::DefaultWebClientState web_client_state =
-        g_browser_process->CachedDefaultWebClientState();
-    win10_params.has_seen_win10_promo =
-        local_state && local_state->GetBoolean(prefs::kHasSeenWin10PromoPage);
-    win10_params.set_default_browser_allowed =
-        SetDefaultBrowserAllowed(local_state);
-    // Do not welcome if this Chrome or another side-by-side install was the
-    // default browser at startup.
-    win10_params.is_default_browser =
-        web_client_state == shell_integration::IS_DEFAULT ||
-        web_client_state == shell_integration::OTHER_MODE_IS_DEFAULT;
-    return GetWin10OnboardingTabsForState(standard_params, win10_params);
-  }
-#endif  // defined(OS_WIN)
-
   return GetStandardOnboardingTabsForState(standard_params);
 #endif  // defined(OS_CHROMEOS)
 }
@@ -123,12 +83,7 @@
       break;
 #if defined(OS_WIN)
     case StartupBrowserCreator::WelcomeBackPage::kWelcomeWin10:
-      if (CanShowWin10Welcome(
-              SetDefaultBrowserAllowed(g_browser_process->local_state()),
-              profile->IsSupervised())) {
-        tabs.emplace_back(GetWin10WelcomePageUrl(false), false);
-        break;
-      }
+      // TODO(hcarmona): delete kWelcomeWin10.
       FALLTHROUGH;
 #endif  // defined(OS_WIN)
     case StartupBrowserCreator::WelcomeBackPage::kWelcomeStandard:
@@ -216,37 +171,6 @@
   return tabs;
 }
 
-#if defined(OS_WIN)
-// static
-bool StartupTabProviderImpl::CanShowWin10Welcome(
-    bool set_default_browser_allowed,
-    bool is_supervised_user) {
-  return set_default_browser_allowed && !is_supervised_user;
-}
-
-// static
-bool StartupTabProviderImpl::ShouldShowWin10WelcomeForOnboarding(
-    bool has_seen_win10_promo,
-    bool is_default_browser) {
-  return !has_seen_win10_promo && !is_default_browser;
-}
-
-// static
-StartupTabs StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-    const StandardOnboardingTabsParams& standard_params,
-    const Win10OnboardingTabsParams& win10_params) {
-  if (CanShowWin10Welcome(win10_params.set_default_browser_allowed,
-                          standard_params.is_supervised_user) &&
-      ShouldShowWin10WelcomeForOnboarding(win10_params.has_seen_win10_promo,
-                                          win10_params.is_default_browser)) {
-    return {StartupTab(GetWin10WelcomePageUrl(!standard_params.is_first_run),
-                       false)};
-  }
-
-  return GetStandardOnboardingTabsForState(standard_params);
-}
-#endif  // defined(OS_WIN)
-
 // static
 StartupTabs StartupTabProviderImpl::GetMasterPrefsTabsForState(
     bool is_first_run,
@@ -319,7 +243,7 @@
 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
   if (has_incompatible_applications)
     tabs.emplace_back(GetIncompatibleApplicationsUrl(), false);
-#endif
+#endif  // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
   return tabs;
 }
 
@@ -331,27 +255,14 @@
              : url;
 }
 
-#if defined(OS_WIN)
-// static
-GURL StartupTabProviderImpl::GetWin10WelcomePageUrl(
-    bool use_later_run_variant) {
-  // Record that the Welcome page was added to the startup url list.
-  UMA_HISTOGRAM_BOOLEAN("Welcome.Win10.NewPromoPageAdded", true);
-  GURL url(chrome::kChromeUIWelcomeWin10URL);
-  return use_later_run_variant
-             ? net::AppendQueryParameter(url, "text", "faster")
-             : url;
-}
-
-#if defined(GOOGLE_CHROME_BUILD)
+#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
 // static
 GURL StartupTabProviderImpl::GetIncompatibleApplicationsUrl() {
   UMA_HISTOGRAM_BOOLEAN("IncompatibleApplicationsPage.AddedPostCrash", true);
   GURL url(chrome::kChromeUISettingsURL);
   return url.Resolve("incompatibleApplications");
 }
-#endif  // defined(GOOGLE_CHROME_BUILD)
-#endif  // defined(OS_WIN)
+#endif  // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
 
 // static
 GURL StartupTabProviderImpl::GetTriggeredResetSettingsUrl() {
diff --git a/chrome/browser/ui/startup/startup_tab_provider.h b/chrome/browser/ui/startup/startup_tab_provider.h
index e338d9a..ff71dc5 100644
--- a/chrome/browser/ui/startup/startup_tab_provider.h
+++ b/chrome/browser/ui/startup/startup_tab_provider.h
@@ -73,12 +73,6 @@
     bool is_force_signin_enabled = false;
   };
 
-  struct Win10OnboardingTabsParams {
-    bool has_seen_win10_promo = false;
-    bool set_default_browser_allowed = false;
-    bool is_default_browser = false;
-  };
-
   StartupTabProviderImpl() = default;
 
   // The static helper methods below implement the policies relevant to the
@@ -101,23 +95,6 @@
   static StartupTabs GetStandardOnboardingTabsForState(
       const StandardOnboardingTabsParams& params);
 
-#if defined(OS_WIN)
-  // returns true if showing the Windows 10 welcome page is permissible.
-  static bool CanShowWin10Welcome(bool set_default_browser_allowed,
-                                  bool is_supervised_user);
-
-  // Returns true if the Windows 10 welcome page should be shown in a tab. This
-  // should only be used following a positive result from CanShowWin10Welcome.
-  static bool ShouldShowWin10WelcomeForOnboarding(bool has_seen_win10_promo,
-                                                  bool is_default_browser);
-
-  // Determines which tabs should be shown according to onboarding/first run
-  // policy, including promo content specific to Windows 10.
-  static StartupTabs GetWin10OnboardingTabsForState(
-      const StandardOnboardingTabsParams& standard_params,
-      const Win10OnboardingTabsParams& win10_params);
-#endif  // defined(OS_WIN)
-
   // Processes first run URLs specified in Master Preferences file, replacing
   // any "magic word" URL hosts with appropriate URLs.
   static StartupTabs GetMasterPrefsTabsForState(
@@ -158,18 +135,11 @@
   // additional profile).
   static GURL GetWelcomePageUrl(bool use_later_run_variant);
 
-#if defined(OS_WIN)
-  // Gets the URL for the Windows 10 Welcome page. If |use_later_run_variant| is
-  // true, a URL parameter will be appended so as to access the variant page
-  // used when onboarding occurs after the first Chrome execution.
-  static GURL GetWin10WelcomePageUrl(bool use_later_run_variant);
-
-#if defined(GOOGLE_CHROME_BUILD)
+#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
   // Gets the URL for the Incompatible Applications subpage of the Chrome
   // settings.
   static GURL GetIncompatibleApplicationsUrl();
-#endif  // defined(GOOGLE_CHROME_BUILD)
-#endif  // defined(OS_WIN)
+#endif  // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
 
   // Gets the URL for the page which offers to reset the user's profile
   // settings.
diff --git a/chrome/browser/ui/startup/startup_tab_provider_unittest.cc b/chrome/browser/ui/startup/startup_tab_provider_unittest.cc
index ebcf3b2..5b6cebb 100644
--- a/chrome/browser/ui/startup/startup_tab_provider_unittest.cc
+++ b/chrome/browser/ui/startup/startup_tab_provider_unittest.cc
@@ -12,17 +12,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#if defined(GOOGLE_CHROME_BUILD)
-#include "chrome/browser/ui/webui/welcome/nux/constants.h"
-#endif  // defined(GOOGLE_CHROME_BUILD)
-#endif  // defined(OS_WIN)
-
 using StandardOnboardingTabsParams =
     StartupTabProviderImpl::StandardOnboardingTabsParams;
-using Win10OnboardingTabsParams =
-    StartupTabProviderImpl::Win10OnboardingTabsParams;
 
 TEST(StartupTabProviderTest, GetStandardOnboardingTabsForState) {
   {
@@ -103,208 +94,6 @@
   }
 }
 
-#if defined(OS_WIN)
-TEST(StartupTabProviderTest, GetWin10OnboardingTabsForState) {
-  {
-    // Show Win 10 Welcome page if it has not been seen, but the standard page
-    // has.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.has_seen_welcome_page = true;
-    standard_params.is_signin_allowed = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWin10WelcomePageUrl(false),
-              output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-  {
-    // Show standard Welcome page if the Win 10 Welcome page has been seen, but
-    // the standard page has not.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.has_seen_win10_promo = true;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWelcomePageUrl(false), output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-  {
-    // If neither page has been seen, the Win 10 Welcome page takes precedence
-    // this launch.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWin10WelcomePageUrl(false),
-              output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-}
-
-TEST(StartupTabProviderTest, GetWin10OnboardingTabsForState_LaterRunVariant) {
-  StandardOnboardingTabsParams standard_params;
-  standard_params.is_signin_allowed = true;
-  {
-    // Show a variant of the Win 10 Welcome page after first run, if it has not
-    // been seen.
-    Win10OnboardingTabsParams win10_params;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWin10WelcomePageUrl(true),
-              output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-  {
-    // Show a variant of the standard Welcome page after first run, if the Win
-    // 10 Welcome page has already been seen but the standard has not.
-    Win10OnboardingTabsParams win10_params;
-    win10_params.has_seen_win10_promo = true;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWelcomePageUrl(true), output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-}
-
-TEST(StartupTabProviderTest, GetWin10OnboardingTabsForState_Negative) {
-  {
-    // Do not show either page if it has already been shown.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.has_seen_welcome_page = true;
-    standard_params.is_signin_allowed = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.has_seen_win10_promo = true;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    EXPECT_TRUE(output.empty());
-  }
-  {
-    // Do not show either page to supervised users.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-    standard_params.is_supervised_user = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    EXPECT_TRUE(output.empty());
-  }
-  {
-    // If Chrome is already the default browser, don't show the Win 10 Welcome
-    // page, and don't preempt the standard Welcome page.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.set_default_browser_allowed = true;
-    win10_params.is_default_browser = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWelcomePageUrl(false), output[0].url);
-    EXPECT_FALSE(output[0].is_pinned);
-  }
-  {
-    // If the user is signed in, block showing the standard Welcome page.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-    standard_params.is_signed_in = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.has_seen_win10_promo = true;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    EXPECT_TRUE(output.empty());
-  }
-  {
-    // If sign-in is disabled, block showing the standard Welcome page.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-
-    Win10OnboardingTabsParams win10_params;
-    win10_params.has_seen_win10_promo = true;
-    win10_params.set_default_browser_allowed = true;
-
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, win10_params);
-
-    EXPECT_TRUE(output.empty());
-  }
-}
-
-TEST(StartupTabProviderTest,
-     GetWin10OnboardingTabsForState_SetDefaultBrowserNotAllowed) {
-  {
-    // Skip the Win 10 promo if setting the default browser is not allowed.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.is_signin_allowed = true;
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, Win10OnboardingTabsParams());
-
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWelcomePageUrl(false), output[0].url);
-  }
-  {
-    // After first run, no onboarding content is displayed when setting the
-    // default browser is not allowed.
-    StandardOnboardingTabsParams standard_params;
-    standard_params.is_first_run = true;
-    standard_params.has_seen_welcome_page = true;
-    standard_params.is_signin_allowed = true;
-    StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
-        standard_params, Win10OnboardingTabsParams());
-
-    EXPECT_TRUE(output.empty());
-  }
-}
-#endif  // defined(OS_WIN)
-
 TEST(StartupTabProviderTest, GetMasterPrefsTabsForState) {
   std::vector<GURL> input = {GURL(base::ASCIIToUTF16("https://new_tab_page")),
                              GURL(base::ASCIIToUTF16("https://www.google.com")),
@@ -454,15 +243,5 @@
   TestingProfile profile;
   Profile* incognito = profile.GetOffTheRecordProfile();
   StartupTabs output = StartupTabProviderImpl().GetOnboardingTabs(incognito);
-#if defined(OS_WIN)
-  if (base::win::GetVersion() >= base::win::Version::WIN10) {
-    ASSERT_EQ(1U, output.size());
-    EXPECT_EQ(StartupTabProviderImpl::GetWin10WelcomePageUrl(false),
-              output[0].url.GetOrigin());
-  } else {
-    EXPECT_TRUE(output.empty());
-  }
-#else
   EXPECT_TRUE(output.empty());
-#endif
 }
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index d0243de..522e334 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -595,7 +595,7 @@
   favicon_request_handler->GetFaviconImageForPageURL(
       url,
       base::BindOnce(&RecentTabsSubMenuModel::OnFaviconDataAvailable,
-                     base::Unretained(this), command_id),
+                     weak_ptr_factory_.GetWeakPtr(), command_id),
       favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS,
       open_tabs ? open_tabs->GetIconUrlForPageUrl(url) : GURL(),
       CanSendHistoryDataToServer(is_local_tab, browser_),
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index a285154..5abd6754 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -39,4 +39,9 @@
 const base::Feature kTabHoverCardImages{"TabHoverCardImages",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+constexpr base::Feature kEnableDbusAndX11StatusIcons{
+    "EnableDbusAndX11StatusIcons", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif
+
 }  // namespace features
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index fab4d03..5b8766c 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -31,6 +31,10 @@
 
 extern const base::Feature kTabHoverCardImages;
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+extern const base::Feature kEnableDbusAndX11StatusIcons;
+#endif
+
 }  // namespace features
 
 #endif  // CHROME_BROWSER_UI_UI_FEATURES_H_
diff --git a/chrome/browser/ui/views/collected_cookies_views.cc b/chrome/browser/ui/views/collected_cookies_views.cc
index c70d8d4..c6e04a2d 100644
--- a/chrome/browser/ui/views/collected_cookies_views.cc
+++ b/chrome/browser/ui/views/collected_cookies_views.cc
@@ -417,8 +417,8 @@
       IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_TAB_LABEL);
   base::string16 label_blocked = l10n_util::GetStringUTF16(
       IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_TAB_LABEL);
-  tabbed_pane->AddTab(label_allowed, CreateAllowedPane().release());
-  tabbed_pane->AddTab(label_blocked, CreateBlockedPane().release());
+  tabbed_pane->AddTab(label_allowed, CreateAllowedPane());
+  tabbed_pane->AddTab(label_blocked, CreateBlockedPane());
   tabbed_pane->SelectTabAt(0);
   tabbed_pane->set_listener(this);
 
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
index 5671323..199fe91 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -174,7 +174,7 @@
   if (panes.size() > 1) {
     auto tabbed_pane = std::make_unique<views::TabbedPane>();
     for (auto& pane : panes)
-      tabbed_pane->AddTab(pane.first, pane.second.release());
+      tabbed_pane->AddTab(pane.first, std::move(pane.second));
     tabbed_pane->set_listener(this);
     tabbed_pane->SetFocusBehavior(views::View::FocusBehavior::NEVER);
     tabbed_pane_ = AddChildView(std::move(tabbed_pane));
diff --git a/chrome/browser/ui/views/hover_button.h b/chrome/browser/ui/views/hover_button.h
index a30368a79..820bf2a 100644
--- a/chrome/browser/ui/views/hover_button.h
+++ b/chrome/browser/ui/views/hover_button.h
@@ -28,6 +28,8 @@
 class View;
 }  // namespace views
 
+class PageInfoBubbleViewBrowserTest;
+
 // A button taking the full width of its parent that shows a background color
 // when hovered over.
 class HoverButton : public views::MenuButton, public views::MenuButtonListener {
@@ -120,6 +122,7 @@
                            SetStatusLabel);
   FRIEND_TEST_ALL_PREFIXES(ExtensionsMenuButtonTest,
                            UpdatesToDisplayCorrectActionTitle);
+  friend class PageInfoBubbleViewBrowserTest;
 
   views::StyledLabel* title_ = nullptr;
   views::Label* subtitle_ = nullptr;
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view.h b/chrome/browser/ui/views/page_info/page_info_bubble_view.h
index d1f8f8a..1606724 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view.h
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view.h
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/page_info/page_info_ui.h"
 #include "chrome/browser/ui/views/bubble_anchor_util_views.h"
+#include "chrome/browser/ui/views/hover_button.h"
 #include "chrome/browser/ui/views/page_info/chosen_object_view_observer.h"
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view_base.h"
 #include "chrome/browser/ui/views/page_info/permission_selector_row.h"
@@ -24,12 +25,12 @@
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/link_listener.h"
 #include "ui/views/controls/separator.h"
+#include "ui/views/controls/styled_label.h"
 #include "ui/views/controls/styled_label_listener.h"
 #include "ui/views/widget/widget.h"
 
 class BubbleHeaderView;
 class GURL;
-class HoverButton;
 class Profile;
 
 namespace content {
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
index d49f50c3..278f9ac65 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
@@ -50,6 +50,8 @@
 
 namespace {
 
+constexpr char kExpiredCertificateFile[] = "expired_cert.pem";
+
 class ClickEvent : public ui::Event {
  public:
   ClickEvent() : ui::Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
@@ -140,6 +142,7 @@
     constexpr char kUnwantedSoftware[] = "UnwantedSoftware";
     constexpr char kSignInPasswordReuse[] = "SignInPasswordReuse";
     constexpr char kEnterprisePasswordReuse[] = "EnterprisePasswordReuse";
+    constexpr char kMalwareAndBadCert[] = "MalwareAndBadCert";
     constexpr char kMixedContentForm[] = "MixedContentForm";
     constexpr char kMixedContent[] = "MixedContent";
     constexpr char kAllowAllPermissions[] = "AllowAllPermissions";
@@ -157,7 +160,7 @@
     GURL url = http_url;
     if (name == kSecure || name == kEvSecure || name == kMixedContentForm ||
         name == kMixedContent || name == kAllowAllPermissions ||
-        name == kBlockAllPermissions) {
+        name == kBlockAllPermissions || name == kMalwareAndBadCert) {
       url = https_url;
     }
     if (name == kInternal) {
@@ -203,19 +206,24 @@
       expected_identifiers_.push_back(
           PageInfoBubbleView::VIEW_ID_PAGE_INFO_LABEL_EV_CERTIFICATE_DETAILS);
     } else if (name == kMalware) {
-      identity.identity_status = PageInfo::SITE_IDENTITY_STATUS_MALWARE;
+      identity.safe_browsing_status = PageInfo::SAFE_BROWSING_STATUS_MALWARE;
     } else if (name == kDeceptive) {
-      identity.identity_status =
-          PageInfo::SITE_IDENTITY_STATUS_SOCIAL_ENGINEERING;
+      identity.safe_browsing_status =
+          PageInfo::SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING;
     } else if (name == kUnwantedSoftware) {
-      identity.identity_status =
-          PageInfo::SITE_IDENTITY_STATUS_UNWANTED_SOFTWARE;
+      identity.safe_browsing_status =
+          PageInfo::SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE;
     } else if (name == kSignInPasswordReuse) {
-      identity.identity_status =
-          PageInfo::SITE_IDENTITY_STATUS_SIGN_IN_PASSWORD_REUSE;
+      identity.safe_browsing_status =
+          PageInfo::SAFE_BROWSING_STATUS_SIGN_IN_PASSWORD_REUSE;
     } else if (name == kEnterprisePasswordReuse) {
-      identity.identity_status =
-          PageInfo::SITE_IDENTITY_STATUS_ENTERPRISE_PASSWORD_REUSE;
+      identity.safe_browsing_status =
+          PageInfo::SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE;
+    } else if (name == kMalwareAndBadCert) {
+      identity.identity_status = PageInfo::SITE_IDENTITY_STATUS_ERROR;
+      identity.certificate = net::ImportCertFromFile(
+          net::GetTestCertsDirectory(), kExpiredCertificateFile);
+      identity.safe_browsing_status = PageInfo::SAFE_BROWSING_STATUS_MALWARE;
     } else if (name == kMixedContentForm) {
       identity.identity_status =
           PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT;
@@ -340,6 +348,15 @@
         ->SetIdentityInfo(identity_info);
   }
 
+  base::string16 GetCertificateButtonTitle() const {
+    // Only PageInfoBubbleViewBrowserTest can access certificate_button_ in
+    // PageInfoBubbleView, or title() in HoverButton.
+    PageInfoBubbleView* page_info_bubble_view =
+        static_cast<PageInfoBubbleView*>(
+            PageInfoBubbleView::GetPageInfoBubble());
+    return page_info_bubble_view->certificate_button_->title()->text();
+  }
+
  private:
   std::vector<PageInfoBubbleView::PageInfoBubbleViewID> expected_identifiers_;
 
@@ -621,6 +638,13 @@
   ShowAndVerifyUi();
 }
 
+// Shows the Page Info bubble for a site flagged for malware that also has a bad
+// certificate.
+IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
+                       InvokeUi_MalwareAndBadCert) {
+  ShowAndVerifyUi();
+}
+
 // Shows the Page Info bubble for an admin-provided cert when the page is
 // secure, but has a form that submits to an insecure url.
 IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
@@ -714,6 +738,41 @@
             l10n_util::GetStringUTF16(IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY));
 }
 
+// Ensure a page can both have an invalid certificate *and* be blocked by Safe
+// Browsing.  Regression test for bug 869925.
+IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest, BlockedAndInvalidCert) {
+  net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
+  https_server.AddDefaultHandlers(
+      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+  ASSERT_TRUE(https_server.Start());
+
+  ui_test_utils::NavigateToURL(browser(), https_server.GetURL("/simple.html"));
+
+  // Setup the bogus identity with an expired cert and SB flagging.
+  PageInfoUI::IdentityInfo identity;
+  identity.identity_status = PageInfo::SITE_IDENTITY_STATUS_ERROR;
+  identity.certificate = net::ImportCertFromFile(net::GetTestCertsDirectory(),
+                                                 kExpiredCertificateFile);
+  identity.safe_browsing_status = PageInfo::SAFE_BROWSING_STATUS_MALWARE;
+  OpenPageInfoBubble(browser());
+
+  SetPageInfoBubbleIdentityInfo(identity);
+
+  views::BubbleDialogDelegateView* page_info =
+      PageInfoBubbleView::GetPageInfoBubble();
+
+  // Verify bubble complains of malware...
+  EXPECT_EQ(page_info->GetWindowTitle(),
+            l10n_util::GetStringUTF16(IDS_PAGE_INFO_MALWARE_SUMMARY));
+
+  // ...and has a "Certificate (Invalid)" button.
+  const base::string16 invalid_parens = l10n_util::GetStringUTF16(
+      IDS_PAGE_INFO_CERTIFICATE_INVALID_PARENTHESIZED);
+  EXPECT_EQ(GetCertificateButtonTitle(),
+            l10n_util::GetStringFUTF16(IDS_PAGE_INFO_CERTIFICATE_BUTTON_TEXT,
+                                       invalid_parens));
+}
+
 namespace {
 
 // Tracks focus of an arbitrary UI element.
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc
index 9745cf3..1e1ca5c 100644
--- a/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc
+++ b/chrome/browser/ui/views/status_icons/status_icon_linux_wrapper.cc
@@ -8,6 +8,7 @@
 
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
 #include "ui/views/linux_ui/linux_ui.h"
 
@@ -21,9 +22,6 @@
 
 namespace {
 
-constexpr base::Feature kEnableDbusAndX11StatusIcons{
-    "EnableDbusAndX11StatusIcons", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Prefix for app indicator ids
 const char kAppIndicatorIdPrefix[] = "chrome_app_indicator_";
 
@@ -135,7 +133,7 @@
 StatusIconLinuxWrapper::CreateWrappedStatusIcon(
     const gfx::ImageSkia& image,
     const base::string16& tool_tip) {
-  if (base::FeatureList::IsEnabled(kEnableDbusAndX11StatusIcons)) {
+  if (base::FeatureList::IsEnabled(features::kEnableDbusAndX11StatusIcons)) {
 #if defined(USE_DBUS)
     return base::WrapUnique(new StatusIconLinuxWrapper(
         std::make_unique<StatusIconLinuxDbus>(), kTypeDbus, image, tool_tip));
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index f1243ec..ef5d787 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -9,6 +9,7 @@
 #include <string>
 #include <utility>
 #include <vector>
+
 #include "base/i18n/string_compare.h"
 #include "base/memory/singleton.h"
 #include "base/metrics/field_trial_params.h"
@@ -848,8 +849,8 @@
   return view;
 }
 
-views::View* TranslateBubbleView::CreateEmptyPane() {
-  views::View* pane = new views::View();
+std::unique_ptr<views::View> TranslateBubbleView::CreateEmptyPane() {
+  auto pane = std::make_unique<views::View>();
   pane->SetBorder(
       views::CreateEmptyBorder(ChromeLayoutProvider::Get()->GetInsetsMetric(
           views::INSETS_DIALOG_SUBSECTION)));
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.h b/chrome/browser/ui/views/translate/translate_bubble_view.h
index 29be5ba0..da575a16 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.h
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.h
@@ -6,7 +6,9 @@
 #define CHROME_BROWSER_UI_VIEWS_TRANSLATE_TRANSLATE_BUBBLE_VIEW_H_
 
 #include <map>
+#include <memory>
 #include <string>
+
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
@@ -242,7 +244,7 @@
 
   // AddTab function requires a view element to be shown below each tab.
   // This function creates an empty view so no extra white space below the tab.
-  views::View* CreateEmptyPane();
+  std::unique_ptr<views::View> CreateEmptyPane();
 
   // Creates the 'translating' view for the existing Button UI. Caller takes
   // ownership of the returned view.
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index a8fe7c7..a7f23f8 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -203,7 +203,6 @@
 #if defined(OS_WIN)
 #include "chrome/browser/ui/webui/conflicts/conflicts_ui.h"
 #include "chrome/browser/ui/webui/set_as_default_browser_ui_win.h"
-#include "chrome/browser/ui/webui/welcome/welcome_win10_ui.h"
 #endif
 
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
@@ -313,13 +312,6 @@
 }
 #endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
 
-#if defined(OS_WIN)
-template <>
-WebUIController* NewWebUI<WelcomeWin10UI>(WebUI* web_ui, const GURL& url) {
-  return new WelcomeWin10UI(web_ui, url);
-}
-#endif  // defined(OS_WIN)
-
 bool IsAboutUI(const GURL& url) {
   return (url.host_piece() == chrome::kChromeUIChromeURLsHost ||
           url.host_piece() == chrome::kChromeUICreditsHost
@@ -616,10 +608,6 @@
   if (url.host_piece() == chrome::kChromeUIWelcomeHost)
     return &NewWebUI<WelcomeUI>;
 #endif
-#if defined(OS_WIN)
-  if (url.host_piece() == chrome::kChromeUIWelcomeWin10Host)
-    return &NewWebUI<WelcomeWin10UI>;
-#endif  // defined(OS_WIN)
 
   /****************************************************************************
    * Other #defines and special logics.
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index f045c47..55bd6955 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -66,7 +66,6 @@
 #include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
-#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
@@ -165,11 +164,6 @@
 #endif
 }
 
-void AddSupervisionOnboardingScreenResources(content::WebUIDataSource* source) {
-  source->AddResourcePath("supervision/onboarding_controller.mojom-lite.js",
-                          IDR_SUPERVISION_ONBOARDING_CONTROLLER_MOJOM_LITE_JS);
-}
-
 // Adds resources for ARC-dependent screens (PlayStore ToS, Assistant, etc...)
 void AddArcScreensResources(content::WebUIDataSource* source) {
   // Required for postprocessing of Goolge PlayStore Terms and Overlay help.
@@ -253,7 +247,6 @@
   AddFingerprintResources(source);
   AddSyncConsentResources(source);
   AddArcScreensResources(source);
-  AddSupervisionOnboardingScreenResources(source);
 
   source->AddResourcePath(kKeyboardUtilsJSPath, IDR_KEYBOARD_UTILS_JS);
   source->OverrideContentSecurityPolicyObjectSrc(
@@ -422,9 +415,6 @@
   AddScreenHandler(std::make_unique<EncryptionMigrationScreenHandler>(
       js_calls_container_.get()));
 
-  AddScreenHandler(std::make_unique<SupervisionOnboardingScreenHandler>(
-      js_calls_container_.get()));
-
   AddScreenHandler(std::make_unique<SupervisionTransitionScreenHandler>(
       js_calls_container_.get()));
 
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc
deleted file mode 100644
index 9a9886b..0000000
--- a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc
+++ /dev/null
@@ -1,86 +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 "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
-
-#include "base/bind.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/oobe_screen.h"
-#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/ash/login_screen_client.h"
-#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/login/localized_values_builder.h"
-
-namespace chromeos {
-
-constexpr StaticOobeScreenId SupervisionOnboardingScreenView::kScreenId;
-
-SupervisionOnboardingScreenHandler::SupervisionOnboardingScreenHandler(
-    JSCallsContainer* js_calls_container)
-    : BaseScreenHandler(kScreenId, js_calls_container) {}
-
-SupervisionOnboardingScreenHandler::~SupervisionOnboardingScreenHandler() {
-  if (screen_)
-    screen_->OnViewDestroyed(this);
-}
-
-void SupervisionOnboardingScreenHandler::DeclareLocalizedValues(
-    ::login::LocalizedValuesBuilder* builder) {
-  builder->Add("supervisionOnboardingWaitMessage",
-               IDS_SUPERVISION_ONBOARDING_WAIT_MESSAGE);
-  builder->Add("supervisionOnboardingNextButtonLabel",
-               IDS_SUPERVISION_ONBOARDING_NEXT_BUTTON);
-  builder->Add("supervisionOnboardingSkipButtonLabel",
-               IDS_SUPERVISION_ONBOARDING_SKIP_BUTTON);
-  builder->Add("supervisionOnboardingBackButtonLabel",
-               IDS_SUPERVISION_ONBOARDING_BACK_BUTTON);
-  builder->Add("supervisionOnboardingRetryButtonLabel",
-               IDS_SUPERVISION_ONBOARDING_RETRY_BUTTON);
-  builder->Add("supervisionOnboardingRetryDialogTitle",
-               IDS_SUPERVISION_ONBOARDING_RETRY_DIALOG_TITLE);
-  builder->Add("supervisionOnboardingRetryDialogMessage",
-               IDS_SUPERVISION_ONBOARDING_RETRY_DIALOG_MESSAGE);
-}
-
-void SupervisionOnboardingScreenHandler::Bind(
-    SupervisionOnboardingScreen* screen) {
-  BaseScreenHandler::SetBaseScreen(screen);
-  screen_ = screen;
-}
-
-void SupervisionOnboardingScreenHandler::Unbind() {
-  supervision_onboarding_controller_.reset();
-  screen_ = nullptr;
-  BaseScreenHandler::SetBaseScreen(nullptr);
-}
-
-void SupervisionOnboardingScreenHandler::Show() {
-  ShowScreen(kScreenId);
-
-  GetOobeUI()->AddHandlerToRegistry(base::BindRepeating(
-      &SupervisionOnboardingScreenHandler::BindSupervisionOnboardingController,
-      base::Unretained(this)));
-
-  CallJS("login.SupervisionOnboardingScreen.setupMojo");
-}
-
-void SupervisionOnboardingScreenHandler::Hide() {}
-
-void SupervisionOnboardingScreenHandler::Initialize() {}
-
-void SupervisionOnboardingScreenHandler::BindSupervisionOnboardingController(
-    supervision::mojom::OnboardingControllerRequest request) {
-  DCHECK(screen_);
-  if (!supervision_onboarding_controller_) {
-    supervision_onboarding_controller_ =
-        std::make_unique<supervision::OnboardingControllerImpl>(
-            ProfileManager::GetPrimaryUserProfile(), screen_);
-  }
-
-  supervision_onboarding_controller_->BindRequest(std::move(request));
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h
deleted file mode 100644
index ba8035c..0000000
--- a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h
+++ /dev/null
@@ -1,82 +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.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
-#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
-#include "chrome/browser/chromeos/supervision/onboarding_controller_impl.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
-#include "components/prefs/pref_change_registrar.h"
-
-namespace chromeos {
-
-class SupervisionOnboardingScreen;
-
-// Interface for dependency injection between SupervisionOnboardingScreen
-// and its WebUI representation.
-class SupervisionOnboardingScreenView {
- public:
-  constexpr static StaticOobeScreenId kScreenId{"supervision-onboarding"};
-
-  virtual ~SupervisionOnboardingScreenView() {}
-
-  virtual void Bind(SupervisionOnboardingScreen* screen) = 0;
-  virtual void Unbind() = 0;
-  virtual void Show() = 0;
-  virtual void Hide() = 0;
-
- protected:
-  SupervisionOnboardingScreenView() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreenView);
-};
-
-class SupervisionOnboardingScreenHandler
-    : public BaseScreenHandler,
-      public SupervisionOnboardingScreenView {
- public:
-  using TView = SupervisionOnboardingScreenView;
-
-  explicit SupervisionOnboardingScreenHandler(
-      JSCallsContainer* js_calls_container);
-  ~SupervisionOnboardingScreenHandler() override;
-
-  // BaseScreenHandler:
-  void DeclareLocalizedValues(
-      ::login::LocalizedValuesBuilder* builder) override;
-
-  // SupervisionOnboardingScreenView:
-  void Bind(SupervisionOnboardingScreen* screen) override;
-  void Unbind() override;
-  void Show() override;
-  void Hide() override;
-
- private:
-  // BaseScreenHandler:
-  void Initialize() override;
-
-  // Callback used to bing the mojo onboarding controller.
-  void BindSupervisionOnboardingController(
-      supervision::mojom::OnboardingControllerRequest request);
-
-  SupervisionOnboardingScreen* screen_ = nullptr;
-
-  std::unique_ptr<supervision::OnboardingControllerImpl>
-      supervision_onboarding_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreenHandler);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index 46927f4..628902de 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -484,6 +484,7 @@
 }
 
 void CupsPrintersHandler::OnAutoconfQueriedDiscovered(
+    const std::string& callback_id,
     Printer printer,
     PrinterQueryResult result,
     const std::string& make,
@@ -516,7 +517,7 @@
       printer_configurer_->SetUpPrinter(
           printer,
           base::BindOnce(&CupsPrintersHandler::OnAddedDiscoveredPrinter,
-                         weak_factory_.GetWeakPtr(), printer));
+                         weak_factory_.GetWeakPtr(), callback_id, printer));
       return;
     }
   }
@@ -525,7 +526,8 @@
   // much information as we can about the printer, and ask the user to supply
   // the rest.
   PRINTER_LOG(EVENT) << "Could not query printer.  Fallback to asking the user";
-  FireManuallyAddDiscoveredPrinter(printer);
+  RejectJavascriptCallback(base::Value(callback_id),
+                           *GetCupsPrinterInfo(printer));
 }
 
 void CupsPrintersHandler::OnAutoconfQueried(
@@ -801,17 +803,19 @@
 }
 
 void CupsPrintersHandler::OnAddedDiscoveredPrinter(
+    const std::string& callback_id,
     const Printer& printer,
     PrinterSetupResult result_code) {
   OnAddedOrEditedPrinterCommon(printer, result_code, /*is_automatic=*/true);
   if (result_code == PrinterSetupResult::kSuccess) {
-    FireWebUIListener("on-add-or-edit-cups-printer", base::Value(result_code),
-                      base::Value(printer.display_name()));
+    ResolveJavascriptCallback(base::Value(callback_id),
+                              base::Value(result_code));
   } else {
     PRINTER_LOG(EVENT) << "Automatic setup failed for discovered printer.  "
                           "Fall back to manual.";
     // Could not set up printer.  Asking user for manufacturer data.
-    FireManuallyAddDiscoveredPrinter(printer);
+    RejectJavascriptCallback(base::Value(callback_id),
+                             *GetCupsPrinterInfo(printer));
   }
 }
 
@@ -1030,9 +1034,11 @@
 void CupsPrintersHandler::HandleAddDiscoveredPrinter(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetSize());
+  CHECK_EQ(2U, args->GetSize());
+  std::string callback_id;
   std::string printer_id;
-  CHECK(args->GetString(0, &printer_id));
+  CHECK(args->GetString(0, &callback_id));
+  CHECK(args->GetString(1, &printer_id));
 
   PRINTER_LOG(USER) << "Adding discovered printer";
   base::Optional<Printer> printer = printers_manager_->GetPrinter(printer_id);
@@ -1040,18 +1046,18 @@
     PRINTER_LOG(ERROR) << "Discovered printer disappeared";
     // Printer disappeared, so we don't have information about it anymore and
     // can't really do much. Fail the add.
-    FireWebUIListener("on-add-or-edit-cups-printer",
-                      base::Value(PrinterSetupResult::kPrinterUnreachable),
-                      base::Value(""));
+    ResolveJavascriptCallback(
+        base::Value(callback_id),
+        base::Value(PrinterSetupResult::kPrinterUnreachable));
     return;
   }
 
   if (!printer->GetUriComponents().has_value()) {
     PRINTER_LOG(DEBUG) << "Could not parse uri";
     // The printer uri was not parsed successfully. Fail the add.
-    FireWebUIListener("on-add-or-edit-cups-printer",
-                      base::Value(PrinterSetupResult::kPrinterUnreachable),
-                      base::Value(""));
+    ResolveJavascriptCallback(
+        base::Value(callback_id),
+        base::Value(PrinterSetupResult::kPrinterUnreachable));
     return;
   }
 
@@ -1062,8 +1068,9 @@
     // If we have something that looks like a ppd reference for this printer,
     // try to configure it.
     printer_configurer_->SetUpPrinter(
-        *printer, base::BindOnce(&CupsPrintersHandler::OnAddedDiscoveredPrinter,
-                                 weak_factory_.GetWeakPtr(), *printer));
+        *printer,
+        base::BindOnce(&CupsPrintersHandler::OnAddedDiscoveredPrinter,
+                       weak_factory_.GetWeakPtr(), callback_id, *printer));
     return;
   }
 
@@ -1072,12 +1079,14 @@
   auto address = printer->GetHostAndPort();
   if (address.IsEmpty()) {
     PRINTER_LOG(ERROR) << "Address is invalid";
-    OnAddedDiscoveredPrinter(*printer, PrinterSetupResult::kPrinterUnreachable);
+    OnAddedDiscoveredPrinter(callback_id, *printer,
+                             PrinterSetupResult::kPrinterUnreachable);
     return;
   }
   endpoint_resolver_->Start(
       address, base::BindOnce(&CupsPrintersHandler::OnIpResolved,
-                              weak_factory_.GetWeakPtr(), std::move(*printer)));
+                              weak_factory_.GetWeakPtr(), callback_id,
+                              std::move(*printer)));
 }
 
 void CupsPrintersHandler::HandleGetPrinterPpdManufacturerAndModel(
@@ -1131,20 +1140,16 @@
                             base::Value("" /* eulaUrl */));
 }
 
-void CupsPrintersHandler::FireManuallyAddDiscoveredPrinter(
-    const Printer& printer) {
-  FireWebUIListener("on-manually-add-discovered-printer",
-                    *GetCupsPrinterInfo(printer));
-}
-
-void CupsPrintersHandler::OnIpResolved(const Printer& printer,
+void CupsPrintersHandler::OnIpResolved(const std::string& callback_id,
+                                       const Printer& printer,
                                        const net::IPEndPoint& endpoint) {
   bool address_resolved = endpoint.address().IsValid();
   UMA_HISTOGRAM_BOOLEAN("Printing.CUPS.AddressResolutionResult",
                         address_resolved);
   if (!address_resolved) {
     PRINTER_LOG(ERROR) << printer.make_and_model() << " IP Resolution failed";
-    OnAddedDiscoveredPrinter(printer, PrinterSetupResult::kPrinterUnreachable);
+    OnAddedDiscoveredPrinter(callback_id, printer,
+                             PrinterSetupResult::kPrinterUnreachable);
     return;
   }
 
@@ -1156,13 +1161,14 @@
     QueryAutoconf(
         resolved_uri,
         base::BindOnce(&CupsPrintersHandler::OnAutoconfQueriedDiscovered,
-                       weak_factory_.GetWeakPtr(), printer));
+                       weak_factory_.GetWeakPtr(), callback_id, printer));
     return;
   }
 
   PRINTER_LOG(EVENT) << "Request make and model from user";
   // If it's not an IPP printer, the user must choose a PPD.
-  FireManuallyAddDiscoveredPrinter(printer);
+  RejectJavascriptCallback(base::Value(callback_id),
+                           *GetCupsPrinterInfo(printer));
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 89c8429e8..d2b16b0 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -89,6 +89,7 @@
 
   // Handles the callback for HandleGetPrinterInfo for a discovered printer.
   void OnAutoconfQueriedDiscovered(
+      const std::string& callback_id,
       Printer printer,
       printing::PrinterQueryResult result,
       const std::string& make,
@@ -167,7 +168,8 @@
   void HandleAddDiscoveredPrinter(const base::ListValue* args);
 
   // Post printer setup callback.
-  void OnAddedDiscoveredPrinter(const Printer& printer,
+  void OnAddedDiscoveredPrinter(const std::string& callback_id,
+                                const Printer& printer,
                                 PrinterSetupResult result_code);
 
   // Code common between the discovered and manual add printer code paths.
@@ -198,7 +200,9 @@
   // parameters.  See https://crbug.com/835476
   void FireManuallyAddDiscoveredPrinter(const Printer& printer);
 
-  void OnIpResolved(const Printer& printer, const net::IPEndPoint& endpoint);
+  void OnIpResolved(const std::string& callback_id,
+                    const Printer& printer,
+                    const net::IPEndPoint& endpoint);
 
   Profile* profile_;
 
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 8e98f3f..71211bd 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -531,29 +531,6 @@
                           base::size(kLocalizedStrings));
 }
 
-void AddKioskNextShellStrings(content::WebUIDataSource* html_source) {
-  static constexpr LocalizedString kLocalizedStrings[] = {
-      {"kioskNextShellPageTitle", IDS_SETTINGS_KIOSK_NEXT_SHELL_TITLE},
-      {"kioskNextShellPageLabel", IDS_SETTINGS_KIOSK_NEXT_SHELL_LABEL},
-      {"kioskNextShellPageSubtextEnable",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_SUBTEXT_ENABLE},
-      {"kioskNextShellPageSubtextDisable",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_SUBTEXT_DISABLE},
-      {"kioskNextShellTurnOn", IDS_SETTINGS_TURN_ON},
-      {"kioskNextShellTurnOff", IDS_SETTINGS_KIOSK_NEXT_SHELL_TURN_OFF},
-      {"kioskNextShellEnabledDialogTitle",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_ENABLED_DIALOG_TITLE},
-      {"kioskNextShellDisabledDialogTitle",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_DISABLED_DIALOG_TITLE},
-      {"kioskNextShellEnabledDialogBody",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_ENABLED_DIALOG_BODY},
-      {"kioskNextShellDisabledDialogBody",
-       IDS_SETTINGS_KIOSK_NEXT_SHELL_DISABLED_DIALOG_BODY},
-  };
-  AddLocalizedStringsBulk(html_source, kLocalizedStrings,
-                          base::size(kLocalizedStrings));
-}
-
 void AddAndroidAppStrings(content::WebUIDataSource* html_source) {
   LocalizedString localized_strings[] = {
       {"androidAppsPageTitle", arc::IsPlayStoreAvailable()
@@ -3082,7 +3059,6 @@
 #if defined(OS_CHROMEOS)
   AddCrostiniStrings(html_source, profile);
   AddPluginVmStrings(html_source, profile);
-  AddKioskNextShellStrings(html_source);
   AddAndroidAppStrings(html_source);
   AddAppsStrings(html_source);
   AddBluetoothStrings(html_source);
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index fb274159b..fe76537f 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -74,7 +74,6 @@
 #endif  // defined(OS_WIN) || defined(OS_CHROMEOS)
 
 #if defined(OS_CHROMEOS)
-#include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
 #include "ash/public/cpp/stylus_utils.h"
 #include "chrome/browser/browser_process.h"
@@ -473,13 +472,6 @@
                           !ash::features::IsSeparateNetworkIconsEnabled());
   html_source->AddBoolean("hasInternalStylus",
                           ash::stylus_utils::HasInternalStylus());
-#if defined(KIOSK_NEXT)
-  // Remove valueExists call from os_settings_ui.js when the #define is removed.
-  html_source->AddBoolean(
-      "showKioskNextShell",
-      base::FeatureList::IsEnabled(ash::features::kKioskNextShell) &&
-          profile->GetPrefs()->GetBoolean(ash::prefs::kKioskNextShellEligible));
-#endif
 
   html_source->AddBoolean("showCrostini",
                           crostini::IsCrostiniUIAllowedForProfile(
diff --git a/chrome/browser/ui/webui/welcome/nux_helper.cc b/chrome/browser/ui/webui/welcome/nux_helper.cc
index 13a0118..34c8a24 100644
--- a/chrome/browser/ui/webui/welcome/nux_helper.cc
+++ b/chrome/browser/ui/webui/welcome/nux_helper.cc
@@ -13,7 +13,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/values.h"
-#include "build/build_config.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/policy/browser_signin_policy_handler.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
@@ -28,10 +27,6 @@
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_service.h"
 
-#if defined(OS_MACOSX)
-#include "base/enterprise_util.h"
-#endif  // defined(OS_MACOSX)
-
 namespace nux {
 
 bool CanShowGoogleAppModule(const policy::PolicyMap& policies) {
@@ -139,6 +134,12 @@
 // Must match study name in configs.
 const char kNuxOnboardingStudyName[] = "NaviOnboarding";
 
+// Get the group for users who onboard in this experiment.
+// Groups are:
+//   - Specified by study
+//   - The same for all experiments in study
+//   - Incremented with each new version
+//   - Not reused
 std::string GetOnboardingGroup(Profile* profile) {
   if (!CanExperimentWithVariations(profile)) {
     // If we cannot run any variations, we bucket the users into a separate
@@ -153,35 +154,22 @@
                                        "onboarding-group");
 }
 
-bool IsNuxOnboardingEnabled(Profile* profile) {
-  if (base::FeatureList::IsEnabled(nux::kNuxOnboardingForceEnabled)) {
-    return true;
-  }
-
-#if defined(GOOGLE_CHROME_BUILD)
-
-#if defined(OS_MACOSX)
-  return !base::IsMachineExternallyManaged();
-#endif  // defined(OS_MACOSX)
-
-#if defined(OS_WIN)
-  // To avoid diluting data collection, existing users should not be assigned
-  // an onboarding group. So, |prefs::kNaviOnboardGroup| is used to
-  // short-circuit the feature checks below.
+#if defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN)
+void JoinOnboardingGroup(Profile* profile) {
   PrefService* prefs = profile->GetPrefs();
-  if (!prefs) {
-    return false;
-  }
 
-  std::string onboard_group = prefs->GetString(prefs::kNaviOnboardGroup);
+  std::string onboard_group;
+  if (prefs->GetBoolean(prefs::kHasSeenWelcomePage)) {
+    // Get user's original onboarding group.
+    onboard_group = prefs->GetString(prefs::kNaviOnboardGroup);
 
-  if (onboard_group.empty()) {
-    // Users who onboarded before Navi or are part of an enterprise.
-    return false;
-  }
-
-  if (!CanExperimentWithVariations(profile)) {
-    return true;  // Default Navi behavior.
+    // Users who onboarded before Navi won't have an onboarding group.
+    if (onboard_group.empty())
+      return;
+  } else {
+    // Join the latest group if onboarding for the first time!
+    onboard_group = GetOnboardingGroup(profile);
+    profile->GetPrefs()->SetString(prefs::kNaviOnboardGroup, onboard_group);
   }
 
   // User will be tied to their original onboarding group, even after
@@ -199,15 +187,17 @@
     base::FeatureList::IsEnabled(kNaviNTPVariationEnabled);
   else if (onboard_group.compare("ShortcutVariationSynthetic-008") == 0)
     base::FeatureList::IsEnabled(kNaviShortcutVariationEnabled);
+}
+#endif  // defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN)
 
-  if (base::FeatureList::IsEnabled(nux::kNuxOnboardingFeature)) {
-    return true;
-  }
-#endif  // defined(OS_WIN)
-
+bool IsNuxOnboardingEnabled(Profile* profile) {
+#if defined(GOOGLE_CHROME_BUILD)
+  return base::FeatureList::IsEnabled(nux::kNuxOnboardingFeature) ||
+         base::FeatureList::IsEnabled(nux::kNuxOnboardingForceEnabled);
+#else
+  // Allow enabling outside official builds for testing purposes.
+  return base::FeatureList::IsEnabled(nux::kNuxOnboardingForceEnabled);
 #endif  // defined(GOOGLE_CHROME_BUILD)
-
-  return false;
 }
 
 bool IsAppVariationEnabled() {
diff --git a/chrome/browser/ui/webui/welcome/nux_helper.h b/chrome/browser/ui/webui/welcome/nux_helper.h
index 719d11e..fb99d65 100644
--- a/chrome/browser/ui/webui/welcome/nux_helper.h
+++ b/chrome/browser/ui/webui/welcome/nux_helper.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/metrics/field_trial_params.h"
+#include "build/build_config.h"
 
 namespace base {
 class DictionaryValue;
@@ -29,14 +30,13 @@
 extern const base::FeatureParam<std::string>
     kNuxOnboardingForceEnabledReturningUserModules;
 
-// Get the group for users who onboard in this experiment.
-// Groups are:
-//   - Specified by study
-//   - The same for all experiments in study
-//   - Incremented with each new version
-//   - Not reused
-//   - Cleared out when experiment ends
-std::string GetOnboardingGroup(Profile* profile);
+#if defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN)
+// Onboarding groups are used for running field trials related to first run
+// experience. This will make a new profile join whatever group is currently
+// active. Any profile that is already part of an onboarding group will remain
+// in that group.
+void JoinOnboardingGroup(Profile* profile);
+#endif  // defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN)
 
 bool IsNuxOnboardingEnabled(Profile* profile);
 
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 04f1337..6eca1ed 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -166,8 +166,6 @@
 const char kChromeUIVersionURL[] = "chrome://version/";
 const char kChromeUIWelcomeHost[] = "welcome";
 const char kChromeUIWelcomeURL[] = "chrome://welcome/";
-const char kChromeUIWelcomeWin10Host[] = "welcome-win10";
-const char kChromeUIWelcomeWin10URL[] = "chrome://welcome-win10/";
 
 #if defined(OS_ANDROID)
 const char kChromeUIExploreSitesInternalsHost[] = "explore-sites-internals";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index d58f6f0..7d25c70 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -168,8 +168,6 @@
 extern const char kChromeUIVersionURL[];
 extern const char kChromeUIWelcomeHost[];
 extern const char kChromeUIWelcomeURL[];
-extern const char kChromeUIWelcomeWin10Host[];
-extern const char kChromeUIWelcomeWin10URL[];
 
 #if defined(OS_ANDROID)
 extern const char kChromeUIExploreSitesInternalsHost[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 954961b..c5e1059 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2010,7 +2010,6 @@
         "../browser/chromeos/login/screens/recommend_apps/scoped_test_recommend_apps_fetcher_factory.cc",
         "../browser/chromeos/login/screens/recommend_apps/scoped_test_recommend_apps_fetcher_factory.h",
         "../browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc",
-        "../browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc",
         "../browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc",
         "../browser/chromeos/login/screens/update_screen_browsertest.cc",
         "../browser/chromeos/login/screens/user_selection_screen_browsertest.cc",
diff --git a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
index 72c60fc..0c8bb59 100644
--- a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
+++ b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 
 import org.chromium.base.PathUtils;
-import org.chromium.chrome.browser.GlobalDiscardableReferencePool;
 import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.native_test.NativeBrowserTestApplication;
 
@@ -22,9 +21,6 @@
 public class ChromeBrowserTestsApplication extends NativeBrowserTestApplication {
     static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome";
 
-    private final GlobalDiscardableReferencePool mReferencePool =
-            new GlobalDiscardableReferencePool();
-
     @Override
     protected void attachBaseContext(Context base) {
         boolean isBrowserProcess = isBrowserProcess();
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc
index 7fac2a1..44461892 100644
--- a/chrome/test/chromedriver/capabilities.cc
+++ b/chrome/test/chromedriver/capabilities.cc
@@ -831,16 +831,3 @@
   }
   return Status(kOk);
 }
-
-Status Capabilities::CheckSupport() const {
-  // TODO(https://crbug.com/chromedriver/1902): pageLoadStrategy=eager not yet
-  // supported.
-  if (page_load_strategy.length() > 0 &&
-      page_load_strategy != PageLoadStrategy::kNormal &&
-      page_load_strategy != PageLoadStrategy::kNone) {
-    return Status(kInvalidArgument, "'pageLoadStrategy=" + page_load_strategy +
-                                        "' not yet supported");
-  }
-
-  return Status(kOk);
-}
diff --git a/chrome/test/chromedriver/capabilities.h b/chrome/test/chromedriver/capabilities.h
index 60ce726..56e52ec 100644
--- a/chrome/test/chromedriver/capabilities.h
+++ b/chrome/test/chromedriver/capabilities.h
@@ -97,16 +97,11 @@
   // Return true if android package is specified.
   bool IsAndroid() const;
 
-  // Accepts all W3C defined capabilities (including those not yet supported by
-  // ChromeDriver) and all ChromeDriver-specific extensions.
+  // Accepts all W3C defined capabilities
+  // and all ChromeDriver-specific extensions.
   Status Parse(const base::DictionaryValue& desired_caps,
                bool w3c_compliant = true);
 
-  // Check if all specified capabilities are supported by ChromeDriver.
-  // The long term goal is to support all standard capabilities, thus making
-  // this method unnecessary.
-  Status CheckSupport() const;
-
   //
   // W3C defined capabilities
   //
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.cc b/chrome/test/chromedriver/chrome/navigation_tracker.cc
index 02abf6b..bf833fa 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.cc
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.cc
@@ -34,12 +34,13 @@
 NavigationTracker::NavigationTracker(
     DevToolsClient* client,
     const BrowserInfo* browser_info,
-    const JavaScriptDialogManager* dialog_manager)
+    const JavaScriptDialogManager* dialog_manager,
+    const bool is_eager)
     : client_(client),
       loading_state_(kUnknown),
       top_frame_id_(client->GetId()),
       dialog_manager_(dialog_manager),
-      load_event_fired_(false),
+      is_eager_(is_eager),
       timed_out_(false) {
   client_->AddListener(this);
 }
@@ -48,12 +49,13 @@
     DevToolsClient* client,
     LoadingState known_state,
     const BrowserInfo* browser_info,
-    const JavaScriptDialogManager* dialog_manager)
+    const JavaScriptDialogManager* dialog_manager,
+    const bool is_eager)
     : client_(client),
       loading_state_(known_state),
       top_frame_id_(client->GetId()),
       dialog_manager_(dialog_manager),
-      load_event_fired_(false),
+      is_eager_(is_eager),
       timed_out_(false) {
   client_->AddListener(this);
 }
@@ -168,8 +170,9 @@
 Status NavigationTracker::OnEvent(DevToolsClient* client,
                                   const std::string& method,
                                   const base::DictionaryValue& params) {
-  if (method == "Page.loadEventFired") {
-    load_event_fired_ = true;
+  if (method == "Page.loadEventFired" ||
+      (is_eager_ && method == "Page.domContentEventFired")) {
+    loading_state_ = kNotLoading;
   } else if (method == "Page.frameStartedLoading") {
     // If frame that started loading is the top frame
     // set loading_state_ to loading. If it is a subframe
@@ -179,7 +182,6 @@
       return Status(kUnknownError, "missing or invalid 'frameId'");
     if (frame_id == top_frame_id_) {
       loading_state_ = kLoading;
-      load_event_fired_ = false;
     }
   } else if (method == "Page.frameStoppedLoading") {
     // Sometimes Page.frameStoppedLoading fires without
@@ -190,12 +192,11 @@
       return Status(kUnknownError, "missing or invalid 'frameId'");
     if (frame_id == top_frame_id_) {
       loading_state_ = kNotLoading;
-      load_event_fired_ = true;
     }
   } else if (method == "Inspector.targetCrashed") {
     loading_state_ = kNotLoading;
   }
-  if (load_event_fired_ || timed_out_)
+  if (timed_out_)
     loading_state_ = kNotLoading;
   return Status(kOk);
 }
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.h b/chrome/test/chromedriver/chrome/navigation_tracker.h
index 96631892..242db06 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.h
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.h
@@ -31,12 +31,14 @@
  public:
   NavigationTracker(DevToolsClient* client,
                     const BrowserInfo* browser_info,
-                    const JavaScriptDialogManager* dialog_manager);
+                    const JavaScriptDialogManager* dialog_manager,
+                    const bool is_eager = false);
 
   NavigationTracker(DevToolsClient* client,
                     LoadingState known_state,
                     const BrowserInfo* browser_info,
-                    const JavaScriptDialogManager* dialog_manager);
+                    const JavaScriptDialogManager* dialog_manager,
+                    const bool is_eager = false);
 
   ~NavigationTracker() override;
 
@@ -67,7 +69,7 @@
   LoadingState loading_state_;
   std::string top_frame_id_;
   const JavaScriptDialogManager* dialog_manager_;
-  bool load_event_fired_;
+  const bool is_eager_;
   bool timed_out_;
 
   DISALLOW_COPY_AND_ASSIGN(NavigationTracker);
diff --git a/chrome/test/chromedriver/chrome/page_load_strategy.cc b/chrome/test/chromedriver/chrome/page_load_strategy.cc
index 081e410b..f9132c83 100644
--- a/chrome/test/chromedriver/chrome/page_load_strategy.cc
+++ b/chrome/test/chromedriver/chrome/page_load_strategy.cc
@@ -20,7 +20,9 @@
   if (strategy == kNone) {
     return new NonBlockingNavigationTracker();
   } else if (strategy == kNormal) {
-    return new NavigationTracker(client, browser_info, dialog_manager);
+    return new NavigationTracker(client, browser_info, dialog_manager, false);
+  } else if (strategy == kEager) {
+    return new NavigationTracker(client, browser_info, dialog_manager, true);
   } else {
     NOTREACHED() << "invalid strategy '" << strategy << "'";
     return nullptr;
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index b910f107..9d7728c 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -254,9 +254,6 @@
   Status status = capabilities.Parse(*desired_caps, session->w3c_compliant);
   if (status.IsError())
     return status;
-  status = capabilities.CheckSupport();
-  if (status.IsError())
-    return status;
 
   if (capabilities.unhandled_prompt_behavior.length() > 0) {
     session->unhandled_prompt_behavior = capabilities.unhandled_prompt_behavior;
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index d31bd73..8c38391 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -996,6 +996,30 @@
     self.assertEquals('normal',
                       self._driver.capabilities['pageLoadStrategy'])
 
+  def testEagerMode(self):
+    send_response = threading.Event()
+    def waitAndRespond():
+        send_response.wait(10)
+        self._sync_server.RespondWithContent('#')
+    thread = threading.Thread(target=waitAndRespond)
+
+    self._http_server.SetDataForPath('/top.html',
+     """
+     <html><body>
+     <div id='top'>
+       <img src='%s'>
+     </div>
+     </body></html>""" % self._sync_server.GetUrl())
+    eager_driver = self.CreateDriver(page_load_strategy='eager')
+    thread.start()
+    start_eager = time.time()
+    eager_driver.Load(self._http_server.GetUrl() + '/top.html')
+    stop_eager = time.time()
+    send_response.set()
+    eager_time = stop_eager - start_eager
+    self.assertTrue(eager_time < 9)
+    thread.join()
+
   def testClearElement(self):
     self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
     text = self._driver.ExecuteScript(
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json
deleted file mode 100644
index 875562c..0000000
--- a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/manifest.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "name": "Tests that worker is kept alive during extension API call.",
-  "version": "1.0",
-  "manifest_version": 2
-}
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js b/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js
deleted file mode 100644
index fb1fea8..0000000
--- a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 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.
-
-var worker = null;
-var FAILURE_MESSAGE = 'FAILURE';
-
-window.runServiceWorker = function() {
-  navigator.serviceWorker.register('sw.js').then(function() {
-    return navigator.serviceWorker.ready;
-  }).then(function(registration) {
-    worker = registration.active;
-    chrome.test.sendMessage('WORKER STARTED');
-  }).catch(function(err) {
-    chrome.test.sendMessage(FAILURE_MESSAGE);
-  });
-};
-
-window.testSendMessage = function() {
-  if (worker == null) {
-    chrome.test.sendMessage(FAILURE_MESSAGE);
-    return;
-  }
-  var channel = new MessageChannel();
-  channel.port1.onmessage = function(e) {
-    if (e.data != 'Worker reply: Hello world') {
-      chrome.test.sendMessage(FAILURE_MESSAGE);
-    }
-  };
-  worker.postMessage('sendMessageTest', [channel.port2]);
-};
-
-window.roundtripToWorker = function() {
-  if (worker == null) {
-    window.domAutomationController.send('roundtrip-failed');
-  }
-  var channel = new MessageChannel();
-  channel.port1.onmessage = function(e) {
-    if (e.data == 'roundtrip-response') {
-      window.domAutomationController.send('roundtrip-succeeded');
-    } else {
-      window.domAutomationController.send('roundtrip-failed');
-    }
-  };
-  worker.postMessage('roundtrip-request', [channel.port2]);
-};
diff --git a/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/manifest.json b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/manifest.json
new file mode 100644
index 0000000..38e4f259
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/manifest.json
@@ -0,0 +1,7 @@
+{
+  "name": "Tests that worker is kept alive during extension API call.",
+  "version": "1.0",
+  "manifest_version": 2,
+  "description": "Test service worker ref counts.",
+  "background": {"service_worker": "service_worker_background.js"}
+}
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.html b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/page.html
similarity index 100%
rename from chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/page.html
rename to chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/page.html
diff --git a/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/page.js b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/page.js
new file mode 100644
index 0000000..658d51c7
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/page.js
@@ -0,0 +1,46 @@
+// 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.
+
+var FAILURE_MESSAGE = 'FAILURE';
+
+function getServiceWorker() {
+  return new Promise(function(resolve, reject) {
+    navigator.serviceWorker.ready.then(function (registration) {
+      resolve(registration.active);
+    });
+  });
+}
+
+window.testSendMessage = function() {
+  getServiceWorker().then(function(serviceWorker) {
+    if (serviceWorker == null) {
+      chrome.test.sendMessage(FAILURE_MESSAGE);
+      return;
+    }
+    var channel = new MessageChannel();
+    channel.port1.onmessage = function(e) {
+      if (e.data != 'Worker reply: Hello world') {
+        chrome.test.sendMessage(FAILURE_MESSAGE);
+      }
+    };
+    serviceWorker.postMessage('sendMessageTest', [channel.port2]);
+  });
+};
+
+window.roundtripToWorker = function() {
+  getServiceWorker().then(function(serviceWorker) {
+    if (serviceWorker == null) {
+      window.domAutomationController.send('roundtrip-failed');
+    }
+    var channel = new MessageChannel();
+    channel.port1.onmessage = function(e) {
+      if (e.data == 'roundtrip-response') {
+        window.domAutomationController.send('roundtrip-succeeded');
+      } else {
+        window.domAutomationController.send('roundtrip-failed');
+      }
+    };
+    serviceWorker.postMessage('roundtrip-request', [channel.port2]);
+  });
+};
diff --git a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/service_worker_background.js
similarity index 88%
rename from chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js
rename to chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/service_worker_background.js
index b0ef9b20..4affea18 100644
--- a/chrome/test/data/extensions/api_test/service_worker/api_worker_ref_count/sw.js
+++ b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/worker_ref_count/service_worker_background.js
@@ -1,4 +1,4 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -27,3 +27,5 @@
     fail();
   }
 };
+
+chrome.test.sendMessage('WORKER STARTED');
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
index 8d59d2d2..b1e1407cb 100644
--- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
+++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -577,6 +577,12 @@
       this.runMochaTest(extension_manager_tests.TestNames.ChangePages);
     });
 
+TEST_F(
+    'CrExtensionsManagerTestWithMultipleExtensionTypesInstalled',
+    'PageTitleUpdate', function() {
+      this.runMochaTest(extension_manager_tests.TestNames.PageTitleUpdate);
+    });
+
 // eslint-disable-next-line no-var
 var CrExtensionsManagerTestWithIdQueryParam =
     class extends CrExtensionsBrowserTestWithInstalledExtension {
diff --git a/chrome/test/data/webui/extensions/manager_test.js b/chrome/test/data/webui/extensions/manager_test.js
index 94f38ae56f..78df284 100644
--- a/chrome/test/data/webui/extensions/manager_test.js
+++ b/chrome/test/data/webui/extensions/manager_test.js
@@ -9,6 +9,7 @@
     ChangePages: 'change pages',
     ItemListVisibility: 'item list visibility',
     SplitItems: 'split items',
+    PageTitleUpdate: 'updates the title based on current route',
     UrlNavigationToDetails: 'url navigation to details',
     UrlNavigationToActivityLogFail:
         'url navigation to activity log without flag set',
@@ -110,6 +111,23 @@
       assertViewActive('extensions-item-list');
     });
 
+    test(assert(TestNames.PageTitleUpdate), function() {
+      expectEquals('Extensions', document.title);
+
+      // Open details view with a valid ID.
+      extensions.navigation.navigateTo({
+        page: Page.DETAILS,
+        extensionId: 'ldnnhddmnhbkjipkidpdiheffobcpfmf'
+      });
+      Polymer.dom.flush();
+      expectEquals('Extensions - My extension 1', document.title);
+
+      // Navigate back to the list view and check the page title.
+      extensions.navigation.navigateTo({page: Page.LIST});
+      Polymer.dom.flush();
+      expectEquals('Extensions', document.title);
+    });
+
     test(assert(TestNames.UrlNavigationToDetails), function() {
       assertViewActive('extensions-detail-view');
       const detailsView = manager.$$('extensions-detail-view');
diff --git a/chrome/test/data/webui/settings/about_page_tests.js b/chrome/test/data/webui/settings/about_page_tests.js
index 9284b2f..38b7c4b 100644
--- a/chrome/test/data/webui/settings/about_page_tests.js
+++ b/chrome/test/data/webui/settings/about_page_tests.js
@@ -836,6 +836,8 @@
 
   return {
     registerTests: function() {
+      // TODO(aee): move CrOS-specific tests to the OS about page tests when
+      // when these parts are removed from the browser about page.
       if (cr.isChromeOS) {
         registerDetailedBuildInfoTests();
         registerChannelSwitcherDialogTests();
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
new file mode 100644
index 0000000..11981e7c
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -0,0 +1,444 @@
+// 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.
+
+cr.define('settings_about_page', function() {
+  function registerAboutPageTests() {
+    /**
+     * @param {!UpdateStatus} status
+     * @param {{
+     *   progress: number|undefined,
+     *   message: string|undefined
+     * }} opt_options
+     */
+    function fireStatusChanged(status, opt_options) {
+      const options = opt_options || {};
+      cr.webUIListenerCallback('update-status-changed', {
+        progress: options.progress === undefined ? 1 : options.progress,
+        message: options.message,
+        status: status,
+      });
+    }
+
+    suite('AboutPageTest', function() {
+      let page = null;
+
+      /** @type {?settings.TestAboutPageBrowserProxy} */
+      let aboutBrowserProxy = null;
+
+      /** @type {?settings.TestLifetimeBrowserProxy} */
+      let lifetimeBrowserProxy = null;
+
+      const SPINNER_ICON = 'chrome://resources/images/throbber_small.svg';
+
+      setup(function() {
+        lifetimeBrowserProxy = new settings.TestLifetimeBrowserProxy();
+        settings.LifetimeBrowserProxyImpl.instance_ = lifetimeBrowserProxy;
+
+        aboutBrowserProxy = new TestAboutPageBrowserProxy();
+        settings.AboutPageBrowserProxyImpl.instance_ = aboutBrowserProxy;
+        return initNewPage();
+      });
+
+      teardown(function() {
+        page.remove();
+        page = null;
+      });
+
+      /** @return {!Promise} */
+      function initNewPage() {
+        aboutBrowserProxy.reset();
+        lifetimeBrowserProxy.reset();
+        PolymerTest.clearBody();
+        page = document.createElement('os-settings-about-page');
+        settings.navigateTo(settings.routes.ABOUT);
+        document.body.appendChild(page);
+        return Promise.all([
+          aboutBrowserProxy.whenCalled('getChannelInfo'),
+          aboutBrowserProxy.whenCalled('refreshUpdateStatus'),
+          aboutBrowserProxy.whenCalled('refreshTPMFirmwareUpdateStatus'),
+        ]);
+      }
+
+      /**
+       * Test that the status icon and status message update according to
+       * incoming 'update-status-changed' events.
+       */
+      test('IconAndMessageUpdates', function() {
+        const icon = page.$$('iron-icon');
+        assertTrue(!!icon);
+        const statusMessageEl = page.$$('#updateStatusMessage div');
+        let previousMessageText = statusMessageEl.textContent;
+
+        fireStatusChanged(UpdateStatus.CHECKING);
+        assertEquals(SPINNER_ICON, icon.src);
+        assertEquals(null, icon.getAttribute('icon'));
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
+
+        fireStatusChanged(UpdateStatus.UPDATING, {progress: 0});
+        assertEquals(SPINNER_ICON, icon.src);
+        assertEquals(null, icon.getAttribute('icon'));
+        assertFalse(statusMessageEl.textContent.includes('%'));
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
+
+        fireStatusChanged(UpdateStatus.UPDATING, {progress: 1});
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        assertTrue(statusMessageEl.textContent.includes('%'));
+        previousMessageText = statusMessageEl.textContent;
+
+        fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+        assertEquals(null, icon.src);
+        assertEquals('settings:check-circle', icon.icon);
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
+
+        fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
+        assertEquals(null, icon.src);
+        assertEquals('cr20:domain', icon.icon);
+        assertEquals(0, statusMessageEl.textContent.trim().length);
+
+        fireStatusChanged(UpdateStatus.FAILED);
+        assertEquals(null, icon.src);
+        assertEquals('cr:error', icon.icon);
+        assertEquals(0, statusMessageEl.textContent.trim().length);
+
+        fireStatusChanged(UpdateStatus.DISABLED);
+        assertEquals(null, icon.src);
+        assertEquals(null, icon.getAttribute('icon'));
+        assertEquals(0, statusMessageEl.textContent.trim().length);
+      });
+
+      test('ErrorMessageWithHtml', function() {
+        const htmlError = 'hello<br>there<br>was<pre>an</pre>error';
+        fireStatusChanged(UpdateStatus.FAILED, {message: htmlError});
+        const statusMessageEl = page.$$('#updateStatusMessage div');
+        assertEquals(htmlError, statusMessageEl.innerHTML);
+      });
+
+      test('FailedLearnMoreLink', function() {
+        // Check that link is shown when update failed.
+        fireStatusChanged(UpdateStatus.FAILED, {message: 'foo'});
+        assertTrue(!!page.$$('#updateStatusMessage a:not([hidden])'));
+
+        // Check that link is hidden when update hasn't failed.
+        fireStatusChanged(UpdateStatus.UPDATED, {message: ''});
+        assertTrue(!!page.$$('#updateStatusMessage a[hidden]'));
+      });
+
+      test('Relaunch', function() {
+        let relaunch = page.$.relaunch;
+        assertTrue(!!relaunch);
+        assertTrue(relaunch.hidden);
+
+        fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+        assertFalse(relaunch.hidden);
+
+        relaunch = page.$.relaunch;
+        assertTrue(!!relaunch);
+        relaunch.click();
+        return lifetimeBrowserProxy.whenCalled('relaunch');
+      });
+
+      test('NoInternet', function() {
+        assertTrue(page.$.updateStatusMessage.hidden);
+        aboutBrowserProxy.sendStatusNoInternet();
+        Polymer.dom.flush();
+        assertFalse(page.$.updateStatusMessage.hidden);
+        assertNotEquals(
+            page.$.updateStatusMessage.innerHTML.includes('no internet'));
+      });
+
+      /**
+       * Test that all buttons update according to incoming
+       * 'update-status-changed' events for the case where target and current
+       * channel are the same.
+       */
+      test('ButtonsUpdate_SameChannel', function() {
+        const relaunch = page.$.relaunch;
+        const checkForUpdates = page.$.checkForUpdates;
+        const relaunchAndPowerwash = page.$.relaunchAndPowerwash;
+
+        assertTrue(!!relaunch);
+        assertTrue(!!relaunchAndPowerwash);
+        assertTrue(!!checkForUpdates);
+
+        function assertAllHidden() {
+          assertTrue(checkForUpdates.hidden);
+          assertTrue(relaunch.hidden);
+          assertTrue(relaunchAndPowerwash.hidden);
+          // Ensure that when all buttons are hidden, the container is also
+          // hidden.
+          assertTrue(page.$.buttonContainer.hidden);
+        }
+
+        // Check that |UPDATED| status is ignored if the user has not
+        // explicitly checked for updates yet.
+        fireStatusChanged(UpdateStatus.UPDATED);
+        assertFalse(checkForUpdates.hidden);
+        assertTrue(relaunch.hidden);
+        assertTrue(relaunchAndPowerwash.hidden);
+
+        // Check that the "Check for updates" button gets hidden for certain
+        // UpdateStatus values, even if the CHECKING state was never
+        // encountered (for example triggering update from crosh command
+        // line).
+        fireStatusChanged(UpdateStatus.UPDATING);
+        assertAllHidden();
+        fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+        assertTrue(checkForUpdates.hidden);
+        assertFalse(relaunch.hidden);
+        assertTrue(relaunchAndPowerwash.hidden);
+
+        fireStatusChanged(UpdateStatus.CHECKING);
+        assertAllHidden();
+
+        fireStatusChanged(UpdateStatus.UPDATING);
+        assertAllHidden();
+
+        fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+        assertTrue(checkForUpdates.hidden);
+        assertFalse(relaunch.hidden);
+        assertTrue(relaunchAndPowerwash.hidden);
+
+        fireStatusChanged(UpdateStatus.UPDATED);
+        assertAllHidden();
+
+        fireStatusChanged(UpdateStatus.FAILED);
+        assertFalse(checkForUpdates.hidden);
+        assertTrue(relaunch.hidden);
+        assertTrue(relaunchAndPowerwash.hidden);
+
+        fireStatusChanged(UpdateStatus.DISABLED);
+        assertAllHidden();
+
+        fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
+        assertAllHidden();
+      });
+
+      /**
+       * Test that buttons update according to incoming
+       * 'update-status-changed' events for the case where the target channel
+       * is more stable than current channel.
+       */
+      test('ButtonsUpdate_BetaToStable', function() {
+        aboutBrowserProxy.setChannels(
+            BrowserChannel.BETA, BrowserChannel.STABLE);
+        aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED);
+
+        return initNewPage().then(function() {
+          assertTrue(!!page.$.relaunch);
+          assertTrue(!!page.$.relaunchAndPowerwash);
+
+          assertTrue(page.$.relaunch.hidden);
+          assertFalse(page.$.relaunchAndPowerwash.hidden);
+
+          page.$.relaunchAndPowerwash.click();
+          return lifetimeBrowserProxy.whenCalled('factoryReset')
+              .then((requestTpmFirmwareUpdate) => {
+                assertFalse(requestTpmFirmwareUpdate);
+              });
+        });
+      });
+
+      /**
+       * Test that buttons update according to incoming
+       * 'update-status-changed' events for the case where the target channel
+       * is less stable than current channel.
+       */
+      test('ButtonsUpdate_StableToBeta', function() {
+        aboutBrowserProxy.setChannels(
+            BrowserChannel.STABLE, BrowserChannel.BETA);
+        aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED);
+
+        return initNewPage().then(function() {
+          assertTrue(!!page.$.relaunch);
+          assertTrue(!!page.$.relaunchAndPowerwash);
+
+          assertFalse(page.$.relaunch.hidden);
+          assertTrue(page.$.relaunchAndPowerwash.hidden);
+
+          page.$.relaunch.click();
+          return lifetimeBrowserProxy.whenCalled('relaunch');
+        });
+      });
+
+      /**
+       * Test that buttons update as a result of receiving a
+       * 'target-channel-changed' event (normally fired from
+       * <settings-channel-switcher-dialog>).
+       */
+      test('ButtonsUpdate_TargetChannelChangedEvent', function() {
+        aboutBrowserProxy.setChannels(BrowserChannel.BETA, BrowserChannel.BETA);
+        aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED);
+
+        return initNewPage().then(function() {
+          assertFalse(page.$.relaunch.hidden);
+          assertTrue(page.$.relaunchAndPowerwash.hidden);
+
+          page.fire('target-channel-changed', BrowserChannel.DEV);
+          assertFalse(page.$.relaunch.hidden);
+          assertTrue(page.$.relaunchAndPowerwash.hidden);
+
+          page.fire('target-channel-changed', BrowserChannel.STABLE);
+          assertTrue(page.$.relaunch.hidden);
+          assertFalse(page.$.relaunchAndPowerwash.hidden);
+        });
+      });
+
+      test('RegulatoryInfo', function() {
+        let regulatoryInfo = null;
+
+        /**
+         * Checks the visibility of the "regulatory info" section.
+         * @param {boolean} isShowing Whether the section is expected to be
+         *     visible.
+         * @return {!Promise}
+         */
+        function checkRegulatoryInfo(isShowing) {
+          return aboutBrowserProxy.whenCalled('getRegulatoryInfo')
+              .then(function() {
+                const regulatoryInfoEl = page.$.regulatoryInfo;
+                assertTrue(!!regulatoryInfoEl);
+                assertEquals(isShowing, !regulatoryInfoEl.hidden);
+
+                if (isShowing) {
+                  const img = regulatoryInfoEl.querySelector('img');
+                  assertTrue(!!img);
+                  assertEquals(regulatoryInfo.text, img.getAttribute('alt'));
+                  assertEquals(regulatoryInfo.url, img.getAttribute('src'));
+                }
+              });
+        }
+
+        return checkRegulatoryInfo(false)
+            .then(function() {
+              regulatoryInfo = {text: 'foo', url: 'bar'};
+              aboutBrowserProxy.setRegulatoryInfo(regulatoryInfo);
+              return initNewPage();
+            })
+            .then(function() {
+              return checkRegulatoryInfo(true);
+            });
+      });
+
+      test('TPMFirmwareUpdate', function() {
+        return initNewPage()
+            .then(function() {
+              assertTrue(page.$.aboutTPMFirmwareUpdate.hidden);
+              aboutBrowserProxy.setTPMFirmwareUpdateStatus(
+                  {updateAvailable: true});
+              aboutBrowserProxy.refreshTPMFirmwareUpdateStatus();
+            })
+            .then(function() {
+              assertFalse(page.$.aboutTPMFirmwareUpdate.hidden);
+              page.$.aboutTPMFirmwareUpdate.click();
+            })
+            .then(function() {
+              const dialog = page.$$('os-settings-powerwash-dialog');
+              assertTrue(!!dialog);
+              assertTrue(dialog.$.dialog.open);
+              dialog.$$('#powerwash').click();
+              return lifetimeBrowserProxy.whenCalled('factoryReset')
+                  .then((requestTpmFirmwareUpdate) => {
+                    assertTrue(requestTpmFirmwareUpdate);
+                  });
+            });
+      });
+
+      test('DeviceEndOfLife', function() {
+        /**
+         * Checks the visibility of the end of life message and icon.
+         * @param {boolean} isShowing Whether the end of life UI is expected
+         *     to be visible.
+         * @return {!Promise}
+         */
+        function checkHasEndOfLife(isShowing) {
+          return aboutBrowserProxy.whenCalled('getHasEndOfLife')
+              .then(function() {
+                const endOfLifeMessageContainer =
+                    page.$.endOfLifeMessageContainer;
+                assertTrue(!!endOfLifeMessageContainer);
+                assertEquals(isShowing, !endOfLifeMessageContainer.hidden);
+
+                // Update status message should be hidden before user has
+                // checked for updates.
+                assertTrue(page.$.updateStatusMessage.hidden);
+
+                fireStatusChanged(UpdateStatus.CHECKING);
+                assertEquals(isShowing, page.$.updateStatusMessage.hidden);
+
+                if (isShowing) {
+                  const icon = page.$$('iron-icon');
+                  assertTrue(!!icon);
+                  assertEquals(null, icon.src);
+                  assertEquals('settings:end-of-life', icon.icon);
+
+                  const checkForUpdates = page.$.checkForUpdates;
+                  assertTrue(!!checkForUpdates);
+                  assertTrue(checkForUpdates.hidden);
+                }
+              });
+        }
+
+        // Force test proxy to not respond to JS requests.
+        // End of life message should still be hidden in this case.
+        aboutBrowserProxy.setHasEndOfLife(new Promise(function(res, rej) {}));
+        return initNewPage()
+            .then(function() {
+              return checkHasEndOfLife(false);
+            })
+            .then(function() {
+              aboutBrowserProxy.setHasEndOfLife(true);
+              return initNewPage();
+            })
+            .then(function() {
+              return checkHasEndOfLife(true);
+            })
+            .then(function() {
+              aboutBrowserProxy.setHasEndOfLife(false);
+              return initNewPage();
+            })
+            .then(function() {
+              return checkHasEndOfLife(false);
+            });
+      });
+
+      test('GetHelp', function() {
+        assertTrue(!!page.$.help);
+        page.$.help.click();
+        return aboutBrowserProxy.whenCalled('openHelpPage');
+      });
+    });
+  }
+
+  function registerOfficialBuildTests() {
+    suite('AboutPageTest_OfficialBuild', function() {
+      let page = null;
+      let browserProxy = null;
+
+      setup(function() {
+        browserProxy = new TestAboutPageBrowserProxy();
+        settings.AboutPageBrowserProxyImpl.instance_ = browserProxy;
+        PolymerTest.clearBody();
+        page = document.createElement('os-settings-about-page');
+        document.body.appendChild(page);
+      });
+
+      test('ReportAnIssue', function() {
+        assertTrue(!!page.$.reportIssue);
+        page.$.reportIssue.click();
+        return browserProxy.whenCalled('openFeedbackDialog');
+      });
+    });
+  }
+
+  return {
+    // TODO(aee): move the detailed build info and channel switch dialog tests
+    // from the browser about page tests when those CrOS-specific parts are
+    // removed from the browser about page.
+    registerTests: registerAboutPageTests,
+    registerOfficialBuildTests: registerOfficialBuildTests,
+  };
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 8281664..c601ad7f 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -127,3 +127,34 @@
 TEST_F('OSSettingsPeoplePageTest', 'MAYBE_All', function() {
   mocha.run();
 });
+
+// eslint-disable-next-line no-var
+var OSSettingsAboutPageTest = class extends OSSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return super.browsePreload + 'chromeos/os_about_page/os_about_page.html';
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return super.extraLibraries.concat([
+      BROWSER_SETTINGS_PATH + 'test_util.js',
+      BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
+      BROWSER_SETTINGS_PATH + 'test_lifetime_browser_proxy.js',
+      BROWSER_SETTINGS_PATH + 'test_about_page_browser_proxy.js',
+      'os_about_page_tests.js',
+    ]);
+  }
+};
+
+TEST_F('OSSettingsAboutPageTest', 'AboutPage', function() {
+  settings_about_page.registerTests();
+  mocha.run();
+});
+
+GEN('#if defined(GOOGLE_CHROME_BUILD)');
+TEST_F('OSSettingsAboutPageTest', 'AboutPage_OfficialBuild', function() {
+  settings_about_page.registerOfficialBuildTests();
+  mocha.run();
+});
+GEN('#endif');
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 9e622bf..51a3e14 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -2275,39 +2275,6 @@
 });
 
 /**
- * Test fixture for the Chrome OS Kiosk Next Shell page.
- * @constructor
- * @extends {CrSettingsBrowserTest}
- */
-function CrSettingsKioskNextShellPageTest() {}
-
-CrSettingsKioskNextShellPageTest.prototype = {
-  __proto__: CrSettingsBrowserTest.prototype,
-
-  /** @override */
-  browsePreload:
-      'chrome://settings/kiosk_next_shell_page/kiosk_next_shell_page.html',
-
-  /** @override */
-  featureList: {enabled: ['ash::features::kKioskNextShell']},
-
-  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    '../test_browser_proxy.js',
-    'kiosk_next_shell_page_tests.js',
-    'test_util.js',
-    'test_lifetime_browser_proxy.js',
-  ]),
-};
-
-GEN('#if defined(OS_CHROMEOS)');
-GEN('#if defined(GOOGLE_CHROME_BUILD)');
-TEST_F('CrSettingsKioskNextShellPageTest', 'All', function() {
-  mocha.run();
-});
-GEN('#endif  // defined(GOOGLE_CHROME_BUILD)');
-GEN('#endif  // defined(OS_CHROMEOS)');
-
-/**
  * Test fixture for the Linux for Chromebook (Crostini) page.
  * @constructor
  * @extends {CrSettingsBrowserTest}
diff --git a/chrome/test/data/webui/settings/cups_printer_page_tests.js b/chrome/test/data/webui/settings/cups_printer_page_tests.js
index 90fac19..a506172 100644
--- a/chrome/test/data/webui/settings/cups_printer_page_tests.js
+++ b/chrome/test/data/webui/settings/cups_printer_page_tests.js
@@ -40,6 +40,13 @@
      * @private {PrinterSetupResult}
      */
     this.getPrinterInfoResult_ = null;
+
+    /**
+     * If set, 'addDiscoveredPrinter' will fail and the promise will be
+     * rejected with this printer.
+     * @private {CupsPrinterInfo}
+     */
+    this.addDiscoveredFailedPrinter_ = null;
   }
 
   /** @override */
@@ -51,6 +58,10 @@
   /** @override */
   addDiscoveredPrinter(printerId) {
     this.methodCalled('addDiscoveredPrinter', printerId);
+    if (this.addDiscoveredFailedPrinter_ != null) {
+      return Promise.reject(this.addDiscoveredFailedPrinter_);
+    }
+    return Promise.resolve(PrinterSetupResult.SUCCESS);
   }
 
   /** @override */
@@ -128,6 +139,11 @@
   setGetPrinterInfoResult(result) {
     this.getPrinterInfoResult_ = result;
   }
+
+  /** @param {!CupsPrinterInfo} printer */
+  setAddDiscoveredPrinterFailure(printer) {
+    this.addDiscoveredFailedPrinter_ = printer;
+  }
 }
 
 /*
@@ -544,6 +560,9 @@
 
     dialog.fire('open-discovery-printers-dialog');
 
+    // Make 'addDiscoveredPrinter' fail so we get sent to the make/model dialog.
+    cupsPrintersBrowserProxy.setAddDiscoveredPrinterFailure(newPrinter);
+
     return cupsPrintersBrowserProxy.whenCalled('startDiscoveringPrinters')
         .then(function() {
           // Select the printer.
@@ -558,8 +577,6 @@
         .then(function(printerId) {
           assertEquals(expectedPrinter, printerId);
 
-          cr.webUIListenerCallback(
-              'on-manually-add-discovered-printer', newPrinter);
           return cupsPrintersBrowserProxy.whenCalled(
               'getCupsPrinterManufacturersList');
         })
diff --git a/chrome/test/data/webui/settings/kiosk_next_shell_page_tests.js b/chrome/test/data/webui/settings/kiosk_next_shell_page_tests.js
deleted file mode 100644
index 745718cb..0000000
--- a/chrome/test/data/webui/settings/kiosk_next_shell_page_tests.js
+++ /dev/null
@@ -1,86 +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.
-
-suite('KioskNextShellPageTests', function() {
-  /** @type {?SettingsKioskNextShellPageElement} */
-  let page = null;
-
-  /** @type {?settings.TestLifetimeBrowserProxy} */
-  let lifetimeBrowserProxy = null;
-
-  function setKioskNextShellPrefs(enabled) {
-    page.prefs = {
-      ash: {
-        kiosk_next_shell: {
-          enabled: {value: enabled},
-        },
-      },
-    };
-    Polymer.dom.flush();
-  }
-
-  function showDialog() {
-    const dialogButton = page.$$('cr-button');
-    assertTrue(!!dialogButton);
-    dialogButton.click();
-    Polymer.dom.flush();
-
-    const dialog = page.$$('#dialog');
-    assertTrue(!!dialog);
-    assertTrue(dialog.$$('cr-dialog').open);
-    return dialog;
-  }
-
-  setup(function() {
-    lifetimeBrowserProxy = new settings.TestLifetimeBrowserProxy();
-    settings.LifetimeBrowserProxyImpl.instance_ = lifetimeBrowserProxy;
-
-    PolymerTest.clearBody();
-    page = document.createElement('settings-kiosk-next-shell-page');
-    document.body.appendChild(page);
-  });
-
-  teardown(function() {
-    page.remove();
-    page = null;
-  });
-
-  test('kiosk next shell dialog can be canceled', function() {
-    setKioskNextShellPrefs(false);
-    const dialog = showDialog();
-
-    const cancelButton = dialog.$$('#cancel');
-    assertTrue(!!cancelButton);
-    cancelButton.click();
-    Polymer.dom.flush();
-
-    // The value of the pref must still be the same and we shouldn't sign out.
-    assertFalse(page.prefs.ash.kiosk_next_shell.enabled.value);
-    assertEquals(0, lifetimeBrowserProxy.getCallCount('signOutAndRestart'));
-  });
-
-  test('turn on kiosk next shell', function() {
-    setKioskNextShellPrefs(false);
-    const dialog = showDialog();
-
-    const confirmButton = dialog.$$('#confirm');
-    assertTrue(!!confirmButton);
-    confirmButton.click();
-
-    assertTrue(page.prefs.ash.kiosk_next_shell.enabled.value);
-    return lifetimeBrowserProxy.whenCalled('signOutAndRestart');
-  });
-
-  test('turn off kiosk next shell', function() {
-    setKioskNextShellPrefs(true);
-    const dialog = showDialog();
-
-    const confirmButton = dialog.$$('#confirm');
-    assertTrue(!!confirmButton);
-    confirmButton.click();
-
-    assertFalse(page.prefs.ash.kiosk_next_shell.enabled.value);
-    return lifetimeBrowserProxy.whenCalled('signOutAndRestart');
-  });
-});
diff --git a/chromecast/app/android/crash_handler.cc b/chromecast/app/android/crash_handler.cc
index 4bdef99..3737f72a 100644
--- a/chromecast/app/android/crash_handler.cc
+++ b/chromecast/app/android/crash_handler.cc
@@ -16,10 +16,10 @@
 #include "chromecast/app/android/cast_crash_reporter_client_android.h"
 #include "chromecast/base/chromecast_config_android.h"
 #include "chromecast/base/version.h"
+#include "chromecast/browser/jni_headers/CastCrashHandler_jni.h"
 #include "components/crash/content/app/crash_reporter_client.h"
 #include "components/crash/content/app/crashpad.h"
 #include "content/public/common/content_switches.h"
-#include "jni/CastCrashHandler_jni.h"
 
 namespace {
 
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn
index 5ec6213..a36b681 100644
--- a/chromecast/base/BUILD.gn
+++ b/chromecast/base/BUILD.gn
@@ -353,8 +353,6 @@
       "java/src/org/chromium/chromecast/base/DumpstateWriter.java",
       "java/src/org/chromium/chromecast/base/SystemTimeChangeNotifierAndroid.java",
     ]
-
-    jni_package = "chromecast"
   }
 
   android_library("base_java") {
diff --git a/chromecast/base/DEPS b/chromecast/base/DEPS
index c80012b5..53fa5bc1 100644
--- a/chromecast/base/DEPS
+++ b/chromecast/base/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
-  "+jni",
+  "+chromecast/base/jni_headers",
+  "+chromecast/browser/jni_headers",
 ]
diff --git a/chromecast/base/android/dumpstate_writer.cc b/chromecast/base/android/dumpstate_writer.cc
index c6c7d88..64d4ac6 100644
--- a/chromecast/base/android/dumpstate_writer.cc
+++ b/chromecast/base/android/dumpstate_writer.cc
@@ -6,7 +6,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
-#include "jni/DumpstateWriter_jni.h"
+#include "chromecast/base/jni_headers/DumpstateWriter_jni.h"
 
 namespace chromecast {
 
diff --git a/chromecast/base/android/system_time_change_notifier_android.cc b/chromecast/base/android/system_time_change_notifier_android.cc
index 05d8e95..c1a9088d 100644
--- a/chromecast/base/android/system_time_change_notifier_android.cc
+++ b/chromecast/base/android/system_time_change_notifier_android.cc
@@ -4,7 +4,7 @@
 
 #include "chromecast/base/android/system_time_change_notifier_android.h"
 
-#include "jni/SystemTimeChangeNotifierAndroid_jni.h"
+#include "chromecast/base/jni_headers/SystemTimeChangeNotifierAndroid_jni.h"
 
 using base::android::JavaParamRef;
 
diff --git a/chromecast/base/cast_sys_info_android.cc b/chromecast/base/cast_sys_info_android.cc
index 5045c093..686c6a7 100644
--- a/chromecast/base/cast_sys_info_android.cc
+++ b/chromecast/base/cast_sys_info_android.cc
@@ -16,8 +16,8 @@
 #include "base/system/sys_info.h"
 #include "chromecast/base/cast_sys_info_util.h"
 #include "chromecast/base/version.h"
+#include "chromecast/browser/jni_headers/CastSysInfoAndroid_jni.h"
 #include "chromecast/chromecast_buildflags.h"
-#include "jni/CastSysInfoAndroid_jni.h"
 
 namespace chromecast {
 
diff --git a/chromecast/base/cast_sys_info_android_things.cc b/chromecast/base/cast_sys_info_android_things.cc
index 810c73a..99b07cc 100644
--- a/chromecast/base/cast_sys_info_android_things.cc
+++ b/chromecast/base/cast_sys_info_android_things.cc
@@ -8,7 +8,7 @@
 #include "chromecast/chromecast_buildflags.h"
 #if BUILDFLAG(IS_ANDROID_THINGS_NON_PUBLIC)
 #include "base/android/jni_array.h"
-#include "jni/CastSysInfoAndroidThings_jni.h"
+#include "chromecast/browser/jni_headers/CastSysInfoAndroid_jni.h"
 #endif
 
 namespace chromecast {
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 081a833..6f6b701 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -551,8 +551,6 @@
     if (is_android_things_non_public) {
       sources += [ "android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroidThings.java" ]
     }
-
-    jni_package = "chromecast"
   }
 
   java_cpp_enum("java_enums") {
diff --git a/chromecast/browser/android/BUILD.gn b/chromecast/browser/android/BUILD.gn
index 2f2ddc3..7317f7c 100644
--- a/chromecast/browser/android/BUILD.gn
+++ b/chromecast/browser/android/BUILD.gn
@@ -184,7 +184,6 @@
     deps = [
       "//chromecast/internal/android/prebuilt/things:support_lib_java",
     ]
-    jni_package = "chromecast"
   }
 }
 
diff --git a/chromecast/browser/android/cast_content_window_android.cc b/chromecast/browser/android/cast_content_window_android.cc
index e056bb4..671e02ea 100644
--- a/chromecast/browser/android/cast_content_window_android.cc
+++ b/chromecast/browser/android/cast_content_window_android.cc
@@ -11,8 +11,8 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "chromecast/browser/jni_headers/CastContentWindowAndroid_jni.h"
 #include "content/public/browser/web_contents.h"
-#include "jni/CastContentWindowAndroid_jni.h"
 #include "ui/events/keycodes/keyboard_code_conversion_android.h"
 
 namespace chromecast {
diff --git a/chromecast/browser/android/cast_metrics_helper_android.cc b/chromecast/browser/android/cast_metrics_helper_android.cc
index 519df071..ecd90ba 100644
--- a/chromecast/browser/android/cast_metrics_helper_android.cc
+++ b/chromecast/browser/android/cast_metrics_helper_android.cc
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "chromecast/base/metrics/cast_metrics_helper.h"
-#include "jni/CastMetricsHelper_jni.h"
+#include "chromecast/browser/jni_headers/CastMetricsHelper_jni.h"
 
 using base::android::JavaParamRef;
 
diff --git a/chromecast/browser/cast_web_contents.h b/chromecast/browser/cast_web_contents.h
index db8738d..3d9bfe0 100644
--- a/chromecast/browser/cast_web_contents.h
+++ b/chromecast/browser/cast_web_contents.h
@@ -18,6 +18,10 @@
 #include "ui/gfx/geometry/rect.h"
 #include "url/gurl.h"
 
+namespace blink {
+class AssociatedInterfaceProvider;
+}  // namespace blink
+
 namespace content {
 class WebContents;
 }  // namespace content
@@ -139,7 +143,8 @@
     virtual void RenderFrameCreated(
         int render_process_id,
         int render_frame_id,
-        service_manager::InterfaceProvider* frame_interfaces) {}
+        service_manager::InterfaceProvider* frame_interfaces,
+        blink::AssociatedInterfaceProvider* frame_associated_interfaces) {}
 
     // These methods are calls forwarded from WebContentsObserver.
     virtual void MainFrameResized(const gfx::Rect& bounds) {}
diff --git a/chromecast/browser/cast_web_contents_browsertest.cc b/chromecast/browser/cast_web_contents_browsertest.cc
index 24a623d..c0be4f42 100644
--- a/chromecast/browser/cast_web_contents_browsertest.cc
+++ b/chromecast/browser/cast_web_contents_browsertest.cc
@@ -101,10 +101,12 @@
   MOCK_METHOD1(OnPageStateChanged, void(CastWebContents* cast_web_contents));
   MOCK_METHOD2(OnPageStopped,
                void(CastWebContents* cast_web_contents, int error_code));
-  MOCK_METHOD3(RenderFrameCreated,
-               void(int render_process_id,
-                    int render_frame_id,
-                    service_manager::InterfaceProvider* frame_interfaces));
+  MOCK_METHOD4(
+      RenderFrameCreated,
+      void(int render_process_id,
+           int render_frame_id,
+           service_manager::InterfaceProvider* frame_interfaces,
+           blink::AssociatedInterfaceProvider* frame_associated_interfaces));
   MOCK_METHOD1(ResourceLoadFailed, void(CastWebContents* cast_web_contents));
 
  private:
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc
index 411dc2e..2ff7edb 100644
--- a/chromecast/browser/cast_web_contents_impl.cc
+++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -266,8 +266,10 @@
   // Allow observers to use remote interfaces which are hosted by the new
   // RenderFrame.
   for (Observer& observer : observer_list_) {
-    observer.RenderFrameCreated(render_process_id, render_frame_id,
-                                render_frame_host->GetRemoteInterfaces());
+    observer.RenderFrameCreated(
+        render_process_id, render_frame_id,
+        render_frame_host->GetRemoteInterfaces(),
+        render_frame_host->GetRemoteAssociatedInterfaces());
   }
 
   chromecast::shell::mojom::FeatureManagerPtr feature_manager_ptr;
diff --git a/chromecast/media/cma/backend/android/BUILD.gn b/chromecast/media/cma/backend/android/BUILD.gn
index b05a52da..32f0b0b 100644
--- a/chromecast/media/cma/backend/android/BUILD.gn
+++ b/chromecast/media/cma/backend/android/BUILD.gn
@@ -52,8 +52,6 @@
       "java/src/org/chromium/chromecast/cma/backend/android/VolumeMap.java",
     ]
   }
-
-  jni_package = "audio_track"
 }
 
 android_library("audio_track_java") {
diff --git a/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.cc b/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.cc
index 55dd415..0df1f72 100644
--- a/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.cc
+++ b/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.cc
@@ -14,8 +14,8 @@
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "chromecast/media/cma/backend/android/audio_track_jni_headers/AudioSinkAudioTrackImpl_jni.h"
 #include "chromecast/media/cma/base/decoder_buffer_base.h"
-#include "jni/AudioSinkAudioTrackImpl_jni.h"
 #include "media/base/audio_bus.h"
 
 #define RUN_ON_FEEDER_THREAD(callback, ...)                               \
diff --git a/chromecast/media/cma/backend/android/volume_control_android.cc b/chromecast/media/cma/backend/android/volume_control_android.cc
index 35a0898..071371c 100644
--- a/chromecast/media/cma/backend/android/volume_control_android.cc
+++ b/chromecast/media/cma/backend/android/volume_control_android.cc
@@ -22,7 +22,7 @@
 #include "chromecast/base/init_command_line_shlib.h"
 #include "chromecast/base/serializers.h"
 #include "chromecast/chromecast_buildflags.h"
-#include "jni/VolumeControl_jni.h"
+#include "chromecast/media/cma/backend/android/audio_track_jni_headers/VolumeControl_jni.h"
 #if BUILDFLAG(ENABLE_VOLUME_TABLES_ACCESS)
 #include "jni/VolumeMap_jni.h"
 #endif
diff --git a/chromeos/dbus/cros_healthd/BUILD.gn b/chromeos/dbus/cros_healthd/BUILD.gn
new file mode 100644
index 0000000..713e45f7
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/BUILD.gn
@@ -0,0 +1,25 @@
+# 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.
+
+assert(is_chromeos, "Non-Chrome-OS builds cannot depend on //chromeos")
+
+component("cros_healthd") {
+  defines = [ "IS_CROS_HEALTHD_IMPL" ]
+
+  deps = [
+    "//base",
+    "//chromeos/services/cros_healthd/public/mojom",
+    "//dbus",
+    "//mojo/public/cpp/bindings",
+    "//mojo/public/cpp/platform",
+    "//mojo/public/cpp/system",
+  ]
+
+  sources = [
+    "cros_healthd_client.cc",
+    "cros_healthd_client.h",
+    "fake_cros_healthd_client.cc",
+    "fake_cros_healthd_client.h",
+  ]
+}
diff --git a/chromeos/dbus/cros_healthd/DEPS b/chromeos/dbus/cros_healthd/DEPS
new file mode 100644
index 0000000..08eb7e09
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+chromeos/services/cros_healthd/public/mojom",
+  "+mojo/public",
+]
\ No newline at end of file
diff --git a/chromeos/dbus/cros_healthd/cros_healthd_client.cc b/chromeos/dbus/cros_healthd/cros_healthd_client.cc
new file mode 100644
index 0000000..68edfccb
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/cros_healthd_client.cc
@@ -0,0 +1,131 @@
+// 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 "chromeos/dbus/cros_healthd/cros_healthd_client.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/memory/weak_ptr.h"
+#include "chromeos/dbus/cros_healthd/fake_cros_healthd_client.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_proxy.h"
+#include "mojo/public/cpp/platform/platform_channel.h"
+#include "mojo/public/cpp/system/invitation.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+namespace {
+
+CrosHealthdClient* g_instance = nullptr;
+
+// Production implementation of CrosHealthdClient.
+class CrosHealthdClientImpl : public CrosHealthdClient {
+ public:
+  CrosHealthdClientImpl() = default;
+  ~CrosHealthdClientImpl() override = default;
+
+  // CrosHealthdClient overrides:
+  mojo::Remote<cros_healthd::mojom::CrosHealthdService> BootstrapMojoConnection(
+      base::OnceCallback<void(bool success)> result_callback) override {
+    mojo::PlatformChannel platform_channel;
+
+    // Prepare a Mojo invitation to send through |platform_channel|.
+    mojo::OutgoingInvitation invitation;
+    // Include an initial Mojo pipe in the invitation.
+    mojo::ScopedMessagePipeHandle pipe = invitation.AttachMessagePipe(
+        diagnostics::kCrosHealthdMojoConnectionChannelToken);
+    mojo::OutgoingInvitation::Send(std::move(invitation),
+                                   base::kNullProcessHandle,
+                                   platform_channel.TakeLocalEndpoint());
+
+    // Bind our end of |pipe| to our CrosHealthdServicePtr. The daemon should
+    // bind its end to a CrosHealthdService implementation.
+    mojo::Remote<cros_healthd::mojom::CrosHealthdService> cros_healthd_service;
+    cros_healthd_service.Bind(
+        mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService>(
+            std::move(pipe), 0u /* version */));
+
+    dbus::MethodCall method_call(
+        diagnostics::kCrosHealthdServiceInterface,
+        diagnostics::kCrosHealthdBootstrapMojoConnectionMethod);
+    dbus::MessageWriter writer(&method_call);
+    base::ScopedFD fd =
+        platform_channel.TakeRemoteEndpoint().TakePlatformHandle().TakeFD();
+    writer.AppendFileDescriptor(fd.get());
+    cros_healthd_service_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(
+            &CrosHealthdClientImpl::OnBootstrapMojoConnectionResponse,
+            weak_ptr_factory_.GetWeakPtr(), std::move(result_callback)));
+
+    return cros_healthd_service;
+  }
+
+  void Init(dbus::Bus* const bus) {
+    cros_healthd_service_proxy_ = bus->GetObjectProxy(
+        diagnostics::kCrosHealthdServiceName,
+        dbus::ObjectPath(diagnostics::kCrosHealthdServicePath));
+  }
+
+ private:
+  dbus::ObjectProxy* cros_healthd_service_proxy_ = nullptr;
+
+  // Passes the success/failure of |dbus_response| on to |result_callback|.
+  void OnBootstrapMojoConnectionResponse(
+      base::OnceCallback<void(bool success)> result_callback,
+      dbus::Response* const dbus_response) {
+    const bool success = dbus_response != nullptr;
+    std::move(result_callback).Run(success);
+  }
+
+  // Must be last class member.
+  base::WeakPtrFactory<CrosHealthdClientImpl> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(CrosHealthdClientImpl);
+};
+
+}  // namespace
+
+CrosHealthdClient::CrosHealthdClient() {
+  DCHECK(!g_instance);
+  g_instance = this;
+}
+
+CrosHealthdClient::~CrosHealthdClient() {
+  DCHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
+
+// static
+void CrosHealthdClient::Initialize(dbus::Bus* bus) {
+  DCHECK(bus);
+  (new CrosHealthdClientImpl())->Init(bus);
+}
+
+// static
+void CrosHealthdClient::InitializeFake() {
+  new FakeCrosHealthdClient();
+}
+
+// static
+void CrosHealthdClient::InitializeFakeWithMockService(
+    mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService> mock_service) {
+  new FakeCrosHealthdClient(std::move(mock_service));
+}
+
+// static
+void CrosHealthdClient::Shutdown() {
+  DCHECK(g_instance);
+  delete g_instance;
+}
+
+// static
+CrosHealthdClient* CrosHealthdClient::Get() {
+  return g_instance;
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/cros_healthd/cros_healthd_client.h b/chromeos/dbus/cros_healthd/cros_healthd_client.h
new file mode 100644
index 0000000..553c1e23
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/cros_healthd_client.h
@@ -0,0 +1,61 @@
+// 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.
+
+#ifndef CHROMEOS_DBUS_CROS_HEALTHD_CROS_HEALTHD_CLIENT_H_
+#define CHROMEOS_DBUS_CROS_HEALTHD_CROS_HEALTHD_CLIENT_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/component_export.h"
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace dbus {
+class Bus;
+}
+
+namespace chromeos {
+
+// D-Bus client for the cros_healthd service. Its only purpose is to bootstrap a
+// Mojo connection to the cros_healthd daemon.
+class COMPONENT_EXPORT(CROS_HEALTHD) CrosHealthdClient {
+ public:
+  // Creates and initializes the global instance. |bus| must not be null.
+  static void Initialize(dbus::Bus* bus);
+
+  // Creates and initializes a fake global instance if not already created.
+  static void InitializeFake();
+
+  static void InitializeFakeWithMockService(
+      mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService>
+          mock_service);
+
+  // Destroys the global instance.
+  static void Shutdown();
+
+  // Returns the global instance which may be null if not initialized.
+  static CrosHealthdClient* Get();
+
+  // Uses D-Bus to bootstrap the Mojo connection between the cros_healthd daemon
+  // and the browser. Returns a bound remote
+  virtual mojo::Remote<cros_healthd::mojom::CrosHealthdService>
+  BootstrapMojoConnection(
+      base::OnceCallback<void(bool success)> result_callback) = 0;
+
+ protected:
+  // Initialize/Shutdown should be used instead.
+  CrosHealthdClient();
+  virtual ~CrosHealthdClient();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CrosHealthdClient);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_CROS_HEALTHD_CROS_HEALTHD_CLIENT_H_
diff --git a/chromeos/dbus/cros_healthd/fake_cros_healthd_client.cc b/chromeos/dbus/cros_healthd/fake_cros_healthd_client.cc
new file mode 100644
index 0000000..4ce44a3
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/fake_cros_healthd_client.cc
@@ -0,0 +1,29 @@
+// 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 "chromeos/dbus/cros_healthd/fake_cros_healthd_client.h"
+
+#include "base/callback.h"
+
+namespace chromeos {
+
+FakeCrosHealthdClient::FakeCrosHealthdClient() = default;
+
+FakeCrosHealthdClient::FakeCrosHealthdClient(
+    mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService> mock_service)
+    : mock_service_(std::move(mock_service)) {}
+
+FakeCrosHealthdClient::~FakeCrosHealthdClient() = default;
+
+mojo::Remote<cros_healthd::mojom::CrosHealthdService>
+FakeCrosHealthdClient::BootstrapMojoConnection(
+    base::OnceCallback<void(bool success)> result_callback) {
+  mojo::Remote<cros_healthd::mojom::CrosHealthdService> remote(
+      std::move(mock_service_));
+
+  std::move(result_callback).Run(/*success=*/true);
+  return remote;
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/cros_healthd/fake_cros_healthd_client.h b/chromeos/dbus/cros_healthd/fake_cros_healthd_client.h
new file mode 100644
index 0000000..137160a
--- /dev/null
+++ b/chromeos/dbus/cros_healthd/fake_cros_healthd_client.h
@@ -0,0 +1,37 @@
+// 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.
+
+#ifndef CHROMEOS_DBUS_CROS_HEALTHD_FAKE_CROS_HEALTHD_CLIENT_H_
+#define CHROMEOS_DBUS_CROS_HEALTHD_FAKE_CROS_HEALTHD_CLIENT_H_
+
+#include "base/callback_forward.h"
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "chromeos/dbus/cros_healthd/cros_healthd_client.h"
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
+
+namespace chromeos {
+
+// Fake implementation of CrosHealthdClient.
+class FakeCrosHealthdClient : public CrosHealthdClient {
+ public:
+  FakeCrosHealthdClient();
+  explicit FakeCrosHealthdClient(
+      mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService>
+          mock_service);
+  ~FakeCrosHealthdClient() override;
+
+  // CrosHealthdClient overrides:
+  mojo::Remote<cros_healthd::mojom::CrosHealthdService> BootstrapMojoConnection(
+      base::OnceCallback<void(bool success)> result_callback) override;
+
+ private:
+  mojo::PendingRemote<cros_healthd::mojom::CrosHealthdService> mock_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeCrosHealthdClient);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_CROS_HEALTHD_FAKE_CROS_HEALTHD_CLIENT_H_
diff --git a/chromeos/dbus/power/fake_power_manager_client.cc b/chromeos/dbus/power/fake_power_manager_client.cc
index bb424c3..39cdc6c 100644
--- a/chromeos/dbus/power/fake_power_manager_client.cc
+++ b/chromeos/dbus/power/fake_power_manager_client.cc
@@ -361,6 +361,10 @@
       FROM_HERE, base::BindOnce(std::move(callback), true));
 }
 
+void FakePowerManagerClient::DeferScreenDim() {
+  num_defer_screen_dim_calls_++;
+}
+
 bool FakePowerManagerClient::PopVideoActivityReport() {
   CHECK(!video_activity_reports_.empty());
   bool fullscreen = video_activity_reports_.front();
@@ -414,6 +418,11 @@
     observer.PowerButtonEventReceived(down, timestamp);
 }
 
+void FakePowerManagerClient::SendScreenDimImminent() {
+  for (auto& observer : observers_)
+    observer.ScreenDimImminent();
+}
+
 void FakePowerManagerClient::SetLidState(LidState state,
                                          const base::TimeTicks& timestamp) {
   lid_state_ = state;
diff --git a/chromeos/dbus/power/fake_power_manager_client.h b/chromeos/dbus/power/fake_power_manager_client.h
index 4095117..82c5c528 100644
--- a/chromeos/dbus/power/fake_power_manager_client.h
+++ b/chromeos/dbus/power/fake_power_manager_client.h
@@ -52,6 +52,7 @@
   int num_set_is_projecting_calls() const {
     return num_set_is_projecting_calls_;
   }
+  int num_defer_screen_dim_calls() const { return num_defer_screen_dim_calls_; }
   int num_wake_notification_calls() const {
     return num_wake_notification_calls_;
   }
@@ -127,6 +128,7 @@
                      VoidDBusMethodCallback callback) override;
   void DeleteArcTimers(const std::string& tag,
                        VoidDBusMethodCallback callback) override;
+  void DeferScreenDim() override;
 
   // Pops the first report from |video_activity_reports_|, returning whether the
   // activity was fullscreen or not. There must be at least one report.
@@ -151,6 +153,9 @@
   // Notifies observers that the power button has been pressed or released.
   void SendPowerButtonEvent(bool down, const base::TimeTicks& timestamp);
 
+  // Notifies observers that the screen is about to be dimmed.
+  void SendScreenDimImminent();
+
   // Sets |lid_state_| or |tablet_mode_| and notifies |observers_| about the
   // change.
   void SetLidState(LidState state, const base::TimeTicks& timestamp);
@@ -219,6 +224,7 @@
   int num_set_policy_calls_ = 0;
   int num_set_is_projecting_calls_ = 0;
   int num_set_backlights_forced_off_calls_ = 0;
+  int num_defer_screen_dim_calls_ = 0;
   int num_wake_notification_calls_ = 0;
 
   // Number of pending suspend readiness callbacks.
diff --git a/chromeos/dbus/power/power_manager_client.cc b/chromeos/dbus/power/power_manager_client.cc
index 06ab167d..1209b65 100644
--- a/chromeos/dbus/power/power_manager_client.cc
+++ b/chromeos/dbus/power/power_manager_client.cc
@@ -192,6 +192,8 @@
          &PowerManagerClientImpl::SuspendDoneReceived},
         {power_manager::kDarkSuspendImminentSignal,
          &PowerManagerClientImpl::DarkSuspendImminentReceived},
+        {power_manager::kScreenDimImminentSignal,
+         &PowerManagerClientImpl::ScreenDimImminentReceived},
         {power_manager::kIdleActionImminentSignal,
          &PowerManagerClientImpl::IdleActionImminentReceived},
         {power_manager::kIdleActionDeferredSignal,
@@ -537,6 +539,10 @@
         base::BindOnce(&OnVoidDBusMethod, std::move(callback)));
   }
 
+  void DeferScreenDim() override {
+    SimpleMethodCallToPowerManager(power_manager::kDeferScreenDimMethod);
+  }
+
  private:
   // Returns true if the current thread is the origin thread.
   bool OnOriginThread() {
@@ -915,6 +921,11 @@
     base::PowerMonitorDeviceSource::HandleSystemResumed();
   }
 
+  void ScreenDimImminentReceived(dbus::Signal* signal) {
+    for (auto& observer : observers_)
+      observer.ScreenDimImminent();
+  }
+
   void IdleActionImminentReceived(dbus::Signal* signal) {
     dbus::MessageReader reader(signal);
     power_manager::IdleActionImminent proto;
diff --git a/chromeos/dbus/power/power_manager_client.h b/chromeos/dbus/power/power_manager_client.h
index 9bd84f5d..b6f3a967a 100644
--- a/chromeos/dbus/power/power_manager_client.h
+++ b/chromeos/dbus/power/power_manager_client.h
@@ -145,6 +145,9 @@
     virtual void TabletModeEventReceived(TabletMode mode,
                                          const base::TimeTicks& timestamp) {}
 
+    // Called just before the screen is dimmed in response to user inactivity.
+    virtual void ScreenDimImminent() {}
+
     // Called when the idle action will be performed after
     // |time_until_idle_action|.
     virtual void IdleActionImminent(
@@ -318,6 +321,11 @@
   virtual void DeleteArcTimers(const std::string& tag,
                                VoidDBusMethodCallback callback) = 0;
 
+  // Instructs powerd to defer dimming the screen. This only has an effect when
+  // called shortly (i.e. seconds) after observers have received
+  // ScreenDimImminent notifications.
+  virtual void DeferScreenDim() = 0;
+
   PowerManagerClient();
   virtual ~PowerManagerClient();
 
diff --git a/chromeos/services/BUILD.gn b/chromeos/services/BUILD.gn
index 37ea9e7..9ac4968 100644
--- a/chromeos/services/BUILD.gn
+++ b/chromeos/services/BUILD.gn
@@ -19,6 +19,7 @@
   testonly = true
   deps = [
     "//chromeos/services/cellular_setup:unit_tests",
+    "//chromeos/services/cros_healthd/public/cpp:unit_tests",
     "//chromeos/services/device_sync:unit_tests",
     "//chromeos/services/ime:services_unittests",
     "//chromeos/services/ime:unit_tests",
diff --git a/chromeos/services/cros_healthd/DEPS b/chromeos/services/cros_healthd/DEPS
new file mode 100644
index 0000000..b5a57d6
--- /dev/null
+++ b/chromeos/services/cros_healthd/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+chromeos/dbus",
+  "+mojo/public",
+]
diff --git a/chromeos/services/cros_healthd/OWNERS b/chromeos/services/cros_healthd/OWNERS
new file mode 100644
index 0000000..fea49f5
--- /dev/null
+++ b/chromeos/services/cros_healthd/OWNERS
@@ -0,0 +1,4 @@
+pmoy@chromium.org
+wbbradley@chromium.org
+
+# COMPONENT: Enterprise
diff --git a/chromeos/services/cros_healthd/public/cpp/BUILD.gn b/chromeos/services/cros_healthd/public/cpp/BUILD.gn
new file mode 100644
index 0000000..781f2550
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/cpp/BUILD.gn
@@ -0,0 +1,34 @@
+# 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.
+
+assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos")
+
+source_set("cpp") {
+  sources = [
+    "service_connection.cc",
+    "service_connection.h",
+  ]
+  deps = [
+    "//base",
+    "//chromeos/dbus/cros_healthd",
+    "//chromeos/services/cros_healthd/public/mojom",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [
+    "service_connection_unittest.cc",
+  ]
+  deps = [
+    ":cpp",
+    "//base/test:test_support",
+    "//chromeos/dbus/cros_healthd",
+    "//chromeos/services/cros_healthd/public/mojom",
+    "//mojo/core/embedder",
+    "//mojo/public/cpp/bindings",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/chromeos/services/cros_healthd/public/cpp/OWNERS b/chromeos/services/cros_healthd/public/cpp/OWNERS
new file mode 100644
index 0000000..fea49f5
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/cpp/OWNERS
@@ -0,0 +1,4 @@
+pmoy@chromium.org
+wbbradley@chromium.org
+
+# COMPONENT: Enterprise
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection.cc b/chromeos/services/cros_healthd/public/cpp/service_connection.cc
new file mode 100644
index 0000000..e3fd1d6
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/cpp/service_connection.cc
@@ -0,0 +1,101 @@
+// 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 "chromeos/services/cros_healthd/public/cpp/service_connection.h"
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "base/sequence_checker.h"
+#include "chromeos/dbus/cros_healthd/cros_healthd_client.h"
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace chromeos {
+namespace cros_healthd {
+
+namespace {
+
+// Production implementation of ServiceConnection.
+class ServiceConnectionImpl : public ServiceConnection {
+ public:
+  ServiceConnectionImpl();
+
+ protected:
+  ~ServiceConnectionImpl() override = default;
+
+ private:
+  // ServiceConnection overrides:
+  void ProbeNonRemovableBlockDeviceInfo(
+      mojom::CrosHealthdService::ProbeNonRemovableBlockDeviceInfoCallback
+          callback) override;
+
+  // Binds the top level interface |cros_healthd_service_| to an
+  // implementation in the cros_healthd daemon, if it is not already bound. The
+  // binding is accomplished via D-Bus bootstrap.
+  void BindCrosHealthdServiceIfNeeded();
+
+  // Mojo disconnect handler. Resets |cros_healthd_service_|, which will be
+  // reconnected upon next use.
+  void OnDisconnect();
+
+  // Response callback for BootstrapMojoConnection.
+  void OnBootstrapMojoConnectionResponse(bool success);
+
+  mojo::Remote<mojom::CrosHealthdService> cros_healthd_service_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(ServiceConnectionImpl);
+};
+
+void ServiceConnectionImpl::ProbeNonRemovableBlockDeviceInfo(
+    mojom::CrosHealthdService::ProbeNonRemovableBlockDeviceInfoCallback
+        callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  BindCrosHealthdServiceIfNeeded();
+  cros_healthd_service_->ProbeNonRemovableBlockDeviceInfo(std::move(callback));
+}
+
+void ServiceConnectionImpl::BindCrosHealthdServiceIfNeeded() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (cros_healthd_service_.is_bound())
+    return;
+
+  cros_healthd_service_ = CrosHealthdClient::Get()->BootstrapMojoConnection(
+      base::BindOnce(&ServiceConnectionImpl::OnBootstrapMojoConnectionResponse,
+                     base::Unretained(this)));
+  cros_healthd_service_.set_disconnect_handler(base::BindOnce(
+      &ServiceConnectionImpl::OnDisconnect, base::Unretained(this)));
+}
+
+ServiceConnectionImpl::ServiceConnectionImpl() {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
+
+void ServiceConnectionImpl::OnDisconnect() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Connection errors are not expected, so log a warning.
+  DLOG(WARNING) << "cros_healthd Mojo connection closed.";
+  cros_healthd_service_.reset();
+}
+
+void ServiceConnectionImpl::OnBootstrapMojoConnectionResponse(
+    const bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!success) {
+    DLOG(WARNING) << "BootstrapMojoConnection D-Bus call failed.";
+    cros_healthd_service_.reset();
+  }
+}
+
+}  // namespace
+
+ServiceConnection* ServiceConnection::GetInstance() {
+  static base::NoDestructor<ServiceConnectionImpl> service_connection;
+  return service_connection.get();
+}
+
+}  // namespace cros_healthd
+}  // namespace chromeos
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection.h b/chromeos/services/cros_healthd/public/cpp/service_connection.h
new file mode 100644
index 0000000..d91f05f
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/cpp/service_connection.h
@@ -0,0 +1,33 @@
+// 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.
+
+#ifndef CHROMEOS_SERVICES_CROS_HEALTHD_PUBLIC_CPP_SERVICE_CONNECTION_H_
+#define CHROMEOS_SERVICES_CROS_HEALTHD_PUBLIC_CPP_SERVICE_CONNECTION_H_
+
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
+
+namespace chromeos {
+namespace cros_healthd {
+
+// Encapsulates a connection to the Chrome OS cros_healthd daemon via its Mojo
+// interface.
+// Sequencing: Must be used on a single sequence (may be created on another).
+class ServiceConnection {
+ public:
+  static ServiceConnection* GetInstance();
+
+  // Gather various info on non-removeable block devices.
+  virtual void ProbeNonRemovableBlockDeviceInfo(
+      mojom::CrosHealthdService::ProbeNonRemovableBlockDeviceInfoCallback
+          callback) = 0;
+
+ protected:
+  ServiceConnection() = default;
+  virtual ~ServiceConnection() = default;
+};
+
+}  // namespace cros_healthd
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_CROS_HEALTHD_PUBLIC_CPP_SERVICE_CONNECTION_H_
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
new file mode 100644
index 0000000..75a2baa
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
@@ -0,0 +1,95 @@
+// 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 "chromeos/services/cros_healthd/public/cpp/service_connection.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
+#include "chromeos/dbus/cros_healthd/cros_healthd_client.h"
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h"
+#include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::StrictMock;
+using ::testing::WithArgs;
+
+namespace chromeos {
+namespace cros_healthd {
+namespace {
+
+std::vector<mojom::NonRemovableBlockDeviceInfoPtr>
+MakeNonRemovableBlockDeviceInfo() {
+  std::vector<mojom::NonRemovableBlockDeviceInfoPtr> info;
+  info.push_back(mojom::NonRemovableBlockDeviceInfo::New(
+      "test_path", 123 /* size */, "test_type", 10 /* manfid */, "test_name",
+      768 /* serial */));
+  info.push_back(mojom::NonRemovableBlockDeviceInfo::New(
+      "test_path2", 124 /* size */, "test_type2", 11 /* manfid */, "test_name2",
+      767 /* serial */));
+  return info;
+}
+
+class MockCrosHealthdService : public mojom::CrosHealthdService {
+ public:
+  mojo::PendingRemote<mojom::CrosHealthdService> GetPendingRemote() {
+    return receiver_.BindNewPipeAndPassRemote();
+  }
+
+  MOCK_METHOD1(ProbeNonRemovableBlockDeviceInfo,
+               void(ProbeNonRemovableBlockDeviceInfoCallback callback));
+
+ private:
+  mojo::Receiver<mojom::CrosHealthdService> receiver_{this};
+};
+
+class CrosHealthdServiceConnectionTest : public testing::Test {
+ public:
+  CrosHealthdServiceConnectionTest() = default;
+
+  void SetUp() override {
+    CrosHealthdClient::InitializeFakeWithMockService(
+        mock_service_.GetPendingRemote());
+  }
+
+  void TearDown() override { CrosHealthdClient::Shutdown(); }
+
+  MockCrosHealthdService* mock_service() { return &mock_service_; }
+
+ private:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  StrictMock<MockCrosHealthdService> mock_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(CrosHealthdServiceConnectionTest);
+};
+
+TEST_F(CrosHealthdServiceConnectionTest, ProbeNonRemovableBlockDeviceInfo) {
+  EXPECT_CALL(*mock_service(), ProbeNonRemovableBlockDeviceInfo(_))
+      .WillOnce(WithArgs<0>(Invoke(
+          [](mojom::CrosHealthdService::ProbeNonRemovableBlockDeviceInfoCallback
+                 callback) {
+            std::move(callback).Run(MakeNonRemovableBlockDeviceInfo());
+          })));
+  bool callback_done = false;
+  ServiceConnection::GetInstance()->ProbeNonRemovableBlockDeviceInfo(
+      base::BindOnce(
+          [](bool* callback_done,
+             std::vector<mojom::NonRemovableBlockDeviceInfoPtr> info) {
+            EXPECT_EQ(info, MakeNonRemovableBlockDeviceInfo());
+            *callback_done = true;
+          },
+          &callback_done));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(callback_done);
+}
+
+}  // namespace
+}  // namespace cros_healthd
+}  // namespace chromeos
diff --git a/chromeos/services/cros_healthd/public/mojom/BUILD.gn b/chromeos/services/cros_healthd/public/mojom/BUILD.gn
new file mode 100644
index 0000000..994ff0a3
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/mojom/BUILD.gn
@@ -0,0 +1,12 @@
+# 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.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojom") {
+  sources = [
+    "cros_healthd.mojom",
+    "cros_healthd_probe.mojom",
+  ]
+}
diff --git a/chromeos/services/cros_healthd/public/mojom/OWNERS b/chromeos/services/cros_healthd/public/mojom/OWNERS
new file mode 100644
index 0000000..c640525
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/mojom/OWNERS
@@ -0,0 +1,3 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
+per-file *.mojom=file://chromeos/SECURITY_OWNERS
\ No newline at end of file
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom
new file mode 100644
index 0000000..d98cbe9
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom
@@ -0,0 +1,25 @@
+// 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.
+
+// API exposed by the cros_healthd daemon. This API is normally consumed by the
+// browser and the telem and diag command-line tools.
+
+// NOTE: This mojom should be kept in sync with the copy in Chromium OS's repo
+// in src/platform2/diagnostics/mojo/cros_healthd.mojom.
+
+module chromeos.cros_healthd.mojom;
+
+import "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom";
+
+// Interface exposed by the cros_healthd daemon.
+interface CrosHealthdService {
+  // ------------------- Start of probe definitions ---------------------
+
+  // Returns an array of all non-removable block devices and associated
+  // up-to-date info.
+  ProbeNonRemovableBlockDeviceInfo()
+      => (array<NonRemovableBlockDeviceInfo> devices);
+
+  // ------------------- End of probe definitions -----------------------
+};
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
new file mode 100644
index 0000000..41dee83
--- /dev/null
+++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -0,0 +1,27 @@
+// 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.
+
+// Definitions for the probe API exposed by the cros_healthd daemon. This API is
+// normally consumed by the browser.
+
+// NOTE: This mojom should be kept in sync with the copy in Chromium OS's repo
+// in src/platform2/diagnostics/mojo/cros_healthd_probe.mojom.
+
+module chromeos.cros_healthd.mojom;
+
+struct NonRemovableBlockDeviceInfo {
+  // The path of this storage on the system. It is useful if caller needs to
+  // correlate with other information.
+  string path;
+  // Exact size of this storage, reported in bytes
+  uint64 size;
+  // Storage type, could be MMC / NVMe / ATA, based on udev subsystem.
+  string type;
+  // Manufacturer ID, 8 bits.
+  uint8 manufacturer_id;
+  // PNM: Product name, ASCII characters for 6 bytes.
+  string name;
+  // PSN: Product serial number, 32 bits
+  uint32 serial;
+};
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index e19fe354..93591eb 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -9,6 +9,7 @@
 <translation id="2338501278241028356">அருகிலுள்ள சாதனங்களைக் கண்டறிய, புளூடூத்தை இயக்கவும்</translation>
 <translation id="2805756323405976993">ஆப்ஸ்</translation>
 <translation id="2872961005593481000">நிறுத்து</translation>
+<translation id="3511655281162215899">புதிய கடவுச்சொல்லை உடனடியாக அமைக்கவும்</translation>
 <translation id="4731797938093519117">பெற்றோர் அணுகல்</translation>
 <translation id="476166673298332917">சாதன நிர்வாகி உங்கள் உலாவல் செயல்பாட்டைக் கண்காணிக்கக்கூடும்.</translation>
 <translation id="5212543919916444558">உங்களுக்கு நான் உதவும் வகையில், உங்கள் திரையில் எதுவுமில்லை.
@@ -16,6 +17,7 @@
 <translation id="5222676887888702881">வெளியேறு</translation>
 <translation id="5457599981699367932">விருந்தினராக உலாவுங்கள்</translation>
 <translation id="54609108002486618">நிர்வகிக்கப்பட்டது</translation>
+<translation id="5733345267661125295">இப்போதே புதிய கடவுச்சொல்லை அமைக்கவும்</translation>
 <translation id="5832805196449965646">நபரைச் சேர்</translation>
 <translation id="5895138241574237353">மறுதொடக்கம்</translation>
 <translation id="6574601967010742428">உங்கள் செயல்பாடு சாதன நிர்வாகியால் கண்காணிக்கப்படலாம்.</translation>
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index b66682e..dbac7929 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -713,6 +713,19 @@
       parts, l10n_util::GetStringUTF8(IDS_AUTOFILL_SUGGESTION_LABEL_SEPARATOR));
 }
 
+class CreditCardSuggestionMatchingTest
+    : public AutofillManagerTest,
+      public testing::WithParamInterface<bool> {
+ protected:
+  void SetUp() override {
+    AutofillManagerTest::SetUp();
+    features_.InitWithFeatureState(features::kAutofillKeyboardAccessory,
+                                   GetParam());
+  }
+
+  base::test::ScopedFeatureList features_;
+};
+
 // Test that calling OnFormsSeen with an empty set of forms (such as when
 // reloading a page or when the renderer processes a set of forms but detects
 // no changes) does not load the forms again.
@@ -1297,24 +1310,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the credit card suggestions to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return all credit card profile suggestions when the triggering
@@ -1331,24 +1343,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return all credit card profile suggestions when the triggering
@@ -1365,24 +1376,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return all credit card profile suggestions when the triggering
@@ -1399,24 +1409,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return all credit card profile suggestions when the triggering
@@ -1442,17 +1451,16 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kMasterCardSuggestionLabel = std::string("08/17");
+  const std::string master_card_label = std::string("08/17");
 #else
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 08/17");
+  const std::string master_card_label = std::string("Expires on 08/17");
 #endif
 
   // Test that we sent the right value to the external delegate.
   CheckSuggestions(kDefaultPageID,
                    Suggestion(std::string("Mastercard  ") +
                                   test::ObfuscatedCardDigitsAsUTF8("3123"),
-                              kMasterCardSuggestionLabel, kMasterCard,
+                              master_card_label, kMasterCard,
                               autofill_manager_->GetPackedCreditCardID(7)));
 }
 
@@ -1470,22 +1478,22 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
+  const std::string visa_label = std::string("04/99");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
+  const std::string visa_label = std::string("Expires on 04/99");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)));
 }
 
 // Test that we return credit card profile suggestions when the selected form
 // field is not the credit card number field.
-TEST_F(AutofillManagerTest, GetCreditCardSuggestions_NonCCNumber) {
+TEST_P(CreditCardSuggestionMatchingTest, GetCreditCardSuggestions_NonCCNumber) {
   // Set up our form data.
   FormData form;
   CreateTestCreditCardFormData(&form, true, false);
@@ -1501,27 +1509,32 @@
       test::ObfuscatedCardDigitsAsUTF8("8765");
 
 #if defined(OS_ANDROID)
-  const std::string kVisaSuggestionLabel =
-      std::string("Visa  ") + obfuscated_last_four_digits1;
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Mastercard  ") + obfuscated_last_four_digits2;
+  const std::string visa_label =
+      IsKeyboardAccessoryEnabled()
+          ? obfuscated_last_four_digits1
+          : std::string("Visa  ") + obfuscated_last_four_digits1;
+  const std::string master_card_label =
+      IsKeyboardAccessoryEnabled()
+          ? obfuscated_last_four_digits2
+          : std::string("Mastercard  ") + obfuscated_last_four_digits2;
+
 #elif defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = obfuscated_last_four_digits1;
-  const std::string kMasterCardSuggestionLabel = obfuscated_last_four_digits2;
+  const std::string visa_label = obfuscated_last_four_digits1;
+  const std::string master_card_label = obfuscated_last_four_digits2;
+
 #else
-  const std::string kVisaSuggestionLabel = base::JoinString(
+  const std::string visa_label = base::JoinString(
       {"Visa  ", obfuscated_last_four_digits1, ", expires on 04/99"}, "");
-  const std::string kMasterCardSuggestionLabel = base::JoinString(
+  const std::string master_card_label = base::JoinString(
       {"Mastercard  ", obfuscated_last_four_digits2, ", expires on 10/98"}, "");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(
-      kDefaultPageID,
-      Suggestion("Elvis Presley", kVisaSuggestionLabel, kVisaCard,
-                 autofill_manager_->GetPackedCreditCardID(4)),
-      Suggestion("Buddy Holly", kMasterCardSuggestionLabel, kMasterCard,
-                 autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(kDefaultPageID,
+                   Suggestion("Elvis Presley", visa_label, kVisaCard,
+                              autofill_manager_->GetPackedCreditCardID(4)),
+                   Suggestion("Buddy Holly", master_card_label, kMasterCard,
+                              autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we will eventually return the credit card signin promo when there
@@ -1601,24 +1614,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return credit card suggestions for secure pages that have a
@@ -1637,24 +1649,23 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that we return all credit card suggestions in the case that two cards
@@ -1681,31 +1692,29 @@
   GetAutofillSuggestions(form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel1 = std::string("10/98");
-  const std::string kMasterCardSuggestionLabel2 = std::string("05/99");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label1 = std::string("10/98");
+  const std::string master_card_label2 = std::string("05/99");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel1 =
-      std::string("Expires on 10/98");
-  const std::string kMasterCardSuggestionLabel2 =
-      std::string("Expires on 05/99");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label1 = std::string("Expires on 10/98");
+  const std::string master_card_label2 = std::string("Expires on 05/99");
 #endif
 
   // Test that we sent the right values to the external delegate.
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel1, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kMasterCardSuggestionLabel2, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(7)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label1, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("3456"),
+                 master_card_label2, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(7)));
 }
 
 // Test that we return profile and credit card suggestions for combined forms.
@@ -1748,24 +1757,23 @@
   GetAutofillSuggestions(kPageID2, form, field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
   // Test that we sent the credit card suggestions to the external delegate.
-  CheckSuggestions(kPageID2,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)),
-                   Suggestion(std::string("Mastercard  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("8765"),
-                              kMasterCardSuggestionLabel, kMasterCard,
-                              autofill_manager_->GetPackedCreditCardID(5)));
+  CheckSuggestions(
+      kPageID2,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)),
+      Suggestion(std::string("Mastercard  ") +
+                     test::ObfuscatedCardDigitsAsUTF8("8765"),
+                 master_card_label, kMasterCard,
+                 autofill_manager_->GetPackedCreditCardID(5)));
 }
 
 // Test that for non-https forms with both address and credit card fields, we
@@ -5623,19 +5631,18 @@
   GetAutofillSuggestions(form, number_field);
 
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  const std::string kVisaSuggestionLabel = std::string("04/99");
-  const std::string kMasterCardSuggestionLabel = std::string("10/98");
+  const std::string visa_label = std::string("04/99");
+  const std::string master_card_label = std::string("10/98");
 #else
-  const std::string kVisaSuggestionLabel = std::string("Expires on 04/99");
-  const std::string kMasterCardSuggestionLabel =
-      std::string("Expires on 10/98");
+  const std::string visa_label = std::string("Expires on 04/99");
+  const std::string master_card_label = std::string("Expires on 10/98");
 #endif
 
-  CheckSuggestions(kDefaultPageID,
-                   Suggestion(std::string("Visa  ") +
-                                  test::ObfuscatedCardDigitsAsUTF8("3456"),
-                              kVisaSuggestionLabel, kVisaCard,
-                              autofill_manager_->GetPackedCreditCardID(4)));
+  CheckSuggestions(
+      kDefaultPageID,
+      Suggestion(
+          std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("3456"),
+          visa_label, kVisaCard, autofill_manager_->GetPackedCreditCardID(4)));
 }
 
 // Test that inputs detected to be CVC inputs are forced to
@@ -5887,7 +5894,8 @@
 
 // Verify that typing "dre" matches "Nancy Drew" when substring matching is
 // enabled.
-TEST_F(AutofillManagerTest, DisplayCreditCardSuggestionsWithMatchingTokens) {
+TEST_P(CreditCardSuggestionMatchingTest,
+       DisplayCreditCardSuggestionsWithMatchingTokens) {
   base::test::ScopedFeatureList features;
   features.InitAndEnableFeature(features::kAutofillTokenPrefixMatching);
 
@@ -5910,20 +5918,23 @@
   personal_data_.AddCreditCard(credit_card);
 
 #if defined(OS_ANDROID)
-  const std::string kVisaSuggestionLabel =
-      std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("7777");
+  const std::string visa_label =
+      IsKeyboardAccessoryEnabled()
+          ? test::ObfuscatedCardDigitsAsUTF8("7777")
+          : std::string("Visa  ") + test::ObfuscatedCardDigitsAsUTF8("7777");
+
 #elif defined(OS_IOS)
-  const std::string kVisaSuggestionLabel =
-      test::ObfuscatedCardDigitsAsUTF8("7777");
+  const std::string visa_label = test::ObfuscatedCardDigitsAsUTF8("7777");
+
 #else
-  const std::string kVisaSuggestionLabel = base::UTF16ToUTF8(
+  const std::string visa_label = base::UTF16ToUTF8(
       credit_card.NetworkOrBankNameLastFourDigitsAndDescriptiveExpiration(
           "en-US"));
 #endif
 
   GetAutofillSuggestions(form, field);
   CheckSuggestions(kDefaultPageID,
-                   Suggestion("Nancy Drew", kVisaSuggestionLabel, kVisaCard,
+                   Suggestion("Nancy Drew", visa_label, kVisaCard,
                               MakeFrontendID(guid, std::string())));
 }
 
@@ -7453,4 +7464,6 @@
 
 INSTANTIATE_TEST_SUITE_P(, SuggestionMatchingTest, testing::Bool());
 
+INSTANTIATE_TEST_SUITE_P(, CreditCardSuggestionMatchingTest, testing::Bool());
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 0a18e30..d166c9db 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -2105,10 +2105,14 @@
         }
       } else {
 #if defined(OS_ANDROID)
-        // E.g. "Visa  ••••1234".
-        suggestion->label = credit_card->NetworkOrBankNameAndLastFourDigits();
+        // On Android devices, the label is formatted as "Visa  ••••1234" when
+        // the keyboard accessory experiment is disabled and as "••••1234" when
+        // it's enabled.
+        suggestion->label =
+            base::FeatureList::IsEnabled(features::kAutofillKeyboardAccessory)
+                ? credit_card->ObfuscatedLastFourDigits()
+                : credit_card->NetworkOrBankNameAndLastFourDigits();
 #elif defined(OS_IOS)
-        // TODO(crbug.com/968267): Use the same format for iOS and Android.
         // E.g. "••••1234"".
         suggestion->label = credit_card->ObfuscatedLastFourDigits();
 #else
diff --git a/components/exo/pointer_unittest.cc b/components/exo/pointer_unittest.cc
index 2807ed1..623fdbe 100644
--- a/components/exo/pointer_unittest.cc
+++ b/components/exo/pointer_unittest.cc
@@ -54,15 +54,9 @@
   MOCK_METHOD0(OnPointerFrame, void());
 };
 
-// Flaky on Linux Chromium OS ASan LSan. http://crbug.com/859020.
-#if defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)
-#define MAYBE_PointerTest DISABLED_PointerTest
-#else
-#define MAYBE_PointerTest PointerTest
-#endif
-class MAYBE_PointerTest : public test::ExoTestBase {
+class PointerTest : public test::ExoTestBase {
  public:
-  MAYBE_PointerTest() = default;
+  PointerTest() = default;
 
   void SetUp() override {
     test::ExoTestBase::SetUp();
@@ -73,10 +67,10 @@
   }
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(MAYBE_PointerTest);
+  DISALLOW_COPY_AND_ASSIGN(PointerTest);
 };
 
-TEST_F(MAYBE_PointerTest, SetCursor) {
+TEST_F(PointerTest, SetCursor) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -138,7 +132,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, SetCursorNull) {
+TEST_F(PointerTest, SetCursorNull) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -169,7 +163,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, SetCursorType) {
+TEST_F(PointerTest, SetCursorType) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -227,7 +221,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, SetCursorTypeOutsideOfSurface) {
+TEST_F(PointerTest, SetCursorTypeOutsideOfSurface) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -259,7 +253,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, SetCursorAndSetCursorType) {
+TEST_F(PointerTest, SetCursorAndSetCursorType) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -332,7 +326,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, SetCursorNullAndSetCursorType) {
+TEST_F(PointerTest, SetCursorNullAndSetCursorType) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -376,7 +370,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerEnter) {
+TEST_F(PointerTest, OnPointerEnter) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -399,7 +393,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerLeave) {
+TEST_F(PointerTest, OnPointerLeave) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -432,7 +426,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerMotion) {
+TEST_F(PointerTest, OnPointerMotion) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -505,7 +499,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerButton) {
+TEST_F(PointerTest, OnPointerButton) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -535,7 +529,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerScroll) {
+TEST_F(PointerTest, OnPointerScroll) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -570,7 +564,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerScrollWithThreeFinger) {
+TEST_F(PointerTest, OnPointerScrollWithThreeFinger) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -605,7 +599,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, OnPointerScrollDiscrete) {
+TEST_F(PointerTest, OnPointerScrollDiscrete) {
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
   gfx::Size buffer_size(10, 10);
@@ -633,7 +627,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, RegisterPointerEventsOnModal) {
+TEST_F(PointerTest, RegisterPointerEventsOnModal) {
   // Create modal surface.
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(
@@ -683,7 +677,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, IgnorePointerEventsOnNonModalWhenModalIsOpen) {
+TEST_F(PointerTest, IgnorePointerEventsOnNonModalWhenModalIsOpen) {
   // Create surface for non-modal window.
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
@@ -752,7 +746,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, IgnorePointerLeaveOnModal) {
+TEST_F(PointerTest, IgnorePointerLeaveOnModal) {
   // Create modal surface.
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(
@@ -794,7 +788,7 @@
   pointer.reset();
 }
 
-TEST_F(MAYBE_PointerTest, RegisterPointerEventsOnNonModal) {
+TEST_F(PointerTest, RegisterPointerEventsOnNonModal) {
   // Create surface for non-modal window.
   std::unique_ptr<Surface> surface(new Surface);
   std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index c1cd110..b32029d 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -462,6 +462,23 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
+// wm::ActivationChangeObserver overrides:
+
+void ShellSurface::OnWindowActivated(ActivationReason reason,
+                                     aura::Window* gained_active,
+                                     aura::Window* lost_active) {
+  ShellSurfaceBase::OnWindowActivated(reason, gained_active, lost_active);
+
+  if (!widget_)
+    return;
+
+  if (gained_active == widget_->GetNativeWindow() ||
+      lost_active == widget_->GetNativeWindow()) {
+    Configure();
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // ShellSurfaceBase overrides:
 
 void ShellSurface::SetWidgetBounds(const gfx::Rect& bounds) {
@@ -482,7 +499,8 @@
 bool ShellSurface::OnPreWidgetCommit() {
   if (!widget_ && GetEnabled()) {
     // Defer widget creation and commit until surface has contents.
-    if (host_window()->bounds().IsEmpty()) {
+    if (host_window()->bounds().IsEmpty() &&
+        root_surface()->surface_hierarchy_content_bounds().IsEmpty()) {
       Configure();
       return false;
     }
@@ -504,23 +522,6 @@
 void ShellSurface::OnPostWidgetCommit() {}
 
 ////////////////////////////////////////////////////////////////////////////////
-// wm::ActivationChangeObserver overrides:
-
-void ShellSurface::OnWindowActivated(ActivationReason reason,
-                                     aura::Window* gained_active,
-                                     aura::Window* lost_active) {
-  ShellSurfaceBase::OnWindowActivated(reason, gained_active, lost_active);
-
-  if (!widget_)
-    return;
-
-  if (gained_active == widget_->GetNativeWindow() ||
-      lost_active == widget_->GetNativeWindow()) {
-    Configure();
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
 // ShellSurface, private:
 
 void ShellSurface::SetParentWindow(aura::Window* parent) {
diff --git a/components/exo/shell_surface.h b/components/exo/shell_surface.h
index 8e4d880..073b2c48 100644
--- a/components/exo/shell_surface.h
+++ b/components/exo/shell_surface.h
@@ -107,6 +107,11 @@
                          aura::Window* gained_active,
                          aura::Window* lost_active) override;
 
+  // Overridden from ShellSurfaceBase:
+  void SetWidgetBounds(const gfx::Rect& bounds) override;
+  bool OnPreWidgetCommit() override;
+  void OnPostWidgetCommit() override;
+
  private:
   class ScopedAnimationsDisabled;
   struct Config;
@@ -132,11 +137,6 @@
     DISALLOW_COPY_AND_ASSIGN(ScopedConfigure);
   };
 
-  // Overridden from ShellSurfaceBase:
-  void SetWidgetBounds(const gfx::Rect& bounds) override;
-  bool OnPreWidgetCommit() override;
-  void OnPostWidgetCommit() override;
-
   // Set the parent window of this surface.
   void SetParentWindow(aura::Window* parent);
 
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc
index cffbe74f..e736618 100644
--- a/components/exo/shell_surface_base.cc
+++ b/components/exo/shell_surface_base.cc
@@ -546,7 +546,8 @@
   if (shadow_bounds_changed_)
     host_window()->AllocateLocalSurfaceId();
 
-  SurfaceTreeHost::OnSurfaceCommit();
+  DCHECK(presentation_callbacks().empty());
+  root_surface()->CommitSurfaceHierarchy(false);
 
   if (!OnPreWidgetCommit())
     return;
@@ -773,7 +774,12 @@
   if (!geometry_.IsEmpty())
     return geometry_.size();
 
-  return host_window()->bounds().size();
+  // The root surface's content bounds should be used instead of the host window
+  // bounds because the host window bounds are not updated until the widget is
+  // committed, meaning that if we need to calculate the preferred size before
+  // then (e.g. in OnPreWidgetCommit()), then we need to use the root surface's
+  // to ensure that we're using the correct bounds' size.
+  return root_surface()->surface_hierarchy_content_bounds().size();
 }
 
 gfx::Size ShellSurfaceBase::GetMinimumSize() const {
@@ -1108,6 +1114,7 @@
   }
 
   UpdateWidgetBounds();
+  SurfaceTreeHost::UpdateHostWindowBounds();
   UpdateShadow();
 
   // System modal container is used by clients to implement overlay
diff --git a/components/exo/shell_surface_base.h b/components/exo/shell_surface_base.h
index b12a175de..f04f787 100644
--- a/components/exo/shell_surface_base.h
+++ b/components/exo/shell_surface_base.h
@@ -10,6 +10,7 @@
 #include <string>
 
 #include "ash/display/window_tree_host_manager.h"
+#include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
@@ -254,6 +255,9 @@
   bool has_grab_ = false;
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(ShellSurfaceTest,
+                           HostWindowBoundsUpdatedAfterCommitWidget);
+
   // Called on widget creation to initialize its window state.
   // TODO(reveman): Remove virtual functions below to avoid FBC problem.
   virtual void InitializeWindowState(ash::wm::WindowState* window_state) = 0;
diff --git a/components/exo/shell_surface_unittest.cc b/components/exo/shell_surface_unittest.cc
index 702b953..f35e3ab 100644
--- a/components/exo/shell_surface_unittest.cc
+++ b/components/exo/shell_surface_unittest.cc
@@ -42,7 +42,6 @@
 #include "ui/wm/core/window_util.h"
 
 namespace exo {
-namespace {
 
 using ShellSurfaceTest = test::ExoTestBase;
 
@@ -232,6 +231,26 @@
       shell_surface->GetWidget()->GetWindowBoundsInScreen().size().ToString());
 }
 
+TEST_F(ShellSurfaceTest, HostWindowBoundsUpdatedAfterCommitWidget) {
+  gfx::Size buffer_size(256, 256);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
+  std::unique_ptr<Surface> surface(new Surface);
+  std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
+
+  surface->Attach(buffer.get());
+  shell_surface->SurfaceTreeHost::OnSurfaceCommit();
+  shell_surface->root_surface()->SetSurfaceHierarchyContentBoundsForTest(
+      gfx::Rect(0, 0, 50, 50));
+
+  // Host Window Bounds size before committing.
+  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), shell_surface->host_window()->bounds());
+  EXPECT_TRUE(shell_surface->OnPreWidgetCommit());
+  shell_surface->CommitWidget();
+  // CommitWidget should update the Host Window Bounds.
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 50), shell_surface->host_window()->bounds());
+}
+
 TEST_F(ShellSurfaceTest, SetFullscreen) {
   gfx::Size buffer_size(256, 256);
   std::unique_ptr<Buffer> buffer(
@@ -783,5 +802,4 @@
   }
 }
 
-}  // namespace
 }  // namespace exo
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index ccaad1f..65e75c3 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -804,6 +804,11 @@
     window()->TrackOcclusionState();
 }
 
+void Surface::SetSurfaceHierarchyContentBoundsForTest(
+    const gfx::Rect& content_bounds) {
+  surface_hierarchy_content_bounds_ = content_bounds;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Buffer, private:
 
diff --git a/components/exo/surface.h b/components/exo/surface.h
index 6f1c53a..5fec13b 100644
--- a/components/exo/surface.h
+++ b/components/exo/surface.h
@@ -266,6 +266,9 @@
   // True if the window for this surface has its occlusion tracked.
   bool is_tracking_occlusion() const { return is_tracking_occlusion_; }
 
+  // Sets the |surface_hierarchy_content_bounds_|.
+  void SetSurfaceHierarchyContentBoundsForTest(const gfx::Rect& content_bounds);
+
  private:
   struct State {
     State();
diff --git a/components/exo/surface_tree_host.cc b/components/exo/surface_tree_host.cc
index d78f16c..6cb904b 100644
--- a/components/exo/surface_tree_host.cc
+++ b/components/exo/surface_tree_host.cc
@@ -260,9 +260,6 @@
   layer_tree_frame_sink_holder_->SubmitCompositorFrame(std::move(frame));
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// SurfaceTreeHost, private:
-
 void SurfaceTreeHost::UpdateHostWindowBounds() {
   // This method applies multiple changes to the window tree. Use ScopedPause
   // to ensure that occlusion isn't recomputed before all changes have been
@@ -282,6 +279,9 @@
       root_surface_origin_, root_surface_->window()->bounds().size()));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// SurfaceTreeHost, private:
+
 viz::CompositorFrame SurfaceTreeHost::PrepareToSubmitCompositorFrame() {
   DCHECK(root_surface_);
 
diff --git a/components/exo/surface_tree_host.h b/components/exo/surface_tree_host.h
index 3dee6f4d..552665e5b 100644
--- a/components/exo/surface_tree_host.h
+++ b/components/exo/surface_tree_host.h
@@ -62,6 +62,11 @@
   }
 
   using PresentationCallbacks = std::list<Surface::PresentationCallback>;
+
+  const PresentationCallbacks& presentation_callbacks() const {
+    return presentation_callbacks_;
+  }
+
   base::flat_map<uint32_t, PresentationCallbacks>&
   GetActivePresentationCallbacksForTesting() {
     return active_presentation_callbacks_;
@@ -90,8 +95,10 @@
   // need to be released back to the client.
   void SubmitEmptyCompositorFrame();
 
- private:
+  // Update the host window's size to cover entire surfaces.
   void UpdateHostWindowBounds();
+
+ private:
   viz::CompositorFrame PrepareToSubmitCompositorFrame();
 
   Surface* root_surface_ = nullptr;
diff --git a/components/offline_pages/core/BUILD.gn b/components/offline_pages/core/BUILD.gn
index 1d10cff..12ecaa4 100644
--- a/components/offline_pages/core/BUILD.gn
+++ b/components/offline_pages/core/BUILD.gn
@@ -56,6 +56,8 @@
     "offline_clock.h",
     "offline_event_logger.cc",
     "offline_event_logger.h",
+    "offline_page_archive_publisher.cc",
+    "offline_page_archive_publisher.h",
     "offline_page_archiver.cc",
     "offline_page_archiver.h",
     "offline_page_client_policy.cc",
@@ -109,6 +111,8 @@
     "model/offline_page_test_utils.h",
     "offline_page_metadata_store_test_util.cc",
     "offline_page_metadata_store_test_util.h",
+    "offline_page_test_archive_publisher.cc",
+    "offline_page_test_archive_publisher.h",
     "offline_page_test_archiver.cc",
     "offline_page_test_archiver.h",
     "stub_offline_page_model.cc",
@@ -173,7 +177,7 @@
     "model/update_file_path_task_unittest.cc",
     "model/visuals_availability_task_unittest.cc",
     "offline_event_logger_unittest.cc",
-    "offline_page_archiver_unittest.cc",
+    "offline_page_archive_publisher_unittest.cc",
     "offline_page_feature_unittest.cc",
     "offline_page_item_utils_unittest.cc",
     "offline_page_metadata_store_unittest.cc",
diff --git a/components/offline_pages/core/model/offline_page_model_taskified.cc b/components/offline_pages/core/model/offline_page_model_taskified.cc
index f02a5a9..7606e7da 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified.cc
+++ b/components/offline_pages/core/model/offline_page_model_taskified.cc
@@ -173,10 +173,12 @@
     std::unique_ptr<OfflinePageMetadataStore> store,
     std::unique_ptr<ArchiveManager> archive_manager,
     std::unique_ptr<SystemDownloadManager> download_manager,
+    std::unique_ptr<OfflinePageArchivePublisher> archive_publisher,
     const scoped_refptr<base::SequencedTaskRunner>& task_runner)
     : store_(std::move(store)),
       archive_manager_(std::move(archive_manager)),
       download_manager_(std::move(download_manager)),
+      archive_publisher_(std::move(archive_publisher)),
       policy_controller_(new ClientPolicyController()),
       task_queue_(this),
       skip_clearing_original_url_for_testing_(false),
@@ -440,15 +442,11 @@
   if (policy_controller_->IsPersistent(offline_page.client_id.name_space)) {
     // If the user intentionally downloaded the page (aka it belongs to a
     // persistent namespace), move it to a public place.
-    // Note: Moving the archiver instance into the callback so it won't be
-    // deleted.
-    OfflinePageArchiver* raw_archiver = archiver.get();
-    raw_archiver->PublishArchive(
-        offline_page, task_runner_, archive_manager_->GetPublicArchivesDir(),
-        download_manager_.get(),
+    archive_publisher_->PublishArchive(
+        offline_page, task_runner_,
         base::BindOnce(&OfflinePageModelTaskified::PublishArchiveDone,
-                       weak_ptr_factory_.GetWeakPtr(), std::move(archiver),
-                       std::move(callback), OfflineTimeNow()));
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+                       OfflineTimeNow()));
     return;
   }
 
@@ -464,7 +462,6 @@
 }
 
 void OfflinePageModelTaskified::PublishArchiveDone(
-    std::unique_ptr<OfflinePageArchiver> archiver,
     SavePageCallback save_page_callback,
     base::Time publish_start_time,
     const OfflinePageItem& offline_page,
@@ -496,21 +493,15 @@
 
 void OfflinePageModelTaskified::PublishInternalArchive(
     const OfflinePageItem& offline_page,
-    std::unique_ptr<OfflinePageArchiver> archiver,
     PublishPageCallback publish_done_callback) {
-  // Note: the archiver instance must be kept alive until the final callback
-  // coming from it takes place.
-  OfflinePageArchiver* raw_archiver = archiver.get();
-  raw_archiver->PublishArchive(
-      offline_page, task_runner_, archive_manager_->GetPublicArchivesDir(),
-      download_manager_.get(),
+  archive_publisher_->PublishArchive(
+      offline_page, task_runner_,
       base::BindOnce(&OfflinePageModelTaskified::PublishInternalArchiveDone,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(archiver),
+                     weak_ptr_factory_.GetWeakPtr(),
                      std::move(publish_done_callback)));
 }
 
 void OfflinePageModelTaskified::PublishInternalArchiveDone(
-    std::unique_ptr<OfflinePageArchiver> archiver,
     PublishPageCallback publish_done_callback,
     const OfflinePageItem& offline_page,
     PublishArchiveResult publish_results) {
diff --git a/components/offline_pages/core/model/offline_page_model_taskified.h b/components/offline_pages/core/model/offline_page_model_taskified.h
index b7b7395..f064418 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified.h
+++ b/components/offline_pages/core/model/offline_page_model_taskified.h
@@ -39,6 +39,7 @@
 
 class ArchiveManager;
 class ClientPolicyController;
+class OfflinePageArchivePublisher;
 class OfflinePageArchiver;
 class OfflinePageMetadataStore;
 class SystemDownloadManager;
@@ -66,6 +67,7 @@
       std::unique_ptr<OfflinePageMetadataStore> store,
       std::unique_ptr<ArchiveManager> archive_manager,
       std::unique_ptr<SystemDownloadManager> download_manager,
+      std::unique_ptr<OfflinePageArchivePublisher> archive_publisher,
       const scoped_refptr<base::SequencedTaskRunner>& task_runner);
   ~OfflinePageModelTaskified() override;
 
@@ -109,7 +111,6 @@
   OfflineEventLogger* GetLogger() override;
   void PublishInternalArchive(
       const OfflinePageItem& offline_page,
-      std::unique_ptr<OfflinePageArchiver> archiver,
       PublishPageCallback publish_done_callback) override;
 
   // Methods for testing only:
@@ -122,7 +123,6 @@
   }
 
  private:
-  // TODO(romax): https://crbug.com/791115, remove the friend class usage.
   friend class OfflinePageModelTaskifiedTest;
 
   // Callbacks for saving pages.
@@ -175,15 +175,13 @@
       const std::vector<int64_t>& pages_deleted);
 
   // Callback for when PublishArchive has completd.
-  void PublishArchiveDone(std::unique_ptr<OfflinePageArchiver> archiver,
-                          SavePageCallback save_page_callback,
+  void PublishArchiveDone(SavePageCallback save_page_callback,
                           base::Time publish_start_time,
                           const OfflinePageItem& offline_page,
                           PublishArchiveResult publish_results);
 
   // Callback for when publishing an internal archive has completed.
-  void PublishInternalArchiveDone(std::unique_ptr<OfflinePageArchiver> archiver,
-                                  PublishPageCallback publish_done_callback,
+  void PublishInternalArchiveDone(PublishPageCallback publish_done_callback,
                                   const OfflinePageItem& offline_page,
                                   PublishArchiveResult publish_results);
 
@@ -205,6 +203,9 @@
   // Manages interaction with the OS download manager, if present.
   std::unique_ptr<SystemDownloadManager> download_manager_;
 
+  // Used for moving archives into public storage.
+  std::unique_ptr<OfflinePageArchivePublisher> archive_publisher_;
+
   // Controller of the client policies.
   std::unique_ptr<ClientPolicyController> policy_controller_;
 
diff --git a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
index bd22bcc0..c799d59 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
+++ b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
@@ -30,6 +30,7 @@
 #include "components/offline_pages/core/offline_page_metadata_store.h"
 #include "components/offline_pages/core/offline_page_metadata_store_test_util.h"
 #include "components/offline_pages/core/offline_page_model.h"
+#include "components/offline_pages/core/offline_page_test_archive_publisher.h"
 #include "components/offline_pages/core/offline_page_test_archiver.h"
 #include "components/offline_pages/core/offline_page_types.h"
 #include "components/offline_pages/core/offline_store_utils.h"
@@ -140,6 +141,11 @@
                                                          ArchiverResult result);
   void CheckTaskQueueIdle();
 
+  void SetArchivePublisher(
+      std::unique_ptr<OfflinePageArchivePublisher> publisher) {
+    model()->archive_publisher_ = std::move(publisher);
+  }
+
   // Getters for private fields.
   base::TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); }
   base::Clock* clock() { return task_runner_->GetMockClock(); }
@@ -149,6 +155,7 @@
     return &store_test_util_;
   }
 
+  ArchiveManager* archive_manager() { return archive_manager_; }
   StubSystemDownloadManager* download_manager_stub() {
     return download_manager_stub_;
   }
@@ -182,6 +189,7 @@
   std::unique_ptr<OfflinePageModelTaskified> model_;
   OfflinePageMetadataStoreTestUtil store_test_util_;
   StubSystemDownloadManager* download_manager_stub_;
+  ArchiveManager* archive_manager_;
   OfflinePageItemGenerator generator_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
   base::ScopedTempDir temporary_dir_;
@@ -245,15 +253,21 @@
 void OfflinePageModelTaskifiedTest::BuildModel() {
   ASSERT_TRUE(store_test_util_.store());
   // Keep a copy of the system download manager stub to test against.
-  download_manager_stub_ = new StubSystemDownloadManager(kDownloadId, true);
   auto archive_manager = std::make_unique<ArchiveManager>(
       temporary_dir_path(), private_archive_dir_path(),
       public_archive_dir_path(), base::ThreadTaskRunnerHandle::Get());
-  std::unique_ptr<SystemDownloadManager> download_manager(
-      download_manager_stub_);
+  archive_manager_ = archive_manager.get();
+  auto download_manager =
+      std::make_unique<StubSystemDownloadManager>(kDownloadId, true);
+  download_manager_stub_ = download_manager.get();
+
+  auto publisher = std::make_unique<OfflinePageTestArchivePublisher>(
+      archive_manager.get(), download_manager.get());
+
   model_ = std::make_unique<OfflinePageModelTaskified>(
       store_test_util()->ReleaseStore(), std::move(archive_manager),
-      std::move(download_manager), base::ThreadTaskRunnerHandle::Get());
+      std::move(download_manager), std::move(publisher),
+      base::ThreadTaskRunnerHandle::Get());
   model_->AddObserver(this);
   histogram_tester_ = std::make_unique<base::HistogramTester>();
   ResetResults();
@@ -304,6 +318,7 @@
   save_page_params.original_url = original_url;
   save_page_params.request_origin = request_origin;
   save_page_params.is_background = false;
+
   model()->SavePage(save_page_params, std::move(archiver), nullptr,
                     std::move(callback));
   PumpLoop();
@@ -363,6 +378,7 @@
 // Tests saving successfully a non-user-requested offline page.
 TEST_F(OfflinePageModelTaskifiedTest, SavePageSuccessful) {
   auto archiver = BuildArchiver(kTestUrl, ArchiverResult::SUCCESSFULLY_CREATED);
+
   int64_t offline_id = SavePageWithExpectedResult(
       kTestUrl, kTestClientId1, kTestUrl2, kEmptyRequestOrigin,
       std::move(archiver), SavePageResult::SUCCESS);
@@ -464,6 +480,7 @@
 
 TEST_F(OfflinePageModelTaskifiedTest, SavePageSuccessfulWithRequestOrigin) {
   auto archiver = BuildArchiver(kTestUrl, ArchiverResult::SUCCESSFULLY_CREATED);
+
   int64_t offline_id = SavePageWithExpectedResult(
       kTestUrl, kTestClientId1, kTestUrl2, kTestRequestOrigin,
       std::move(archiver), SavePageResult::SUCCESS);
@@ -1151,7 +1168,14 @@
   // Save a persistent page that will report failure to be copied to a public
   // dir.
   auto archiver = BuildArchiver(kTestUrl, ArchiverResult::SUCCESSFULLY_CREATED);
-  archiver->set_archive_attempt_failure(true);
+
+  // Expect that PublishArchive is called and force returning FILE_MOVE_FAILED.
+  auto publisher = std::make_unique<OfflinePageTestArchivePublisher>(
+      archive_manager(), download_manager_stub());
+  publisher->expect_publish_archive_called(true);
+  publisher->set_archive_attempt_failure(true);
+  SetArchivePublisher(std::move(publisher));
+
   SavePageWithFileMoveFailure(kTestUrl, kTestUserRequestedClientId, GURL(),
                               kEmptyRequestOrigin, std::move(archiver));
 
@@ -1185,17 +1209,11 @@
   // a public downloads directory.
   EXPECT_TRUE(public_archive_dir_path().IsParent(persistent_page->file_path));
 
-  // Make another archiver, since SavePageWithExpectedResult deleted the first
-  // one.
-  test_archiver =
-      BuildArchiver(kTestUrl2, ArchiverResult::SUCCESSFULLY_CREATED);
-
   // Publish the page from our internal store.
   base::MockCallback<PublishPageCallback> callback;
   EXPECT_CALL(callback, Run(A<const base::FilePath&>(), A<SavePageResult>()));
 
-  model()->PublishInternalArchive(*persistent_page, std::move(test_archiver),
-                                  callback.Get());
+  model()->PublishInternalArchive(*persistent_page, callback.Get());
   PumpLoop();
 }
 
diff --git a/components/offline_pages/core/offline_page_archive_publisher.cc b/components/offline_pages/core/offline_page_archive_publisher.cc
new file mode 100644
index 0000000..7a3a900
--- /dev/null
+++ b/components/offline_pages/core/offline_page_archive_publisher.cc
@@ -0,0 +1,122 @@
+// 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 "components/offline_pages/core/offline_page_archive_publisher.h"
+
+#include <errno.h>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/files/file_util.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/sequenced_task_runner.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/task_runner_util.h"
+#include "components/offline_pages/core/archive_manager.h"
+#include "components/offline_pages/core/model/offline_page_model_utils.h"
+#include "components/offline_pages/core/offline_store_utils.h"
+#include "components/offline_pages/core/system_download_manager.h"
+
+namespace offline_pages {
+
+namespace {
+
+const char* kMoveFileFailureReason =
+    "OfflinePages.PublishArchive.MoveFileFailureReason";
+const int kSourceMissing = 0;
+const int kDestinationMissing = 1;
+
+using offline_pages::SavePageResult;
+
+// Helper function to do the move and register synchronously. Make sure this is
+// called from a background thread.
+PublishArchiveResult MoveAndRegisterArchive(
+    const offline_pages::OfflinePageItem& offline_page,
+    const base::FilePath& publish_directory,
+    offline_pages::SystemDownloadManager* download_manager) {
+  PublishArchiveResult archive_result;
+  // Calculate the new file name.
+  base::FilePath new_file_path =
+      offline_pages::model_utils::GenerateUniqueFilenameForOfflinePage(
+          offline_page.title, offline_page.url, publish_directory);
+
+  // Create the destination directory if it does not already exist.
+  if (!publish_directory.empty() && !base::DirectoryExists(publish_directory)) {
+    base::File::Error file_error;
+    if (!base::CreateDirectoryAndGetError(publish_directory, &file_error)) {
+      UMA_HISTOGRAM_ENUMERATION(
+          "OfflinePages.PublishArchive.CreateDirectoryError", -file_error,
+          -base::File::Error::FILE_ERROR_MAX);
+    }
+  }
+
+  // Move the file.
+  bool moved = base::Move(offline_page.file_path, new_file_path);
+  if (!moved) {
+    archive_result.move_result = SavePageResult::FILE_MOVE_FAILED;
+    DVPLOG(0) << "OfflinePage publishing file move failure " << __func__;
+    base::UmaHistogramSparse("OfflinePages.PublishArchive.MoveFileError",
+                             errno);
+
+    if (!base::PathExists(offline_page.file_path)) {
+      DVLOG(0) << "Can't copy from non-existent path, from "
+               << offline_page.file_path << " " << __func__;
+      base::UmaHistogramBoolean(kMoveFileFailureReason, kSourceMissing);
+    }
+    if (!base::PathExists(publish_directory)) {
+      DVLOG(0) << "Target directory does not exist, " << publish_directory
+               << " " << __func__;
+      base::UmaHistogramBoolean(kMoveFileFailureReason, kDestinationMissing);
+    }
+    return archive_result;
+  }
+
+  // Tell the download manager about our file, get back an id.
+  if (!download_manager->IsDownloadManagerInstalled()) {
+    archive_result.move_result = SavePageResult::ADD_TO_DOWNLOAD_MANAGER_FAILED;
+    return archive_result;
+  }
+
+  // TODO(petewil): Handle empty page title.
+  std::string page_title = base::UTF16ToUTF8(offline_page.title);
+  // We use the title for a description, since the add to the download manager
+  // fails without a description, and we don't have anything better to use.
+  int64_t download_id = download_manager->AddCompletedDownload(
+      page_title, page_title,
+      offline_pages::store_utils::ToDatabaseFilePath(new_file_path),
+      offline_page.file_size, offline_page.url.spec(), std::string());
+  if (download_id == 0LL) {
+    archive_result.move_result = SavePageResult::ADD_TO_DOWNLOAD_MANAGER_FAILED;
+    return archive_result;
+  }
+
+  // Put results into the result object.
+  archive_result.move_result = SavePageResult::SUCCESS;
+  archive_result.new_file_path = new_file_path;
+  archive_result.download_id = download_id;
+
+  return archive_result;
+}
+
+}  // namespace
+
+OfflinePageArchivePublisher::OfflinePageArchivePublisher(
+    ArchiveManager* archive_manager,
+    SystemDownloadManager* download_manager)
+    : archive_manager_(archive_manager), download_manager_(download_manager) {}
+
+void OfflinePageArchivePublisher::PublishArchive(
+    const OfflinePageItem& offline_page,
+    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
+    PublishArchiveDoneCallback publish_done_callback) const {
+  base::PostTaskAndReplyWithResult(
+      background_task_runner.get(), FROM_HERE,
+      base::BindOnce(&MoveAndRegisterArchive, offline_page,
+                     archive_manager_->GetPublicArchivesDir(),
+                     download_manager_),
+      base::BindOnce(std::move(publish_done_callback), offline_page));
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_archive_publisher.h b/components/offline_pages/core/offline_page_archive_publisher.h
new file mode 100644
index 0000000..76c31fd1
--- /dev/null
+++ b/components/offline_pages/core/offline_page_archive_publisher.h
@@ -0,0 +1,62 @@
+// 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.
+
+#ifndef COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_ARCHIVE_PUBLISHER_H_
+#define COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_ARCHIVE_PUBLISHER_H_
+
+#include <cstdint>
+#include <string>
+
+#include "base/callback.h"
+#include "base/files/file_path.h"
+#include "base/strings/string16.h"
+#include "components/offline_pages/core/offline_page_item.h"
+#include "components/offline_pages/core/offline_page_types.h"
+
+namespace base {
+class SequencedTaskRunner;
+}  // namespace base
+
+namespace offline_pages {
+
+class ArchiveManager;
+class SystemDownloadManager;
+
+// The result of publishing an offline page to Downloads.
+struct PublishArchiveResult {
+  SavePageResult move_result;
+  base::FilePath new_file_path;
+  int64_t download_id;
+};
+
+// Interface of a class responsible for publishing offline page archives to
+// downloads.
+class OfflinePageArchivePublisher {
+ public:
+  using PublishArchiveDoneCallback =
+      base::OnceCallback<void(const OfflinePageItem& /* offline_page */,
+                              PublishArchiveResult /* archive_result */)>;
+
+  OfflinePageArchivePublisher(ArchiveManager* archive_manager,
+                              SystemDownloadManager* download_manager);
+  virtual ~OfflinePageArchivePublisher() {}
+
+  // Publishes the page on a background thread, then returns to the
+  // OfflinePageModelTaskified's done callback.
+  //
+  // A default implementation publishing the file via SystemDownloadManager is
+  // provided but embedders may implement it themselves.
+  virtual void PublishArchive(
+      const OfflinePageItem& offline_page,
+      const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
+      PublishArchiveDoneCallback publish_done_callback) const;
+
+ protected:
+  ArchiveManager* archive_manager_;
+  SystemDownloadManager* download_manager_;
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_ARCHIVE_PUBLISHER_H_
diff --git a/components/offline_pages/core/offline_page_archiver_unittest.cc b/components/offline_pages/core/offline_page_archive_publisher_unittest.cc
similarity index 74%
rename from components/offline_pages/core/offline_page_archiver_unittest.cc
rename to components/offline_pages/core/offline_page_archive_publisher_unittest.cc
index d9b00d9..3b20141 100644
--- a/components/offline_pages/core/offline_page_archiver_unittest.cc
+++ b/components/offline_pages/core/offline_page_archive_publisher_unittest.cc
@@ -1,8 +1,8 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// 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 "components/offline_pages/core/offline_page_archiver.h"
+#include "components/offline_pages/core/offline_page_archive_publisher.h"
 
 #include "base/bind.h"
 #include "base/files/file_path.h"
@@ -12,6 +12,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "components/offline_pages/core/archive_manager.h"
 #include "components/offline_pages/core/model/offline_page_item_generator.h"
 #include "components/offline_pages/core/stub_system_download_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -22,23 +23,15 @@
 
 namespace offline_pages {
 
-class TestOfflinePageArchiver : public OfflinePageArchiver {
- public:
-  void CreateArchive(const base::FilePath& archives_dir,
-                     const CreateArchiveParams& create_archive_params,
-                     content::WebContents* web_contents,
-                     CreateArchiveCallback callback) override {}
-};
-
-class OfflinePageArchiverTest
+class OfflinePageArchivePublisherTest
     : public testing::Test,
-      public base::SupportsWeakPtr<OfflinePageArchiverTest> {
+      public base::SupportsWeakPtr<OfflinePageArchivePublisherTest> {
  public:
-  OfflinePageArchiverTest()
+  OfflinePageArchivePublisherTest()
       : task_runner_(new base::TestSimpleTaskRunner),
         task_runner_handle_(task_runner_),
         weak_ptr_factory_(this) {}
-  ~OfflinePageArchiverTest() override {}
+  ~OfflinePageArchivePublisherTest() override {}
 
   SavePageCallback save_page_callback;
 
@@ -62,7 +55,7 @@
   scoped_refptr<base::SequencedTaskRunner> task_runner() {
     return task_runner_;
   }
-  base::WeakPtr<OfflinePageArchiverTest> get_weak_ptr() {
+  base::WeakPtr<OfflinePageArchivePublisherTest> get_weak_ptr() {
     return weak_ptr_factory_.GetWeakPtr();
   }
 
@@ -78,41 +71,46 @@
   PublishArchiveResult publish_archive_result_;
   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
   base::ThreadTaskRunnerHandle task_runner_handle_;
-  base::WeakPtrFactory<OfflinePageArchiverTest> weak_ptr_factory_;
+  base::WeakPtrFactory<OfflinePageArchivePublisherTest> weak_ptr_factory_;
 };
 
-void OfflinePageArchiverTest::SetUp() {
+void OfflinePageArchivePublisherTest::SetUp() {
   ASSERT_TRUE(temporary_dir_.CreateUniqueTempDir());
   ASSERT_TRUE(private_archive_dir_.CreateUniqueTempDir());
   ASSERT_TRUE(public_archive_dir_.CreateUniqueTempDir());
 }
 
-void OfflinePageArchiverTest::PublishArchiveDone(
+void OfflinePageArchivePublisherTest::PublishArchiveDone(
     SavePageCallback save_page_callback,
     const OfflinePageItem& offline_page,
     PublishArchiveResult archive_result) {
   publish_archive_result_ = archive_result;
 }
 
-void OfflinePageArchiverTest::PumpLoop() {
+void OfflinePageArchivePublisherTest::PumpLoop() {
   task_runner_->RunUntilIdle();
 }
 
-TEST_F(OfflinePageArchiverTest, PublishArchive) {
-  TestOfflinePageArchiver archiver;
+TEST_F(OfflinePageArchivePublisherTest, PublishArchive) {
+  auto archive_manager = std::make_unique<ArchiveManager>(
+      temporary_dir_path(), private_archive_dir_path(),
+      public_archive_dir_path(), task_runner());
+  auto download_manager =
+      std::make_unique<StubSystemDownloadManager>(kDownloadId, true);
+
+  OfflinePageArchivePublisher archiver(archive_manager.get(),
+                                       download_manager.get());
+
   // Put an offline page into the private dir, adjust the FilePath.
   page_generator()->SetArchiveDirectory(temporary_dir_path());
   OfflinePageItem offline_page = page_generator()->CreateItemWithTempFile();
   base::FilePath old_file_path = offline_page.file_path;
   base::FilePath new_file_path =
       public_archive_dir_path().Append(offline_page.file_path.BaseName());
-  std::unique_ptr<SystemDownloadManager> download_manager(
-      new StubSystemDownloadManager(kDownloadId, true));
 
   archiver.PublishArchive(
       offline_page, base::ThreadTaskRunnerHandle::Get(),
-      public_archive_dir_path(), download_manager.get(),
-      base::BindOnce(&OfflinePageArchiverTest::PublishArchiveDone,
+      base::BindOnce(&OfflinePageArchivePublisherTest::PublishArchiveDone,
                      get_weak_ptr(), std::move(save_page_callback)));
   PumpLoop();
 
diff --git a/components/offline_pages/core/offline_page_archiver.cc b/components/offline_pages/core/offline_page_archiver.cc
index f2159ce2..26bdd32 100644
--- a/components/offline_pages/core/offline_page_archiver.cc
+++ b/components/offline_pages/core/offline_page_archiver.cc
@@ -4,122 +4,10 @@
 
 #include "components/offline_pages/core/offline_page_archiver.h"
 
-#include <errno.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/sequenced_task_runner.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task_runner_util.h"
-#include "components/offline_pages/core/model/offline_page_model_taskified.h"
-#include "components/offline_pages/core/model/offline_page_model_utils.h"
-#include "components/offline_pages/core/offline_store_utils.h"
-#include "components/offline_pages/core/system_download_manager.h"
-
 namespace offline_pages {
 
-namespace {
-
-const char* kMoveFileFailureReason =
-    "OfflinePages.PublishArchive.MoveFileFailureReason";
-const int kSourceMissing = 0;
-const int kDestinationMissing = 1;
-
-using offline_pages::SavePageResult;
-
-// Helper function to do the move and register synchronously. Make sure this is
-// called from a background thread.
-PublishArchiveResult MoveAndRegisterArchive(
-    const offline_pages::OfflinePageItem& offline_page,
-    const base::FilePath& publish_directory,
-    offline_pages::SystemDownloadManager* download_manager) {
-  PublishArchiveResult archive_result;
-  // Calculate the new file name.
-  base::FilePath new_file_path =
-      offline_pages::model_utils::GenerateUniqueFilenameForOfflinePage(
-          offline_page.title, offline_page.url, publish_directory);
-
-  // Create the destination directory if it does not already exist.
-  if (!publish_directory.empty() && !base::DirectoryExists(publish_directory)) {
-    base::File::Error file_error;
-    if (!base::CreateDirectoryAndGetError(publish_directory, &file_error)) {
-      UMA_HISTOGRAM_ENUMERATION(
-          "OfflinePages.PublishArchive.CreateDirectoryError", -file_error,
-          -base::File::Error::FILE_ERROR_MAX);
-    }
-  }
-
-  // Move the file.
-  bool moved = base::Move(offline_page.file_path, new_file_path);
-  if (!moved) {
-    archive_result.move_result = SavePageResult::FILE_MOVE_FAILED;
-    DVPLOG(0) << "OfflinePage publishing file move failure " << __func__;
-    base::UmaHistogramSparse("OfflinePages.PublishArchive.MoveFileError",
-                             errno);
-
-    if (!base::PathExists(offline_page.file_path)) {
-      DVLOG(0) << "Can't copy from non-existent path, from "
-               << offline_page.file_path << " " << __func__;
-      base::UmaHistogramBoolean(kMoveFileFailureReason, kSourceMissing);
-    }
-    if (!base::PathExists(publish_directory)) {
-      DVLOG(0) << "Target directory does not exist, " << publish_directory
-               << " " << __func__;
-      base::UmaHistogramBoolean(kMoveFileFailureReason, kDestinationMissing);
-    }
-    return archive_result;
-  }
-
-  // Tell the download manager about our file, get back an id.
-  if (!download_manager->IsDownloadManagerInstalled()) {
-    archive_result.move_result = SavePageResult::ADD_TO_DOWNLOAD_MANAGER_FAILED;
-    return archive_result;
-  }
-
-  // TODO(petewil): Handle empty page title.
-  std::string page_title = base::UTF16ToUTF8(offline_page.title);
-  // We use the title for a description, since the add to the download manager
-  // fails without a description, and we don't have anything better to use.
-  int64_t download_id = download_manager->AddCompletedDownload(
-      page_title, page_title,
-      offline_pages::store_utils::ToDatabaseFilePath(new_file_path),
-      offline_page.file_size, offline_page.url.spec(), std::string());
-  if (download_id == 0LL) {
-    archive_result.move_result = SavePageResult::ADD_TO_DOWNLOAD_MANAGER_FAILED;
-    return archive_result;
-  }
-
-  // Put results into the result object.
-  archive_result.move_result = SavePageResult::SUCCESS;
-  archive_result.new_file_path = new_file_path;
-  archive_result.download_id = download_id;
-
-  return archive_result;
-}
-
-}  // namespace
-
 OfflinePageArchiver::CreateArchiveParams::CreateArchiveParams(
     const std::string& name_space)
     : name_space(name_space) {}
 
-void OfflinePageArchiver::PublishArchive(
-    const OfflinePageItem& offline_page,
-    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
-    const base::FilePath& publish_directory,
-    SystemDownloadManager* download_manager,
-    PublishArchiveDoneCallback publish_done_callback) {
-  // Note: once the |publish_done_callback| is invoked it is very likely that
-  // this instance will be destroyed. So all parameters sent to it must not be
-  // bound to the lifetime on this.
-  base::PostTaskAndReplyWithResult(
-      background_task_runner.get(), FROM_HERE,
-      base::BindOnce(&MoveAndRegisterArchive, offline_page, publish_directory,
-                     download_manager),
-      base::BindOnce(std::move(publish_done_callback), offline_page));
-}
-
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_archiver.h b/components/offline_pages/core/offline_page_archiver.h
index 13b2502..4f5e7b2 100644
--- a/components/offline_pages/core/offline_page_archiver.h
+++ b/components/offline_pages/core/offline_page_archiver.h
@@ -15,26 +15,12 @@
 #include "components/offline_pages/core/offline_page_types.h"
 #include "url/gurl.h"
 
-namespace base {
-class SequencedTaskRunner;
-}  // namespace base
-
 namespace content {
 class WebContents;
 }  // namespace content
 
 namespace offline_pages {
 
-class SystemDownloadManager;
-
-// The results of attempting to move the offline page to a public directory, and
-// registering it with the system download manager.
-struct PublishArchiveResult {
-  SavePageResult move_result;
-  base::FilePath new_file_path;
-  int64_t download_id;
-};
-
 // Interface of a class responsible for creation of the archive for offline use.
 //
 // Archiver will be implemented by embedder and may have additional methods that
@@ -99,10 +85,6 @@
                               int64_t /* file_size */,
                               const std::string& /* digest */)>;
 
-  using PublishArchiveDoneCallback =
-      base::OnceCallback<void(const OfflinePageItem& /* offline_page */,
-                              PublishArchiveResult /* archive_result */)>;
-
   virtual ~OfflinePageArchiver() {}
 
   // Starts creating the archive in the |archives_dir| per
@@ -113,17 +95,6 @@
                              content::WebContents* web_contents,
                              CreateArchiveCallback callback) = 0;
 
-  // Publishes the page on a background thread, then returns to the
-  // OfflinePageModelTaskified's done callback.
-  //
-  // TODO(https://crbug.com/849424): move the publish logic out of the archiver
-  // as it doesn't depend on the embedder code as creation logic does.
-  virtual void PublishArchive(
-      const OfflinePageItem& offline_page,
-      const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
-      const base::FilePath& publish_directory,
-      SystemDownloadManager* download_manager,
-      PublishArchiveDoneCallback publish_done_callback);
 };
 
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_model.h b/components/offline_pages/core/offline_page_model.h
index f3c7acb..8a1f1d87 100644
--- a/components/offline_pages/core/offline_page_model.h
+++ b/components/offline_pages/core/offline_page_model.h
@@ -16,6 +16,7 @@
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/offline_pages/core/client_policy_controller.h"
 #include "components/offline_pages/core/offline_event_logger.h"
+#include "components/offline_pages/core/offline_page_archive_publisher.h"
 #include "components/offline_pages/core/offline_page_archiver.h"
 #include "components/offline_pages/core/offline_page_types.h"
 #include "components/offline_pages/core/offline_page_visuals.h"
@@ -188,7 +189,6 @@
   // take ownership of OfflinePageArchiver.
   virtual void PublishInternalArchive(
       const OfflinePageItem& offline_page,
-      std::unique_ptr<OfflinePageArchiver> archiver,
       PublishPageCallback publish_done_callback) = 0;
 
   // Returns the policy controller.
diff --git a/components/offline_pages/core/offline_page_test_archive_publisher.cc b/components/offline_pages/core/offline_page_test_archive_publisher.cc
new file mode 100644
index 0000000..54b884a
--- /dev/null
+++ b/components/offline_pages/core/offline_page_test_archive_publisher.cc
@@ -0,0 +1,65 @@
+// 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 "components/offline_pages/core/offline_page_test_archive_publisher.h"
+
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/files/file_util.h"
+#include "base/location.h"
+#include "base/single_thread_task_runner.h"
+#include "components/offline_pages/core/archive_manager.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace offline_pages {
+
+OfflinePageTestArchivePublisher::OfflinePageTestArchivePublisher(
+    ArchiveManager* archive_manager,
+    SystemDownloadManager* download_manager)
+    : OfflinePageArchivePublisher(archive_manager, download_manager),
+      expect_publish_archive_called_(false),
+      publish_archive_called_(false),
+      archive_attempt_failure_(false),
+      use_verbatim_archive_path_(false) {}
+
+OfflinePageTestArchivePublisher::~OfflinePageTestArchivePublisher() {
+  if (expect_publish_archive_called_)
+    EXPECT_TRUE(publish_archive_called_);
+}
+
+void OfflinePageTestArchivePublisher::PublishArchive(
+    const OfflinePageItem& offline_page,
+    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
+    PublishArchiveDoneCallback publish_done_callback) const {
+  publish_archive_called_ = true;
+  PublishArchiveResult publish_archive_result;
+
+  if (archive_attempt_failure_) {
+    publish_archive_result.move_result = SavePageResult::FILE_MOVE_FAILED;
+  } else {
+    publish_archive_result.move_result = SavePageResult::SUCCESS;
+
+    // TODO(iwells): use_verbatim_archive_path is meant to accommodate
+    // offline_page_request_handler_unittest.cc whose tests fail when the
+    // published archive path is built using publish_directory. The tests should
+    // be fixed and this special case should be removed.
+    if (use_verbatim_archive_path_) {
+      publish_archive_result.new_file_path = offline_page.file_path;
+    } else {
+      publish_archive_result.new_file_path =
+          archive_manager_->GetPublicArchivesDir().Append(
+              offline_page.file_path.BaseName());
+    }
+    publish_archive_result.download_id = 0;
+  }
+
+  background_task_runner->PostTask(
+      FROM_HERE, base::BindOnce(std::move(publish_done_callback), offline_page,
+                                std::move(publish_archive_result)));
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_test_archive_publisher.h b/components/offline_pages/core/offline_page_test_archive_publisher.h
new file mode 100644
index 0000000..9a8eb75
--- /dev/null
+++ b/components/offline_pages/core/offline_page_test_archive_publisher.h
@@ -0,0 +1,57 @@
+// 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.
+
+#ifndef COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_TEST_ARCHIVE_PUBLISHER_H_
+#define COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_TEST_ARCHIVE_PUBLISHER_H_
+
+#include <cstdint>
+#include <string>
+
+#include "base/callback.h"
+#include "base/files/file_path.h"
+#include "base/strings/string16.h"
+#include "components/offline_pages/core/offline_page_archive_publisher.h"
+#include "components/offline_pages/core/offline_page_item.h"
+#include "components/offline_pages/core/offline_page_types.h"
+
+namespace base {
+class SequencedTaskRunner;
+}  // namespace base
+
+namespace offline_pages {
+
+class ArchiveManager;
+class SystemDownloadManager;
+
+class OfflinePageTestArchivePublisher : public OfflinePageArchivePublisher {
+ public:
+  OfflinePageTestArchivePublisher(ArchiveManager* archive_manager,
+                                  SystemDownloadManager* download_manager);
+  ~OfflinePageTestArchivePublisher() override;
+
+  void PublishArchive(
+      const OfflinePageItem& offline_page,
+      const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
+      PublishArchiveDoneCallback publish_done_callback) const override;
+
+  void set_archive_attempt_failure(bool fail) {
+    archive_attempt_failure_ = fail;
+  }
+
+  void expect_publish_archive_called(bool expect) {
+    expect_publish_archive_called_ = expect;
+  }
+
+  void use_verbatim_archive_path(bool use) { use_verbatim_archive_path_ = use; }
+
+ private:
+  bool expect_publish_archive_called_;
+  mutable bool publish_archive_called_;
+  bool archive_attempt_failure_;
+  bool use_verbatim_archive_path_;
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_TEST_ARCHIVE_PUBLISHER_H_
diff --git a/components/offline_pages/core/offline_page_test_archiver.cc b/components/offline_pages/core/offline_page_test_archiver.cc
index 4071dda..a8be976a 100644
--- a/components/offline_pages/core/offline_page_test_archiver.cc
+++ b/components/offline_pages/core/offline_page_test_archiver.cc
@@ -28,17 +28,16 @@
       create_archive_params_(std::string()),
       result_(result),
       size_to_report_(size_to_report),
+      expect_create_archive_called_(false),
       create_archive_called_(false),
-      publish_archive_called_(false),
-      archive_attempt_failure_(false),
       delayed_(false),
       result_title_(result_title),
       digest_to_report_(digest_to_report),
       task_runner_(task_runner) {}
 
 OfflinePageTestArchiver::~OfflinePageTestArchiver() {
-  EXPECT_TRUE(create_archive_called_ || publish_archive_called_ ||
-              archive_attempt_failure_);
+  if (expect_create_archive_called_)
+    EXPECT_TRUE(create_archive_called_);
 }
 
 void OfflinePageTestArchiver::CreateArchive(
@@ -54,44 +53,23 @@
     CompleteCreateArchive();
 }
 
-void OfflinePageTestArchiver::PublishArchive(
-    const OfflinePageItem& offline_page,
-    const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
-    const base::FilePath& new_file_path,
-    SystemDownloadManager* download_manager,
-    PublishArchiveDoneCallback publish_done_callback) {
-  publish_archive_called_ = true;
-  PublishArchiveResult publish_archive_result;
-
-  if (archive_attempt_failure_) {
-    publish_archive_result.move_result = SavePageResult::FILE_MOVE_FAILED;
-  } else {
-    publish_archive_result.move_result = SavePageResult::SUCCESS;
-    publish_archive_result.new_file_path =
-        new_file_path.Append(offline_page.file_path.BaseName());
-    publish_archive_result.download_id = 0;
-  }
-
-  // Note: once the |publish_done_callback| is invoked it is very likely that
-  // this instance will be destroyed. So all parameters sent to it must not be
-  // bound to the lifetime on this.
-  background_task_runner->PostTask(
-      FROM_HERE, base::BindOnce(std::move(publish_done_callback), offline_page,
-                                std::move(publish_archive_result)));
-}
-
 void OfflinePageTestArchiver::CompleteCreateArchive() {
   DCHECK(!callback_.is_null());
   base::FilePath archive_path;
+
   if (filename_.empty()) {
     ASSERT_TRUE(base::CreateTemporaryFileInDir(archives_dir_, &archive_path));
+  } else if (filename_.IsAbsolute()) {
+    archive_path = filename_;
   } else {
     archive_path = archives_dir_.Append(filename_);
     // This step ensures the file is created and closed immediately.
     base::File file(archive_path, base::File::FLAG_OPEN_ALWAYS);
   }
+
   if (observer_)
     observer_->SetLastPathCreatedByArchiver(archive_path);
+
   task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(std::move(callback_), result_, url_, archive_path,
diff --git a/components/offline_pages/core/offline_page_test_archiver.h b/components/offline_pages/core/offline_page_test_archiver.h
index ce7a30e..e572c7f 100644
--- a/components/offline_pages/core/offline_page_test_archiver.h
+++ b/components/offline_pages/core/offline_page_test_archiver.h
@@ -50,17 +50,15 @@
                      content::WebContents* web_contents,
                      CreateArchiveCallback callback) override;
 
-  void PublishArchive(
-      const OfflinePageItem& offline_page,
-      const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
-      const base::FilePath& publish_directory,
-      SystemDownloadManager* download_manager,
-      PublishArchiveDoneCallback publish_done_callback) override;
-
   // Completes the creation of archive. Should be used with |set_delayed| set to
   // true.
   void CompleteCreateArchive();
 
+  // Set whether to check create_archive_called_ on destruction.
+  void ExpectCreateArchiveCalled(bool expect) {
+    expect_create_archive_called_ = expect;
+  }
+
   // When set to true, |CompleteCreateArchive| should be called explicitly for
   // the process to finish.
   // TODO(fgorski): See if we can move this to the constructor.
@@ -76,10 +74,6 @@
 
   bool create_archive_called() const { return create_archive_called_; }
 
-  void set_archive_attempt_failure(bool fail) {
-    archive_attempt_failure_ = fail;
-  }
-
  private:
   // Not owned. Outlives OfflinePageTestArchiver.
   Observer* observer_;
@@ -89,9 +83,8 @@
   base::FilePath filename_;
   ArchiverResult result_;
   int64_t size_to_report_;
+  bool expect_create_archive_called_;
   bool create_archive_called_;
-  bool publish_archive_called_;
-  bool archive_attempt_failure_;
   bool delayed_;
   base::string16 result_title_;
   std::string digest_to_report_;
diff --git a/components/offline_pages/core/stub_offline_page_model.cc b/components/offline_pages/core/stub_offline_page_model.cc
index 7afa440..b90e2ca01e 100644
--- a/components/offline_pages/core/stub_offline_page_model.cc
+++ b/components/offline_pages/core/stub_offline_page_model.cc
@@ -54,7 +54,6 @@
     base::OnceCallback<void(VisualsAvailability)> callback) {}
 void StubOfflinePageModel::PublishInternalArchive(
     const OfflinePageItem& offline_page,
-    std::unique_ptr<OfflinePageArchiver> archiver,
     PublishPageCallback publish_done_callback) {}
 const base::FilePath& StubOfflinePageModel::GetInternalArchiveDirectory(
     const std::string& name_space) const {
diff --git a/components/offline_pages/core/stub_offline_page_model.h b/components/offline_pages/core/stub_offline_page_model.h
index 95285f4..e076671f 100644
--- a/components/offline_pages/core/stub_offline_page_model.h
+++ b/components/offline_pages/core/stub_offline_page_model.h
@@ -53,7 +53,6 @@
       base::OnceCallback<void(VisualsAvailability)> callback) override;
   void PublishInternalArchive(
       const OfflinePageItem& offline_page,
-      std::unique_ptr<OfflinePageArchiver> archiver,
       PublishPageCallback publish_done_callback) override;
   const base::FilePath& GetInternalArchiveDirectory(
       const std::string& name_space) const override;
diff --git a/components/payments/content/android/BUILD.gn b/components/payments/content/android/BUILD.gn
index fad769a..ee1aa95 100644
--- a/components/payments/content/android/BUILD.gn
+++ b/components/payments/content/android/BUILD.gn
@@ -69,3 +69,11 @@
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
   ]
 }
+
+java_cpp_strings("error_strings_generated_srcjar") {
+  sources = [
+    "//components/payments/core/error_strings.cc",
+  ]
+
+  template = "java_templates/ErrorStrings.java.tmpl"
+}
diff --git a/components/payments/content/android/java_templates/ErrorStrings.java.tmpl b/components/payments/content/android/java_templates/ErrorStrings.java.tmpl
new file mode 100644
index 0000000..8f76d23
--- /dev/null
+++ b/components/payments/content/android/java_templates/ErrorStrings.java.tmpl
@@ -0,0 +1,31 @@
+// 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.
+
+// This file is autogenerated by
+//   //components/payments/content/android/BUILD.gn
+
+package org.chromium.components.payments;
+
+/** Error message strings. */
+public abstract class ErrorStrings {{
+
+{NATIVE_STRINGS}
+
+    // The following error strings are used only on Android.
+
+    public static final String WEB_PAYMENT_API_DISABLED = "Web Payments API is disabled.";
+
+    public static final String INVALID_PAYMENT_METHODS_OR_DATA = "Invalid payment methods or data.";
+
+    public static final String INVALID_PAYMENT_DETAILS = "Invalid payment details.";
+
+    public static final String INVALID_VALIDATION_ERRORS = "Invalid payment validation errors.";
+
+    public static final String TAB_OVERVIEW_MODE = "Tab overview mode dismissed UI.";
+
+    public static final String ACTIVITY_NOT_FOUND = "Unable to find Chrome activity.";
+
+    // Prevent instantiation.
+    private ErrorStrings() {{}}
+}}
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 529145c..b460c509 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -4,12 +4,14 @@
 
 #include "components/payments/content/payment_request.h"
 
+#include <algorithm>
 #include <string>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/stl_util.h"
+#include "base/strings/string_util.h"
 #include "components/payments/content/can_make_payment_query_factory.h"
 #include "components/payments/content/content_payment_request_delegate.h"
 #include "components/payments/content/payment_details_converter.h"
@@ -46,6 +48,27 @@
          method_name == kAndroidPayMethodName;
 }
 
+std::string GetNotSupportedErrorMessage(PaymentRequestSpec* spec) {
+  if (!spec || spec->payment_method_identifiers_set().empty())
+    return errors::kGenericPaymentMethodNotSupportedMessage;
+
+  std::vector<std::string> method_names(
+      spec->payment_method_identifiers_set().size());
+  std::transform(
+      spec->payment_method_identifiers_set().begin(),
+      spec->payment_method_identifiers_set().end(), method_names.begin(),
+      [](const std::string& method_name) { return "\"" + method_name + "\""; });
+
+  std::string output;
+  bool replaced = base::ReplaceChars(
+      method_names.size() == 1
+          ? errors::kSinglePaymentMethodNotSupportedFormat
+          : errors::kMultiplePaymentMethodsNotSupportedFormat,
+      "$", base::JoinString(method_names, ", "), &output);
+  DCHECK(replaced);
+  return output;
+}
+
 }  // namespace
 
 PaymentRequest::PaymentRequest(
@@ -191,7 +214,8 @@
     has_recorded_completion_ = true;
     journey_logger_.SetNotShown(
         JourneyLogger::NOT_SHOWN_REASON_CONCURRENT_REQUESTS);
-    client_->OnError(mojom::PaymentErrorReason::ALREADY_SHOWING);
+    client_->OnError(mojom::PaymentErrorReason::ALREADY_SHOWING,
+                     errors::kAnotherUiShowing);
     OnConnectionTerminated();
     return;
   }
@@ -201,7 +225,8 @@
     DCHECK(!has_recorded_completion_);
     has_recorded_completion_ = true;
     journey_logger_.SetNotShown(JourneyLogger::NOT_SHOWN_REASON_OTHER);
-    client_->OnError(mojom::PaymentErrorReason::USER_CANCEL);
+    client_->OnError(mojom::PaymentErrorReason::USER_CANCEL,
+                     errors::kCannotShowInBackgroundTab);
     OnConnectionTerminated();
     return;
   }
@@ -245,7 +270,7 @@
   if (!PaymentsValidators::IsValidPaymentValidationErrorsFormat(errors,
                                                                 &error)) {
     log_.Error(error);
-    client_->OnError(mojom::PaymentErrorReason::USER_CANCEL);
+    client_->OnError(mojom::PaymentErrorReason::USER_CANCEL, error);
     OnConnectionTerminated();
     return;
   }
@@ -458,7 +483,8 @@
     has_recorded_completion_ = true;
     journey_logger_.SetNotShown(
         JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD);
-    client_->OnError(mojom::PaymentErrorReason::NOT_SUPPORTED);
+    client_->OnError(mojom::PaymentErrorReason::NOT_SUPPORTED,
+                     GetNotSupportedErrorMessage(spec_.get()));
     if (observer_for_testing_)
       observer_for_testing_->OnNotSupportedError();
     OnConnectionTerminated();
@@ -573,7 +599,8 @@
   RecordFirstAbortReason(JourneyLogger::ABORT_REASON_ABORTED_BY_USER);
 
   // This sends an error to the renderer, which informs the API user.
-  client_->OnError(mojom::PaymentErrorReason::USER_CANCEL);
+  client_->OnError(mojom::PaymentErrorReason::USER_CANCEL,
+                   errors::kUserCancelled);
 
   // We close all bindings and ask to be destroyed.
   client_.reset();
diff --git a/components/payments/core/error_strings.cc b/components/payments/core/error_strings.cc
index db2da9a..78c30dff9 100644
--- a/components/payments/core/error_strings.cc
+++ b/components/payments/core/error_strings.cc
@@ -8,42 +8,37 @@
 namespace errors {
 
 // Please keep the list alphabetized.
+// Each string must be on a single line to correctly generate ErrorStrings.java.
 
-const char kAnotherUiShowing[] = "A PaymentRequest UI is already showing.";
+const char kAnotherUiShowing[] = "Another PaymentRequest UI is already showing in a different tab or window.";
 const char kAttemptedInitializationTwice[] = "Attempted initialization twice.";
-const char kCannotAbortWithoutInit[] =
-    "Attempted abort without initialization.";
+const char kCannotAbortWithoutInit[] = "Attempted abort without initialization.";
 const char kCannotAbortWithoutShow[] = "Attempted abort without show.";
-const char kCannotCallCanMakePaymentWithoutInit[] =
-    "Attempted canMakePayment without initialization.";
-const char kCannotCallHasEnrolledInstrumentWithoutInit[] =
-    "Attempted hasEnrolledInstrument without initialization.";
-const char kCannotCompleteWithoutInit[] =
-    "Attempted complete without initialization.";
+const char kCannotCallCanMakePaymentWithoutInit[] = "Attempted canMakePayment without initialization.";
+const char kCannotCallHasEnrolledInstrumentWithoutInit[] = "Attempted hasEnrolledInstrument without initialization.";
+const char kCannotCompleteWithoutInit[] = "Attempted complete without initialization.";
 const char kCannotCompleteWithoutShow[] = "Attempted complete without show.";
-const char kCannotRetryWithoutInit[] =
-    "Attempted retry without initialization.";
+const char kCannotRetryWithoutInit[] = "Attempted retry without initialization.";
 const char kCannotRetryWithoutShow[] = "Attempted retry without show.";
-const char kCannotShowInBackgroundTab[] =
-    "Cannot show PaymentRequest UI in a background tab.";
+const char kCannotShowInBackgroundTab[] = "Cannot show PaymentRequest UI in a background tab.";
 const char kCannotShowTwice[] = "Attempted show twice.";
 const char kCannotShowWithoutInit[] = "Attempted show without initialization.";
-const char kCannotUpdateWithoutInit[] =
-    "Attempted updateWith without initialization.";
+const char kCannotUpdateWithoutInit[] = "Attempted updateWith without initialization.";
 const char kCannotUpdateWithoutShow[] = "Attempted updateWith without show.";
+const char kGenericPaymentMethodNotSupportedMessage[] = "Payment method not supported.";
 const char kInvalidSslCertificate[] = "SSL certificate is not valid.";
 const char kInvalidState[] = "Invalid state.";
 const char kMethodDataRequired[] = "Method data required.";
 const char kMethodNameRequired[] = "Method name required.";
+const char kMultiplePaymentMethodsNotSupportedFormat[] = "The payment methods $ are not supported.";
 const char kNotInASecureOrigin[] = "Not in a secure origin.";
 const char kNotInitialized[] = "Not initialized.";
 const char kNotShown[] = "Not shown.";
-const char kProhibitedOrigin[] =
-    "Only localhost, file://, and cryptographic scheme origins allowed.";
-const char kProhibitedOriginOrInvalidSslExplanation[] =
-    "No UI will be shown. CanMakePayment and hasEnrolledInstrument will always "
-    "return false. Show will be rejected with NotSupportedError.";
+const char kProhibitedOrigin[] = "Only localhost, file://, and cryptographic scheme origins allowed.";
+const char kProhibitedOriginOrInvalidSslExplanation[] = "No UI will be shown. CanMakePayment and hasEnrolledInstrument will always return false. Show will be rejected with NotSupportedError.";
+const char kSinglePaymentMethodNotSupportedFormat[] = "The payment method $ is not supported.";
 const char kTotalRequired[] = "Total required.";
+const char kUserCancelled[] = "User closed the Payment Request UI.";
 
 }  // namespace errors
 }  // namespace payments
diff --git a/components/payments/core/error_strings.h b/components/payments/core/error_strings.h
index 01d75a83..a343153 100644
--- a/components/payments/core/error_strings.h
+++ b/components/payments/core/error_strings.h
@@ -58,6 +58,9 @@
 // Mojo call PaymentRequest::Show() must precede PaymentRequest::UpdateWith().
 extern const char kCannotUpdateWithoutShow[];
 
+// A message about unsupported payment method.
+extern const char kGenericPaymentMethodNotSupportedMessage[];
+
 // Chrome refuses to provide any payment information to a website with an
 // invalid SSL certificate.
 extern const char kInvalidSslCertificate[];
@@ -72,6 +75,11 @@
 // Used when non-empty "supportedMethods": "" is required, but not provided.
 extern const char kMethodNameRequired[];
 
+// The format for the message about multiple payment methods that are not
+// supported. This format should be used with base::ReplaceChars() function,
+// where "$" is the character to replace.
+extern const char kMultiplePaymentMethodsNotSupportedFormat[];
+
 // The PaymentRequest API is available only on secure origins.
 extern const char kNotInASecureOrigin[];
 
@@ -88,10 +96,18 @@
 // or kInvalidSslCertificate error.
 extern const char kProhibitedOriginOrInvalidSslExplanation[];
 
+// The format for the message about a single payment method that is not
+// supported. This format should be used with base::ReplaceChars() function,
+// where "$" is the character to replace.
+extern const char kSinglePaymentMethodNotSupportedFormat[];
+
 // Used when "total": {"label": "Total", "amount": {"currency": "USD", "value":
 // "0.01"}} is required, bot not provided.
 extern const char kTotalRequired[];
 
+// Used when user dismissed the Payment Request dialog.
+extern const char kUserCancelled[];
+
 }  // namespace errors
 }  // namespace payments
 
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 40436fd..7d966d4 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -432,12 +432,6 @@
 
       መመሪያው <ph name="PRODUCT_OS_NAME" /> የአገልግሎት ውሉን ሊያወርድበት ወደሚችል ዩአርኤል ነው መዋቀር ያለበት። የአገልግሎት ውሉ እንደ MIME አይነት ጽሑፍ/ግልጽ በቀረበ ስነጣ አልባ ጽሑፍ ነው መሆን ያለበት። ምንም ለውጥ ያዢ አይፈቀድም።</translation>
 <translation id="1750315445671978749">ሁሉንም ውርዶች አግድ</translation>
-<translation id="1762072363876276024">
-      ይህ መመሪያ በመግቢያ ገጹ ላይ ይተገበራል። እባክዎ እንዲሁም በተጠቃሚ ክፍለ-ጊዜው ላይ የሚተገበረውን የ<ph name="SITE_PER_PROCESS_POLICY_NAME" /> መመሪያ ይመልከቱ። ሁለቱንም መመሪያዎች ወደ ተመሳስዩ እሴት እእንዲዋቀሩ ይመከራል። መመሪያዎቹ የማይዛመዱ ከሆኑ በተጠቃሚ የተገለጸ እሴት ተተግብሮ ሳለ ወደ የተጠቃሚ ክፍለ-ጊዜ መግባት መዘግየት ሊያስከትል ይችላል።
-      ይህ ቅንብር DeviceLoginScreenSitePerProcess ተጠቃሚዎች ከሁሉም ጣቢያዎች የማግለል ባህሪ መርጠው እንዳይወጡ ሊከለክላቸው ይችላል። የDeviceLoginScreenIsolateOrigins መመሪያው እንዲሁም ተጨማሪ ይበልጥ የተጣሩ ምንጮችን ለማግለል ጠቃሚ ሊሆን ይችላል።
-      መመሪያው ከነቃ ተጠቃሚዎች እያንዳንዱ ጣቢያ በራሱ ሂደት ውስጥ ከሚያሄድበት ነባሪው ባህሪ መርጠው መውጣት አይችሉም።
-      መመሪያው ካልተዋቀረ ወይም ከተሰናከለ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል (ለምሳሌ፦ በ chrome://flags ውስጥ «የጣቢያ ማግለልን አሰናክል» ግቤትን መጠቀም)።
-      </translation>
 <translation id="1767673020408652620">የመተግበሪያ የሚመከርን የፍለጋ ሳጥን ዜሮ ሁኔታ አንቃ</translation>
 <translation id="17719159826324007">
       ይህ መመሪያ ወደ ArcSession ሲዋቀር Android ጀምሮ ከሆነ ተጠቃሚው ዘግቶ ሲወጣ መሣሪያው ዳግም እንዲነሳ ያስገድደዋል።
@@ -3660,22 +3654,6 @@
 
           ማስታወሻ፦ በ<ph name="CHARGE_START_TIME_FIELD_NAME" /> እና <ph name="CHARGE_END_TIME_FIELD_NAME" /> ውስጥ ለ<ph name="MINUTE_FIELD_NAME" /> መስክ የሚፈቀዱት እሴቶች 0፣ 15፣ 30፣ 45 ናቸው።</translation>
 <translation id="7717938661004793600">የ<ph name="PRODUCT_OS_NAME" /> ተደራሽነት ባህሪያትን ያዋቅራል።</translation>
-<translation id="7724994675283793633">ይህ መመሪያ ከ80 ሌላ በሆኑ ወደቦች ላይ ለኤችቲቲፒ፣ እና ከ443 ሌላ በሆኑ ወደቦች ላይ ለኤችቲቲፒኤስ HTTP/0.9ን ያነቃል።
-
-      ይህ መመሪያ በነባሪነት ይሰናከላል፣ እና ከነቃ ተጠቃሚዎችን ለደህንነት አደጋ https://crbug.com/600352 ያጋልጣል።
-
-      ይህ መመሪያ ድርጅቶች ነባር አገልጋዮችን ከHTTP/0.9 ወደ ሌላ የማዛወር እድል ለመስጠት የታሰበ ነው፣ እና ለወደፊቱ ይወገዳል።
-
-      ይህ መመሪያ ካልተዋቀረ HTTP/0.9 ነባሪ ባልሆኑ ወደቦች ላይ ይሰናከላል።</translation>
-<translation id="7726421241038987229">
-      ይህ ቅንብር SitePerProcess ተጠቃሚዎች ከነባሪው የሁሉም ጣቢያዎች ይየማግለያ ባህሪ መርጠው እንዳይወጡ ለመከልከል ስራ ላይ ሊውል ይችላል። የIsolateOrigins መመሪያው እእንዲሁም ተጨማሪ ይበልጥ የተጣሩ ምንጮችን ለማግለል ጠቃሚ ሊሆን እንደሚችል ልብ ይበሉ።
-      መመሪያው ከነቃ ተጠቃሚዎች እያንዳንዱ ጣቢያ በራሱ ሂደት ውስጥ ከሚያሄድበት ነባሪው ባህሪ መርጠው መውጣት አይችሉም።
-      መመሪያው ካልተዋቀረ ወይም ከተሰናከለ ተጠቃሚው ከጣቢያ ማግለል መርጦ መውጣት ይችላል
-      (ለምሳሌ፦ በchrome://flags ውስጥ «የጣቢያ ማግለልን አሰናክል» ግቤትን መጠቀም)።  መመሪያውን ወደ ተሰናክሏል ማዋቀር እና/ወይም መመሪያውን እንዳልተዋቀረ መተው የጣቢያ ማግለልን አያጠፋውም።
-      <ph name="PRODUCT_OS_NAME" /> ላይ የ<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> መሣሪያ መመሪያውን እንዲሁም ወደ ተመሳሳዩ እሴት እንዲዋቀር ይመከራል። በሁለቱ መመሪያዎች የተገለጹት እሴቶች የማይዛመዱ ከሆኑ በተጠቃሚ የተገለጸ እሴት እየተተገበረ ሳለ ወደ የተጠቃሚ ክፍለ-ጊዜ ሲገቡ መዘግየት ሊኖር ይችላል።
-
-      ማስታወሻ፦ ይህ መመሪያ በAndroid ላይ አይተገበርም። በAndroid ላይ SitePerProcessን ለማንቃት የSitePerProcessAndroid መመሪያ ቅንብሩን ይጠቀሙ።
-      </translation>
 <translation id="7747447585227954402">መሣሪያዎች <ph name="PLUGIN_VM_NAME" />ን በ <ph name="PRODUCT_OS_NAME" /> ላይ እንዲጠቀሙ ፍቀድ</translation>
 <translation id="7749402620209366169">ለሩቅ መዳረሻ አስተናጋጆች በተጠቃሚ ከተገለጸ ፒን ይልቅ ባለሁለት ደረጃ ማረጋገጥን ያነቃል።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index e23963b..4644656 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -446,12 +446,6 @@
 
       يجب تعيين السياسة على عنوان URL يمكن من خلاله أن ينزّل <ph name="PRODUCT_OS_NAME" /> بنود الخدمة. يجب أن تكون بنود الخدمة بنص عادي، وأن يتم عرضها بخط عادي أو كنص من النوع MIME. ولا يُسمح بإجراء أي ترميز.</translation>
 <translation id="1750315445671978749">حظر جميع التنزيلات</translation>
-<translation id="1762072363876276024">‏
-      تسري هذه السياسة على شاشة تسجيل الدخول. يُرجى الاطِّلاع أيضًا على سياسة <ph name="SITE_PER_PROCESS_POLICY_NAME" /> التي تنطبق على جلسة المستخدم. ويُنصح بضبط كلا السياستين على القيمة نفسها. وفي حال عدم تطابق القيم، قد يحدث تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدَّدة في سياسة المستخدم.
-      يمكن استخدام هذا الإعداد، DeviceLoginScreenSitePerProcess، لعدم السماح للمستخدمين بإيقاف السلوك التلقائي لعزل جميع مواقع الويب. تجدر الإشارة إلى أن سياسة DeviceLoginScreenIsolateOrigins قد تكون مفيدة أيضًا من أجل عزل المزيد من الأصول بدقة.
-      في حال تفعيل هذه السياسة، لن يتمكَّن المستخدمون من إيقاف السلوك التلقائي حيث يتم تشغيل كل موقع ويب على حدة.
-      في حال عدم ضبط هذه السياسة أو إيقافها، سيتمكَّن المستخدمون من تغيير هذا الإعداد (مثلاً، استخدام إدخال "إيقاف ميزة عزل الموقع" في chrome://flags).
-      </translation>
 <translation id="1767673020408652620">تعمل هذه السياسة على تفعيل اقتراح التطبيقات في "الحالة الصفرية" لمربّع البحث.</translation>
 <translation id="17719159826324007">‏
       عند ضبط هذه السياسة على ArcSession، فإنها تفرض إعادة تشغيل الجهاز عند تسجيل خروج المستخدم في حال بدء Android.
@@ -3563,22 +3557,6 @@
 
           ملاحظة: القيم المسموح بها للحقل <ph name="MINUTE_FIELD_NAME" /> في <ph name="CHARGE_START_TIME_FIELD_NAME" /> و<ph name="CHARGE_END_TIME_FIELD_NAME" /> هي 0 و15 و30 و45.</translation>
 <translation id="7717938661004793600">تهيئة ميزات إمكانية الدخول إلى <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">‏تمكِّن هذه السياسة HTTP / 0.9 في المنافذ الأخرى بخلاف المنفذ 80 لـ HTTP والمنفذ 443 لـ HTTPS.
-
-      يتم إيقاف هذه السياسة بشكل تلقائي، وإذا تم تمكينها، فسوف تدع المستخدمين معرّضين لمشكلة الأمان https://crbug.com/600352.
-
-      الهدف من هذه السياسة هو إعطاء المؤسسات فرصةً لترحيل الخوادم الحالية خارج HTTP / 0.9، وسوف تتم إزالتها في المستقبل.
-
-      إذا لم يتم تعيين هذه السياسة، فسيتم إيقاف HTTP / 0.9 في المنافذ غير التلقائية.</translation>
-<translation id="7726421241038987229">‏
-      يمكن استخدام هذا الإعداد، SitePerProcess، لعدم السماح للمستخدمين بإيقاف السلوك التلقائي لعزل جميع مواقع الويب. تجدر الإشارة إلى أن سياسة IsolateOrigins قد تكون مفيدة أيضًا من أجل عزل المزيد من الأصول بدقة.
-      في حال تفعيل هذه السياسة، لن يتمكَّن المستخدمون من إيقاف السلوك التلقائي حيث يتم تشغيل كل موقع ويب على حدة.
-      في حال عدم ضبط هذه السياسة أو إيقافها، سيتمكَّن المستخدمون من إيقاف ميزة عزل الموقع
-      (مثلاً، استخدام إدخال "إيقاف ميزة عزل الموقع" في chrome://flags).  لا يؤدي ضبط السياسة على إيقاف و/أو عدم ضبط السياسة إلى إيقاف ميزة عزل الموقع.
-      في <ph name="PRODUCT_OS_NAME" />، يُنصح بضبط سياسة الجهاز <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> على القيمة نفسها. وفي حال عدم تطابق القيم المُحدَّدة للسياستين، سيؤدي ذلك إلى تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدَّدة من خلال سياسة المستخدم.
-
-      ملاحظة: لا تسري هذه السياسة على نظام التشغيل Android. لتفعيل سياسة SitePerProcess على نظام التشغيل Android، يمكنك استخدام إعداد سياسة SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">السماح للأجهزة باستخدام <ph name="PLUGIN_VM_NAME" /> على <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">لتفعيل المصادقة الثنائية لعمليات استضافة الدخول عن بُعد بدلاً من رقم التعريف الشخصي الذي يحدده المستخدم.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 610797f..47c7c68 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -427,12 +427,6 @@
 
 За него трябва да се посочи URL адрес, от който <ph name="PRODUCT_OS_NAME" /> може да изтегли Общите условия. Те трябва да бъдат с неформатиран текст, показван като тип MIME „text/plain“. Не е разрешено маркиране.</translation>
 <translation id="1750315445671978749">Блокиране на всички изтегляния</translation>
-<translation id="1762072363876276024">
-      Това правило се отнася за екрана за вход. Моля, вижте и правилото <ph name="SITE_PER_PROCESS_POLICY_NAME" />, което се прилага на ниво потребителска сесия. Препоръчително е да зададете една и съща стойност и за двете правила. В противен случай прилагането на стойността от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия.
-      Настройката DeviceLoginScreenSitePerProcess служи за отнемане на възможността на потребителите да се отказват от стандартното поведение, при което се изолират всички сайтове. Обърнете внимание, че правилото DeviceLoginScreenIsolateOrigins може също да е полезно за изолирането на допълнителни, по-конкретно дефинирани източници.
-      Ако правилото е активирано, потребителите няма да могат да се отказват от стандартното поведение, при което всеки сайт се изпълнява в собствен процес.
-      В случай че правилото не е конфигурирано или е деактивирано, потребителите ще имат възможност да променят тази настройка (напр. посредством записа „Деактивиране на изолирането на сайтове“ в chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Активиране на препоръките за приложения при нулево състояние на полето за търсене</translation>
 <translation id="17719159826324007">
       Когато за това правило е зададено ArcSession, устройството ще се рестартира принудително, след като потребител излезе от профила си, ако операционната система Android е стартирана.
@@ -3569,22 +3563,6 @@
 
 Забележка: Допустимите стойности за полето <ph name="MINUTE_FIELD_NAME" /> в <ph name="CHARGE_START_TIME_FIELD_NAME" /> и <ph name="CHARGE_END_TIME_FIELD_NAME" /> са 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Конфигурирайте функциите на <ph name="PRODUCT_OS_NAME" /> за достъпност.</translation>
-<translation id="7724994675283793633">Това правило активира HTTP/0.9 на портове, различни от 80 за HTTP и 443 за HTTPS.
-
-      По подразбиране правилото е деактивирано. Ако бъде активирано, потребителите стават уязвими за проблема в сигурността https://crbug.com/600352.
-
-      Правилото има за цел да даде на фирмите възможност да мигрират съществуващите сървъри към по-нова версия на HTTP и ще бъде премахнато в бъдеще.
-
-      Ако правилото не е зададено, HTTP/0.9 ще бъде деактивиран през нестандартни портове.</translation>
-<translation id="7726421241038987229">
-      Настройката SitePerProcess служи за отнемане на възможността на потребителите да се отказват от стандартното поведение, при което се изолират всички сайтове. Обърнете внимание, че правилото IsolateOrigins може също да е полезно за изолирането на допълнителни, по-конкретно дефинирани източници.
-      Ако правилото е активирано, потребителите няма да могат да се отказват от стандартното поведение, при което всеки сайт се изпълнява в собствен процес.
-      В случай че правилото не е конфигурирано или е деактивирано, потребителите ще имат възможност да се отказват от изолирането на сайтове
-(напр. посредством записа „Деактивиране на изолирането на сайтове“ в chrome://flags).  При деактивиране и/или незадаване на правилото изолирането на сайтове не се изключва.
-      Под <ph name="PRODUCT_OS_NAME" /> е препоръчително да се зададе същата стойност и за правилото за устройства <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Ако стойностите на двете правила не са идентични, прилагането на тази от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия.
-
-      ЗАБЕЛЕЖКА: Това правило не се прилага за Android. За да активирате SitePerProcess под Android, използвайте настройката SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Разрешаване на устройствата да използват <ph name="PLUGIN_VM_NAME" /> под <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Активира за хостовете за отдалечен достъп двуфакторното удостоверяване вместо посочен от потребителя ПИН код.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 7efe49c..9ad3526 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -446,12 +446,6 @@
 
       নীতিটি একটি URL-এ সেট করা উচিত যেখান থেকে <ph name="PRODUCT_OS_NAME" /> পরিষেবার শর্ত ডাউনলোড করতে পারবে৷ পরিষেবার শর্তটিকে অবশ্যই সাধারণ টেক্সট হতে হবে, যা MIME ধরনের টেক্সট/ সাধারণ হিসাবে পরিবেশিত৷ কোনও মার্কআপ অনুমোদিত নয়৷</translation>
 <translation id="1750315445671978749">সমস্ত ডাউনলোড ব্লক করুন</translation>
-<translation id="1762072363876276024">
-      এই নীতি সাইন-ইন স্ক্রিনের ক্ষেত্রে প্রযোজ্য হয়। ব্যবহারকারীর সেশনের ক্ষেত্রে প্রযোজ্য <ph name="SITE_PER_PROCESS_POLICY_NAME" /> নীতিও দেখে নিতে ভুলবেন না। উভয় নীতিকেই একই মানে সেট করার জন্য সাজেস্ট করা হয়। মানগুলি না মিললে, 'ব্যবহারকারী' নীতিতে উল্লেখ করা মান প্রয়োগ করা হচ্ছে বলে ব্যবহারকারীর সেশন শুরু হওয়ার সময় কিছুটা বিলম্ব হতে পারে।
-      সব সাইট আইসোলেট করার ডিফল্ট আচরণ থেকে ব্যবহারকারীদের বেরিয়ে আসা বন্ধ করতে DeviceLoginScreenSitePerProcess সেটিং ব্যবহার করা যেতে পারে। মনে রাখবেন যে DeviceLoginScreenIsolateOrigins নীতি আরও সূক্ষ্ম ও অতিরিক্ত উৎসকে আইসোলেট করার জন্যও উপযোগী হতে পারে।
-      এই নীতি চালু করা থাকলে, প্রতিটি সাইটের নিজস্ব প্রসেস চালানোর ডিফল্ট আচরণ থেকে ব্যবহারকারীদের বেরিয়ে আসার কোনও সুযোগ থাকে না।
-      এই নীতি কনফিগার করা না থাকলে বা বন্ধ করা থাকলে, ব্যবহারকারী এই সেটিং (যেমন, chrome://flags-এ "সাইট আইসোলেশন বন্ধ করুন" এন্ট্রি ব্যবহার করে) পরিবর্তন করতে পারেন।
-      </translation>
 <translation id="1767673020408652620">সার্চ বক্সের জিরো স্টেটে অ্যাপের সাজেশন চালু করা</translation>
 <translation id="17719159826324007">
       এই নীতি ArcSession-এ সেট করা থাকলে এবং Android চালু হয়ে গেলে, ব্যবহারকারী সাইন-আউট করার পরে ডিভাইসকে রিবুট করতে বাধ্য করে।
@@ -3684,22 +3678,6 @@
 
           দ্রষ্টব্য: <ph name="CHARGE_START_TIME_FIELD_NAME" /> ও <ph name="CHARGE_END_TIME_FIELD_NAME" />-এ <ph name="MINUTE_FIELD_NAME" /> ফিল্ডের মান হিসেবে ০, ১৫, ৩০, ৪৫ লেখা যাবে।</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" />-এর ব্যবহারযোগ্যতার বৈশিষ্ট্যগুলিকে কনফিগার করে৷</translation>
-<translation id="7724994675283793633">এই নীতিটি HTTP এর জন্য ৮০ এবং HTTPS এর জন্য ৪৪৩ ছাড়া অন্য পোর্টগুলিতে HTTP/0.9 চালু করে।
-
-      এই নীতিটি ডিফল্টরূপে বন্ধ করা থাকে এবং চালু করা হলে ব্যবহারকারীকে https://crbug.com/600352-এ বর্ণনা করা নিরাপত্তা সমস্যার মুখোমুখি হওয়ার সম্ভাবনা সৃষ্টি করে।
-
-      এই নীতিটি এন্টারপ্রাইজগুলিকে HTTP/0.9 থেকে বিদ্যমান সার্ভারগুলিকে স্থানান্তর করার একটি সুযোগ দেওয়ার উদ্দেশ্যে করা হয়েছে এবং ভবিষ্যতে এটি সরানো হবে।
-
-      এই নীতিটি সেট না করা হলে, ডিফল্ট নয় এমন পোর্টগুলিতে HTTP/0.9 বন্ধ করা হবে।</translation>
-<translation id="7726421241038987229">
-      সব সাইট আইসোলেট করার ডিফল্ট আচরণ থেকে ব্যবহারকারীদের বেরিয়ে আসা বন্ধ করতে SitePerProcess সেটিং ব্যবহার করা যেতে পারে। মনে রাখবেন যে IsolateOrigins নীতি আরও সূক্ষ্ম ও অতিরিক্ত উৎসকে আইসোলেট করার জন্যও উপযোগী হতে পারে।
-      এই নীতি চালু করা থাকলে, প্রতিটি সাইটের নিজস্ব প্রসেস চালানোর ডিফল্ট আচরণ থেকে ব্যবহারকারীদের বেরিয়ে আসার কোনও সুযোগ থাকে না।
-      এই নীতি কনফিগার করা না থাকলে বা বন্ধ করা থাকলে, ব্যবহারকারী সাইট আইসোলেশন
-      (যেমন, chrome://flags-এ "সাইট আইসোলেশন বন্ধ করুন" এন্ট্রি ব্যবহার করে) থেকে বেরিয়ে আসতে পারেন।  নীতিটি বন্ধ হিসেবে সেট করা থাকলে এবং/অথবা কনফিগার করা না থাকলে, সাইট আইসোলেশন বন্ধ হয়ে যায় না।
-      <ph name="PRODUCT_OS_NAME" />-এ, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ডিভাইস নীতিও একই মানে সেট করার জন্য সাজেস্ট করা হয়। দুটি নীতিতে উল্লেখ করা মান না মিললে, 'ব্যবহারকারী' নীতিতে উল্লেখ করা মান প্রয়োগ করা হচ্ছে বলে ব্যবহারকারীর সেশন শুরু হওয়ার সময় কিছুটা বিলম্ব হতে পারে।
-
-      দ্রষ্টব্য: Android-এ এই নীতি প্রযোজ্য হয় না। Android-এ SitePerProcess চালু করতে, SitePerProcessAndroid নীতির সেটিং ব্যবহার করুন।
-      </translation>
 <translation id="7747447585227954402">ডিভাইসকে <ph name="PRODUCT_OS_NAME" />-এ একটি <ph name="PLUGIN_VM_NAME" /> ব্যবহার করার অনুমতি দিন</translation>
 <translation id="7749402620209366169">ব্যবহারকারী-নির্দিষ্ট পিনের পরিবর্তে রিমোট অ্যাক্সেস হোস্টের জন্য টু-ফ্যাক্টর যাচাইকরণ চালু করে৷
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index da8635c..d731009 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -386,12 +386,6 @@
 
       La política s'ha de definir en un URL del qual <ph name="PRODUCT_OS_NAME" /> pugui baixar els Termes i condicions, que han de trobar-se com a text sense format proporcionat com a text/sense format de tipus MIME. No es permet l'etiquetatge.</translation>
 <translation id="1750315445671978749">Bloqueja totes les baixades</translation>
-<translation id="1762072363876276024">
-      Aquesta política s'aplica a la pantalla d'inici de sessió. Consulta també la política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que s'aplica a la sessió de l'usuari. Es recomana que les dues polítiques tinguin el mateix valor. Si els valors no coincideixen, es pot produir un retard en entrar en una sessió d'usuari mentre s'apliqui el valor especificat per la política de l'usuari.
-      Aquesta configuració, DeviceLoginScreenSitePerProcess, es pot utilitzar per impedir que els usuaris desactivin el comportament predeterminat de l'aïllament de tots els llocs web. Tingues en compte que la política DeviceLoginScreenIsolateOrigins també pot ser útil per aïllar altres orígens amb més precisió.
-      Si la política s'activa, els usuaris no podran desactivar el comportament predeterminat quan cada lloc web s'executi en el seu propi procés.
-      Si la política no es configura o es desactiva, l'usuari podrà canviar aquesta configuració (per exemple, utilitzant l'entrada "Desactiva l'aïllament de lloc web" a chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Activa les recomanacions d'aplicacions quan el quadre de cerca no mostri cap resultat.</translation>
 <translation id="17719159826324007">
       Si aquesta política s'estableix en ArcSession, obliga el dispositiu a reiniciar-se quan l'usuari tanqui la sessió si Android s'ha iniciat.
@@ -3283,21 +3277,6 @@
 
           Nota: els valors que s'admeten al camp <ph name="MINUTE_FIELD_NAME" /> corresponent a <ph name="CHARGE_START_TIME_FIELD_NAME" /> i a <ph name="CHARGE_END_TIME_FIELD_NAME" /> són 0, 15, 30 i 45.</translation>
 <translation id="7717938661004793600">Permet configurar les funcions d'accessibilitat de <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Aquesta política activa la compatibilitat amb HTTP/0.9 als ports que no són 80 per a HTTP ni 443 per a HTTPS.
-
-      Està desactivada de manera predeterminada i, si s'activa, els usuaris es poden trobar amb el problema de seguretat https://crbug.com/600352.
-
-      Aquesta política està dissenyada perquè les empreses puguin migrar els servidors que ja tenen a HTTP/0.9. Se suprimirà en el futur.
-
-      Si no s'estableix cap valor, es desactivarà la compatibilitat amb HTTP/0.9 en tots els ports no predeterminats.</translation>
-<translation id="7726421241038987229">
-      Aquesta configuració, SitePerProcess, es pot utilitzar per impedir que els usuaris desactivin el comportament predeterminat de l'aïllament de tots els llocs web. Tingues en compte que la política IsolateOrigins també pot ser útil per aïllar altres orígens amb més precisió.
-      Si la política s'activa, els usuaris no podran desactivar el comportament predeterminat quan cada lloc web s'executi en el seu propi procés.
-      Si la política no es configura o es desactiva, l'usuari podrà desactivar l'aïllament de lloc web (per exemple, utilitzant l'entrada "Desactiva l'aïllament de lloc web" a chrome://flags).  Si la política es desactiva o no es configura, l'aïllament de lloc web no es desactivarà.
-      A <ph name="PRODUCT_OS_NAME" />, també es recomana establir la política <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> del dispositiu en el mateix valor. Si els valors especificats per les dues polítiques no coincideixen, es pot produir un retard en entrar en una sessió d'usuari mentre s'apliqui el valor especificat per la política de l'usuari.
-
-      NOTA: aquesta política no s'aplica a Android. Per activar SitePerProcess a Android, fes servir la configuració de la política SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permet que els dispositius utilitzin un connector <ph name="PLUGIN_VM_NAME" /> a <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Activa l'autenticació de dos factors per als amfitrions d'accés remot en lloc d'un PIN especificat per l'usuari.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 6569f26..aa48f30f 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -419,12 +419,6 @@
 
       Jako hodnotu této zásady zadejte adresu URL, ze které může systém <ph name="PRODUCT_OS_NAME" /> smluvní podmínky stáhnout. Smluvní podmínky musejí být uloženy ve formátu prostého textu s typem MIME „text/plain“. Nejsou povoleny žádné značky.</translation>
 <translation id="1750315445671978749">Blokovat veškerá stahování</translation>
-<translation id="1762072363876276024">
-      Tato zásada platí pro přihlašovací obrazovku. Prostudujte si také zásadu <ph name="SITE_PER_PROCESS_POLICY_NAME" />, která platí pro uživatelskou relaci. Obě zásady doporučujeme nastavit na stejnou hodnotu. Pokud se hodnoty neshodují, může při zahajování uživatelské návštěvy dojít ke zpoždění způsobenému používáním hodnoty zadané v zásadě pro uživatele.
-      Pomocí tohoto nastavení (DeviceLoginScreenSitePerProcess) lze uživatelům zakázat změnu výchozího chování, při němž jsou všechny weby izolovány. K izolaci dalších (podrobněji určených) zdrojů může být užitečná také zásada DeviceLoginScreenIsolateOrigins.
-      Pokud je tato zásada aktivovaná, uživatelé se nebudou moci odhlásit z výchozího chování, v němž je každý web spuštěn v samostatném procesu.
-      Pokud tato zásada není nakonfigurovaná nebo je deaktivovaná, uživatel toto nastavení bude moci změnit (např. pomocí možnosti Disable site isolation (Vypnout izolaci webů) na stránce chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Povolit doporučení aplikací ve spouštěči při prázdném vyhledávacím poli</translation>
 <translation id="17719159826324007">
       Když je tato zásada nastavená na hodnotu ArcSession a byl spuštěn systém Android, bude po odhlášení uživatele vynucen restart zařízení.
@@ -3608,21 +3602,6 @@
 
           Poznámka: V poli <ph name="MINUTE_FIELD_NAME" /> v nastaveních <ph name="CHARGE_START_TIME_FIELD_NAME" /> a <ph name="CHARGE_END_TIME_FIELD_NAME" /> jsou povoleny tyto hodnoty: 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfiguruje funkce usnadnění přístupu v systému <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Tato zásada povolí protokol HTTP/0.9 na portech jiných než 80 pro HTTP a 443 pro HTTPS.
-
-      Tato zásada je ve výchozím nastavení vypnuta. Pokud ji zapnete, vystavíte tím uživatele bezpečnostnímu riziku popsanému na stránce https://crbug.com/600352.
-
-      Účelem této zásady je poskytnout organizacím čas k migraci existujících serverů na jiný protokol než HTTP/0.9 a v budoucnu bude odstraněna.
-
-      Pokud tato zásada není nastavena, protokol HTTP/0.9 bude na jiných než výchozích portech zakázán.</translation>
-<translation id="7726421241038987229">
-      Pomocí tohoto nastavení (SitePerProcess) lze uživatelům zakázat změnu výchozího chování, při kterém jsou všechny weby izolovány. K izolaci dalších (podrobněji určených) zdrojů může být užitečná také zásada IsolateOrigins.
-      Pokud je tato zásada aktivovaná, uživatelé nebudou moci změnit výchozí chování, kdy je každý web spuštěn v samostatném procesu.
-      Pokud tato zásada není nakonfigurovaná nebo je deaktivovaná, budou uživatelé moci izolaci webů zakázat (např. pomocí možnosti Disable site isolation (Vypnout izolaci webů) na stránce chrome://flags).  Tím, že tuto zásadu deaktivujete nebo že ji nenakonfigurujete, izolaci webů nevypnete.
-      V systému <ph name="PRODUCT_OS_NAME" /> doporučujeme nastavit na stejnou hodnotu také zásadu zařízení <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Pokud se hodnoty těchto dvou zásad neshodují, při vstupu do uživatelské relace může dojít k prodlevě způsobené používáním hodnoty zadané v zásadě pro uživatele.
-
-      POZNÁMKA: Tato zásada se nevztahuje na systém Android. K aktivaci zásady SitePerProcess v systému Android použijte zásadu SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Povolit zařízení používat v systému <ph name="PRODUCT_OS_NAME" /> plugin <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7749402620209366169">Namísto kódu PIN zadaného uživatelem aktivuje dvoufázové ověření hostitelů vzdáleného přístupu.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index 024151df..fe9f98e 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -433,12 +433,6 @@
 
       Politikken skal indstilles til en webadresse, hvorfra <ph name="PRODUCT_OS_NAME" /> kan downloade servicevilkårene. Servicevilkårene skal være almindelig tekst vist som MIME-tekst. Markering er ikke tilladt.</translation>
 <translation id="1750315445671978749">Bloker alle downloads</translation>
-<translation id="1762072363876276024">
-      Denne politik gælder for loginskærmen. Se også politikken <ph name="SITE_PER_PROCESS_POLICY_NAME" />, der gælder for brugersessionen. Det anbefales at angive samme værdi for begge politikker. Hvis værdierne ikke stemmer overens, kan der opstå en forsinkelse ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes.
-      Denne indstilling, DeviceLoginScreenSitePerProcess, kan bruges til at forhindre brugerne i at fravælge standardadfærden, hvor alle websites isoleres. Bemærk, at politikken DeviceLoginScreenIsolateOrigins også kan bruges til mere finkornet isolering af websites.
-      Hvis politikken er aktiveret, kan brugerne ikke fravælge standardadfærden, hvor hvert website kører i sin egen proces.
-      Hvis politikken ikke er angivet eller er deaktiveret, kan brugeren ændre denne indstilling (f.eks. ved at bruge posten "Deaktiver isolering af website" i chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Aktivér appanbefaling ved nultilstand i søgefeltet</translation>
 <translation id="17719159826324007">
       Hvis politikken er angivet som ArcSession, tvinges enheden til at genstarte, når brugeren logger ud og Android er startet.
@@ -1586,7 +1580,7 @@
 
       Hvis "Aktivér browserlogin" er angivet for politikken, har brugeren tilladelse til at logge ind i browseren, og brugeren logges automatisk ind i browseren, når vedkommende er logget ind i Google-webtjenester såsom Gmail. Når brugeren er logget ind i browseren, gemmes vedkommendes kontooplysninger i browseren. Det betyder dog ikke, at Chrome-synkronisering som standard aktiveres. Brugeren skal selv tilvælge denne funktion. Aktivering af denne politik forhindrer brugeren i at deaktivere den indstilling, der tillader browserlogin. Brug politikken "SyncDisabled" til at styre tilgængeligheden af Chrome-synkronisering.
 
-      Hvis "Kræv browserlogin" er angivet for politikken, får brugeren vist en dialogboks til kontovalg, hvor vedkommende skal vælge og logge ind på en konto for at benytte browseren. Dette sikrer, at politikker, der er knyttet til administrerede konti, anvendes og håndhæves. Denne indstilling aktiverer som standard Chrome-synkronisering for kontoen, undtagen i tilfælde, hvor synkronisering er deaktiveret af domæneadministratoren eller via politikken "SyncDisabled". Standardværdien for BrowserGuestModeEnabled angives som Falsk. Bemærk! Eksisterende profiler, hvor der ikke er logget ind, låses og kan ikke længere anvendes efter aktivering af denne politik. Du kan få flere oplysninger i artiklen i Hjælp: https://support.google.com/chrome/a/answer/7572556.
+      Hvis "Kræv browserlogin" er angivet for politikken, får brugeren vist en dialogboks til kontovalg, hvor vedkommende skal vælge og logge ind på en konto for at benytte browseren. Dette sikrer, at politikker, der er knyttet til mangerstyrede konti, anvendes og håndhæves. Denne indstilling aktiverer som standard Chrome-synkronisering for kontoen, undtagen i tilfælde, hvor synkronisering er deaktiveret af domæneadministratoren eller via politikken "SyncDisabled". Standardværdien for BrowserGuestModeEnabled angives som Falsk. Bemærk! Eksisterende profiler, hvor der ikke er logget ind, låses og kan ikke længere anvendes efter aktivering af denne politik. Du kan få flere oplysninger i artiklen i Hjælp: https://support.google.com/chrome/a/answer/7572556.
 
       Hvis politikken ikke konfigureres, kan brugeren selv bestemme, om muligheden for browserlogin skal aktiveres, og anvende den efter eget behov.</translation>
 <translation id="3911737181201537215">Denne politik påvirker ikke logføring udført af Android.</translation>
@@ -2782,7 +2776,7 @@
 <translation id="6190367314942602985">Rapportér oplysninger om brugeridentifikation</translation>
 <translation id="6197453924249895891">Giver virksomhedsnøgler adgang til udvidelser.
 
-Nøgler er beregnet til virksomhedsbrug, hvis de er genereret ved hjælp af chrome.enterprise.platformKeys API på en administreret konto. Nøgler, der er importeret eller genereret på en anden måde, er ikke beregnet til virksomhedsbrug.
+Nøgler er beregnet til virksomhedsbrug, hvis de er genereret ved hjælp af chrome.enterprise.platformKeys API på en mangerstyret konto. Nøgler, der er importeret eller genereret på en anden måde, er ikke beregnet til virksomhedsbrug.
 
 Adgang til nøgler, der er beregnet til virksomhedsbrug, kontrolleres alene af denne politik. Brugeren kan hverken give udvidelser adgang til virksomhedsnøgler eller fjerne deres adgang.
 
@@ -3588,22 +3582,6 @@
 
           Bemærk! Tilladte værdier for feltet <ph name="MINUTE_FIELD_NAME" /> i <ph name="CHARGE_START_TIME_FIELD_NAME" /> og <ph name="CHARGE_END_TIME_FIELD_NAME" /> er 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfigurer hjælpefunktioner for <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Denne politik aktiverer HTTP/0.9 på andre porte end 80 for HTTP og 443 for HTTPS.
-
-      Denne politik er som standard deaktiveret. Hvis den aktiveres, kan brugerne blive udsat for sikkerhedsproblemet https://crbug.com/600352.
-
-      Denne politik har til formål at give virksomheder mulighed for at migrere eksisterende servere væk fra HTTP/0.9 og vil blive fjernet på et senere tidspunkt.
-
-      Hvis denne politik ikke er angivet, deaktiveres HTTP/0.9 på ikke-standard-porte.</translation>
-<translation id="7726421241038987229">
-      Denne indstilling, SitePerProcess, kan bruges til at forhindre brugerne i at fravælge standardadfærden, hvor alle websites isoleres. Bemærk, at politikken IsolateOrigins også kan bruges til mere finkornet isolering af websites.
-      Hvis politikken er aktiveret, kan brugerne ikke fravælge standardadfærden, hvor hvert website kører i sin egen proces.
-      Hvis politikken ikke er angivet eller er deaktiveret, kan brugeren fravælge isolering af website
-      (f.eks. ved at bruge posten "Deaktiver isolering af website" i chrome://flags).  Isolering af website slås ikke fra, hvis politikken angives som deaktiveret og/eller ikke angives.
-      I <ph name="PRODUCT_OS_NAME" /> anbefales det, at der også angives den samme værdi for enhedspolitikken <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Hvis de to politikker har forskellige værdier, kan der ske forsinkelser ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes.
-
-      BEMÆRK! Denne politik anvendes ikke på Android-enheder. Hvis du vil aktivere SitePerProcess på en Android-enhed, skal du bruge politikindstillingen SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Tillad, at enheder anvender en <ph name="PLUGIN_VM_NAME" /> i <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7749402620209366169">Aktiverer godkendelse med to faktorer for værter med fjernadgang i stedet for en brugerangivet pinkode.
 
@@ -3800,7 +3778,7 @@
           Hvis du angiver denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
           Hvis denne politik ikke angives, vil høj kontrast være deaktiveret, men brugeren kan når som helst slå funktionen til.</translation>
-<translation id="815061180603915310">Hvis denne politik er aktiveret, tvinger den profilen til at skifte til engangsbruger. Hvis denne politik er angivet som en OS-politik (f.eks. GPO i Windows), vil den være gældende for alle profiler i systemet. Hvis politikken er angivet som en cloudpolitik, vil den kun være gældende for en profil, der er logget ind med en administreret konto.
+<translation id="815061180603915310">Hvis denne politik er aktiveret, tvinger den profilen til at skifte til engangsbruger. Hvis denne politik er angivet som en OS-politik (f.eks. GPO i Windows), vil den være gældende for alle profiler i systemet. Hvis politikken er angivet som en cloudpolitik, vil den kun være gældende for en profil, der er logget ind med en mangerstyret konto.
 
       I denne tilstand gemmes profildataene kun på harddisken, så længe brugersessionen varer. Funktioner som f.eks. browserhistorik, udvidelser og hertil knyttede webdata som f.eks. cookies og webdatabaser gemmes ikke, når browseren lukkes. Men dette forhindrer ikke brugeren i at downloade eventuelle data til harddisken manuelt, gemme sider eller udskrive dem.
 
@@ -4013,7 +3991,7 @@
       (uden citationstegn) til listen over domæner).
 
       Denne indstilling forhindrer brugeren i at logge ind og tilføjer en sekundær
-      konto på en administreret konto, der kræver Google-godkendelse, hvis denne
+      konto på en mangerstyret konto, der kræver Google-godkendelse, hvis denne
       konto ikke tilhører den tidligere nævnte liste over tilladte domæner.
 
       Hvis du undlader at markere/konfigurere denne indstilling, kan brugerne
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 13889c8..9b231e88 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -445,12 +445,6 @@
 
       In der Richtlinie muss eine URL angegeben werden, von der <ph name="PRODUCT_OS_NAME" /> die Nutzungsbedingungen herunterladen kann. Die Nutzungsbedingungen müssen als unformatierter Text mit dem MIME-Typ "text/plain" vorliegen. Markups sind nicht zulässig.</translation>
 <translation id="1750315445671978749">Alle Downloads blockieren</translation>
-<translation id="1762072363876276024">
-      Diese Richtlinie gilt für die Anmeldeseite. Sehen Sie sich auch die Richtlinie "<ph name="SITE_PER_PROCESS_POLICY_NAME" />" für die eigentliche Nutzersitzung an. Es wird empfohlen, für beide Richtlinien denselben Wert festzulegen. Wenn die Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, weil der von der Nutzerrichtlinie angegebene Wert erst angewendet werden muss.
-      Mit der Einstellung "DeviceLoginScreenSitePerProcess" können Nutzer daran gehindert werden, die standardmäßige Isolierung sämtlicher Websites zu deaktivieren. Hinweis: Die Richtlinie "DeviceLoginScreenIsolateOrigins" kann auch für die Isolierung zusätzlicher, differenzierterer Ursprünge hilfreich sein.
-      Ist die Richtlinie aktiviert, können Nutzer das Standardverhalten, bei dem jede Website in einem eigenen Prozess ausgeführt wird, nicht deaktivieren.
-      Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, kann der Nutzer diese Einstellung ändern, z. B. mithilfe des Eintrags "Disable site isolation" in chrome://flags.
-      </translation>
 <translation id="1767673020408652620">App-Empfehlungen bei Nullstatus des Suchfelds aktivieren</translation>
 <translation id="17719159826324007">
       Wenn diese Richtlinie auf "ArcSession" gesetzt ist und Android gestartet wurde, wird nach einer Nutzerabmeldung ein Neustart des Geräts erzwungen.
@@ -3575,21 +3569,6 @@
 
           Hinweis: Zulässige Werte für das Feld "<ph name="MINUTE_FIELD_NAME" />" in "<ph name="CHARGE_START_TIME_FIELD_NAME" />" und "<ph name="CHARGE_END_TIME_FIELD_NAME" />" sind 0, 15, 30 und 45.</translation>
 <translation id="7717938661004793600">Hiermit konfigurieren Sie die Zugänglichkeitsfunktionen für <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Diese Richtlinie aktiviert HTTP/0.9 auf allen Ports mit Ausnahme von Port 80 für HTTP und 443 für HTTPS.
-
-      Diese Richtlinie ist standardmäßig deaktiviert. Bei Aktivierung besteht für Nutzer die folgende Sicherheitslücke: https://crbug.com/600352.
-
-      Mit dieser Richtlinie, die demnächst entfernt wird, sollen Unternehmen die Möglichkeit erhalten, vorhandene Server auf eine andere Version als HTTP/0.9 zu migrieren.
-
-      Ist die Richtlinie nicht konfiguriert, wird HTTP/0.9 auf nicht standardmäßigen Ports deaktiviert.</translation>
-<translation id="7726421241038987229">
-      Mit der Einstellung "SitePerProcess" können Nutzer daran gehindert werden, die standardmäßige Isolierung sämtlicher Websites zu deaktivieren. Hinweis: Die Richtlinie "IsolateOrigins" kann auch für die Isolierung zusätzlicher, differenzierterer Ursprünge hilfreich sein.
-      Ist die Richtlinie aktiviert, können Nutzer das Standardverhalten, bei dem jede Website in einem eigenen Prozess ausgeführt wird, nicht deaktivieren.
-      Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, können Nutzer die Website-Isolierung deaktivieren, z. B. mithilfe des Eintrags "Disable site isolation" in chrome://flags.  Die Website-Isolierung wird nicht deaktiviert, wenn Sie die Richtlinie deaktivieren oder nicht konfigurieren.
-      Unter <ph name="PRODUCT_OS_NAME" /> wird empfohlen, die Geräterichtlinie "<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />" auf denselben Wert festzulegen. Wenn die Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, weil der von der Nutzerrichtlinie angegebene Wert erst angewendet werden muss.
-
-      HINWEIS: Diese Richtlinie funktioniert nicht unter Android. Wenn "SitePerProcess" unter Android aktiviert werden soll, muss die Richtlinieneinstellung "SitePerProcessAndroid" verwendet werden.
-      </translation>
 <translation id="7747447585227954402">Geräten erlauben, <ph name="PLUGIN_VM_NAME" /> auf <ph name="PRODUCT_OS_NAME" /> zu verwenden</translation>
 <translation id="7749402620209366169">Aktiviert die Zwei-Faktor-Authentifizierung für Remotezugriff-Hosts anstelle einer vom Nutzer angegebenen PIN.
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index 4b21d763..47a257c 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -454,12 +454,6 @@
 
       Η πολιτική πρέπει να οριστεί σε μια διεύθυνση URL, από την οποία το <ph name="PRODUCT_OS_NAME" /> μπορεί να λάβει τους Όρους Παροχής Υπηρεσιών. Οι Όροι Παροχής Υπηρεσιών πρέπει να είναι απλό κείμενο, το οποίο προβάλλεται ως απλό κείμενο τύπου MIME. Δεν επιτρέπονται σημάνσεις.</translation>
 <translation id="1750315445671978749">Αποκλεισμός όλων των λήψεων</translation>
-<translation id="1762072363876276024">
-      Αυτή η πολιτική ισχύει για την οθόνη σύνδεσης. Ανατρέξτε, επίσης, στην πολιτική <ph name="SITE_PER_PROCESS_POLICY_NAME" />, η οποία ισχύει για την περίοδο σύνδεσης χρήστη. Συνιστάται να ορίσετε την ίδια τιμή και για τις δύο πολιτικές. Εάν οι τιμές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση κατά την είσοδο σε μια περίοδο σύνδεσης χρήστη ενώ εφαρμόζεται η τιμή που καθορίζεται από την πολιτική χρήστη.
-      Αυτή η ρύθμιση, DeviceLoginScreenSitePerProcess, μπορεί να χρησιμοποιηθεί για να μην επιτρέπεται στους χρήστες να εξαιρούνται από την προεπιλεγμένη συμπεριφορά της απομόνωσης όλων των ιστοτόπων. Σημειώστε ότι η πολιτική DeviceLoginScreenIsolateOrigins μπορεί επίσης να είναι χρήσιμη για την απομόνωση επιπλέον προελεύσεων με μεγαλύτερη ακρίβεια.
-      Εάν η πολιτική είναι ενεργοποιημένη, οι χρήστες δεν θα έχουν τη δυνατότητα να εξαιρεθούν από την προεπιλεγμένη συμπεριφορά όπου κάθε ιστότοπος εκτελεί τη δική του διαδικασία.
-      Εάν η πολιτική δεν έχει διαμορφωθεί ή είναι απενεργοποιημένη, ο χρήστης θα μπορεί να αλλάξει αυτήν τη ρύθμιση (π.χ. χρησιμοποιώντας την καταχώριση "Απενεργοποίηση απομόνωσης ιστοτόπου" στο chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Ενεργοποίηση των προτάσεων εφαρμογών στη μηδενική κατάσταση του πλαισίου αναζήτησης</translation>
 <translation id="17719159826324007">
       Αυτή η πολιτική, όταν οριστεί σε ArcSession, επιβάλλει την επανεκκίνηση της συσκευής κατά την αποσύνδεση του χρήστη, εάν έχει ξεκινήσει το Android.
@@ -3704,22 +3698,6 @@
 
           Σημείωση: Οι επιτρεπόμενες τιμές <ph name="MINUTE_FIELD_NAME" /> στα πεδία <ph name="CHARGE_START_TIME_FIELD_NAME" /> και <ph name="CHARGE_END_TIME_FIELD_NAME" /> είναι 0, 15, 30 ή 45.</translation>
 <translation id="7717938661004793600">Διαμόρφωση λειτουργιών προσβασιμότητας <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Αυτή η πολιτική ενεργοποιεί το HTTP/0.9 σε θύρες εκτός της θύρας 80 για HTTP και της θύρας 443 για HTTPS.
-
-      Αυτή η πολιτική είναι απενεργοποιημένη από προεπιλογή και αν ενεργοποιηθεί εκθέτει τους χρήστες στο πρόβλημα ασφάλειας https://crbug.com/600352.
-
-      Αυτή η πολιτική έχει ως σκοπό να δώσει στις επιχειρήσεις μια ευκαιρία να μετεγκαταστήσουν διακομιστές από το HTTP/0.9 και θα καταργηθεί στο μέλλον.
-
-      Αν δεν έχει οριστεί αυτή η πολιτική, το HTTP/0.9 θα είναι απενεργοποιημένο σε μη προεπιλεγμένες θύρες.</translation>
-<translation id="7726421241038987229">
-      Αυτή η ρύθμιση, SitePerProcess, μπορεί να χρησιμοποιηθεί για να μην επιτρέπεται στους χρήστες να εξαιρούνται από την προεπιλεγμένη συμπεριφορά της απομόνωσης όλων των ιστοτόπων. Σημειώστε ότι η πολιτική IsolateOrigins μπορεί επίσης να είναι χρήσιμη για την απομόνωση επιπλέον προελεύσεων με μεγαλύτερη ακρίβεια.
-      Εάν η πολιτική είναι ενεργοποιημένη, οι χρήστες δεν θα έχουν τη δυνατότητα να εξαιρεθούν από την προεπιλεγμένη συμπεριφορά όπου κάθε ιστότοπος εκτελεί τη δική του διαδικασία.
-      Εάν η πολιτική δεν έχει διαμορφωθεί ή είναι απενεργοποιημένη, ο χρήστης θα μπορεί να εξαιρεθεί από την απομόνωση ιστοτόπου
-      (π.χ. χρησιμοποιώντας την καταχώριση "Απενεργοποίηση απομόνωσης ιστοτόπου" στο chrome://flags).  Εάν η πολιτική οριστεί ως απενεργοποιημένη ή/και δεν διαμορφωθεί, η απομόνωση ιστοτόπου δεν απενεργοποιείται.
-      Για το <ph name="PRODUCT_OS_NAME" />, συνιστάται επίσης η ρύθμιση της πολιτικής συσκευής <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> στην ίδια τιμή. Εάν οι τιμές που καθορίζονται από τις δύο πολιτικές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση κατά την είσοδο σε μια περίοδο σύνδεσης χρήστη ενώ εφαρμόζεται η τιμή που καθορίζεται από την πολιτική χρήστη.
-
-      ΣΗΜΕΙΩΣΗ: Αυτή η πολιτική δεν εφαρμόζεται σε Android. Για να ενεργοποιήσετε το SitePerProcess σε Android, χρησιμοποιήστε τη ρύθμιση πολιτικής SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Να επιτρέπεται στις συσκευές η χρήση ενός <ph name="PLUGIN_VM_NAME" /> σε <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Ενεργοποιεί τον έλεγχο ταυτότητας δύο παραγόντων για κεντρικούς υπολογιστές απομακρυσμένης πρόσβασης αντί για έναν κωδικό PIN που έχει προσδιοριστεί από τον χρήστη.
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 3468d16..eab0cc6a 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -448,12 +448,6 @@
 
       The policy should be set to a URL from which <ph name="PRODUCT_OS_NAME" /> can download the Terms of Service. The Terms of Service must be plain text, served as MIME type text/plain. No markup is allowed.</translation>
 <translation id="1750315445671978749">Block all downloads</translation>
-<translation id="1762072363876276024">
-      This policy applies to the sign-in screen. Please see also the <ph name="SITE_PER_PROCESS_POLICY_NAME" /> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied.
-      This setting, DeviceLoginScreenSitePerProcess, may be used to disallow users from opting out of the default behaviour of isolating all sites. Note that the DeviceLoginScreenIsolateOrigins policy may also be useful for isolating additional, finer-grained origins.
-      If the policy is enabled, users will be unable to opt out of the default behaviour where each site runs in its own process.
-      If the policy is not configured or disabled, the user will be able to change this setting (e.g. using 'Disable site isolation' entry in chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Enable App Recommendations in Zero State of Search Box</translation>
 <translation id="17719159826324007">
       This policy, when set to ArcSession, forces the device to reboot when a user signs out if Android has started.
@@ -3691,22 +3685,6 @@
 
           Note: allowed values for <ph name="MINUTE_FIELD_NAME" /> field in <ph name="CHARGE_START_TIME_FIELD_NAME" /> and <ph name="CHARGE_END_TIME_FIELD_NAME" /> are 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Configure <ph name="PRODUCT_OS_NAME" /> accessibility features.</translation>
-<translation id="7724994675283793633">This policy enables HTTP/0.9 on ports other than 80 for HTTP and 443 for HTTPS.
-
-      This policy is disabled by default and, if enabled, leaves users open to the security issue https://crbug.com/600352.
-
-      This policy is intended to give enterprises a chance to migrate existing servers off HTTP/0.9, and will be removed in the future.
-
-      If this policy is not set, HTTP/0.9 will be disabled on non-default ports.</translation>
-<translation id="7726421241038987229">
-      This setting, SitePerProcess, may be used to disallow users from opting out of the default behaviour of isolating all sites. Note that the IsolateOrigins policy may also be useful for isolating additional, finer-grained origins.
-      If the policy is enabled, users will be unable to opt out of the default behaviour where each site runs in its own process.
-      If the policy is not configured or disabled, the user will be able to opt out of site isolation
-      (e.g. using 'Disable site isolation' entry in chrome://flags).  Setting the policy to disabled and/or not configuring the policy does not turn off Site Isolation.
-      On <ph name="PRODUCT_OS_NAME" />, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied.
-
-      NOTE: This policy does not apply on Android. To enable SitePerProcess on Android, use the SitePerProcessAndroid policy setting.
-      </translation>
 <translation id="7747447585227954402">Allow devices to use a <ph name="PLUGIN_VM_NAME" /> on <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Enables two-factor authentication for remote access hosts instead of a user-specified PIN.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 8feb31f..bf6e20a 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -444,12 +444,6 @@
 
       La política debe establecerse en una URL de la cual <ph name="PRODUCT_OS_NAME" /> pueda descargar las Condiciones del servicio. Estas deberán estar en texto sin formato y ofrecerse como texto sin formato tipo MIME. No se permiten marcas.</translation>
 <translation id="1750315445671978749">Bloquear todas las descargas</translation>
-<translation id="1762072363876276024">
-      Esta política se aplica a la pantalla de acceso. Consulta también la política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica a la sesión de usuario. Se recomienda establecer ambas políticas en el mismo valor. Si los valores no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor que especifica la política del usuario.
-      Esta configuración, DeviceLoginScreenSitePerProcess, se puede utilizar para impedir que los usuarios rechacen el comportamiento predeterminado de aislamiento de todos los sitios. Ten en cuenta que la política DeviceLoginScreenIsolateOrigins también puede ser útil para aislar orígenes adicionales más precisos.
-      Si se habilita la política, los usuarios no podrán rechazar el comportamiento predeterminado en el que cada sitio ejecuta su propio proceso.
-      Si se inhabilita la política o no se configura, el usuario podrá cambiar esta configuración (p. ej., mediante la entrada para inhabilitar el aislamiento de sitios en chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Habilitar las recomendaciones de apps cuando el cuadro de búsqueda se encuentra sin estado</translation>
 <translation id="17719159826324007">
       Si se establece en ArcSession, esta política forzará el reinicio del dispositivo después de que el usuario salga de su cuenta en el caso de que se inicie Android.
@@ -3588,22 +3582,6 @@
 
           Nota: Los valores permitidos para el campo <ph name="MINUTE_FIELD_NAME" /> en <ph name="CHARGE_START_TIME_FIELD_NAME" /> y <ph name="CHARGE_END_TIME_FIELD_NAME" /> son 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Permite configurar las funciones de accesibilidad de <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Esta política habilita el protocolo HTTP/0.9 en otros puertos además del puerto 80 para HTTP y el 443 para HTTPS.
-
-      De forma predeterminada, esta política está inhabilitada. Si se habilita, los usuarios quedan expuestos ante el problema de seguridad https://crbug.com/600352.
-
-      El objetivo de esta política es darle a las empresas una oportunidad para migrar servidores existentes con HTTP/0.9; en el futuro, se quitará.
-
-      Si la política no se establece, HTTP/0.9 se inhabilitará para los puertos no predeterminados.</translation>
-<translation id="7726421241038987229">
-      Esta configuración, SitePerProcess, se puede usar para impedir que los usuarios rechacen el comportamiento predeterminado del aislamiento de todos los sitios. Ten en cuenta que la política IsolateOrigins también puede ser útil para aislar los orígenes adicionales más precisos.
-      Si se habilita la política, los usuarios no podrán rechazar el comportamiento predeterminado en el que cada sitio ejecuta su propio proceso.
-      Si se inhabilita la política o no se configura, el usuario podrá rechazar el aislamiento de sitios
-      (p. ej., mediante la entrada para inhabilitar el aislamiento de sitios en chrome://flags).  Si se inhabilita la política o no se configura, no se desactivará el aislamiento de sitios.
-      En <ph name="PRODUCT_OS_NAME" />, se recomienda también establecer la política de dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> en el mismo valor. Si los valores que especifican las dos políticas no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor que especifica la política del usuario.
-
-      NOTA: Esta política no se aplica en Android. Para habilitar SitePerProcess en Android, usa la configuración de la política SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permitir que los dispositivos usen un <ph name="PLUGIN_VM_NAME" /> en <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Habilita la autenticación de dos factores para los hosts de acceso remoto en lugar de un PIN especificado por el usuario.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 957c65444..b2b2f726 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -442,12 +442,6 @@
 
       La política se debe establecer en una URL desde la que <ph name="PRODUCT_OS_NAME" /> podrá descargar las Condiciones de Servicio. Las Condiciones de Servicio deben ser texto sin formato, que actúe como texto/sin formato del tipo de MIME. No se permite ningún tipo de marcado.</translation>
 <translation id="1750315445671978749">Bloquear todas las descargas</translation>
-<translation id="1762072363876276024">
-      Esta política se aplica a la pantalla de inicio de sesión. También puedes consultar la política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica a la sesión del usuario. Se recomienda asignar el mismo valor a ambas políticas. Si los valores de las dos políticas no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario.
-      Este ajuste, DeviceLoginScreenSitePerProcess, puede usarse para evitar que los usuarios inhabiliten el comportamiento predeterminado de aislamiento de todos los sitios web. Ten en cuenta que la política DeviceLoginScreenIsolateOrigins también puede ser útil para aislar orígenes adicionales de forma más precisa.
-      Si se habilita la política, los usuarios podrán inhabilitar el comportamiento predeterminado con el que cada sitio web se ejecuta en su propio proceso.
-      Si la política no se configura o se inhabilita, el usuario podrá cambiar esta configuración (por ejemplo, utilizando la entrada "Inhabilitar el aislamiento de sitio web" en chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Habilitar la opción Aplicaciones recomendadas en estado cero del cuadro de búsqueda.</translation>
 <translation id="17719159826324007">
       Si se asigna el valor "ArcSession" a esta política, se forzará al dispositivo a reiniciarse cuando el usuario cierre sesión si Android se ha iniciado.
@@ -2548,6 +2542,10 @@
       Recuerda que no se recomienda esta opción, ya que puede permitir que se omita la extensión nameConstraints que restringe los nombres de host para los que puede estar autorizado un certificado concreto.
 
       Si esta política no se configura o se le asigna el valor valse, los certificados de servidor que no tengan ninguna extensión subjectAlternativeName que incluya un nombre de DNS o una dirección IP no serán de confianza.</translation>
+<translation id="5578571772998293651">Permitir comentarios de los usuarios.
+        Si se asigna el valor "False" a esta política, los usuarios no podrán enviar comentarios a Google.
+
+        Si no se le asigna ningún valor o se le asigna el valor "True", los usuarios podrán enviar comentarios a Google desde Menú &gt; Ayuda &gt; Informar de un problema o con una combinación de teclas.</translation>
 <translation id="5581292529942108810">Configurar las políticas asociadas a Chrome Reporting Extension.
 
       Esta política solo es efectiva si la extensión <ph name="CHROME_REPORTING_EXTENSION_NAME" /> está habilitada y el equipo está registrado en <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3700,22 +3698,6 @@
 
           Nota: Los valores permitidos para el campo <ph name="MINUTE_FIELD_NAME" /> en <ph name="CHARGE_START_TIME_FIELD_NAME" /> y <ph name="CHARGE_END_TIME_FIELD_NAME" /> son 0, 15, 30 y 45.</translation>
 <translation id="7717938661004793600">Permite configurar funciones de accesibilidad de <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Esta política habilita HTTP/0.9 en puertos diferentes a 80 en el caso de HTTP y 443 para HTTPS.
-
-      Esta política está inhabilitada de forma predeterminada. Si se habilita, expone a los usuarios al problema de seguridad que se indica en la página https://crbug.com/600352.
-
-      Esta política se ha diseñado con el objetivo de que las empresas puedan migrar sus servidores para que no utilicen HTTP/0.9 y se retirará más adelante.
-
-      Si no se configura esta política, HTTP/0.9 se inhabilitará en los puertos no utilizados de forma predeterminada.</translation>
-<translation id="7726421241038987229">
-      Este ajuste, SitePerProcess, puede usarse para evitar que los usuarios inhabiliten el comportamiento predeterminado de aislamiento de todos los sitios web. Ten en cuenta que la política IsolateOrigins también puede ser útil para aislar orígenes adicionales de forma más precisa.
-      Si se habilita la política, los usuarios podrán inhabilitar el comportamiento predeterminado con el que cada sitio web se ejecuta en su propio proceso.
-      Si no se configura la política o se inhabilita, el usuario podrá inhabilitar el aislamiento de sitio web
-      (por ejemplo, utilizando la entrada "Inhabilitar el aislamiento de sitio web" en chrome://flags).  Si la política se configura como inhabilitada o no se configura, no se desactivará el aislamiento de sitio web.
-      En <ph name="PRODUCT_OS_NAME" />, también se recomienda asignar el mismo valor a la política de dispositivos <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Si los valores especificados por las dos políticas no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario.
-
-      NOTA: Esta política no se aplica a Android. Para habilitar SitePerProcess en Android, utiliza la configuración de política SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permite a los dispositivos usar <ph name="PLUGIN_VM_NAME" /> en <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Permite habilitar la autenticación de dos factores para los hosts de acceso remoto en lugar de un PIN especificado por el usuario.
 
@@ -3941,6 +3923,7 @@
       Si no se establece esta política, no se hará ninguna excepción a la lista negra de la política "URLBlacklist".</translation>
 <translation id="8176035528522326671">Permitir que el usuario de empresa sea solo un usuario principal de varios perfiles (comportamiento predeterminado para usuarios administrados por empresas)</translation>
 <translation id="8183108371184777472">Impide que se abra la ventana del navegador</translation>
+<translation id="8186911565834244165">Permitir comentarios de los usuarios</translation>
 <translation id="8214600119442850823">Permite configurar el Administrador de Contraseñas.</translation>
 <translation id="8217516105848565518">Esta política está obsoleta. Sustitúyela por la política RemoteAccessHostDomainList.</translation>
 <translation id="8244171102276095471">Habilita los conjuntos de cifrado de RC4 en TLS</translation>
@@ -4370,6 +4353,12 @@
 <translation id="9112897538922695510">Te permite registrar una lista de controladores de protocolos. Solo puede tratarse de una política recomendada. La propiedad |protocol| se debe establecer según el esquema (por ejemplo, mailto), y la propiedad |url| se debe establecer según el patrón de URL de la aplicación que procesa el esquema. El patrón puede incluir un %s, que si está presente se sustituirá por la URL procesada.
 
 Los controladores de protocolos registrados por la política se combinan con los registrados por el usuario, y ambos pueden utilizarse. El usuario puede anular los controladores de protocolos instalados por la política. Para ello, debe instalar un nuevo controlador predeterminado, pero no puede eliminar un controlador de protocolo registrado por la política.</translation>
+<translation id="91196902572559194">Esta política da permiso al Asistente de Google para escuchar y detectar la frase de activación.
+
+      Si se habilita esta política, el Asistente de Google escuchará para detectar la frase de activación.
+      De lo contrario, el Asistente de Google no escuchará para detectar la frase de activación.
+      Si no se configura la política, los usuarios podrán decidir si permiten o no al Asistente de Google escuchar para detectar la frase de activación.
+      </translation>
 <translation id="9123211093995421438">Especifica el número mínimo de reversiones a versiones principales de <ph name="PRODUCT_OS_NAME" /> que se deberían permitir desde la versión estable en cualquier momento.
 
       El valor predeterminado es 0 para dispositivos de consumo y 4 (aproximadamente medio año) para los dispositivos registrados por empresas.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index f217b4c9..1ed4305 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -454,12 +454,6 @@
 
       Reegel tuleb määrata URL-ile, kust <ph name="PRODUCT_OS_NAME" /> saab teenusetingimused alla laadida. Teenusetingimused peavad olema lihtteksti vormingus, esitatud MIME-tüüpi tekstina/lihttekstina. Märgistused pole lubatud.</translation>
 <translation id="1750315445671978749">Blokeeri kõik allalaadimised</translation>
-<translation id="1762072363876276024">
-      See reegel kehtib sisselogimiskuval. Vaadake ka reeglit <ph name="SITE_PER_PROCESS_POLICY_NAME" />, mis kehtib kasutajaseansi puhul. Soovitatav on seada mõlemad reeglid samale väärtusele. Kui väärtused ei kattu, võib kasutajaseansi avamisel ilmneda viivitus kasutajareeglitega määratud väärtuse rakendamise tõttu.
-      Seade DeviceLoginScreenSitePerProcess abil võib keelata kasutajate jaoks vaikekäitumisest ehk kõigi saitide isoleerimisest loobumise. Pange tähele, et reegel DeviceLoginScreenIsolateOrigins võimaldab isoleerida ka muid, täpsemini määratud lähtekohti.
-      Kui reegel on lubatud, ei saa kasutajad loobuda vaikekäitumisest, mille puhul käitatakse igat saiti eraldi protsessina.
-      Kui reegel on seadistamata või keelatud, saab kasutaja seadet muuta (nt jaotise chrome://flags kirje „Keela saidi isoleerimine” abil).
-      </translation>
 <translation id="1767673020408652620">Rakenduse soovituste lubamine nullolekuga otsingukastis</translation>
 <translation id="17719159826324007">
       Kui selle reegli väärtuseks on määratud ArcSession, taaskäivitab reegel seadme pärast kasutaja väljalogimist, kui Android on käivitunud.
@@ -3706,22 +3700,6 @@
 
           Märkus. Üksuste <ph name="CHARGE_START_TIME_FIELD_NAME" /> ja <ph name="CHARGE_END_TIME_FIELD_NAME" /> välja <ph name="MINUTE_FIELD_NAME" /> lubatud väärtused on 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Seadistage teenuse <ph name="PRODUCT_OS_NAME" /> juurdepääsufunktsioonid.</translation>
-<translation id="7724994675283793633">See reegel lubab HTTP/0.9 portides, mis ei ole HTTP puhul 80 ja HTTPS-i puhul 443.
-
-      See reegel on vaikimisi keelatud. Kui see on lubatud, võivad kasutajad kokku puutuda turvaprobleemiga https://crbug.com/600352.
-
-      Selle reegli eesmärk on anda ettevõtetele võimalus eemaldada olemasolevad serverid üksusest HTTP/0.9. See reegel eemaldatakse tulevikus.
-
-      Kui see reegel on määramata, keelatakse HTTP/0.9 mittevaikeportides.</translation>
-<translation id="7726421241038987229">
-      Seadega SitePerProcess saab kasutajate jaoks keelata kõigi saitide isoleerimise vaikeseadest loobumise. Pange tähele, et reegel IsolateOrigins võimaldab isoleerida ka muid, täpsemini määratud lähtekohti.
-      Kui reegel on lubatud, ei saa kasutajad loobuda vaikekäitumisest, mille puhul käitatakse igat saiti eraldi protsessina.
-      Kui reegel on seadistamata või keelatud, saab kasutaja loobuda saidi isoleerimisest
-      (nt jaotises chrome://flags kirje „Keela saidi isoleerimine” kasutamisest).  Reegli keelamisel ja/või seadistamata jätmisel ei lülitata saidi isoleerimist välja.
-      Teenuses <ph name="PRODUCT_OS_NAME" /> on soovitatav määrata seadmereegli <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> jaoks sama väärtus. Kui nende kahe reegli jaoks määratud väärtused ei kattu, võib kasutajaseansi avamisel ilmneda viivitus kasutajareegli jaoks määratud väärtuse rakendamise tõttu.
-
-      MÄRKUS. Reegel ei kehti Androidi puhul. Androidis funktsiooni SitePerProcess lubamiseks kasutage reegli SitePerProcessAndroid seadet.
-      </translation>
 <translation id="7747447585227954402">Seadmetel lubatakse operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> kasutada pistikprogrammi <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7749402620209366169">Lubab kaugjuurdepääsu hostide autentimiseks kasutaja määratud PIN-koodi asemel kahetasandilise autentimise.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index f07d1eb..31c190a 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -440,12 +440,6 @@
 
       خط‌مشی باید روی آدرس اینترنتی‌ای تنظیم شود که از آن <ph name="PRODUCT_OS_NAME" /> می‌تواند شرایط خدمات را بارگیری کند. شرایط خدمات باید نوشتار ساده باشد، و بعنوان نوشتار نوع MIME/ ساده کار کند. نشانه‌گذاری مجاز نیست.</translation>
 <translation id="1750315445671978749">مسدود کردن همه بارگیری‌ها</translation>
-<translation id="1762072363876276024">‏
-      این خط‌مشی در صفحه ورود به سیستم اعمال می‌شود. لطفاً خط‌مشی <ph name="SITE_PER_PROCESS_POLICY_NAME" /> را هم ببینید؛ این خط‌مشی در جلسه کاربر اعمال می‌شود. توصیه می‌شود هر دو خط‌مشی را روی یک مقدار تنظیم کنید. اگر مقادیر منطبق نباشند، ممکن است هنگام ورود به جلسه کاربر که مقدار مشخص‌شده توسط خط‌مشی کاربر اعمال می‌شود، تأخیری پیش آید.
-      با استفاده از تنظیم DeviceLoginScreenSitePerProcess می‌توان امکان انصراف از رفتار پیش‌فرض جداشدگی همه سایت‌ها را از کاربر گرفت. توجه داشته باشید خط‌مشی DeviceLoginScreenIsolateOrigins هم می‌تواند برای جداشدگی مبدأهای اضافی جزئی‌تر مفید باشد.
-      اگر این خط‌مشی فعال شود، کاربران نمی‌توانند از رفتار پیش‌فرض که در آن هر سایت در پردازش مخصوص به‌خود اجرا می‌شود،‌ انصراف دهند.
-      اگر این خط‌مشی پیکربندی نشود یا غیرفعال شود، کاربر می‌تواند این تنظیم را تغییر دهد (برای نمونه، با استفاده از ورودی «غیرفعال کردن جداشدگی سایت» در chrome://flags).
-      </translation>
 <translation id="1767673020408652620">فعال کردن «توصیه‌های برنامه» در «حالت‌صفر» «کادر جستجو»</translation>
 <translation id="17719159826324007">‏
       اگر این خط‌مشی روی ArcSession تنظیم شده باشد، اگر Android شروع به‌کار کرده باشد، دستگاه وادار می‌شود هنگام خروج کاربر از سیستم راه‌اندازی مجدد شود.
@@ -2949,8 +2943,7 @@
 
       این خط‌مشی توانایی کاربران را برای پیکربندی چاپگر در دستگاه‌های فردی تحت‌تأثیر قرار نمی‌دهد.  این خط‌مشی به‌عنوان مکملی برای پیکربندی چاپگرها ازجانب کاربران مجزا درنظر گرفته شده است.
 
-      برای دستگاه‌های مدیریت‌شده با Active Directory، این خط‌مشی از گسترش <ph name="MACHINE_NAME_VARIABLE" /> به نام رایانه Active Directory یا رشته‌ای فرعی از آن پشتیبانی می‌کند. برای مثال، اگر نام رایانه <ph name="MACHINE_NAME_EXAMPLE" /> باشد، ۴ نویسه بعد از موقعیت ششم جایگزین <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> می‌شوند (به این شکل: <ph name="MACHINE_NAME_PART_EXAMPLE" />) . توجه کنید این موقعیت برمبنای صفر است.
-      </translation>
+      برای دستگاه‌های مدیریت‌شده با Active Directory، این خط‌مشی از گسترش <ph name="MACHINE_NAME_VARIABLE" /> به نام رایانه Active Directory یا رشته‌ای فرعی از آن پشتیبانی می‌کند. برای مثال، اگر نام رایانه <ph name="MACHINE_NAME_EXAMPLE" /> باشد، ۴ نویسه بعد از موقعیت ششم جایگزین <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> می‌شود (به این شکل: <ph name="MACHINE_NAME_PART_EXAMPLE" />) . توجه کنید این موقعیت برمبنای صفر است.</translation>
 <translation id="6598235178374410284">تصویر چهره‌نمای کاربر</translation>
 <translation id="6603004149426829878">همیشه هنگام شناسایی منطقه زمانی، سیگنال‌های مکان دردسترس به سرور ارسال شود</translation>
 <translation id="6628120204569232711">گزارش وضعیت ذخیره‌سازی</translation>
@@ -3582,21 +3575,6 @@
 
           توجه: مقادیر مجاز برای فیلد <ph name="MINUTE_FIELD_NAME" /> در <ph name="CHARGE_START_TIME_FIELD_NAME" /> و <ph name="CHARGE_END_TIME_FIELD_NAME" /> ۰، ۱۵، ۳۰، ۴۵ است.</translation>
 <translation id="7717938661004793600">پیکربندی ویژگی‌های دسترس‌پذیری <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">‏این خط‌مشی، HTTP/0.9 را در درگاه‌هایی به‌جز 80 برای HTTP و 443 برای HTTPS فعال می‌کند.
-
-      این خط‌مشی به‌طور پیش‌فرض غیرفعال است و اگر فعال شود، کاربران را در معرض مشکل امنیتی https://crbug.com/600352 قرار می‌دهد.
-
-      هدف از این خط‌مشی به وجود آوردن فرصتی برای شرکت‌ها است تا سرورهای موجود را از HTTP/0.9 خارج کنند و این خط‌مشی در آینده برداشته می‌شود.
-
-      اگر این خط‌مشی تنظیم نشود، HTTP/0.9 در درگاه‌های غیر پیش‌فرض غیرفعال خواهد شد.</translation>
-<translation id="7726421241038987229">‏
-      با استفاده از تنظیم SitePerProcess می‌توان امکان انصراف از رفتار پیش‌فرض جداشدگی همه سایت‌ها را از کاربران گرفت. توجه داشته باشید خط‌مشی IsolateOrigins می‌تواند برای جداشدگی مبدأهای اضافی جزئی‌تر نیز مفید باشد.
-      اگر این خط‌مشی فعال شود، کاربران نمی‌توانند از رفتار پیش‌فرض که در آن هر سایت در پردازش مخصوص به‌خود اجرا می‌شود،‌ انصراف دهند.
-      اگر این خط‌مشی پیکربندی نشود یا غیرفعال شود، کاربر می‌تواند از جداشدگی سایت انصراف دهد (برای نمونه،‌ با استفاده از ورودی «غیرفعال کردن جداشدگی سایت» در chrome://flags).  تنظیم کردن خط‌مشی روی غیرفعال و/یا پیکربندی نکردن خط‌مشی، «جداشدگی سایت» را خاموش نمی‌کند.
-      در <ph name="PRODUCT_OS_NAME" />، توصیه می‌شود خط‌مشی دستگاه <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> را نیز روی مقدار یکسانی با این خط‌مشی تنظیم کنید. اگر مقادیر مشخص‌شده توسط دو خط‌مشی مطابقت نداشته باشند، ممکن است هنگام ورود به جلسه کاربری که مقدار مشخص‌شده توسط خط‌مشی کاربر اعمال می‌شود، تأخیری به‌وجود آید.
-
-      توجه: این خط‌مشی در Android اعمال نمی‌شود. برای فعال کردن SitePerProcess در Android، از تنظیم خط‌مشی SitePerProcessAndroid استفاده کنید.
-      </translation>
 <translation id="7747447585227954402">به دستگاه‌ها اجازه داده شود از <ph name="PLUGIN_VM_NAME" /> در <ph name="PRODUCT_OS_NAME" /> استفاده کنند</translation>
 <translation id="7749402620209366169">تأیید هویت دو فاکتوری را برای میزبان‌های دسترسی راه دور بجای پین مشخص شده توسط کاربر فعال می‌کند.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index b992711..51f8bab4 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -448,12 +448,6 @@
 
       Tämän käytännön arvoksi määritetään URL-osoite, josta <ph name="PRODUCT_OS_NAME" /> voi ladata käyttöehdot. Käyttöehtojen täytyy olla tavallista tekstiä (MIME-tyyppi text/plain). Muotoilua ei sallita.</translation>
 <translation id="1750315445671978749">Estä kaikki lataukset</translation>
-<translation id="1762072363876276024">
-      Tämä käytäntö koskee kirjautumisnäyttöä. Tutustu myös <ph name="SITE_PER_PROCESS_POLICY_NAME" /> -käytäntöön, joka koskee käyttökertaa. On suositeltavaa asettaa molemmille käytännöille sama arvo. Jos arvot eivät täsmää, käyttökerran aloittaminen voi viivästyä käyttäjäkäytännössä määritetyn arvon hakemisen vuoksi.
-      Tällä asetuksella (DeviceLoginScreenSitePerProcess) voidaan estää käyttäjiä lopettamasta oletuskäytös, kaikkien sivustojen erilläänpito. Huomaa, että DeviceLoginScreenIsolateOrigins voi myös olla hyödyllinen eristettäessä muita, tarkemmin määritettyjä alkuperiä.
-      Jos käytäntö on käytössä, käyttäjä voi lopettaa oletuskäyttäytymisen eli oman prosessin suorittamisen joka sivustolla.
-      Jos käytäntöä ei määritetä tai se poistetaan käytöstä, käyttäjä voi muuttaa tätä asetusta (esimerkiksi chrome://flags-valinnalla Älä pidä sivustoja erillään).
-      </translation>
 <translation id="1767673020408652620">Ota käyttöön sovellussuositukset hakukentän nollatilassa</translation>
 <translation id="17719159826324007">
       Kun käytännön arvoksi asetetaan ArcSession, se pakottaa laitteen käynnistymään uudelleen käyttäjän uloskirjautumisen yhteydessä, jos Android on käynnistynyt.
@@ -2489,6 +2483,10 @@
       Huom. Tämän asetuksen käyttöä ei suositella, sillä se voi mahdollistaa nameConstraints-laajennuksen ohittamisen. Kyseinen laajennus rajoittaa isäntänimiä, joiden käyttöön varmenne voidaan valtuuttaa.
 
       Jos tämän käytännön arvo on epätosi tai sitä ei ole määritetty, DNS-nimen tai IP-osoitteen sisältäviä palvelinvarmenteita ei pidetä luotettavina, jos niistä puuttuu subjectAlternativeName-laajennus.</translation>
+<translation id="5578571772998293651">Salli käyttäjäpalaute.
+        Jos käytännön arvo on epätosi, käyttäjät eivät voi lähettää palautetta Googlelle.
+
+        Jos käytännölle ei ole määritetty arvoa tai sen arvo on tosi, käyttäjät voivat lähettää Googlelle palautetta valitsemalla Valikko-&gt;Ohje-&gt;Ilmoita ongelmasta tai näppäinyhdistelmällä.</translation>
 <translation id="5581292529942108810">Määritä Chromen ilmoituslaajennukseen liittyvät käytännöt.
 
       Käytäntö on voimassa vain, kun <ph name="CHROME_REPORTING_EXTENSION_NAME" /> on käytössä ja koneella on käytössä <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3607,22 +3605,6 @@
 
           Huom. Kentän <ph name="MINUTE_FIELD_NAME" /> sallitut arvot kohdissa<ph name="CHARGE_START_TIME_FIELD_NAME" /> ja <ph name="CHARGE_END_TIME_FIELD_NAME" /> ovat 0, 15, 30 ja 45.</translation>
 <translation id="7717938661004793600">Määritä tuotteen <ph name="PRODUCT_OS_NAME" /> käytettävyysominaisuudet.</translation>
-<translation id="7724994675283793633">Tämä käytäntö sallii HTTP/0.9:n myös muille porteille kuin 80 (HTTP) ja 443 (HTTPS).
-
-      Käytäntö on oletuksena poissa käytöstä. Jos se otetaan käyttöön, käyttäjät altistuvat tälle tietoturvaongelmalle: https://crbug.com/600352.
-
-      Käytännön tarkoitus on antaa yrityksille tilaisuus jättää HTTP/0.9 pois käytöstä olemassa olevilla palvelimilla, ja se poistetaan tulevaisuudessa.
-
-      Jos käytäntöä ei ole määritetty, HTTP/0.9 ei ole käytössä muilla kuin oletusarvoisilla porteilla.</translation>
-<translation id="7726421241038987229">
-      Tällä asetuksella (SitePerProcess) voidaan estää käyttäjiä lopettamasta oletuskäytös, kaikkien sivustojen erilläänpito. Huomaa, että IsolateOrigins voi myös olla hyödyllinen eristettäessä muita, tarkemmin määritettyjä alkuperiä.
-      Jos käytäntö on käytössä, käyttäjä voi lopettaa oletuskäyttäytymisen eli oman prosessin suorittamisen joka sivustolla.
-      Jos käytäntöä ei määritetä tai se poistetaan käytöstä, käyttäjä voi poistaa sivustojen erilläänpidon käytöstä
-      (esimerkiksi chrome://flags-valinnalla Älä pidä sivustoja erillään).  Sivustojen erilläänpito ei poistu käytöstä, vaikka käytäntö poistetaan käytöstä tai sitä ei määritetä.
-      Suositus (<ph name="PRODUCT_OS_NAME" />): aseta sama arvo myös laitekäytännölle <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Jos näiden kahden käytännön arvot eivät täsmää, käyttökerran aloittaminen voi viivästyä käyttäjäkäytännössä määritetyn arvon hakemisen vuoksi.
-
-      HUOMIOITAVAA: Tämä käytäntö ei koske Androidia. Jos haluat ottaa SitePerProcess-asetuksen käyttöön Androidilla, käytä SitePerProcessAndroid-käytännön asetusta.
-      </translation>
 <translation id="7747447585227954402">Salli laitteiden käyttää laajennusta <ph name="PLUGIN_VM_NAME" /> tuotteessa <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Ottaa etäisännille käyttöön kahden tekijän todennuksen käyttäjän määrittämän PIN-koodin sijaan.
 
@@ -3845,6 +3827,7 @@
       Jos tätä käytäntöä ei ole määritetty, URLBlacklist-käytännön luettelossa oleviin kiellettyihin osoitteisiin ei tehdä poikkeuksia.</translation>
 <translation id="8176035528522326671">Anna yrityskäyttäjän olla vain ensisijainen käyttäjä usean profiilin käyttökerralla (oletuskäyttäytyminen yrityksen hallinnoimille käyttäjille)</translation>
 <translation id="8183108371184777472">Estä selainikkunan avaaminen</translation>
+<translation id="8186911565834244165">Salli käyttäjäpalaute</translation>
 <translation id="8214600119442850823">Määrittää salasanan hallinnan.</translation>
 <translation id="8217516105848565518">Tämä käytäntö on poistettu käytöstä. Käytä tämän sijaan RemoteAccessHostDomainList-käytäntöä.</translation>
 <translation id="8244171102276095471">Ota käyttöön TLS:n RC4-salaustekniikat</translation>
@@ -4278,6 +4261,12 @@
 <translation id="9112897538922695510">Tämän käytännön avulla voit rekisteröidä luettelon protokollan käsittelijöitä. Tämä voi olla vain suositeltu käytäntö. |protocol|-ominaisuudeksi tulee asettaa malli, kuten "mailto", ja |url|-ominaisuudeksi tulee asettaa kyseistä mallia käsittelevän sovelluksen URL-osoitemalli. Osoitemalli voi sisältää merkin %s, joka korvataan käsiteltävällä URL-osoitteella.
 
           Käytännön avulla rekisteröidyt protokollan käsittelijät yhdistetään käyttäjän rekisteröimien käsittelijöiden kanssa, ja molemmat ovat käytettävissä. Käyttäjä voi ohittaa käytännön määrittämät protokollan käsittelijät asentamalla uuden oletuskäsittelijän. Käyttäjä ei kuitenkaan voi poistaa käytännön avulla rekisteröityjä protokollan käsittelijöitä.</translation>
+<translation id="91196902572559194">Tämä käytäntö antaa Google Assistantille luvan kuunnella äänikomennon.
+
+      Jos käytäntö on käytössä, Google Assistant kuuntelee äänikomennon.
+      Jos käytäntö ei ole käytössä, Google Assistant ei kuuntele äänikomentoa.
+      Jos käytäntöä ei ole määritetty, käyttäjä voi päättää, saako Google Assistant kuunnella äänikomennon.
+      </translation>
 <translation id="9123211093995421438">Määritä <ph name="PRODUCT_OS_NAME" /> ‑virstanpylväiden palauttamisten sallittu vähimmäismäärä, joka lasketaan aina vakaasta versiosta alkaen.
 
       Kuluttajalaitteissa oletusmäärä on 0 ja yritysten rekisteröimissä laitteissa 4 (noin puolen vuoden välein).
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index efa87f5..fe89bc3 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -449,12 +449,6 @@
 
       Dapat itakda ang patakaran sa isang URL kung saan maaaring i-download ng <ph name="PRODUCT_OS_NAME" /> ang Mga Tuntunin ng Serbisyo. Dapat ay plain text ang Mga Tuntunin ng Serbisyo, na ihahatid bilang MIME type text/plain. Hindi pinapayagan ang markup.</translation>
 <translation id="1750315445671978749">I-block ang lahat ng pag-download</translation>
-<translation id="1762072363876276024">
-      Nalalapat ang patakarang ito sa screen sa pag-sign in. Pakitingnan din ang patakarang <ph name="SITE_PER_PROCESS_POLICY_NAME" /> na nalalapat sa session ng user. Inirerekomendang itakda ang parehong patakaran sa parehong value. Kung hindi magkatugma ang mga value, puwedeng magkaroon ng pagkaantala kapag pumapasok sa session ng user habang inilalapat ang value na tinukoy ng patakaran ng user.
-      Ang setting na ito, DeviceLoginScreenSitePerProcess, ay magagamit para huwag payagan ang mga user na mag-opt out sa default na gawi ng pag-isolate ng lahat ng site. Tandaang puwede ring maging kapaki-pakinabang ang patakarang DeviceLoginScreenIsolateOrigins sa pag-isolate ng karagdagang mas mahuhusay na pinagmulan.
-      Kung naka-enable ang patakaran, hindi makakapag-opt out ang mga user sa default na gawi kung saan tumatakbo ang bawat site sa sarili nitong proseso.
-      Kung hindi naka-configure o naka-disable ang patakaran, mababago ng user ang setting na ito (hal. paggamit ng entry na "I-disable ang pag-isolate ng site" sa chrome://flags).
-      </translation>
 <translation id="1767673020408652620">I-enable ang Mga Rekomendasyon sa App sa Zero State ng Box para sa Paghahanap</translation>
 <translation id="17719159826324007">
       Pupuwersahin ng patakarang ito, kapag nakatakda sa ArcSession, na mag-reboot ang device kapag may user na nag-sign out kung nagsimula ang Android.
@@ -2548,6 +2542,10 @@
       Tandaan na hindi ito inirerekomenda, dahil maaari itong maging daan sa pag-bypass sa nameConstraints na extension na naghihigpit sa mga hostname kung saan maaaring awtorisahan ang isang certificate.
 
       Kung hindi naitakda ang patakarang ito, o kung naitakda ito sa false, hindi pagkakatiwalaan ang mga certificate ng server na walang subjectAlternativeName na extension na naglalaman ng DNS name o IP address.</translation>
+<translation id="5578571772998293651">Payagan ang feedback ng user.
+        Kung nakatakda sa false ang patakaran, hindi makakapagpadala ang mga user ng feedback sa Google.
+
+        Kung hindi nakatakda o nakatakda sa true ang patakaran, makakapagpadala ang mga user ng feedback sa Google sa pamamagitan ng Menu-&gt;Tulong-&gt;Mag-ulat ng Isyu o kumbinasyon ng key.</translation>
 <translation id="5581292529942108810">I-configure ang mga patakarang nauugnay sa Chrome Reporting Extension.
 
       May bisa lang ang patakarang ito kapag naka-enable ang <ph name="CHROME_REPORTING_EXTENSION_NAME" />, at naka-enroll sa <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> ang machine.</translation>
@@ -3702,22 +3700,6 @@
 
           Tandaan: ang mga pinapayagang value para sa field na <ph name="MINUTE_FIELD_NAME" /> sa <ph name="CHARGE_START_TIME_FIELD_NAME" /> at <ph name="CHARGE_END_TIME_FIELD_NAME" /> ay 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">I-configure ang mga tampok sa accessibility ng <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Ini-enable ng patakarang ito ang HTTP/0.9 sa mga port maliban sa 80 para sa HTTP at 443 para sa HTTPS.
-
-      Naka-disable ang patakarang ito bilang default, at kung naka-enable, nagiging dahilan ito na maaaring maapektuhan ang mga user ng panseguridad na isyu https://crbug.com/600352.
-
-      Layunin ng patakarang ito na bigyan ang mga enterprise ng pagkakataong alisin ang mga kasalukuyang server sa HTTP/0.9 at aalisin ito sa hinaharap.
-
-      Kung hindi itatakda ang patakarang ito, idi-disable ang HTTP/0.9 sa mga hindi default na port.</translation>
-<translation id="7726421241038987229">
-      Ang setting na ito, SitePerProcess, ay magagamit para huwag payagan ang mga user na mag-opt out sa default na gawi ng pag-isolate ng lahat ng site. Tandaang puwede ring maging kapaki-pakinabang ang patakarang IsolateOrigins sa pag-isolate ng karagdagang mas mahuhusay na pinagmulan.
-      Kung naka-enable ang patakaran, hindi makakapag-opt out ang mga user sa default na gawi kung saan tumatakbo ang bawat site sa sarili nitong proseso.
-      Kung hindi naka-configure o naka-disable ang patakaran, makakapag-opt out ang user sa pag-isolate ng site
-      (hal. paggamit ng entry na "I-disable ang pag-isolate ng site" sa chrome://flags).  Ang pagtakda ng patakaran sa naka-disable at/o hindi pag-configure ng patakaran ay hindi mag-o-off sa Pag-isolate ng Site.
-      Sa <ph name="PRODUCT_OS_NAME" />, inirerekomendang itakda rin ang patakaran ng device na <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sa parehong value. Kung hindi magkatugma ang mga value na tinukoy ng dalawang patakaran, puwedeng magkaroon ng pagkaantala kapag pumapasok sa session ng user habang inilalapat ang value na tinukoy ng patakaran ng user.
-
-      TANDAAN: Hindi nalalapat ang patakarang ito sa Android. Para i-enable ang SitePerProcess sa Android, gamitin ang setting ng patakarang SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Payagan ang mga device na gumamit ng <ph name="PLUGIN_VM_NAME" /> sa <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Pinapagana ang pagpapatotoong may dalawang salik para sa mga host ng malayuang pag-access sa halip na isang PIN na tinukoy ng user.
 
@@ -3945,6 +3927,7 @@
       Kung hindi nakatakda ang patakarang ito, hindi magkakaroon ng mga pagbubukod sa blacklist mula sa patakarang 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">Payagan ang user ng enterprise na maging pangunahing multiprofile na user lang (Default na pag-uugali para sa mga user na pinamamahalaan ng enterprise)</translation>
 <translation id="8183108371184777472">Pigilan ang paglunsad ng window ng browser</translation>
+<translation id="8186911565834244165">Payagan ang feedback ng user</translation>
 <translation id="8214600119442850823">Kino-configure ang password manager.</translation>
 <translation id="8217516105848565518">Hindi na ginagamit ang patakarang ito. Pakigamit na lang ang RemoteAccessHostDomainList.</translation>
 <translation id="8244171102276095471">I-enable ang mga RC4 cipher suite sa TLS</translation>
@@ -4388,6 +4371,12 @@
 <translation id="9112897538922695510">Nagbibigay-daan sa iyong magrehistro ng isang listahan ng mga tagapangasiwa ng protocol. Dapat ay isa itong inirerekomendang patakaran. Dapat itakda ang property na |protocol| sa scheme gaya ng 'mailto' at dapat itakda ang property na |url| sa pattern ng URL ng application na nangangasiwa sa scheme. Maaaring maglaman ng '%s' ang pattern, at kung mayroon nito, papalitan ito ng pinapangasiwaang URL.
 
           Ang mga tagapangasiwa ng protocol na irerehistro ng patakaran ay isasama sa mga inirehistro ng user, at available gamitin ang dalawang ito. Maaaring i-override ng user ang mga tagapangasiwa ng protocol na na-install ng patakaran sa pamamagitan ng pag-i-install ng bagong default na tagapangasiwa, ngunit hindi nila maaalis ang isang tagapangasiwa ng protocol na inirehistro ng patakaran.</translation>
+<translation id="91196902572559194">Ang patakarang ito ay nagbibigay ng pahintulot sa Google Assistant na makinig sa parirala para sa pag-activate gamit ang boses.
+
+      Kung naka-enable ang patakaran, makikinig ang Google Assistant sa parirala para sa pag-activate gamit ang boses.
+      Kung naka-disable ang patakaran, hindi makikinig ang Google Assistant sa parirala para sa pag-activate gamit ang boses.
+      Kung hindi nakatakda ang patakaran, makakapagpasya ang mga user kung papayagang makinig sa parirala para sa pag-activate gamit ang boses.
+      </translation>
 <translation id="9123211093995421438">Tumutukoy sa minimum na bilang ng pag-rollback ng mga milestone ng <ph name="PRODUCT_OS_NAME" /> na dapat payagan simula sa stable na bersyon anumang oras.
 
       Ang default ay 0 para sa consumer, 4 (tinatayang kalahating taon) para sa mga device na na-enroll ng enterprise.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index b81bb16..e0367ac 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -449,12 +449,6 @@
 
       La règle doit être définie sur une URL à partir de laquelle <ph name="PRODUCT_OS_NAME" /> peut télécharger les conditions d'utilisation. Ces conditions doivent être en texte brut, et proposées au format texte/brut au type MIME. Aucun balisage n'est autorisé.</translation>
 <translation id="1750315445671978749">Bloquer tous les téléchargements</translation>
-<translation id="1762072363876276024">
-      Cette règle s'applique à l'écran de connexion. Veuillez également consulter celle applicable à la session utilisateur (<ph name="SITE_PER_PROCESS_POLICY_NAME" />). Nous vous recommandons d'attribuer la même valeur à ces deux règles. Si les valeurs sont différentes, il peut y avoir un certain délai lors de l'ouverture d'une session utilisateur dû à l'application de la valeur spécifiée par la règle relative aux utilisateurs.
-      La règle DeviceLoginScreenSitePerProcess peut être utilisée pour empêcher les utilisateurs de désactiver le paramètre par défaut qui isole tous les sites. Notez que la règle DeviceLoginScreenIsolateOrigins peut également servir à isoler d'autres origines plus précises.
-      Si la présente règle est activée, les utilisateurs ne peuvent pas désactiver le paramètre par défaut où chaque site exécute son propre processus.
-      Si cette règle n'est pas configurée ou si elle est désactivée, les utilisateurs peuvent modifier ce paramètre (en accédant à l'option "Désactiver l'isolation de sites" sur la page chrome://flags, par exemple).
-      </translation>
 <translation id="1767673020408652620">Activer les recommandations d'applications dans le champ de recherche vide</translation>
 <translation id="17719159826324007">
       Lorsque l'option "ArcSession" est activée, cette règle contraint l'appareil à redémarrer lorsqu'un utilisateur se déconnecte si Android est en cours d'exécution.
@@ -3702,22 +3696,6 @@
 
           Remarque : Les valeurs autorisées dans le champ <ph name="MINUTE_FIELD_NAME" /> de <ph name="CHARGE_START_TIME_FIELD_NAME" /> et <ph name="CHARGE_END_TIME_FIELD_NAME" /> sont 0, 15, 30 et 45.</translation>
 <translation id="7717938661004793600">Permet de configurer les fonctionnalités d'accessibilité de <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Cette règle active le protocole HTTP 0.9 sur les ports autres que 80 pour HTTP et 443 pour HTTPS.
-
-      Cette règle est désactivée par défaut. Lorsqu'elle est activée, les utilisateurs sont exposés à la faille de sécurité décrite sur la page https://crbug.com/600352.
-
-      Cette règle est conçue pour permettre aux entreprises de migrer les serveurs pour qu'ils n'utilisent plus HTTP 0.9. Elle sera supprimée à l'avenir.
-
-      Si cette règle n'est pas définie, le protocole HTTP 0.9 est désactivé sur les ports non utilisés par défaut.</translation>
-<translation id="7726421241038987229">
-      La règle SitePerProcess peut être employée pour empêcher les utilisateurs de désactiver le paramètre par défaut qui isole tous les sites. Notez que la règle IsolateOrigins peut également servir à isoler d'autres origines plus précises.
-      Si la présente règle est activée, les utilisateurs ne peuvent pas désactiver le paramètre par défaut où chaque site exécute son propre processus.
-      Si cette règle n'est pas configurée ou si elle est désactivée, les utilisateurs peuvent désactiver l'isolation de sites
-      (en accédant à l'option "Désactiver l'isolation de sites" sur la page chrome://flags, par exemple).  Si cette règle est désactivée et/ou si elle n'est pas configurée, l'isolation de sites n'est pas désactivée.
-      Pour <ph name="PRODUCT_OS_NAME" />, nous vous recommandons d'attribuer également la même valeur à la règle <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> relative aux appareils. Si les valeurs sont différentes, il peut y avoir un certain délai lors de l'ouverture d'une session utilisateur dû à l'application de la valeur spécifiée par la règle relative aux utilisateurs.
-
-      REMARQUE : Cette règle ne s'applique pas à Android. Pour l'activer sur Android, utilisez le paramètre de la règle SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Autoriser les appareils à utiliser un <ph name="PLUGIN_VM_NAME" /> pour <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Active l'authentification forte pour les hôtes d'accès à distance au lieu d'un code d'accès défini par l'utilisateur.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index b9ab86d..3efa3de 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -448,12 +448,6 @@
 
       નીતિ એ URL પર સેટ કરવી કે જેમાંથી <ph name="PRODUCT_OS_NAME" /> સેવાની શરતોને ડાઉનલોડ કરી શકે. સેવાની શરતો સાદા ટેક્સ્ટમાં, MIME પ્રકાર ટેક્સ્ટ/સાદા તરીકે આપેલી હોવી જરૂરી છે. કોઈ માર્કઅપની પરવાનગી નથી.</translation>
 <translation id="1750315445671978749">બધા ડાઉનલોડ અવરોધિત કરો</translation>
-<translation id="1762072363876276024">
-      આ નીતિ સાઇન-ઇન સ્ક્રીન પર લાગુ થાય છે. કૃપા કરીને <ph name="SITE_PER_PROCESS_POLICY_NAME" /> નીતિ પણ જુઓ જે વપરાશકર્તા સત્ર પર લાગુ થાય છે. બન્ને નીતિઓને સમાન મૂલ્ય પર સેટ કરવાનો સુઝાવ આપેલો છે. જો મૂલ્યો મેળ ખાતા ન હોય, તો વપરાશકર્તા નીતિ દ્વારા ઉલ્લેખિત મૂલ્ય લાગુ કરવામાં આવી રહ્યું હોય ત્યારે વપરાશકર્તા સત્રમાં દાખલ થતી વખતે વિલંબ થઈ શકે છે.
-      આ સેટિંગ, DeviceLoginScreenSitePerProcess, વપરાશકર્તાને બધી સાઇટને આઇસોલેટ કરવાની ડિફૉલ્ટ વર્તણૂક પસંદ કરવાથી અટકાવવાની મંજૂરી રદ કરવા ઉપયોગમાં લઈ શકાય છે. ધ્યાનમાં રાખો કે DeviceLoginScreenIsolateOrigins નીતિ અતિરિક્ત, ફાઇન-ગ્રેઇનવાળા ઑરિજિનને આઇસોલેટ કરવા માટે પણ ઉપયોગી હોય શકે.
-      જો આ નીતિ ચાલુ કરેલી હોય, તો જ્યાં દરેક સાઇટ તેની પોતાની પ્રક્રિયામાં ચાલતી હોય ત્યાં વપરાશકર્તાઓ ડિફૉલ્ટ વર્તણૂક પસંદ કરી શકશે નહીં.
-      જો આ નીતિને ગોઠવેલી ન હોય અથવા બંધ કરેલી હોય, તો વપરાશકર્તા આ સેટિંગને બદલી શકશે (દા.ત. chrome://flagsમાં "સાઇટ આઇસોલેશન બંધ કરો"નો ઉપયોગ કરવો)
-      </translation>
 <translation id="1767673020408652620">શોધ બૉક્સના Zero Stateમાં ઍપ સુઝાવ ચાલુ કરો</translation>
 <translation id="17719159826324007">
       જ્યારે આ નીતિને ArcSession પર સેટ કરી હોય, ત્યારે તે Android ચાલુ થઈ જવા પર વપરાશકર્તા સાઇન આઉટ કરે ત્યારે ડિવાઇસને રીબૂટ કરવાનું જરૂરી બનાવે છે.
@@ -3676,22 +3670,6 @@
 
           નોંંધ: <ph name="CHARGE_START_TIME_FIELD_NAME" /> અને <ph name="CHARGE_END_TIME_FIELD_NAME" />માં <ph name="MINUTE_FIELD_NAME" /> ફીલ્ડ માટે મંજૂર મૂલ્યો 0, 15, 30 અને 45 છે.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> ઍક્સેસિબિલિટી સુવિધાઓને ગોઠવો.</translation>
-<translation id="7724994675283793633">આ નીતિ પોર્ટ પર HTTP માટે 80 અને HTTPS માટે 443 ની સિવાય HTTP/0.9 ને સક્રિય કરે છે . 
-
-આ નીતિ ડિફૉલ્ટ રીતે બંધ હોઇ છે, અને જો ચાલુ હોય તો, વપરાશકર્તાઓને સુરક્ષા મુશ્કેલી https://crbug.com/600352 ના પ્રતિ જોખમમાં નાખે છે. 
-
-આ નીતિનો ઉદ્દેશ ઉદ્યોગો ને HTTP/0.9 નું અસ્તિત્વમાંનું સર્વરથી બહાર સ્થાનાંતર કરવા માટે તક આપવી છે અને તેને ભવિષ્યમાં દૂર કરવામાં આવશે. 
-
-જો આ નીતિ સેટ નથી, તો HTTP/0.9 ને બિન-ડિફૉલ્ટ પોર્ટ પર બંધ કરવામાં આવશે.</translation>
-<translation id="7726421241038987229">
-      આ સેટિંગ, SitePerProcess, વપરાશકર્તાઓને બધી સાઇટને આઇસોલેટ કરવાની ડિફૉલ્ટ વર્તણૂકને પસંદ કરવાથી અટકાવવાની મંજૂરીને રદ કરવા માટે ઉપયોગમાં લઈ શકાય છે. ધ્યાનમાં રાખો કે IsolateOrigins નીતિ અતિરિક્ત, ફાઇનર-ગ્રેઇનવાળા ઑરિજિનને આઇસોલેટ કરવા માટે પણ ઉપયોગમાં લઈ શકાય છે.
-      જો આ નીતિ ચાલુ કરેલી હોય, તો જ્યાં દરેક સાઇટ તેની પોતાની પ્રક્રિયામાં ચાલતી હોય ત્યાં વપરાશકર્તાઓ ડિફૉલ્ટ વર્તણૂક પસંદ કરી શકશે નહીં.
-      જો આ નીતિ ગોઠવેલી ન હોય અથવા બંધ કરેલી હોય, તો વપરાશકર્તા સાઇટનું આઇસોલેશન પસંદ કરી શકશે નહીં
-      (દા.ત. chrome://flagsમાં "સાઇટ આઇસોલેશન બંધ કરો" એન્ટ્રીનો ઉપયોગ કરવો).  નીતિને બંધ અને/અથવા નીતિને ગોઠવવી નહીં પર સેટ કરવાથી સાઇટ આઇસોલેશન બંધ થતું નથી.
-      <ph name="PRODUCT_OS_NAME" /> પર, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ડિવાઇસ નીતિ પણ સમાન મૂલ્ય પર સેટ કરવામાં આવે તે માટેનો સુઝાવ પણ આપેલો છે. જો બે નીતિઓ દ્વારા ઉલ્લેખિત મૂલ્યો મેળ ન ખાતા હોય, તો વપરાશકર્તા નીતિ દ્વારા ઉલ્લેખિત મૂલ્ય લાગુ થઈ રહ્યું હોય ત્યારે વપરાશકર્તા સત્રમાં દાખલ થતી વખતે વિલંબ થઈ શકે છે.
-
-      નોંધ: આ નીતિ Android પર લાગુ થતી નથી. Android પર SitePerProcess ચાલુ કરવા માટે, SitePerProcessAndroid નીતિ સેટિંગનો ઉપયોગ કરો.
-      </translation>
 <translation id="7747447585227954402"><ph name="PRODUCT_OS_NAME" /> પર <ph name="PLUGIN_VM_NAME" />નો ઉપયોગ કરવાની ડિવાઇસને મંજૂરી આપો</translation>
 <translation id="7749402620209366169">વપરાશકર્તા-ઉલ્લેખિત PIN ને બદલે રીમોટ ઍક્સેસ હોસ્ટ્સ માટે બે-કારક પ્રમાણીકરણ સક્ષમ કરે છે.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index f9ec9d8..062895d 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -450,12 +450,6 @@
 
       नीति को किसी ऐसे यूआरएल से जोड़ा जाना चाहिए जिससे <ph name="PRODUCT_OS_NAME" /> सेवा की शर्तें डाउनलोड कर सके. सेवा की शर्तें सामान्य लेख में होनी चाहिए जिसे एमआईएमई किस्म के लेख/सामान्य के रूप में दिया गया हो. किसी मार्कअप की अनुमति नहीं है.</translation>
 <translation id="1750315445671978749">सभी डाउनलोड ब्लॉक करें</translation>
-<translation id="1762072363876276024">
-      यह नीति साइन-इन स्क्रीन पर लागू होती है. कृपया उपयोगकर्ता सत्र पर लागू होने वाली <ph name="SITE_PER_PROCESS_POLICY_NAME" /> नीति भी देखें. दोनों नीतियों को समान मान पर सेट करने का सुझाव दिया जाता है. अगर मान मेल नहीं खाते हैं, तो उपयोगकर्ता नीति के ज़रिए बताए गए मान को लागू करते समय उपयोगकर्ता सेशन में जाने में देर हो सकती है.
-      DeviceLoginScreenSitePerProcess सेटिंग का इस्तेमाल लोगों को सभी साइटों से आइसोलेट करने के डिफ़ॉल्ट बर्ताव से ऑप्ट-आउट करने की मंज़ूरी नहीं देने के लिए किया जा सकता है. ध्यान रखें कि DeviceLoginScreenIsolateOrigins नीति का इस्तेमाल ज़्यादा बारीक मूल को आइसोलेट करने के लिए भी किया जा सकता है.
-      अगर यह नीति चालू होती है, तो लोग डिफ़ॉल्ट बर्ताव से ऑप्ट-आउट नहीं कर पाएंगे जहां हर साइट अपनी खुद की प्रक्रिया में चलती है.
-      अगर नीति कॉन्फ़िगर नहीं है या बंद है, तो इस्तेमाल करने वाले लोग इस सेटिंग को बदल पाएंगे (जैसे, chrome://flags में साइट आइसोलेशन बंद करें" प्रविष्टि का इस्तेमाल करना).
-      </translation>
 <translation id="1767673020408652620">खोज बॉक्स में कुछ न लिखा होने पर ऐप्लिकेशन के सुझाव पाने की सुविधा चालू करें</translation>
 <translation id="17719159826324007">
       जब यह नीति ArcSession पर सेट होती है, तब Android के शुरू होने और उपयोगकर्ता के साइन आउट करने पर डिवाइस हर हाल में फिर से चालू हो जाता है.
@@ -2550,6 +2544,10 @@
       ध्यान रखें कि इसका सुझाव नहीं दिया जाता, क्योंकि इससे ऐसे nameConstraints एक्सटेंशन को बायपास करने की अनुमति मिल सकती है जो ऐसे होस्टनामों पर रोक लगाता है, जिसके लिए किसी प्रमाणपत्र को मंज़ूरी दी जा सकती है.
 
       अगर इस नीति को सेट नहीं किया जाता है या गलत पर सेट किया जाता है तो, जिन सर्वर प्रमाणपत्रों में किसी डीएनएस नाम या आईपी पते वाला subjectAlternativeName एक्सटेंशन मौजूद नहीं है, उन पर भरोसा नहीं किया जाएगा.</translation>
+<translation id="5578571772998293651">उपयोगकर्ता को शिकायत भेजने की अनुमति दें.
+        अगर नीति को 'गलत' पर सेट किया जाता है, तो इस्तेमाल करने वाले लोग Google को शिकायत नहीं भेज पाएंगे.
+
+        अगर नीति को सेट नहीं किया जाता या 'सही' पर सेट किया जाता है, तो इस्तेमाल करने वाले लोग Google को सुझाव भेज पाएंगे. इसके लिए उन्हें मेन्यू-&gt;सहायता-&gt;'गड़बड़ी या कुंजी संयोजन की शिकायत करें' में जाना होगा.</translation>
 <translation id="5581292529942108810">Chrome रिपोर्टिंग एक्सटेंशन से जुड़ी नीतियां कॉन्फ़िगर करें.
 
       यह नीति सिर्फ़ तब प्रभावी होती है जब <ph name="CHROME_REPORTING_EXTENSION_NAME" /> चालू हो और मशीन का नाम <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> के ज़रिए दर्ज कराया गया हो.</translation>
@@ -3695,22 +3693,6 @@
 
           नोट: <ph name="CHARGE_START_TIME_FIELD_NAME" /> और <ph name="CHARGE_END_TIME_FIELD_NAME" /> में <ph name="MINUTE_FIELD_NAME" /> फ़ील्ड के लिए मंज़ूरी दिए गए मान 0, 15, 30 और 45 हैं.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> की पहुंच-योग्यता सुविधाएं कॉन्फ़िगर करें.</translation>
-<translation id="7724994675283793633">यह नीति पोर्ट पर HTTP के लिए 80 और HTTPS के लिए 443 के अलावा HTTP/0.9 को सक्षम करती है.
-
-      यह नीति डिफ़ॉल्ट रूप से अक्षम होती है और सक्षम किए जाने पर, यह उपयोगकर्ताओं को सुरक्षा समस्‍या https://crbug.com/600352 के प्रति जोखिम में डालती है.
-
-      इस नीति का उद्देश्य उद्यमों को HTTP/0.9 के मौजूदा सर्वर से बाहर माइग्रेट करने का अवसर देना है और इसे भविष्य में निकाल दिया जाएगा.
-
-      अगर यह नीति सेट नहीं की जाती है, तो HTTP/0.9 को गैर-डिफ़ॉल्ट पोर्ट पर अक्षम कर दिया जाएगा.</translation>
-<translation id="7726421241038987229">
-      SitePerProcess सेटिंग का इस्तेमाल उपयोगकर्ताओं को सभी साइट से आइसोलेट करने के बर्ताव से ऑप्ट आउट करने की नामंज़ूरी के लिए किया जा सकता है. ध्यान रखें कि IsolateOrigins नीति ज़्यादा बारीक मूल को आइसोलेट करने के लिए भी उपयोगी हो सकती है.
-      अगर यह नीति चालू होती है, तो लोग डिफ़ॉल्ट बर्ताव से ऑप्ट-आउट नहीं कर पाएंगे जहां हर साइट अपनी खुद की प्रक्रिया में चलती है.
-      अगर यह नीति कॉन्फ़िगर नहीं होती है या बंद होती है, तो लोग साइट आइसोलेशन से ऑप्ट-आउट कर पाएंगे
-      (जैसे chrome://flags में "साइट आइसोलेशन बंद करें" प्रविष्टि का इस्तेमाल करना).  नीति को बंद पर सेट करने से और/या नीति को कॉन्फ़िगर नहीं करने से साइट आइसोलेशन बंद नहीं होता है.
-      <ph name="PRODUCT_OS_NAME" /> पर, यह सुझाव भी दिया जाता है कि <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> डिवाइस नीति को समान मान पर सेट किया जाए. अगर दो नीतियों के ज़रिए बताए गए मान मेल नहीं खाते हैं, तो उपयोगकर्ता नीति के ज़रिए बताए गए मान को लागू करते समय उपयोगकर्ता सेशन में जाने में देर हो सकती है.
-
-      नोट: यह नीति Android पर लागू नहीं होती. Android पर SitePerProcess चालू करने के लिए, SitePerProcessAndroid नीति सेटिंग का इस्तेमाल करें.
-      </translation>
 <translation id="7747447585227954402">डिवाइस को <ph name="PRODUCT_OS_NAME" /> पर <ph name="PLUGIN_VM_NAME" /> इस्तेमाल करने दें</translation>
 <translation id="7749402620209366169">दूर से एक्सेस कर रहे होस्ट के लिए, किसी उपयोगकर्ता के लिए तय खास पिन के बजाय दो तरीकों से पुष्टि को चालू करती है.
 
@@ -3938,6 +3920,7 @@
       अगर यह नीति सेट नहीं है, तो 'URLBlacklist' नीति से पाबंदी वाली सूची में डालने के लिए कोई अपवाद नहीं होंगे.</translation>
 <translation id="8176035528522326671">'एंटरप्राइज़ उपयोगकर्ता' को सिर्फ़ 'एक से ज़्यादा प्रोफ़ाइल' का प्राथमिक उपयोगकर्ता बनने की अनुमति दें (एंटरप्राइज़-प्रबंधित उपयोगकर्ताओं के लिए डिफ़ॉल्ट व्यवहार)</translation>
 <translation id="8183108371184777472">ब्राउज़र विंडो के लॉन्च होने की प्रक्रिया को छिपाना</translation>
+<translation id="8186911565834244165">उपयोगकर्ता को शिकायत भेजने की अनुमति दें</translation>
 <translation id="8214600119442850823">पासवर्ड प्रबंधक को कॉन्फ़िगर करती है.</translation>
 <translation id="8217516105848565518">इस नीति का समर्थन रोक दिया गया है. इसके बजाय, कृपया RemoteAccessHostDomainList का इस्तेमाल करें.</translation>
 <translation id="8244171102276095471">TLS में RC4 सिफ़र सुइट चालू करें</translation>
@@ -4361,6 +4344,12 @@
 <translation id="9112897538922695510">आपको प्रोटोकॉल प्रबंधकों की सूची रजिस्टर कराने देती है. यह सिर्फ़ एक सुझाई गई नीति हो सकती है. |protocol| गुण को केवल 'mailto' जैसी स्कीम पर और |url| गुण को स्कीन का प्रबंधन करने वाले ऐप्लिकेशन के URL प्रतिमान पर ही सेट किया जा सकता है. प्रतिमान में '%s' शामिल हो सकता है, जिसके मौजूद होने पर उसे प्रबंधित URL के ज़रिए बदल दिया जाएगा.
 
           नीति के रजिस्टर किए गए प्रोटोकॉल प्रबंधकों को उपयोगकर्ता के रजिस्टर कराए गए प्रबंधकों के साथ मिला दिया जाता है और दोनों ही इस्तेमाल के लिए उपलब्ध रहते हैं. उपयोगकर्ता, नए डिफ़ॉल्ट प्रबंधक को इंस्टॉल करके नीति के इंस्टॉल किए गए प्रोटोकॉल प्रबंधकों को ओवरराइड कर सकता है, लेकिन नीति के रजिस्टर कराए गए प्रोटोकॉल प्रबंधक को निकाल नहीं सकता.</translation>
+<translation id="91196902572559194">यह नीति Google Assistant को अनुमति देती है कि वह बोले गए पासवर्ड को सुनकर चालू हो सके.
+
+      अगर यह नीति लागू की जाती है, तो Google Assistant, बोला गया पासवर्ड सुनकर चालू होगी.
+      अगर यह नीति लागू नहीं की जाती, तो Google Assistant, बोला गया पासवर्ड सुनकर चालू नहीं होगी.
+      अगर नीति सेट नहीं की जाती, तो इस्तेमाल करने वाले लोग यह तय कर सकते हैं कि Google Assistant, बोला गया पासवर्ड सुनकर चालू हो या नहीं.
+      </translation>
 <translation id="9123211093995421438">यह <ph name="PRODUCT_OS_NAME" /> उपलब्धियों की ऐसी कम से कम संख्या तय करती है जिसके लिए किसी भी समय स्थिर वर्शन से रोलबैक शुरू करने की मंज़ूरी दी जानी चाहिए.
 
       डिफ़ॉल्ट, उपभोक्ता के लिए 0 है, एंटरप्राइज़ के नाम दर्ज किए हुए डिवाइस के लिए 4 (करीब एक साल में आधे) है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index f830178..8dd8369 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -436,12 +436,6 @@
 
       Pravilo treba biti postavljeno na URL s kojeg <ph name="PRODUCT_OS_NAME" /> može preuzeti Uvjete pružanja usluge. Uvjeti pružanja usluge moraju biti običan tekst, poslužen kao vrsta "text/plain" protokola MIME. Jezik za označavanje nije dopušten.</translation>
 <translation id="1750315445671978749">Blokiranje svih preuzimanja</translation>
-<translation id="1762072363876276024">
-      To se pravilo primjenjuje na zaslon za prijavu. Pogledajte i pravilo <ph name="SITE_PER_PROCESS_POLICY_NAME" /> koje se primjenjuje na korisničku sesiju. Preporučuje se postaviti oba pravila na istu vrijednost. Ako se vrijednosti ne podudaraju, može doći do kašnjenja prilikom pokretanja korisničke sesije dok se primjenjuje vrijednost navedena korisničkim pravilima.
-      Ova postavka, DeviceLoginScreenSitePerProcess, može se koristiti kako bi se korisnicima onemogućilo da se isključe iz zadanog ponašanja izolacije svih web-lokacija. Napominjemo da pravilo DeviceLoginScreenIsolateOrigins također može biti korisno za izolaciju dodatnih, preciznije određenih izvora.
-      Ako se to pravilo omogući, korisnici se neće moći isključiti iz zadanog ponašanja pri kojem se svaka web-lokacija izvodi u svojem procesu.
-      Ako se to pravilo ne konfigurira ili se onemogući, korisnik će moći promijeniti tu postavku (na primjer pomoću unosa "Disable site isolation" (Onemogući izolaciju web-lokacije) na stranici chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Omogući preporuke aplikacije u nultom stanju okvira za pretraživanje</translation>
 <translation id="17719159826324007">
       Kada se postavi na ArcSession, to pravilo prisilno ponovo pokreće uređaj nakon što se korisnik odjavi, a Android je pokrenut.
@@ -3596,22 +3590,6 @@
 
           Napomena: dopuštene vrijednosti za polje <ph name="MINUTE_FIELD_NAME" /> u <ph name="CHARGE_START_TIME_FIELD_NAME" /> i <ph name="CHARGE_END_TIME_FIELD_NAME" /> jesu 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfiguriranje značajki pristupačnosti proizvoda <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">To pravilo omogućuje HTTP/0.9 na priključcima osim priključka 80 za HTTP i 443 za HTTPS.
-
-      To je pravilo onemogućeno prema zadanim postavkama. Ako se omogući, korisnici mogu biti izloženi sigurnosnoj poteškoći https://crbug.com/600352.
-
-      Tim se pravilom organizacijama želi pružiti prilika da premjeste postojeće poslužitelje s HTTP-a/0.9. Pravilo će se ukloniti u budućnosti.
-
-      Ako se to pravilo ne postavi, HTTP/0.9 onemogućit će se na priključcima koji nisu zadani.</translation>
-<translation id="7726421241038987229">
-      Ova postavka, SitePerProcess, može se koristiti kako bi se korisnicima onemogućilo da se isključe iz zadanog ponašanja izolacije svih web-lokacija. Napominjemo da pravilo IsolateOrigins također može biti korisno za izolaciju dodatnih, preciznije određenih izvora.
-      Ako se to pravilo omogući, korisnici se neće moći isključiti iz zadanog ponašanja pri kojem se svaka web-lokacija izvodi u svojem procesu.
-      Ako se pravilo ne konfigurira ili se onemogući, korisnik će se moći isključiti iz izolacije web-lokacije
-      (na primjer pomoću unosa "Disable site isolation" (Onemogući izolaciju web-lokacije) na stranici chrome://flags).  Ako se to pravilo postavi na onemogućeno i/ili ne konfigurira, ono ne isključuje izolaciju web-lokacije.
-      Na proizvodu <ph name="PRODUCT_OS_NAME" /> preporučuje se postaviti pravila za uređaje <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> na istu vrijednost. Ako se vrijednosti koje navode ta dva pravila ne podudaraju, može doći do kašnjenja prilikom pokretanja korisničke sesije dok se primjenjuje vrijednost koju navode korisnička pravila.
-
-      NAPOMENA: To se pravilo ne primjenjuje na Androidu. Da biste omogućili SitePerProcess na Androidu, postavite pravilo SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Dopusti uređajima da upotrebljavaju <ph name="PLUGIN_VM_NAME" /> na proizvodu <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Omogućuje autentifikaciju s dva čimbenika za hostove daljinskog pristupa umjesto PIN-a koji određuje korisnik.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index 156b9fe..4f05188f 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -446,12 +446,6 @@
 
       A házirend beállításánál egy URL-t kell megadni, amelyről a(z) <ph name="PRODUCT_OS_NAME" /> letöltheti az Általános Szerződési Feltételeket. Az Általános Szerződési Feltételek egyszerű szöveg formátumban legyenek, amelyet text/plain MIME típusként kell megjeleníteni. HTML-kódok nem engedélyezettek.</translation>
 <translation id="1750315445671978749">Az összes letöltés letiltása</translation>
-<translation id="1762072363876276024">
-      Ez a házirend a bejelentkezési képernyőre vonatkozik. Lásd még a <ph name="SITE_PER_PROCESS_POLICY_NAME" /> házirendet is, amely a felhasználói munkamenetre vonatkozik. Javasolt mindkét házirendet ugyanarra az értékre állítani. Ha az értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni próbálja a felhasználói házirend által meghatározott értéket.
-      Ez a DeviceLoginScreenSitePerProcess beállítás használható annak letiltására, hogy a felhasználók kikapcsolhassák az összes webhelyet elszigetelő alapértelmezett viselkedést. Ne feledje, hogy a DeviceLoginScreenIsolateOrigins házirend is hasznos lehet további, pontosabb eredetek elszigetelésére.
-      Ha a házirend engedélyezett, a felhasználók nem tudják kikapcsolni az alapértelmezett viselkedést, amelynél minden webhely a saját folyamatában fut.
-      Ha a házirend nincs beállítva, vagy le van tiltva, a felhasználók módosíthatják ezt a beállítást (pl. a chrome://flags oldalon található „Disable site isolation” [Webhely-elszigetelés letiltása] beállítás használatával).
-      </translation>
 <translation id="1767673020408652620">Alkalmazásjavaslatok engedélyezése a keresőmező alapállapotában</translation>
 <translation id="17719159826324007">
       Az ArcSession beállítás kiválasztása esetén ez a házirend arra kényszeríti az eszközt, hogy újrainduljon, amikor a felhasználó kijelentkezik (ha az Android rendszer fut).
@@ -3610,22 +3604,6 @@
 
           Megjegyzés: A <ph name="MINUTE_FIELD_NAME" /> mező megengedett értékei a <ph name="CHARGE_START_TIME_FIELD_NAME" /> és <ph name="CHARGE_END_TIME_FIELD_NAME" /> beállításokban a következők: 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">A <ph name="PRODUCT_OS_NAME" /> kisegítő funkcióinak konfigurálása.</translation>
-<translation id="7724994675283793633">Ez a házirend a HTTP/0.9 protokoll használatát más portokon is engedélyezi a HTTP 80-as és a HTTPS 443-as portja mellett.
-
-      Ez a házirend alapértelmezés szerint le van tiltva, és engedélyezése esetén a felhasználók ki lesznek téve a következő biztonsági problémának: https://crbug.com/600352.
-
-      A házirend célja, hogy lehetőséget adjon a vállalatoknak arra, hogy a  meglévő szervereiket áttelepítsék HTTP/0.9-ről. A házirendet a jövőben eltávolítjuk.
-
-      Ha nem állítja be ezt a házirendet, akkor a HTTP/0.9 le lesz tiltva a nem alapértelmezett portokon.</translation>
-<translation id="7726421241038987229">
-      Ez a SitePerProcess beállítás használható annak letiltására, hogy a felhasználók kikapcsolhassák az összes webhelyet elszigetelő alapértelmezett viselkedést. Ne feledje, hogy az IsolateOrigins házirend is hasznos lehet további, pontosabb eredetek elszigetelésére.
-      Ha a házirend engedélyezett, a felhasználók nem tudják kikapcsolni az alapértelmezett viselkedést, amelynél minden webhely a saját folyamatában fut.
-      Ha a házirend nincs beállítva, vagy le van tiltva, a felhasználók kikapcsolhatják a webhely-elszigetelést
-      (pl. a chrome://flags oldalon található „Disable site isolation” [Webhely-elszigetelés letiltása] beállítás használatával).  A házirend letiltása és/vagy beállításának mellőzése nem kapcsolja ki a webhely-elszigetelést.
-      A <ph name="PRODUCT_OS_NAME" /> rendszeren ajánlott a <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> eszközházirendet is ugyanerre az értékre állítani. Ha a két házirend által megadott értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni próbálja a felhasználói házirend által meghatározott értéket.
-
-      MEGJEGYZÉS: Ez a házirend nem alkalmazható Android rendszeren. Ha engedélyezni szeretné a SitePerProcess házirendet Androidon, használja a SitePerProcessAndroid házirend-beállítást.
-      </translation>
 <translation id="7747447585227954402"><ph name="PLUGIN_VM_NAME" /> használatának engedélyezése az eszközök számára <ph name="PRODUCT_OS_NAME" /> rendszeren</translation>
 <translation id="7749402620209366169">Engedélyezi a kétlépcsős azonosítást a távoli hozzáférésű gazdagépekhez a felhasználóspecifikus PIN-kód helyett.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 710f371..7fdd114 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -431,12 +431,6 @@
 
       Kebijakan ini harus disetel ke URL di tempat <ph name="PRODUCT_OS_NAME" /> dapat mendownload Persyaratan Layanan tersebut. Persyaratan Layanan ini harus dalam teks biasa, yang disajikan sebagai teks/biasa jenis MIME. Tidak ada markup yang diizinkan.</translation>
 <translation id="1750315445671978749">Blokir semua download</translation>
-<translation id="1762072363876276024">
-      Kebijakan ini berlaku untuk layar login. Baca juga kebijakan <ph name="SITE_PER_PROCESS_POLICY_NAME" /> yang berlaku untuk sesi pengguna. Pengguna disarankan untuk menyetel kedua kebijakan ke nilai yang sama. Jika nilai tidak cocok, penundaan mungkin terjadi ketika memasuki sesi pengguna saat nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan.
-      Setelan ini, DeviceLoginScreenSitePerProcess, mungkin digunakan untuk meminta pengguna agar tetap mengikuti perilaku default dalam pengisolasian semua situs. Perlu diperhatikan bahwa kebijakan DeviceLoginScreenIsolateOrigin mungkin juga berguna untuk mengisolasi asal tambahan yang lebih mendetail.
-      Jika kebijakan diaktifkan, pengguna harus memilih untuk mengikuti perilaku default, yaitu setiap situs akan dijalankan dalam prosesnya sendiri.
-      Jika kebijakan ini dinonaktifkan atau tidak dikonfigurasikan, pengguna akan dapat mengubah setelan ini (misalnya, menggunakan entri "Nonaktifkan isolasi situs" di chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Aktifkan fitur Rekomendasi Aplikasi pada Status Kosong Kotak Penelusuran</translation>
 <translation id="17719159826324007">
       Kebijakan ini, saat disetel ke ArcSession, akan memaksa perangkat untuk reboot saat pengguna logout jika Android telah dimulai.
@@ -3562,22 +3556,6 @@
 
           Catatan: nilai yang diizinkan untuk kolom <ph name="MINUTE_FIELD_NAME" /> pada <ph name="CHARGE_START_TIME_FIELD_NAME" /> dan <ph name="CHARGE_END_TIME_FIELD_NAME" /> adalah 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Mengonfigurasikan fitur aksesibilitas <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Kebijakan ini memungkinkan HTTP/0.9 di port selain 80 untuk HTTP dan 443 untuk HTTPS.
-
-      Kebijakan ini dinonaktifkan secara default dan jika diaktifkan akan membuat pengguna rentan terhadap masalah keamanan https://crbug.com/600352.
-
-      Kebijakan ini ditujukan untuk memberikan peluang kepada perusahaan untuk memindahkan server yang masih ada dari HTTP/0.9, dan akan dihapus di masa mendatang.
-
-      Jika kebijakan ini tidak disetel, HTTP/0.9 akan dinonaktifkan di port non-default.</translation>
-<translation id="7726421241038987229">
-      Setelan ini, SitePerProcess, dapat digunakan untuk meminta pengguna agar tetap mengikuti perilaku default dalam pengisolasian semua situs. Perlu diingat bahwa kebijakan IsolateOrigins juga mungkin berguna untuk mengisolasi asal tambahan yang lebih baik.
-      Jika kebijakan diaktifkan, pengguna harus memilih untuk mengikuti perilaku default, yaitu setiap situs akan dijalankan dalam prosesnya sendiri.
-      Jika kebijakan dinonaktifkan atau tidak dikonfigurasi, pengguna dapat memilih untuk tidak mengikuti isolasi situs
-      (misalnya, menggunakan entri "Nonaktifkan isolasi situs" di chrome://flags).  Dengan menonaktifkan dan/atau tidak mengonfigurasi kebijakan, Isolasi Situs tidak akan dinonaktifkan.
-      Di <ph name="PRODUCT_OS_NAME" />, pengguna disarankan untuk menyetel kebijakan perangkat <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ke nilai yang sama. Jika nilai yang ditentukan oleh kedua kebijakan tidak cocok, penundaan mungkin terjadi ketika memasuki sesi pengguna saat nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan.
-
-      CATATAN: Kebijakan ini tidak berlaku untuk Android. Untuk mengaktifkan SitePerProcess di Android, gunakan setelan kebijakan SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Izinkan perangkat menggunakan <ph name="PLUGIN_VM_NAME" /> di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Mengaktifkan autentikasi dua faktor untuk hosting akses jarak jauh sebagai ganti PIN yang ditentukan pengguna.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 96f22b79..74a337b 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -426,12 +426,6 @@
 
 Per la norma dovrebbe essere impostato un URL da cui <ph name="PRODUCT_OS_NAME" /> possa scaricare i Termini di servizio. I Termini di servizio devono essere in testo normale e pubblicati come testo di tipo MIME/semplice. Il markup non è consentito.</translation>
 <translation id="1750315445671978749">Blocca tutti i download</translation>
-<translation id="1762072363876276024">
-      Questo criterio si applica alla schermata di accesso. Vedi anche il criterio <ph name="SITE_PER_PROCESS_POLICY_NAME" /> che viene applicato alla sessione utente. È consigliabile impostare lo stesso valore per entrambi i criteri. Se i valori non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dai criteri relativi agli utenti.
-      Questa impostazione, DeviceLoginScreenSitePerProcess, può essere utilizzata per non consentire più agli utenti di disattivare il comportamento predefinito di isolamento di tutti i siti. Tieni presente che il criterio DeviceLoginScreenIsolateOrigins può essere utile anche per isolare origini aggiuntive più specifiche.
-      Se il criterio è attivato, gli utenti non potranno disattivare il comportamento predefinito nei casi in cui ciascun sito viene eseguito nel proprio processo.
-      Se il criterio non è configurato o è disattivato, l'utente potrà modificare questa impostazione (ad esempio, utilizzando la voce "Disattiva isolamento dei siti" in chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Attiva consigli di app a stato nullo della casella di ricerca</translation>
 <translation id="17719159826324007">
       Se è impostato su ArcSession, questo criterio forza il riavvio del dispositivo all'uscita dell'utente se Android è stato avviato.
@@ -3547,22 +3541,6 @@
 
           Nota: i valori consentiti per il campo <ph name="MINUTE_FIELD_NAME" /> in <ph name="CHARGE_START_TIME_FIELD_NAME" /> e <ph name="CHARGE_END_TIME_FIELD_NAME" /> sono 0, 15, 30 e 45.</translation>
 <translation id="7717938661004793600">Configura le funzioni di accessibilità di <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">La norma consente di attivare HTTP/0.9 sulle porte diverse da 80 per HTTP e 443 per HTTPS.
-
-      Per impostazione predefinita, la norma è disattivata e, se attivata, espone gli utenti al problema di sicurezza https://crbug.com/600352.
-
-      La norma è pensata per dare alle aziende la possibilità di eseguire la migrazione dei server esistenti da HTTP/0.9 e in futuro sarà rimossa.
-
-      Se la norma non viene impostata, HTTP/0.9 sarà disattivato sulle porte non predefinite.</translation>
-<translation id="7726421241038987229">
-      Questa impostazione, SitePerProcess, può essere utilizzata per non consentire più agli utenti di disattivare il comportamento predefinito di isolamento di tutti i siti. Tieni presente che il criterio IsolateOrigins può essere utile anche per isolare origini aggiuntive più specifiche.
-      Se il criterio è attivato, gli utenti non potranno disattivare il comportamento predefinito nei casi in cui ciascun sito viene eseguito nel proprio processo.
-      Se il criterio non è configurato o è disattivato, l'utente potrà disattivare l'isolamento dei siti
-      (ad esempio, utilizzando la voce "Disattiva isolamento dei siti" in chrome://flags).  La disattivazione e/o la mancata configurazione del criterio non comporta la disattivazione dell'isolamento dei siti.
-      In <ph name="PRODUCT_OS_NAME" />, si consiglia di impostare anche il criterio <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> relativo ai dispositivi sullo stesso valore. Se i valori specificati dai due criteri non corrispondono, può verificarsi un ritardo durante l'accesso a una sessione utente, mentre viene applicato il valore specificato dai criteri relativi agli utenti.
-
-      NOTA: questo criterio non viene applicato su Android. Per attivare SitePerProcess su Android, utilizza l'impostazione del criterio SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Consenti ai dispositivi di usare <ph name="PLUGIN_VM_NAME" /> su <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Consente di abilitare l'autenticazione a due fattori per gli host di accesso remoto invece di un PIN specificato dall'utente.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 4748aa3..4a86020f 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -438,12 +438,6 @@
 
       יש להגדיר את המדיניות ככתובת אתר שממנה <ph name="PRODUCT_OS_NAME" /> יכול להוריד את התנאים וההגבלות. התנאים וההגבלות חייבים להיות בטקסט פשוט ומוצגים כסוג MIME טקסט/פשוט. השימוש בסימון אסור.</translation>
 <translation id="1750315445671978749">חסום את כל ההורדות</translation>
-<translation id="1762072363876276024">‏
-      המדיניות הזו חלה על מסך הכניסה. יש לעיין גם במדיניות <ph name="SITE_PER_PROCESS_POLICY_NAME" /> שחלה על הסשן של המשתמש. מומלץ לקבוע ערך זהה בשתי הגדרות המדיניות. אם הערכים שונים, ייתכן שהכניסה לסשן של משתמש תתעכב בזמן שהמערכת מיישמת את הערך שצוין במדיניות המשתמש.
-      באמצעות ההגדרה הזו, DeviceLoginScreenSitePerProcess, ניתן לחייב משתמשים להשתמש בהתנהגות ברירת המחדל שבה כל האתרים מבודדים. חשוב לזכור – ניתן להשתמש במדיניות DeviceLoginScreenIsolateOrigins כדי לבודד מקורות נוספים, ספציפיים יותר.
-      אם המדיניות הזו מופעלת, משתמשים יהיו חייבים להשתמש בהתנהגות ברירת המחדל שבה כל אתר פועל בתהליך משלו.
-      אם המדיניות מושבתת או לא מוגדרת, המשתמש יוכל לשנות את ההגדרה (למשל, הוא יוכל להשתמש בערך "השבתת בידוד של אתר" ב-chrome://flags).
-      </translation>
 <translation id="1767673020408652620">הפעלת המלצות על אפליקציות במצב אפס של תיבת החיפוש</translation>
 <translation id="17719159826324007">‏
       כשהמדיניות הזו מקבלת את הערך ArcSession, היא מאלצת הפעלה מחדש של המכשיר כשהמשתמש יוצא, אם Android הופעל.
@@ -2472,6 +2466,10 @@
       שים לב שלא מומלץ לעשות זאת, שכן הדבר עלול לאפשר עקיפה של תוסף ה-nameConstraints שמגביל את שמות המארחים שניתן להקצות לאישור מסוים.
 
       אם המדיניות לא הוגדרה, או אם הוגדרה ל-false, לא יינתן אמון באישורי שרת שאין בהם תוסף subjectAlternativeName שמכיל שם DNS או כתובת IP.</translation>
+<translation id="5578571772998293651">‏הפעלת משוב משתמשים.
+        אם המדיניות הזו הוגדרה כ-false, משתמשים לא יכולים לשלוח משוב ל-Google.
+
+        אם המדיניות לא הוגדרה, או הוגדרה כ-true, משתמשים יכולים לשלוח משוב ל-Google דרך התפריט -&gt; 'עזרה' -&gt; 'דיווח על בעיה', או באמצעות הקשה על שילוב מקשים.</translation>
 <translation id="5581292529942108810">‏הגדרת כללי מדיניות שקשורים ל-Chrome Reporting Extension.
 
       המדיניות הזו תקפה רק כאשר <ph name="CHROME_REPORTING_EXTENSION_NAME" /> מופעל, והמחשב רשום במדיניות <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3587,22 +3585,6 @@
 
           הערה: בשדה <ph name="MINUTE_FIELD_NAME" /> של <ph name="CHARGE_START_TIME_FIELD_NAME" /> ושל <ph name="CHARGE_END_TIME_FIELD_NAME" /> מותר להשתמש רק בערכים 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">הגדר את תכונות הנגישות של <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">‏המדיניות הזו מפעילה את HTTP/0.9 ביציאות שאינן 80 עבור HTTP או 443 עבור HTTPS.
-
-      מדיניות זו מושבתת כברירת מחדל. אם תפעיל אותה, המשתמשים יהיו חשופים לבעיית האבטחה https://crbug.com/600352.
-
-      מדיניות זו נועדה לאפשר לארגונים להעביר שרתים קיימים מ-HTTP/0.9, והיא תוסר בעתיד.
-
-      אם מדיניות זו לא הוגדרה, HTTP/0.9 יושבת ביציאות שאינן מוגדרות כברירת מחדל.</translation>
-<translation id="7726421241038987229">‏
-      באמצעות ההגדרה הזו, SitePerProcess, ניתן לחייב משתמשים להשתמש בהתנהגות ברירת המחדל שבה כל האתרים מבודדים. חשוב לזכור – ניתן להשתמש במדיניות IsolateOrigins כדי לבודד מקורות נוספים, ספציפיים יותר.
-      אם המדיניות הזו מופעלת, משתמשים יהיו חייבים להשתמש בהתנהגות ברירת המחדל שבה כל אתר פועל בתהליך משלו.
-      אם המדיניות מושבתת או לא מוגדרת, המשתמש יוכל להפסיק להשתמש בבידוד של אתר
-      (למשל, הוא יוכל להשתמש בערך "השבתת בידוד של אתר" ב-chrome://flags).  גם אם משביתים את המדיניות ו/או לא מגדירים אותה, התכונה 'בידוד של אתר' לא מושבתת.
-      ב-<ph name="PRODUCT_OS_NAME" />, מומלץ גם לקבוע את אותו ערך במדיניות המכשיר <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. אם בכל אחת משתי הגדרות המדיניות מצוין ערך אחר, ייתכן שהכניסה לסשן של משתמש תתעכב בזמן שהמערכת מיישמת את הערך שצוין במדיניות המשתמש.
-
-      הערה: המדיניות הזו לא רלוונטית ל-Android. כדי להפעיל את SitePerProcess ב-Android, משתמשים בהגדרת המדיניות SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">מתן הרשאה למכשירים להשתמש ב-<ph name="PLUGIN_VM_NAME" /> ב-<ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7749402620209366169">‏מאפשר אימות של שני גורמים עבור מארחים של גישה מרחוק במקום PIN שנקבע על ידי המשתמש.
 
@@ -3825,6 +3807,7 @@
       אם לא תגדיר מדיניות זו כלל, לא יהיו חריגים לרשימה השחורה מהמדיניות 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">אפשר למשתמש ארגוני להיות משתמש ראשי ומרובה-פרופילים בלבד (התנהגות ברירת המחדל עבור משתמשים המנוהלים על ידי ארגון)</translation>
 <translation id="8183108371184777472">מניעת הפתיחה של חלון דפדפן</translation>
+<translation id="8186911565834244165">הפעלת משוב משתמשים</translation>
 <translation id="8214600119442850823">מגדירה את מנהל הסיסמאות.</translation>
 <translation id="8217516105848565518">‏המדיניות הזו הוצאה משימוש. במקומה יש להשתמש במדיניות RemoteAccessHostDomainList.</translation>
 <translation id="8244171102276095471">‏הפעלה של חבילות הצפנה מסוג RC4 ב-TLS (אבטחת שכבת התעבורה)</translation>
@@ -4248,6 +4231,12 @@
 <translation id="9112897538922695510">‏מדיניות זו מאפשרת לך לציין רשימת גורמים מטפלים של פרוטוקול. זו יכולה להיות מדיניות מומלצת בלבד. המאפיין |protocol| צריך להיות מוגדר לסכימה כגון 'mailto' והמאפיין |url| צריך להיות מוגדר לתבנית ה-URL של האפליקציה המטפלת בסכימה. התבנית יכולה לכלול '%s', ואם הוא קיים, הוא יוחלף בכתובת ה-URL המטופלת.
 
           המטפלים של הפרוטוקול הרשומים על ידי המדיניות מתמזגים עם המטפלים הרשומים על ידי המשתמש ושניהם זמינים לשימוש. המשתמש יכול לעקוף את המטפלים של הפרוטוקול שהותקנו על ידי מדיניות על ידי התקנת מטפל חדש המשמש כברירת מחדל, אך אינו יכול להסיר מטפל של פרוטוקול הרשום על ידי מדיניות.</translation>
+<translation id="91196902572559194">‏המדיניות הזו מעניקה ל-Google Assistant הרשאה להקשיב כדי לזהות את ביטוי ההפעלה הקולית.
+
+      אם המדיניות מופעלת, Google Assistant יקשיב כדי לזהות את ביטוי ההפעלה הקולית.
+      אם המדיניות מושבתת, Google Assistant לא יקשיב כדי לזהות את ביטוי ההפעלה הקולית.
+      אם המדיניות לא הוגדרה, המשתמשים יכולים לקבוע אם לאפשר ל-Google Assistant להקשיב כדי לזהות את ביטוי ההפעלה הקולית.
+      </translation>
 <translation id="9123211093995421438">מציינת את המספר המינימלי של גרסאות קודמות של <ph name="PRODUCT_OS_NAME" /> שאפשר לחזור אליהן בכל שלב, החל מהגרסה היציבה.
 
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 1721b15..0500923 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -445,12 +445,6 @@
 
       ポリシーは、<ph name="PRODUCT_OS_NAME" /> による利用規約のダウンロードが可能な URL に設定する必要があります。利用規約はテキスト形式で、MIME タイプのプレーン テキストとして配信してください。マークアップ形式は使用できません。</translation>
 <translation id="1750315445671978749">すべてのダウンロードをブロックする</translation>
-<translation id="1762072363876276024">
-      このポリシーはログイン画面に適用されます。ユーザー セッションに適用される <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ポリシーもご覧になり、両方のポリシーを同じ値に設定することをおすすめします。値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。
-      この DeviceLoginScreenSitePerProcess 設定は、すべてのサイトが分離されるデフォルトの動作をユーザーが無効にできないようにする場合に使用します。発行元を追加してより細かく分離するには、DeviceLoginScreenIsolateOrigins ポリシーの利用もご検討ください。
-      このポリシーが有効に設定されている場合、ユーザーは、サイトが各自のプロセスで実行されるデフォルトの動作を無効にできません。
-      このポリシーが未設定または無効に設定されている場合、ユーザーはこの設定を変更できます(chrome://flags で「Disable site isolation」エントリを使用するなど)。
-      </translation>
 <translation id="1767673020408652620">検索ボックスが「ゼロ状態」のときにアプリのおすすめを有効にする</translation>
 <translation id="17719159826324007">
       このポリシーを「ArcSession」に設定すると、ユーザーのログアウト時に Android が起動していた場合に限り、デバイスの再起動が行われます。
@@ -2454,6 +2448,10 @@
       この場合、nameConstraints 拡張による制限(証明書を受け入れるホスト名の制限)が適用されなくなる可能性があるため、有効化はおすすめしません。
 
       このポリシーが未設定のままか false に設定されている場合、subjectAlternativeName 拡張がなく DNS 名または IP アドレスのいずれかを含むサーバー証明書は信頼されません。</translation>
+<translation id="5578571772998293651">ユーザーからのフィードバックを許可します。
+        このポリシーが false に設定されている場合、ユーザーは Google にフィードバックを送信できません。
+
+        このポリシーが未設定か true に設定されている場合、ユーザーはメニューの [ヘルプ] で [問題の報告] をクリックするか、ショートカット キーを押して、Google にフィードバックを送信できます。</translation>
 <translation id="5581292529942108810">Chrome レポート拡張機能に関するポリシーを設定します。
 
       このポリシーは、<ph name="CHROME_REPORTING_EXTENSION_NAME" /> が有効になっている場合にのみ有効です。また、マシンは <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> に登録されます。</translation>
@@ -3564,22 +3562,6 @@
 
           注: <ph name="CHARGE_START_TIME_FIELD_NAME" /> と <ph name="CHARGE_END_TIME_FIELD_NAME" /> の <ph name="MINUTE_FIELD_NAME" /> フィールドで指定できる値は 0、15、30、45 です。</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> のユーザー補助機能を設定します。</translation>
-<translation id="7724994675283793633">このポリシーは、80(HTTP)と 443(HTTPS)以外のポートで HTTP/0.9 を有効にするかどうかを指定するものです。
-
-      このポリシーはデフォルトでは無効です。有効にした場合、ユーザーは https://crbug.com/600352 に記載されているセキュリティの問題に晒されることになります。
-
-      このポリシーは、企業が既存のサーバーを HTTP/0.9 から移行するときに使用するためのものです。将来的には削除されます。
-
-      このポリシーが未設定の場合、HTTP/0.9 はデフォルト以外のポートでは無効になります。</translation>
-<translation id="7726421241038987229">
-      この SitePerProcess 設定は、すべてのサイトが分離されるデフォルトの動作をユーザーが無効にできないようにする場合に使用します。発行元を追加してより細かく分離するには、IsolateOrigins ポリシーの利用もご検討ください。
-      このポリシーが有効に設定されている場合、ユーザーは、サイトが各自のプロセスで実行されるデフォルトの動作を無効にできません。
-      このポリシーが未設定または無効に設定されている場合、ユーザーはサイト分離を無効にできます
-      (chrome://flags で「Disable site isolation」エントリを使用するなど)。  ポリシーを未設定または無効に設定しても、サイト分離はオフになりません。
-      <ph name="PRODUCT_OS_NAME" /> では、<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> デバイス ポリシーも同じ値に設定することをおすすめします。この 2 つのポリシーの値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。
-
-      注: このポリシーは Android には適用されません。Android で SitePerProcess を有効にするには、SitePerProcessAndroid ポリシーの設定を使用してください。
-      </translation>
 <translation id="7747447585227954402">デバイスが <ph name="PRODUCT_OS_NAME" /> で <ph name="PLUGIN_VM_NAME" /> を使用できるようにする</translation>
 <translation id="7749402620209366169">リモート アクセス ホストに、ユーザー指定の PIN の代わりに 2 段階認証プロセスを有効にします。
 
@@ -3802,6 +3784,7 @@
       このポリシーが未設定の場合、「URLBlacklist」ポリシーのブラックリストに対して例外は適用されません。</translation>
 <translation id="8176035528522326671">企業ユーザーがメインのマルチプロフィール ユーザーとしてのみ操作できるようにする(企業の管理対象ユーザーに対するデフォルトの動作)</translation>
 <translation id="8183108371184777472">ブラウザ ウィンドウの起動を抑制する</translation>
+<translation id="8186911565834244165">ユーザーからのフィードバックを許可する</translation>
 <translation id="8214600119442850823">パスワード マネージャを設定します。</translation>
 <translation id="8217516105848565518">このポリシーはサポートを終了しました。代わりに RemoteAccessHostDomainList を使用してください。</translation>
 <translation id="8244171102276095471">TLS の RC4 暗号スイートを有効にする</translation>
@@ -4232,6 +4215,12 @@
 <translation id="9112897538922695510">プロトコル ハンドラのリストを登録できます。これはあくまでも推奨のポリシーです。プロパティ |protocol| には「mailto」などのスキームを設定し、プロパティ |url| にはこのスキームを処理するアプリケーションの URL パターンを設定します。このパターンに「%s」を含めて、処理された URL に置き換えることもできます。
 
           ポリシーで登録されたプロトコル ハンドラは、ユーザーが登録したプロトコル ハンドラと統合され、両方とも使用可能になります。ユーザーは、新しいデフォルトのハンドラをインストールすることにより、ポリシーでインストールされたプロトコル ハンドラをオーバーライドできます。ただし、ポリシーで登録されたプロトコル ハンドラを削除することはできません。</translation>
+<translation id="91196902572559194">このポリシーでは、Google アシスタントで音声サービスの起動ワードを有効にするかどうかを指定します。
+
+      このポリシーを有効に設定した場合は、Google アシスタントで音声サービスの起動ワードが有効になります。
+      このポリシーを無効に設定した場合は、Google アシスタントで音声サービスの起動ワードが無効になります。
+      このポリシーが未設定の場合、Google アシスタントで音声サービスの起動ワードを有効にするかどうかをユーザーが指定できます。
+      </translation>
 <translation id="9123211093995421438">Stable バージョンから随時ロールバックできる <ph name="PRODUCT_OS_NAME" /> のマイルストーンの最小数を指定します。
 
       デフォルト値は、一般ユーザーの場合は 0、企業の登録済みデバイスの場合は 4(6 か月前後)となります。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index b684fb4..97f2c33f 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -416,12 +416,6 @@
     ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ, ಸೇವಾ ನಿಯಮಗಳನ್ನು ತೋರಿಸಲಾಗುವುದಿಲ್ಲ
 <ph name="PRODUCT_OS_NAME" /> ಸೇವಾ ನಿಯಮಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದ URL ಗೆ ನೀತಿಯನ್ನು ಹೊಂದಿಸಬೇಕು. MIME ವಿಧ ಪಠ್ಯ/ಸೇವಾ ನಿಯಮವು ಖಾಲಿ ಪಠ್ಯವಾಗಿರಬೇಕು,</translation>
 <translation id="1750315445671978749">ಎಲ್ಲ ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
-<translation id="1762072363876276024">
-      ಈ ಕಾರ್ಯನೀತಿಯು ಸೈನ್ ಇನ್ ಪರದೆಗೂ ಸಹ ಅನ್ವಯವಾಗುತ್ತದೆ. ಬಳಕೆದಾರ ಸೆಶನ್‌ಗೆ ಅನ್ವಯವಾಗುವಂತಹ <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ನೋಡಿ. ಎರಡೂ ಕಾರ್ಯನೀತಿಗಳನ್ನು ಒಂದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸುವಂತೆ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ ಕಾರ್ಯನೀತಿಯ ಮೂಲಕ ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವ ಸಂದರ್ಭದಲ್ಲಿ ಬಳಕೆದಾರ ಸೆಶನ್‌ಗೆ ಪ್ರವೇಶಿಸಲು ಸ್ವಲ್ಪ ವಿಳಂಬವಾಗಬಹುದು.
-      ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಸೈಟ್‌ಗಳಲ್ಲಿ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆಯ ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆಯಿಂದ ಹೊರಗುಳಿಯುವುದನ್ನು ತಡೆಯಲು ಈ DeviceLoginScreenSitePerProcess ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಬಹುದಾಗಿದೆ. ಹೆಚ್ಚುವರಿ, ಅತ್ಯುತ್ತಮ ಮೂಲಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುವುದಕ್ಕಾಗಿ, ಈ DeviceLoginScreenIsolateOrigins ಕಾರ್ಯನೀತಿಯು ಉಪಯುಕ್ತವಾಗಿರುತ್ತದೆ ಎಂಬುದು ನಿಮಗೆ ತಿಳಿದಿರಲಿ.
-      ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿಯೊಂದು ಸೈಟ್ ತನ್ನದೇ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿರುವಾಗ ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆಯಿಂದ ಹೊರಗುಳಿಯಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
-      ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಬಹುದು (ಉದಾ, chrome://flags ನಲ್ಲಿ "ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" ನಮೂದನ್ನು ಬಳಸುವುದು).
-      </translation>
 <translation id="1767673020408652620">ಹುಡುಕಾಟ ಬಾಕ್ಸ್‌ನ ಶೂನ್ಯ ಸ್ಥಿತಿಯಲ್ಲಿನ ಆ್ಯಪ್ ಶಿಫಾರಸುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="17719159826324007">
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ArcSession ಗೆ ಹೊಂದಿಸಿರುವಾಗ, ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಿದಾಗ Android ಪ್ರಾರಂಭಗೊಂಡರೆ, ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡುವಂತೆ ಒತ್ತಾಯಿಸುತ್ತದೆ.
@@ -2404,6 +2398,10 @@
       ಇದನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ, ಇದು ನೀಡಿದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಅಧಿಕೃತ ಮಾಡಬಹುದಾದ ಹೋಸ್ಟ್ ಹೆಸರುಗಳನ್ನು ನಿರ್ಬಂಧಿಸುವ nameConstraints ವಿಸ್ತರಣೆಯ ಬೈಪಾಸ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಬಹುದು.
 
       ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಅಥವಾ ತಪ್ಪಾಗಿ ಹೊಂದಿಸಿದ್ದರೆ, DNS ಹೆಸರು ಅಥವಾ IP ವಿಳಾಸವನ್ನು ಹೊಂದಿರುವ subjectAlternativeName ವಿಸ್ತರಣೆಯ ಕೊರತೆ ಹೊಂದಿರುವ ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಂಬಲಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="5578571772998293651">ಬಳಕೆದಾರರ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸಿ.
+        ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು Google ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
+
+        ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆಯೇ ಬಿಟ್ಟರೆ ಅಥವಾ ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಮೆನು-&gt;ಸಹಾಯ-&gt;ಸಮಸ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಿ ಅಥವಾ ಕೀ ಸಂಯೋಜನೆಯ ಮೂಲಕ ಬಳಕೆದಾರರು Google ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಬಹುದು.</translation>
 <translation id="5581292529942108810">Chrome ವರದಿಮಾಡುವಿಕೆಯ ವಿಸ್ತರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಕಾರ್ಯನೀತಿಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.
 
       ಈ ಕಾರ್ಯನೀತಿಯು, <ph name="CHROME_REPORTING_EXTENSION_NAME" /> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ ಮತ್ತು ಯಂತ್ರವನ್ನು <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಿದಾಗ ಮಾತ್ರ ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation>
@@ -3510,22 +3508,6 @@
 
           ಗಮನಿಸಿ: <ph name="MINUTE_FIELD_NAME" /> ಕ್ಷೇತ್ರಕ್ಕಾಗಿ <ph name="CHARGE_START_TIME_FIELD_NAME" /> ಮತ್ತು <ph name="CHARGE_END_TIME_FIELD_NAME" /> ನಲ್ಲಿ ಅನುಮತಿಸಿದ ಮೌಲ್ಯಗಳು ಹೀಗಿವೆ 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> ಪ್ರವೇಶದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation>
-<translation id="7724994675283793633">ಈ ನೀತಿಯು HTTP ಗೆ 80 ಮತ್ತು HTTPS ಗೆ 443 ಹೊರತುಪಡಿಸಿ HTTP/0.9 ಪೋರ್ಟ್‌ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.
-
-      ಈ ನೀತಿಯು ಡಿಫಾಲ್ಟ್ ಆಗಿ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ ಮತ್ತು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರನ್ನು ಸುರಕ್ಷತಾ ಸಮಸ್ಯೆಗೆ ಮುಕ್ತವಾಗಿಸುತ್ತದೆ https://crbug.com/600352.
-
-      ಈ ನೀತಿಯು ಪ್ರಸ್ತುತ ಸರ್ವರ್‌ಗಳಿಂದ HTTP/0.9 ಗೆ ವರ್ಗಾಯಿಸಲು ಉದ್ಯಮಗಳಿಗೆ ಒಂದು ಅವಕಾಶ ನೀಡಲು ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ತೆಗೆದುಹಾಕಲು ಉದ್ದೇಶಿಸಿದೆ.
-
-      ಈ ನೀತಿಯು ಹೊಂದಿಕೆಯಾಗದಿದ್ದಲ್ಲಿ, ಡಿಫಾಲ್ಟ್ ಅಲ್ಲದ ಪೋರ್ಟ್‌ಗಳಲ್ಲಿ HTTP/0.9 ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation>
-<translation id="7726421241038987229">
-      ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಸೈಟ್‌ಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುವ ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆಯಿಂದ ಹೊರಗುಳಿಯುವುದನ್ನು ತಡೆಯಲು ಈ SitePerProcess ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಬಹುದಾಗಿದೆ. ಹೆಚ್ಚುವರಿ, ಅತ್ಯುತ್ತಮ ಮೂಲಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುವುದಕ್ಕಾಗಿ, IsolateOrigins ಕಾರ್ಯನೀತಿಯು ಉಪಯುಕ್ತವಾಗಿರುತ್ತದೆ ಎಂಬುದು ನಿಮಗೆ ತಿಳಿದಿರಲಿ.
-      ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿಯೊಂದು ಸೈಟ್ ತನ್ನದೇ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿರುವಾಗ ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆಯಿಂದ ಹೊರಗುಳಿಯಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
-      ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರು ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಆಯ್ಕೆಯಿಂದ ಹೊರಗುಳಿಯಬಹುದು
-      (ಉದಾ, chrome://flags ನಲ್ಲಿ "ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" ನಮೂದನ್ನು ಬಳಸುವುದು).  ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು/ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಕಾರ್ಯನೀತಿಯು ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡುವುದಿಲ್ಲ.
-      <ph name="PRODUCT_OS_NAME" /> ರಲ್ಲಿ, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ಸಾಧನದ ಕಾರ್ಯನೀತಿಯನ್ನು ಒಂದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸುವಂತೆ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. ಎರಡು ಕಾರ್ಯನೀತಿಗಳ ಮೂಲಕ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿರುವ ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ ಕಾರ್ಯನೀತಿಯ ಮೂಲಕ ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವ ಸಂದರ್ಭದಲ್ಲಿ ಬಳಕೆದಾರ ಸೆಶನ್‌ಗೆ ಪ್ರವೇಶಿಸುತ್ತಿರುವಾಗ ಸ್ವಲ್ಪ ವಿಳಂಬವಾಗಬಹುದು.
-
-      ಗಮನಿಸಿ: ಈ ಕಾರ್ಯನೀತಿಯು Android ಗೆ ಅನ್ವಯವಾಗುವುದಿಲ್ಲ. Android ನಲ್ಲಿ SitePerProcess ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, SitePerProcessAndroid ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಿ.
-      </translation>
 <translation id="7747447585227954402"><ph name="PRODUCT_OS_NAME" /> ನಲ್ಲಿ <ph name="PLUGIN_VM_NAME" /> ಬಳಸಲು ಸಾಧನಗಳನ್ನು ಅನುಮತಿಸಿ</translation>
 <translation id="7749402620209366169">ಬಳಕೆದಾರ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ PIN ಬದಲಿಗೆ ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್‌ಗಳಿಗಾಗಿ ಎರಡು ಅಂಶದ ಪ್ರಮಾಣೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.
 
@@ -3747,6 +3729,7 @@
       ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿರದಿದ್ದರೆ 'URLBlacklist' ನೀತಿಯಿಂದ ಕಪ್ಪುಪಟ್ಟಿಗೆ ಯಾವುದೇ ವಿನಾಯಿತಿಗಳಿರುವುದಿಲ್ಲ.</translation>
 <translation id="8176035528522326671">ಎಂಟರ್‌ಪ್ರೈಸ್ ಬಳಕೆದಾರರನ್ನು ಪ್ರಾಥಮಿಕ ಬಹುಪ್ರೊಫೈಲ್ ಬಳಕೆದಾರ ಮಾತ್ರ ಎಂಬಂತೆ ಅನುಮತಿಸಿ (ಎಂಟರ್‌ಪ್ರೈಸ್-ನಿರ್ವಹಣೆಯ ಬಳಕೆದಾರರಿಗಾಗಿ ಡಿಫಾಲ್ಟ್ ನಡವಳಿಕೆ)</translation>
 <translation id="8183108371184777472">ಬ್ರೌಸರ್ ವಿಂಡೋ ಪ್ರಾರಂಭಿಸುವುದನ್ನು ನಿಗ್ರಹಿಸಿ</translation>
+<translation id="8186911565834244165">ಬಳಕೆದಾರರ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸಿ</translation>
 <translation id="8214600119442850823">ಪಾಸ್‌ವರ್ಡ್ ಮ್ಯಾನೇಜರ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="8217516105848565518">ಈ ನೀತಿಯನ್ನು ಅಸಮ್ಮತಿಸಲಾಗಿದೆ. ಬದಲಿಗೆ RemoteAccessHostDomainList ಅನ್ನು ಬಳಸಿ.</translation>
 <translation id="8244171102276095471">TLS ನಲ್ಲಿ RC4 ಸೈಪರ್ ಸ್ಯೂಟ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
@@ -4144,6 +4127,12 @@
 <translation id="9112897538922695510">ಪ್ರೋಟೋಕಾಲ್ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಂದಾಯಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಶಿಫಾರಸು ಮಾಡಿರುವ ನೀತಿ ಮಾತ್ರವೇ ಆಗಿರಬಹುದು. ಗುಣಲಕ್ಷಣದ |ಪ್ರೋಟೋಕಾಲ್| 'mailto' ಎಂಬ ಯೋಜನೆಗೆ ಹೊಂದಿಸಿರಬೇಕು ಮತ್ತು ಯೋಜನೆಯನ್ನು ನಿರ್ವಹಿಸುವಂತಹ ಅಪ್ಲಿಕೇಶನ್‌ನ URL ನಮೂನೆಗೆ ಗುಣಲಕ್ಷಣದ |url| ಅನ್ನು ಹೊಂದಿಸಿರಬೇಕು. ನಮೂನೆಯು '%s' ಅನ್ನು ಒಳಗೊಂಡಿರಬಹುದು, ಇದು ಪ್ರದರ್ಶನಗೊಂಡರೆ ನಿರ್ವಹಣಾ URL ಮೂಲಕ ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ.
 
           ನೀತಿಯ ಮೂಲಕ ನೋಂದಾಯಿಸಿರುವ ಪ್ರೋಟೋಕಾಲ್ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳನ್ನು ಬಳಕೆದಾರರು ನೋಂದಾಯಿಸಿರುವ ಹ್ಯಾಂಡ್ಲರ್ ಜೊತೆಗೆ ವಿಲೀನಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಎರಡೂ ಬಳಕೆಗೆ ಲಭ್ಯವಿರುತ್ತವೆ. ಬಳಕೆದಾರರು ಹೊಸ ಡಿಫಾಲ್ಟ್ ಹ್ಯಾಂಡ್ಲರ್ ಸ್ಛಾಪಿಸುವುದರ ಮೂಲಕ ನೀತಿಯ ಮುಖೇನ ಸ್ಥಾಪಿಸಲಾಗಿರುವ ಪ್ರೋಟೋಕಾಲ್ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳನ್ನು ಅತಿಕ್ರಮಿಸಬಹುದು, ಆದರೆ ನೀತಿಯ ಮುಖೇನ ನೋಂದಾಯಿಸಿರುವ ಪ್ರೋಟೋಕಾಲ್ ಹ್ಯಾಂಡ್ಲರ್ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
+<translation id="91196902572559194">ಈ ಕಾರ್ಯನೀತಿಯು ಧ್ವನಿ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ನುಡಿಗಟ್ಟನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳಲು Google ಅಸಿಸ್ಟೆಂಟ್‌ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ.
+
+      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, Google ಅಸಿಸ್ಟೆಂಟ್ ಧ್ವನಿ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ನುಡಿಗಟ್ಟನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳುತ್ತದೆ.
+      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, Google ಅಸಿಸ್ಟೆಂಟ್ ಧ್ವನಿ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ನುಡಿಗಟ್ಟನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ.
+      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, Google ಅಸಿಸ್ಟೆಂಟ್ ಧ್ವನಿ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ನುಡಿಗಟ್ಟನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳುವುದನ್ನು ಅನುಮತಿಸಲು ಬಳಕೆದಾರರು ನಿರ್ಧರಿಸಬಹುದು.
+      </translation>
 <translation id="9123211093995421438">ಸ್ಥಿರ ಆವೃತ್ತಿಯಿಂದ ಪ್ರಾರಂಭಿಸಿ, ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಅನುಮತಿಸಬೇಕಾದ <ph name="PRODUCT_OS_NAME" /> ಮೈಲಿಗಲ್ಲುಗಳ ಹಿಂತಿರುಗುವಿಕೆಯ ಕನಿಷ್ಠ ಸಂಖ್ಯೆಯನ್ನು ಇದು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.
 
       ಗ್ರಾಹಕರಿಗಾಗಿ ಡಿಫಾಲ್ಟ್ 0 ಆಗಿದ್ದರೆ, ಎಂಟರ್‌ಪ್ರೈಸ್ ನೋಂದಾಯಿತ ಸಾಧನಗಳಿಗಾಗಿ 4 (ಸುಮಾರು ಅರ್ಧ ವರ್ಷ) ಆಗಿದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 4925001..708466bea 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -450,12 +450,6 @@
 
       정책은 <ph name="PRODUCT_OS_NAME" />에서 서비스 약관을 다운로드할 수 있는 URL로 설정되어야 합니다. 서비스 약관은 일반 텍스트여야 하며 MIME 유형 text/plain으로 제공됩니다. 마크업은 허용되지 않습니다.</translation>
 <translation id="1750315445671978749">모든 다운로드 차단</translation>
-<translation id="1762072363876276024">
-      이 정책은 로그인 화면에 적용됩니다. 사용자 세션에 적용되는 <ph name="SITE_PER_PROCESS_POLICY_NAME" /> 정책도 확인하세요. 두 정책을 동일한 값으로 설정하는 것이 좋습니다. 값이 일치하지 않을 경우 사용자 세션을 입력할 때 지연이 발생할 수 있으며 사용자 정책에서 지정된 값이 적용됩니다.
-      DeviceLoginScreenSitePerProcess 설정을 사용해 사용자가 기본 동작인 전체 사이트 격리를 선택 해제하지 못하도록 할 수 있습니다. 추가로 세분화된 출처를 격리하는 경우 DeviceLoginScreenIsolateOrigins 정책도 유용합니다.
-      이 정책이 사용 설정되면 모든 사이트가 자체 프로세스로 작동하는 기본 동작을 사용자가 선택 해제할 수 없습니다.
-      이 정책이 구성되지 않거나 사용 중지되면 사용자가 설정을 변경할 수 있습니다(예: chrome://flags에서 '사이트 격리 사용 중지' 항목 사용).
-      </translation>
 <translation id="1767673020408652620">검색창이 0 상태일 때 앱 추천을 사용 설정합니다.</translation>
 <translation id="17719159826324007">
       이 정책을 ArcSession으로 설정하면 Android 시작 후 사용자가 로그아웃한 경우 기기가 강제로 재부팅됩니다.
@@ -2550,6 +2544,10 @@
       이는 권장되지 않습니다. 이를 통해 특정 인증서만 승인되며 호스트 이름을 제한하는 nameConstraints 확장 필드를 우회할 수 있기 때문입니다.
 
       이 정책을 설정하지 않거나 false로 설정되면 subjectAlternativeName 확장 필드가 누락되어 있으며 DNS 이름이나 IP 주소가 포함된 서버 인증서를 신뢰하지 않습니다.</translation>
+<translation id="5578571772998293651">사용자 의견을 허용합니다.
+        정책을 False로 설정하면 사용자가 Google에 의견을 제출할 수 없습니다.
+
+        정책을 설정하지 않거나 True로 설정하면 사용자가 메뉴-&gt;도움말-&gt;문제 신고로 이동하거나 키 조합을 사용하여 Google에 의견을 보낼 수 있습니다.</translation>
 <translation id="5581292529942108810">Chrome 보고 확장 프로그램 관련 정책을 구성합니다.
 
       이 정책은 <ph name="CHROME_REPORTING_EXTENSION_NAME" />이(가) 사용 설정되어 있고 기기가 <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />에 등록되어 있는 경우에만 적용됩니다.</translation>
@@ -3707,22 +3705,6 @@
 
           참고: <ph name="CHARGE_START_TIME_FIELD_NAME" /> 및 <ph name="CHARGE_END_TIME_FIELD_NAME" />의 <ph name="MINUTE_FIELD_NAME" /> 필드에 허용된 값은 0, 15, 30, 45입니다.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> 접근성 기능을 구성합니다.</translation>
-<translation id="7724994675283793633">이 정책은 HTTP:80 및 HTTPS:443이 아닌 포트에서 HTTP/0.9를 사용합니다.
-
-      이 정책은 기본적으로 중지되어 있으며 사용 설정할 경우 사용자가 보안 문제(https://crbug.com/600352)에 노출됩니다.
-
-      이 정책은 기업이 HTTP/0.9에서 기존 서버를 이전하도록 돕는 데 목적이 있으며 이후에 삭제됩니다.
-
-      이 정책이 설정되지 않으면 기본 포트가 아닌 포트에서 HTTP/0.9가 중지됩니다.</translation>
-<translation id="7726421241038987229">
-      SitePerProcess 설정을 사용해 사용자가 기본 동작인 전체 사이트 격리를 선택 해제하지 못하도록 할 수 있습니다. 추가로 세분화된 출처를 격리하는 경우 IsolateOrigins 정책도 유용합니다.
-      이 정책이 사용 설정되면 모든 사이트가 자체 프로세스로 작동하는 기본 동작을 사용자가 선택 해제할 수 없습니다.
-      이 정책이 구성되지 않거나 사용 중지되면 사용자가 사이트 격리를 선택 해제할 수 있습니다.
-      (예: chrome://flags에서 '사이트 격리 사용 중지' 항목 사용).  정책을 구성하지 않거나 사용 중지함으로 설정해도 사이트 격리가 사용 중지되지 않습니다.
-      <ph name="PRODUCT_OS_NAME" />의 경우 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 기기 정책을 같은 값으로 설정하는 것이 좋습니다. 두 정책에서 지정된 값이 일치하지 않을 경우, 사용자 세션을 입력할 때 지연이 발생할 수 있으며 사용자 정책에서 지정된 값이 적용됩니다.
-
-      참고: 이 정책은 Android에는 적용되지 않습니다. Android에서 SitePerProcess를 사용하도록 설정하려면 SitePerProcessAndroid 정책 설정을 사용하세요.
-      </translation>
 <translation id="7747447585227954402">기기가 <ph name="PRODUCT_OS_NAME" />에서 <ph name="PLUGIN_VM_NAME" />을(를) 사용하도록 허용합니다.</translation>
 <translation id="7749402620209366169">사용자 지정 PIN 대신 원격 액세스 호스트에 대한 2단계 인증을 사용하도록 설정합니다.
 
@@ -3951,6 +3933,7 @@
       이 정책을 설정하지 않는 경우 'URLBlacklist' 정책의 차단 목록에 예외가 적용되지 않습니다.</translation>
 <translation id="8176035528522326671">기업 사용자에게 기본 멀티 프로필 사용자만 허용(기업에서 관리하는 사용자에 대한 기본 동작임)</translation>
 <translation id="8183108371184777472">브라우저 창 실행 억제</translation>
+<translation id="8186911565834244165">사용자 의견 허용</translation>
 <translation id="8214600119442850823">비밀번호 관리자를 구성합니다.</translation>
 <translation id="8217516105848565518">이 정책은 지원이 중단되었습니다. RemoteAccessHostDomainList를 사용하세요.</translation>
 <translation id="8244171102276095471">TLS에서 RC4 암호화 기술을 사용 설정합니다.</translation>
@@ -4393,6 +4376,12 @@
 <translation id="9112897538922695510">프로토콜 핸들러 목록을 등록할 수 있도록 허용합니다. 추천 정책만 될 수 있습니다. |protocol| 속성은 'mailto'와 같은 스키마로 설정해야 하며 |url| 속성은 스키마를 처리하는 애플리케이션의 URL 패턴으로 설정해야 합니다. 패턴에 '%s'를 포함할 수 있으며, 포함할 경우 이 기호는 처리된 URL로 교체됩니다.
 
           정책에 의해 등록된 프로토콜 핸들러는 사용자가 등록한 핸들러와 통합되며 두 가지 모두 사용 가능합니다. 사용자는 새로운 기본 핸들러를 설치함으로써 정책에 의해 설치된 프로토콜 핸들러를 덮어쓸 수 있지만 정책에 의해 등록된 프로토콜 핸들러를 삭제할 수는 없습니다.</translation>
+<translation id="91196902572559194">이 정책은 Google 어시스턴트에 음성 활성화 문구를 감지할 권한을 부여합니다.
+
+      정책을 사용 설정하면 Google 어시스턴트가 음성 활성화 문구를 감지합니다.
+      정책을 사용 중지하면 Google 어시스턴트가 음성 활성화 문구를 감지하지 않습니다.
+      정책을 설정하지 않으면 Google 어시스턴트가 음성 활성화 문구를 감지하도록 허용할지 사용자가 결정할 수 있습니다.
+      </translation>
 <translation id="9123211093995421438">정식 버전부터 항상 허용되어야 하는 <ph name="PRODUCT_OS_NAME" />의 최소 주요 롤백 수를 지정합니다.
 
       기본값은 소비자의 경우 0이며, 엔터프라이즈 등록 기기의 경우 4(약 반년)입니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index 395f44c..4100e58 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -451,12 +451,6 @@
 
       Politika turėtų būti nustatyta į URL, kuriuo „<ph name="PRODUCT_OS_NAME" />“ gali atsisiųsti paslaugų teikimo sąlygas. Paslaugų teikimo sąlygas turi sudaryti paprastasis tekstas, pateiktas kaip MIME tipo tekstas / paprastasis tekstas. Neleidžiamas joks žymėjimas.</translation>
 <translation id="1750315445671978749">Blokuoti visus atsisiuntimus</translation>
-<translation id="1762072363876276024">
-      Ši politika taikoma prisijungimo ekranui. Taip pat peržiūrėkite politiką „<ph name="SITE_PER_PROCESS_POLICY_NAME" />“, taikomą naudotojo seansui. Rekomenduojama nustatyti vienodas abiejų politikos nuostatų vertes. Jei vertės nesutaps, pradedant naudotojo seansą galima delsa, kol bus pritaikyta naudotojo politikos nurodyta vertė.
-      Šis nustatymas („DeviceLoginScreenSitePerProcess“) gali būti naudojamas norint neleisti naudotojams atsisakyti numatytosios elgsenos – izoliuoti visas svetaines. Atminkite, kad politika „DeviceLoginScreenSitePerProcess“ taip pat gali būti naudinga, jei reikia izoliuoti papildomus smulkesnius šaltinius.
-      Jei politika įgalinta, naudotojai negalės atsisakyti numatytosios elgsenos, kai vykdomi atskiri kiekvienos svetainės procesai.
-      Jei politika nesukonfigūruota ar išjungta, naudotojai galės pakeisti šį nustatymą (pvz., įrašydami „Išjungti svetainių izoliavimą“ adresu chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Įgalinamos programos rekomendacijos tuščiame paieškos laukelyje</translation>
 <translation id="17719159826324007">
       Kai ši politika nustatyta kaip „ArcSession“, įrenginys priverstinai paleidžiamas iš naujo naudotojui atsijungus (jei „Android“ paleista).
@@ -3710,22 +3704,6 @@
 
           Pastaba: leidžiamos lauko „<ph name="MINUTE_FIELD_NAME" />“ vertės laukuose „<ph name="CHARGE_START_TIME_FIELD_NAME" />“ ir „<ph name="CHARGE_END_TIME_FIELD_NAME" />“ yra 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfigūruokite „<ph name="PRODUCT_OS_NAME" />“ pasiekiamumo funkcijas.</translation>
-<translation id="7724994675283793633">Ši politika įgalina HTTP/0.9 protokolą ne HTTP 80 ir HTTPS 443 prievaduose.
-
-      Politika pagal numatytuosius nustatymus neleidžiama, o ją įgalinus naudotojai gali susidurti su saugos problema, aprašyta adresu https://crbug.com/600352.
-
-      Politikos tikslas – suteikti įmonėms galimybę perkelti esamus serverius, naudojančius HTTP/0.9 protokolą, ir ateityje ji bus pašalintą.
-
-      Jei politika nenustatyta, nenumatytuose prievaduose HTTP/0.9 protokolas bus išjungtas.</translation>
-<translation id="7726421241038987229">
-      Šis nustatymas („SitePerProcess“) gali būti naudojamas norint neleisti naudotojams atsisakyti numatytosios elgsenos – izoliuoti visas svetaines. Atminkite, kad politika „IsolateOrigins“ taip pat gali būti naudinga, jei reikia izoliuoti papildomus smulkesnius šaltinius.
-      Jei politika įgalinta, naudotojai negalės atsisakyti numatytosios elgsenos, kai vykdomi atskiri kiekvienos svetainės procesai.
-      Jei politika nesukonfigūruota ar išjungta, naudotojai galės atsisakyti svetainių izoliavimo
-      (pvz., įrašydami „Išjungti svetainių izoliavimą“ adresu chrome://flags).  Nustačius politiką kaip išjungtą ir (arba) jos nesukonfigūravus, svetainių izoliavimas neišjungiamas.
-      Sistemoje „<ph name="PRODUCT_OS_NAME" />“ rekomenduojama taip pat nustatyti tokią pačią „<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />“ įrenginio politikos vertę. Jei abiejų politikos nuostatų nurodytos vertės nesutampa, pradedant naudotojo seansą galima delsa, kol pritaikoma naudotojo politikos vertė.
-
-      PASTABA: ši politika netaikoma „Android“. Norėdami įgalinti „SitePerProcess“ sistemoje „Android“, naudokite politikos nustatymą „SitePerProcessAndroid“.
-      </translation>
 <translation id="7747447585227954402">Leidimas įrenginiams naudoti „<ph name="PLUGIN_VM_NAME" />“ sistemoje „<ph name="PRODUCT_OS_NAME" />“</translation>
 <translation id="7749402620209366169">Įgalinamas nuotolinės prieigos prieglobų autentifikavimas dviem veiksniais vietoje naudotojo (-os) nurodyto PIN kodo naudojimo.
 
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index cd30551..d71989e 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -439,12 +439,6 @@
 
       Politikā ir jāiestata vietrādis URL, kur operētājsistēma <ph name="PRODUCT_OS_NAME" /> var lejupielādēt pakalpojumu sniegšanas noteikumus. Tiem ir jābūt rakstītiem kā vienkāršam tekstam, kas jārāda kā MIME veids “teksts/vienkāršs”. Iezīmēšana nav atļauta.</translation>
 <translation id="1750315445671978749">Bloķēt visas lejupielādes</translation>
-<translation id="1762072363876276024">
-      Šī politika attiecas uz pierakstīšanās ekrānu. Lūdzu, skatiet arī politiku <ph name="SITE_PER_PROCESS_POLICY_NAME" />, kas attiecas uz lietotāja sesiju. Ieteicams abām politikām iestatīt vienādu vērtību. Ja vērtības nebūs vienādas, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikas vērtība.
-      Šo politikas DeviceLoginScreenSitePerProcess iestatījumu var izmantot, lai neatļautu lietotājiem atteikties no noklusējuma rīcības — visu vietņu izolēšanas. Ņemiet vērā, ka politika DeviceLoginScreenIsolateOrigins var būt noderīga papildu detalizētāku vietņu izolēšanai.
-      Ja politika ir iespējota, lietotāji nevarēs atteikties no noklusējuma rīcības, kad katrai vietnei tiek izpildīts atsevišķs process.
-      Ja politika nav konfigurēta vai ir atspējota, lietotājs varēs mainīt iestatījumu (piemēram, izmantojot ierakstu “Atspējot vietnes izolēšanu” vietnē chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Iespējot lietotņu ieteikumus meklēšanas lodziņa nulles stāvoklī</translation>
 <translation id="17719159826324007">
       Kad šai politikai ir iestatīta vērtība “ArcSession”, tā liek ierīcei veikt atkārtotu palaišanu pēc lietotāja izrakstīšanās, ja operētājsistēma Android ir sākusi darbu.
@@ -3682,22 +3676,6 @@
 
           Piezīme. Atļautās vērtības laukam <ph name="MINUTE_FIELD_NAME" /> sadaļās <ph name="CHARGE_START_TIME_FIELD_NAME" /> un <ph name="CHARGE_END_TIME_FIELD_NAME" /> ir 0, 15, 30 un 45.</translation>
 <translation id="7717938661004793600">Konfigurējiet <ph name="PRODUCT_OS_NAME" /> pieejamības funkcijas.</translation>
-<translation id="7724994675283793633">Šī politika iespējo protokolu HTTP/0.9 portos, kas nav 80 (HTTP) un 443 (HTTPS).
-
-      Šī politika pēc noklusējuma ir atspējota. Ja tā tiek iespējota, lietotājiem var rasties drošības problēma: https://crbug.com/600352.
-
-      Šī politika ir paredzēta uzņēmumiem, kas vēlas migrēt esošos serverus no HTTP/0.9, un tā tiks noņemta.
-
-      Ja šī politika nav iestatīta, protokols HTTP/0.9 tiks atspējots portos, kas nav noklusējuma porti.</translation>
-<translation id="7726421241038987229">
-      Šis politikas SitePerProcess iestatījums var tikt izmantots, lai neatļautu lietotājiem atteikties no noklusējuma rīcības — visu vietņu izolēšanas. Ņemiet vērā, ka politika IsolateOrigins var būt noderīga arī papildu detalizētāku vietņu izolēšanai.
-      Ja politika ir iespējota, lietotāji nevarēs atteikties no noklusējuma rīcības, kad katrai vietnei tiek izpildīts atsevišķs process.
-      Ja politika nav konfigurēta vai ir atspējota, lietotājs varēs atteikties no vietnes izolācijas
-      (piemēram, izmantojot ierakstu “Atspējot vietnes izolēšanu” vietnē chrome://flags).  Atspējojot politiku un/vai nekonfigurējot politiku, vietnes izolācija netiek izslēgta.
-      Operētājsistēmā <ph name="PRODUCT_OS_NAME" /> šādu vērtību ieteicams iestatīt arī ierīces politikai <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Ja abām politikām iestatītās vērtības nav vienādas, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikas vērtība.
-
-      PIEZĪME. Šī politika neattiecas uz operētājsistēmu Android. Lai politiku SitePerProcess iespējotu operētājsistēmā Android, izmantojiet politikas SitePerProcessAndroid iestatījumu.
-      </translation>
 <translation id="7747447585227954402">Atļauj ierīcēm izmantot spraudni <ph name="PLUGIN_VM_NAME" /> produktā <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7749402620209366169">Iespējo divu faktoru autentifikāciju attālās piekļuves saimniekdatoriem, nevis izmanto lietotāja norādītu PIN.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 73cbee4..9ed2e18 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -424,12 +424,6 @@
 
       <ph name="PRODUCT_OS_NAME" />-ന് സേവന നിബന്ധനകൾ ഡൗൺലോഡ് ചെയ്യാനാകുന്ന രീതിയിൽ നയം ഒരു URL-ൽ സജ്ജീകരിക്കുക. സേവന നിബന്ധനകൾ MIME തര വാചകമോ/സാധാരണ വാചകമോ ആയി പ്രവർത്തിക്കാനാകുന്ന സാധാരണ വാചകമായിരിക്കണം. മാർക്കപ്പ് അനുവദിക്കില്ല.</translation>
 <translation id="1750315445671978749">എല്ലാ ഡൗൺലോഡുകളും ബ്ലോക്കുചെയ്യുക</translation>
-<translation id="1762072363876276024">
-      ഈ നയം സൈൻ ഇൻ സ്ക്രീനിന് ബാധകമാണ്. ഉപയോക്തൃ സെഷന് ബാധകമാകുന്ന <ph name="SITE_PER_PROCESS_POLICY_NAME" /> നയം കൂടി കാണുക. രണ്ട് നയങ്ങളും ഒരേ മൂല്യത്തിൽ സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് കാലതാമസം നേരിട്ടേക്കാം.
-      DeviceLoginScreenSitePerProcess എന്ന ഈ ക്രമീകരണം, എല്ലാ സൈറ്റുകളും മാറ്റി നിർത്തുന്ന ഡിഫോൾട്ട് പ്രവർത്തനരീതി ഒഴിവാക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കാതിരിക്കാൻ ഉപയോഗിച്ചേക്കാം. വളരെ മികച്ച അധിക ഉറവിടങ്ങൾ മാറ്റിനിർത്താൻ DeviceLoginScreenIsolateOrigins നയം പ്രയോജനപ്പെട്ടേക്കാം എന്ന കാര്യം ശ്രദ്ധിക്കുക.
-      നയം പ്രവർത്തനക്ഷമമാണെങ്കിൽ, ഓരോ സൈറ്റും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യുന്ന ഡിഫോൾട്ട് പ്രവർത്തനരീതി ഒഴിവാക്കാൻ ഉപയോക്താക്കൾക്ക് കഴിയില്ല.
-      നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ പ്രവർത്തനരഹിതമാണെങ്കിലോ, ഉപയോക്താവിന് ഈ ക്രമീകരണം മാറ്റാനാവും (ഉദാ, chrome://flags എന്നതിൽ "സൈറ്റ് ഐസൊലേഷൻ പ്രവർത്തനരഹിതമാക്കുക" ഉപയോഗിക്കുന്നതിലൂടെ).
-      </translation>
 <translation id="1767673020408652620">സെർച്ച് ബോക്‌സിൻ്റെ സീറോ സ്‌റ്റേറ്റിൽ ആപ്പ് നിർദ്ദേശങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="17719159826324007">
       ഈ നയം ArcSession എന്ന് സജ്ജീകരിക്കുമ്പോൾ, Android ആരംഭിച്ചിട്ടുണ്ടെങ്കിൽ ഉപയോക്താവ് സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ ഉപകരണം നിർബന്ധിതമായി റീബൂട്ട് ചെയ്യുന്നു.
@@ -2499,6 +2493,10 @@
       നൽകിയിരിക്കുന്ന സർട്ടിഫിക്കറ്റുകൾക്ക് അംഗീകാരമുണ്ടായേക്കാവുന്ന ഹോസ്‌റ്റ് നാമങ്ങളെ നിയന്ത്രിക്കുന്ന nameConstraints വിപുലീകരണത്തെ ബൈപാസ് ചെയ്യാൻ അനുവദിക്കാനിടയുള്ളതിനാൽ, ഇത് ശുപാർശ ചെയ്യുന്നില്ല എന്നകാര്യം ശ്രദ്ധിക്കുക.
 
       ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ തെറ്റ് എന്ന് സജ്ജമാക്കുകയാണെങ്കിലോ, ഒരു DNS പേരോ IP വിലാസമോ ഉൾപ്പെട്ടിരിക്കുന്ന subjectAlternativeName ലഭ്യമല്ലാത്ത സെർവർ സർട്ടിഫിക്കറ്റുകളെ വിശ്വസ്‌തമായി കണക്കാക്കില്ല.</translation>
+<translation id="5578571772998293651">ഉപയോക്തൃ ഫീഡ്‌ബാക്ക് അനുവദിക്കുക.
+        നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താക്കൾക്ക് Google-ലേക്ക് ഫീഡ്ബാക്ക് അയയ്‌ക്കാനാവില്ല.
+
+        നയം സജ്ജീകരിച്ചത് മാറ്റുകയോ ശരി എന്ന് സജ്ജീകരിക്കുകയോ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, മെനു-&gt;സഹായം-&gt;പ്രശ്‌നം റിപ്പോർട്ട് ചെയ്യുക അല്ലെങ്കിൽ കീ കോമ്പിനേഷൻ എന്നതിലൂടെ ഉപയോക്താക്കൾക്ക് Google-ലേക്ക് ഫീഡ്ബാക്ക് അയയ്‌ക്കാം.</translation>
 <translation id="5581292529942108810">Chrome റിപ്പോർട്ട് ചെയ്യൽ വിപുലീകരണവുമായി ബന്ധപ്പെട്ട നയങ്ങൾ കോൺഫിഗർ ചെയ്യുക.
 
       <ph name="CHROME_REPORTING_EXTENSION_NAME" /> പ്രവർത്തനക്ഷമമാക്കുകയും മെഷീൻ <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> എന്നതിൽ എൻറോൾ ചെയ്‌തിരിക്കുമ്പോഴും മാത്രമേ ഈ നയം പ്രാബല്യത്തിൽ വരൂ.</translation>
@@ -3629,22 +3627,6 @@
 
          ശ്രദ്ധിക്കുക: <ph name="MINUTE_FIELD_NAME" /> ഫീൽഡിന് <ph name="CHARGE_START_TIME_FIELD_NAME" />, <ph name="CHARGE_END_TIME_FIELD_NAME" /> എന്നിവയിൽ അനുവദിച്ചിരിക്കുന്ന മൂല്യങ്ങൾ 0, 15, 30, 45 എന്നിവയാണ്.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> ഉപയോഗസഹായി സവിശേഷതകൾ കോൺഫിഗർ ചെയ്യുക.</translation>
-<translation id="7724994675283793633">HTTP-യ്‌ക്കായി 80-ഉം HTTPS-ന് 443-ഉം ഉപയോഗിക്കുന്നത് ഒഴിവാക്കി ഈ നയം പോർട്ടുകളിൽ HTTP/0.9 പ്രവർത്തനക്ഷമമാക്കുന്നു.
-
-      ഡിഫോൾട്ടായി ഈ നയം പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു, എന്നാലത് പ്രവർത്തനക്ഷമമാക്കിയാൽ ഉപയോക്താക്കൾക്ക് https://crbug.com/600352 സുരക്ഷാ പ്രശ്‌നം ഉണ്ടാക്കുന്നതിനിടയാക്കുന്നു.
-
-      ഈ നയം HTTP/0.9 ൽ നിന്ന് നിലവിലെ സെർവറുകളെ മൈഗ്രേറ്റ് ചെയ്യുന്നതിന് എന്റർപ്രൈസുകൾക്ക് അവസരം നൽകുന്നതിനെ ഉദ്ദേശിച്ചുള്ളതാണ്.
-
-      ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ടല്ലാത്ത പോർട്ടുകളിൽ HTTP/0.9 പ്രവർത്തനരഹിതമാകും.</translation>
-<translation id="7726421241038987229">
-      SitePerProcess എന്ന ഈ ക്രമീകരണം, എല്ലാ സൈറ്റുകളെയും മാറ്റി നിർത്തുന്ന ഡിഫോൾട്ട് പ്രവർത്തനരീതി ഒഴിവാക്കാൻ ഉപയോക്താക്കൾ ശ്രമിക്കുമ്പോൾ അവരെ അതിന് അനുവദിക്കാതിരിക്കാൻ ഉപയോഗിച്ചേക്കാം. വളരെ മികച്ച അധിക ഉറവിടങ്ങൾ മാറ്റിനിർത്താൻ IsolateOrigins നയം പ്രയോജനപ്പെട്ടേക്കാം എന്ന കാര്യം ശ്രദ്ധിക്കുക.
-      നയം പ്രവർത്തനക്ഷമമാണെങ്കിൽ, ഓരോ സൈറ്റും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യുന്ന ഡിഫോൾട്ട് പ്രവർത്തനരീതി ഒഴിവാക്കാൻ ഉപയോക്താക്കൾക്ക് കഴിയില്ല.
-      നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ പ്രവർത്തനരഹിതമാണെങ്കിലോ, സൈറ്റ് ഐസൊലേഷൻ ഒഴിവാക്കാൻ ഉപയോക്താക്കൾക്ക് കഴിയും
-      (ഉദാ, chrome://flags എന്നതിൽ "സൈറ്റ് ഐസൊലേഷൻ പ്രവർത്തനരഹിതമാക്കൽ" ഉപയോഗിക്കുന്നതിലൂടെ).  നയം പ്രവർത്തനരഹിതമാക്കി സജ്ജീകരിക്കുന്നതിലൂടെ ഒപ്പം/അല്ലെങ്കിൽ നയം കോൺഫിഗർ ചെയ്യാതിരിക്കുന്നതിലൂടെ സൈറ്റ് ഐസൊലേഷൻ ഓഫാകില്ല.
-      <ph name="PRODUCT_OS_NAME" />-ൽ <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ഉപകരണ നയവും അതേ മൂല്യത്തിലേക്ക് സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. രണ്ട് നയങ്ങൾ മുഖേന വ്യക്തമാക്കപ്പെടുന്ന മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് കാലതാമസം നേരിട്ടേക്കാം.
-
-      ശ്രദ്ധിക്കുക: ഈ നയം Android-ൽ ബാധകമല്ല. Android-ൽ SitePerProcess പ്രവർത്തനക്ഷമമാക്കാൻ, SitePerProcessAndroid നയ ക്രമീകരണം ഉപയോഗിക്കുക.
-      </translation>
 <translation id="7747447585227954402"><ph name="PRODUCT_OS_NAME" /> എന്നതിൽ ഒരു <ph name="PLUGIN_VM_NAME" /> ഉപയോഗിക്കാൻ ഉപകരണങ്ങളെ അനുവദിക്കുക.</translation>
 <translation id="7749402620209366169">വിദൂര ആക്‌സസ് ഹോസ്റ്റുകൾക്ക് ഉപയോക്തൃ-നിർദ്ദിഷ്‌ട PIN-ന് പകരമായി രണ്ട് ഘട്ട പരിശോധിച്ചുറപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുന്നു.
 
@@ -3874,6 +3856,7 @@
       ഈ നയം സജ്ജമാക്കിയില്ലെങ്കിൽ 'URLBlacklist' നയത്തിൽ നിന്നും ഒഴിവാക്കലുകളൊന്നും ഉണ്ടാകില്ല.</translation>
 <translation id="8176035528522326671">എന്റർപ്രൈസ് ഉപയോക്താവിനെ പ്രാഥമിക മൾട്ടിപ്രൊഫൈൽ ഉപയോക്താവായി മാത്രം അനുവദിക്കുക (എന്റർപ്രൈസ് മാനേജ് ചെയ്യുന്ന ഉപയോക്താക്കൾക്കായുള്ള ഡിഫോൾട്ട് പെരുമാറ്റരീതി)</translation>
 <translation id="8183108371184777472">ബ്രൗസർ വിൻഡോ സമാരംഭിക്കുന്നത് നിയന്ത്രിക്കുക</translation>
+<translation id="8186911565834244165">ഉപയോക്തൃ ഫീഡ്‌ബാക്ക് അനുവദിക്കുക</translation>
 <translation id="8214600119442850823">പാസ്‌വേഡ് മാനേജർ കോൺഫിഗർ ചെയ്യുന്നു.</translation>
 <translation id="8217516105848565518">ഈ നയം അവസാനിപ്പിച്ചിരിക്കുന്നു. പകരം RemoteAccessHostDomainList ഉപയോഗിക്കുക.</translation>
 <translation id="8244171102276095471">TLS-ൽ RC4 സൈഫർ സ്യൂട്ടുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
@@ -4287,6 +4270,12 @@
 <translation id="9112897538922695510">പ്രോട്ടോക്കോൾ ഹാന്‍ഡ്‌ലറുകളുടെ ഒരു ലിസ്‌റ്റ് രജിസ്റ്റര്‍ ചെയ്യാൻ നിങ്ങളെ അനിവദിക്കുന്നു. ഇതൊരു ശുപാർശ ചെയ്‌തിരിക്കുന്ന നയം മാത്രമായിരിക്കും. പ്രോപ്പർട്ടി |protocol|, 'mailto' എന്നതുപോലെയുള്ള സ്‌കീമിലേക്ക് സജ്ജമാക്കിയിരിക്കണം ഒപ്പം പ്രോപ്പർട്ടി |url|, സ്കീം കൈകാര്യംചെയ്യുന്ന ആപ്പിന്‍റെ URL പാറ്റേണിലേക്ക് സജ്ജമാക്കിയിരിക്കണം. '%s' നിലവിലുണ്ടെങ്കിലും പാറ്റേണിൽ അത് ഉൾപ്പെട്ടിരിക്കാം, ഒപ്പം അത് നിയന്ത്രിത URL ഉപയോഗിച്ച് മാറ്റി പകരം വയ്‌ക്കും.
 
           നയം രജിസ്റ്റര്‍ ചെയ്ത പ്രോട്ടോക്കോൾ ഹാന്‍ഡ്‌ലറുകൾ ഉപയോക്താവ് രജിസ്‌റ്റർ ചെയ്തവയോട് ലയിക്കുന്നു ഒപ്പം രണ്ടും ഉപയോഗിക്കാനായി ലഭ്യമാകുകയും ചെയ്യുന്നു. നയം ഇൻസ്റ്റാൾ ചെയ്‌ത പ്രോട്ടോക്കോൾ ഹാന്‍ഡ്‌ലറുകളെ ഉപയോക്താവിന് പുതിയ ഒരു ഡിഫോൾട്ട് ഹാൻഡ്‌ലർ ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതിലൂടെ അസാധുവാക്കാനാകും, എന്നാൽ നയം രജിസ്‌റ്റർ ചെയ്ത ഒരു പ്രോട്ടോക്കോൾ ഹാന്‍ഡ്‌ലർ നീക്കം ചെയ്യാനാകില്ല.</translation>
+<translation id="91196902572559194">ഈ നയം Google അസിസ്‌റ്റന്റിന് വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാൻ അനുമതി നൽകുന്നു.
+
+      നയം പ്രവർത്തനക്ഷമമാണെങ്കിൽ, Google അസിസ്‌റ്റന്റിന് വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാനാകും.
+      നയം പ്രവർത്തനരഹിതമാണെങ്കിൽ, Google അസിസ്‌റ്റന്റിന് വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാനാവില്ല.
+      നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, Google അസിസ്‌റ്റന്റിന് വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാൻ അനുവദിക്കണോ എന്ന് ഉപയോക്താക്കൾക്ക് തീരുമാനിക്കാം.
+      </translation>
 <translation id="9123211093995421438">സുസ്ഥിര പതിപ്പിൽ നിന്ന് ഏത് സമയത്തും കുറഞ്ഞത് എത്ര <ph name="PRODUCT_OS_NAME" /> നാഴികക്കല്ലുകൾ തിരികെ പോകാൻ അനുവദിക്കണമെന്നത് വ്യക്തമാക്കുന്നു.
 
       ഉപഭോക്താക്കൾക്കുള്ള ഡിഫോൾട്ട്, പൂജ്യവും എന്റർപ്രൈസ് എൻറോൾ ചെയ്തിരിക്കുന്ന ഉപകരണങ്ങൾക്ക് നാലും (ഏകദേശം ആറു മാസം) ആണ്.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 3635fe9..197f46ed 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -423,12 +423,6 @@
 
       धोरण एका URL वर सेट केले जावे ज्यावरून <ph name="PRODUCT_OS_NAME" /> सेवा अटी डाउनलोड करू शकते. MIME प्रकारच्या मजकूर/साध्या रुपात दिलेल्या सेवा अटी ह्या साधा मजकूर असणे आवश्यक आहे. कोणत्याही मार्कअपला अनुमती नाही.</translation>
 <translation id="1750315445671978749">सर्व डाउनलोड ब्लॉक करा</translation>
-<translation id="1762072363876276024">
-      हे धोरण साइन-इन स्क्रीनला लागू होते. कृपया वापरकर्ता सेशनला लागू होणारे <ph name="SITE_PER_PROCESS_POLICY_NAME" /> धोरण देखील पाहा. दोन्ही धोरणे समान मूल्यांवर सेट करण्याची शिफारस करण्यात येेते. मूल्ये जुळत नसल्यास, वापरकर्ता धोरणाद्वारे नमूद केलेले मूल्य लागू करत असताना वापरकर्ता सेशनमध्ये प्रवेश करताना विलंब होऊ शकतो.
-      हे सेटिंग, DeviceLoginScreenSitePerProcess, वापरकर्त्यांना सर्व साइट वेगळे करण्याच्या डीफॉल्ट वर्तनातून निवड रद्द करण्याची अनुमती नाकारण्यासाठी वापरले जाऊ शकते. लक्षात ठेवा की, DeviceLoginScreenIsolateOrigins धोरण हे अतिरिक्त फाईनर-ग्रेन्ड ओरिजिन वेगळे करण्यासाठी उपयुक्त असू शकते.
-      धोरण सुरू केल्यास, प्रत्येक साइट तिची स्वत:ची प्रक्रिया रन करते तेथे वापरकर्त्याला निवड रद्द करण्याच्या डीफॉल्ट वर्तनातून बाहेर पडता येणार नाही.
-      धोरण कॉन्फिगर केले नसल्यास किंवा बंद केले असल्यास, वापरकर्ता साइट आयसोलेशनमधून बाहेर पडू शकतो (उदा. chrome://flags मध्ये "साइट आयसोलेशन करणे बंद करा" एन्ट्री वापरून).
-      </translation>
 <translation id="1767673020408652620">सर्च बॉक्सच्या झिरो स्टेट मध्ये अ‍ॅप शिफारशी सुरू करा</translation>
 <translation id="17719159826324007">
       हे धोरण, ArcSession वर सेट केल्यावर, Android सुरू झाल्यास वापरकर्त्याने साइन आउट केल्यावर डिव्हाइसला सक्तीने रीबूट करायला लावते.
@@ -2505,6 +2499,10 @@
       लक्षात ठेवा की, दिलेले सर्टिफिकेट ज्यासाठी ऑप्टीमाइझ केले जाऊ शकते त्या होस्टनावांना प्रतिबंधित करणार्‍या nameConstraints एक्स्टेंशनस बायपास करण्यास कदाचित हे अनुमती देत असल्याने याची शिफारस केली जात नाही.
 
       हे धोरण सेट केले नसल्यास किंवा असत्य वर सेट केले असल्यास, subjectAlternativeName एक्स्टेंशन नसलेल्या एक DNS नाव किंवा IP अॅड्रेस असलेल्या सर्व्हर सर्टिफिकेटांवर विश्वास ठेवला जाणार नाही.</translation>
+<translation id="5578571772998293651">वापरकर्ता फीडबॅकला अनुमती द्या.
+        धोरण असत्यवर सेट केल्यास, वापरकर्ते Google ला फीडबॅक पाठवू शकत नाहीत.
+
+        धोरण सेट केले नसल्यास किंवा सत्यवर सेट केल्यास, वापरकर्ते मेनू-&gt;मदत-&gt; समस्येची तक्रार करा वापरून किंवा की काँबिनेशन वापरून Google ला फीडबॅक पाठवू शकतात.</translation>
 <translation id="5581292529942108810">Chrome रिपोर्टिंग एक्स्टेंशनशी संबंधित धोरणे कॉन्फिगर करा.
 
       हे धोरण फक्त <ph name="CHROME_REPORTING_EXTENSION_NAME" /> सुरू केलेले असताना आणि मशीनची <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> सह नोंदणी केलेली असताना प्रभावी असते.</translation>
@@ -3620,21 +3618,6 @@
 
           टीप: <ph name="CHARGE_START_TIME_FIELD_NAME" /> आणि <ph name="CHARGE_END_TIME_FIELD_NAME" /> मध्ये <ph name="MINUTE_FIELD_NAME" /> भागासाठी अनुमती असलेल्या संख्या ०, १५, ३०, ४५ आहेत.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> अॅक्सेस करता येणारी वैशिष्ट्ये कॉन्फिगर करा.</translation>
-<translation id="7724994675283793633">हे धोरण HTTP साठी 80 आणि HTTPS साठी 443 च्या व्यतिरिक्त पोर्टवर HTTP/0.9 सुरू करते.
-
-      हे धोरण बाय डीफॉल्ट बंद केलेले आहे आणि सक्षम केल्यास, वापरकर्त्यांना सुरक्षा समस्या https://crbug.com/600352 मध्ये तसेच ठेवते.
-
-      या धोरणाचा हेतू संस्थांना HTTP/0.9 च्या विद्यमान सर्व्हर्सच्या बाहेर स्थलांतरित करण्याची संधी देणे आहे आणि भविष्यात काढले जाईल.
-      हे धोरण सेट न केल्यास, डीफॉल्ट नसलेल्या पोर्टवर HTTP/0.9 बंद केले जाईल.</translation>
-<translation id="7726421241038987229">
-      हे सेटिंग, SitePerProcess, वापरकर्त्यांना सर्व साइट वेगळे करण्याच्या डीफॉल्ट वर्तनातून निवड रद्द करण्याची अनुमती नाकारण्यासाठी वापरले जाऊ शकते. लक्षात ठेवा की, IsolateOrigins धोरण हे अतिरिक्त फाईनर-ग्रेन्ड ओरिजिन वेगळे करण्यासाठी उपयुक्त असू शकते.
-      धोरण सुरू केल्यास, प्रत्येक साइट तिची स्वत:ची प्रक्रिया रन करते तेथे वापरकर्त्याला निवड रद्द करण्याच्या डीफॉल्ट वर्तनातून बाहेर पडता येणार नाही.
-      धोरण कॉन्फिगर केले नसल्यास किंवा बंद केले असल्यास, वापरकर्ता साइट आयसोलेशनमधून बाहेर पडू शकतो 
-(उदा. chrome://flags मध्ये "साइट आयसोलेशन बंद करा" एन्ट्री वापरून).  धोरण बंद करणे आणि/किंवा धोरण कॉन्फिगर न केल्याने साइट आयसोलेशन बंद होत नाही.
-      <ph name="PRODUCT_OS_NAME" /> वर, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> डिव्हाइस धोरण त्याच मूल्यावर सेट करण्याची शिफारस केली जाते. दोन धोरणांद्वारे नमूद केलेली मूल्ये जुळत नसल्यास, वापरकर्ता धोरणाद्वारे नमूद केलेले मूल्य लागू करत असताना वापरकर्ता सेशनमध्ये प्रवेश करताना विलंब होऊ शकतो.
-
-      टीप: हे धोरण Android वर लागू होत नाही. SitePerProcess Android वर सुरू करण्यासाठी, SitePerProcessAndroid धोरण सेटिंग वापरा.
-      </translation>
 <translation id="7747447585227954402">डिव्हाइसना <ph name="PRODUCT_OS_NAME" /> वर <ph name="PLUGIN_VM_NAME" /> वापरण्याची अनुमती द्या</translation>
 <translation id="7749402620209366169">वापरकर्ता-नमूद पिन  च्या जागी रिमोट अॅक्सेस होस्ट टू-फॅक्टर अॉथेंटिकेशन सक्षम करते.
 
@@ -3859,6 +3842,7 @@
       हे धोरण सेट न केल्यास 'URLBlacklist' धोरणामधील ब्लॅकलिस्टवर कोणतेही एक्सपेशन नसतील.</translation>
 <translation id="8176035528522326671">केवळ प्राथमिक एकाधिकप्रोफाईल वापरकर्ता होण्यासाठी एंटरप्राइझ वापरकर्त्यास अनुमती द्या (एंटरप्राइझ-व्यवस्थापित वापरकर्त्यांसाठी डीफॉल्ट वर्तन)</translation>
 <translation id="8183108371184777472">ब्राउझर विंडो लाँच करणे थांबवा</translation>
+<translation id="8186911565834244165">वापरकर्ता फीडबॅकला अनुमती द्या</translation>
 <translation id="8214600119442850823">पासवर्ड व्यवस्थापक कॉन्फिगर करते.</translation>
 <translation id="8217516105848565518">हे धोरण बहिष्कृत केले आहे. कृपया त्याऐवजी RemoteAccessHostDomainList वापरा.</translation>
 <translation id="8244171102276095471">TLS मध्ये RC4 सायफर संच सुरू करा</translation>
@@ -4268,6 +4252,12 @@
 <translation id="9112897538922695510">प्रोटोकॉल हँडलरच्या सूचीची नोंदणी करण्यास तुम्हाला अनुमती देते. हे केवळ एक शिफारस केलेले धोरण असू शकते. गुणधर्म |protocol| 'mailto' सारख्या योजनेवर सेट केला जावा आणि गुणधर्माने |url| स्कीम हाताळणार्‍या ॲप्लिकेशनाचा URL नमुना सेट करावा. नमुना '%s' समाविष्ट करू शकतो, जे प्रस्तुत केल्यास हाताळलेल्या URL द्वारे रिप्लेस केली जाईल.
 
           धोरणाद्वारे नोंदणीकृत प्रोटोकॉल हँडलर वापरकर्त्याद्वारे नोंदणी केलेल्या एकासह विलीन केले जातात आणि वापरण्यासाठी दोन्ही उपलब्ध असतात. वापरकर्ता एक नवीन डीफॉल्ट हँडलर इंस्टॉल करून धोरणाद्वारे प्रोटोकॉल हँडलर ओव्हरराइड करू शकतो, परंतु धोरणाद्वारे नोंदणीकृत प्रोटोकॉल हँडलर काढू शकत नाही.</translation>
+<translation id="91196902572559194">हे धोरण Google असिस्टंट ला व्हॉइस अ‍ॅक्टिव्हेशन वाक्य ऐकण्याची परवानगी देते.
+
+      धोरण सुरू केल्यास, Google असिस्टंट व्हॉइस अ‍ॅक्टिव्हेशन वाक्य ऐकेल.
+      धोरण बंद केल्यास, Google असिस्टंट व्हॉइस अ‍ॅक्टिव्हेशन वाक्य ऐकणार नाही.
+      धोरण सेट केले नसल्यास, Google असिस्टंट ने व्हॉइस अॅक्टिव्हेशन वाक्य ऐकावे की नाही हे वापरकर्ते ठरवू शकतात.
+      </translation>
 <translation id="9123211093995421438"><ph name="PRODUCT_OS_NAME" /> माइलस्टोन रोलबॅकची किमान संख्या नमूद करण्यासाठी कधीही स्थिर आवृत्तीपासून सुरुवात करण्यास अनुमती देणे आवश्यक आहे
 
       ग्राहकासाठी डीफॉल्ट शून्य आहे, तर एंटरप्राइझ नोंंदणी केलेल्या डिव्हाइससाठी चार (अंदाजे सहा महिने) आहे.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index a60d948..e00bd0f4 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -450,12 +450,6 @@
 
       Dasar ini harus ditetapkan kepada URL yang <ph name="PRODUCT_OS_NAME" /> boleh gunakan untuk memuat turun Syarat Perkhidmatan. Syarat Perkhidmatan mestilah dalam teks biasa, bertindak sebagai teks jenis MIME/biasa. Penanda tidak dibenarkan.</translation>
 <translation id="1750315445671978749">Sekat semua muat turun</translation>
-<translation id="1762072363876276024">
-      Dasar ini terpakai kepada skrin log masuk. Sila lihat juga dasar <ph name="SITE_PER_PROCESS_POLICY_NAME" /> yang terpakai kepada sesi pengguna. Anda disyorkan agar menetapkan kedua-dua dasar kepada nilai yang sama. Jika nilai tidak sepadan, kelewatan mungkin berlaku apabila memasuki sesi pengguna semasa nilai yang ditentukan oleh dasar pengguna sedang digunakan.
-      Tetapan ini, DeviceLoginScreenSitePerProcess, boleh digunakan untuk menghalang pengguna menarik diri daripada gelagat lalai yang mengasingkan semua tapak. Sila ambil perhatian bahawa dasar DeviceLoginScreenIsolateOrigins mungkin turut berguna untuk mengasingkan asalan tambahan yang lebih terperinci.
-      Jika dasar ini didayakan, pengguna tidak akan dapat menarik diri daripada gelagat lalai, iaitu setiap tapak berjalan dalam prosesnya sendiri.
-      Jika dasar ini tidak dikonfigurasikan atau dilumpuhkan, pengguna akan dapat menukar tetapan ini (mis. menggunakan masukan "Lumpuhkan pengasingan tapak" dalam chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Dayakan Cadangan Apl dalam Keadaan Sifar Kotak Carian</translation>
 <translation id="17719159826324007">
       Jika Android telah dimulakan, dasar ini akan memaksa peranti untuk but semula apabila pengguna log keluar jika dasar ditetapkan kepada ArcSession.
@@ -3706,22 +3700,6 @@
 
           Nota: nilai yang dibenarkan untuk medan <ph name="MINUTE_FIELD_NAME" /> dalam <ph name="CHARGE_START_TIME_FIELD_NAME" /> dan <ph name="CHARGE_END_TIME_FIELD_NAME" /> ialah 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfigurasi ciri kebolehcapaian <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Dasar ini mendayakan HTTP/0.9 pada port selain 80 untuk HTTP dan 443 untuk HTTPS.
-
-      Dasar ini dilumpuhkan secara lalai dan jika didayakan akan menyebabkan pengguna terdedah kepada isu keselamatan https://crbug.com/600352.
-
-      Dasar ini bertujuan untuk memberikan pihak syarikat peluang memindahkan pelayan sedia ada yang menggunakan HTTP/0.9 dan akan dialih keluar pada masa hadapan.
-
-      Jika dasar ini tidak ditetapkan, HTTP/0.9 akan dilumpuhkan pada port bukan lalai.</translation>
-<translation id="7726421241038987229">
-      Tetapan ini, SitePerProcess, boleh digunakan untuk melarang pengguna menarik diri daripada gelagat lalai yang mengasingkan semua tapak Sila ambil perhatian bahawa dasar IsolateOrigins juga mungkin berguna untuk mengasingkan asalan tambahan yang lebih terperinci.
-      Jika dasar ini didayakan, pengguna tidak akan dapat menarik diri daripada gelagat lalai, iaitu setiap tapak berjalan dalam prosesnya sendiri.
-      Jika dasar ini tidak dikonfigurasikan atau dilumpuhkan, pengguna akan dapat menarik diri daripada pengasingan tapak
-      (mis. menggunakan masukan "Lumpuhkan pengasingan tapak" dalam chrome://flags).  Tindakan menetapkan dasar ini kepada dilumpuhkan dan/atau tidak mengkonfigurasikan dasar ini tidak akan mematikan Pengasingan Tapak.
-      Pada <ph name="PRODUCT_OS_NAME" />, anda juga disyorkan agar menetapkan dasar peranti <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> kepada nilai yang sama. Jika nilai yang ditetapkan oleh dua dasar tersebut tidak sepadan, kelewatan mungkin berlaku apabila memasuki sesi pengguna semasa nilai yang ditentukan oleh dasar pengguna sedang digunakan.
-
-      NOTA: Dasar ini tidak terpakai kepada Android. Untuk mendayakan SitePerProcess pada Android, gunakan tetapan dasar SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Benarkan peranti menggunakan <ph name="PLUGIN_VM_NAME" /> pada <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Mendayakan pengesahan dua faktor untuk hos akses jauh dan bukan PIN yang ditentukan pengguna.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index d2def75..34dcf4a 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -447,12 +447,6 @@
 
       Het beleid moet op een URL worden ingesteld vanaf waar de Servicevoorwaarden door <ph name="PRODUCT_OS_NAME" /> kunnen worden gedownload. De Servicevoorwaarden moeten platte tekst zijn die als tekst met MIME-type/plat wordt weergegeven. Er is geen opmaak toegestaan.</translation>
 <translation id="1750315445671978749">Alle downloads blokkeren</translation>
-<translation id="1762072363876276024">
-      Dit beleid is van toepassing op het inlogscherm. Raadpleeg ook het beleid <ph name="SITE_PER_PROCESS_POLICY_NAME" /> dat van toepassing is op de gebruikerssessie. Het wordt aangeraden beide beleidsregels in te stellen op dezelfde waarde. Als de waarden niet overeenkomen, kan er een vertraging optreden bij het starten van een gebruikerssessie terwijl de waarde wordt toegepast die is gespecificeerd door het gebruikersbeleid.
-      Deze instelling, DeviceLoginScreenSitePerProcess, kan worden gebruikt om gebruikers niet toe te staan het standaardgedrag uit te schakelen waarbij alle sites worden geïsoleerd. Het beleid DeviceLoginScreenIsolateOrigins kan ook handig zijn voor het isoleren van aanvullende, gedetailleerdere herkomsten.
-      Als het beleid is ingeschakeld, kunnen gebruikers het standaardgedrag niet uitschakelen waarbij elke site wordt uitgevoerd in een eigen proces.
-      Als het beleid niet is geconfigureerd of is uitgeschakeld, kan de gebruiker deze instelling wijzigen (bijvoorbeeld met 'Disable site isolation' ('Site-isolatie uitschakelen) in chrome://flags).
-      </translation>
 <translation id="1767673020408652620">App-aanbevelingen inschakelen voor de nulstatus van het zoekvak</translation>
 <translation id="17719159826324007">
       Wanneer dit beleid is ingesteld op ArcSession, wordt het apparaat gedwongen opnieuw opgestart na het uitloggen van een gebruiker als Android is gestart.
@@ -3675,22 +3669,6 @@
 
           Opmerking: Toegestane waarden voor het veld <ph name="MINUTE_FIELD_NAME" /> in <ph name="CHARGE_START_TIME_FIELD_NAME" /> en <ph name="CHARGE_END_TIME_FIELD_NAME" /> zijn 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Toegankelijkheidsfuncties van <ph name="PRODUCT_OS_NAME" /> configureren.</translation>
-<translation id="7724994675283793633">Met dit beleid wordt HTTP/0.9 ingeschakeld voor poorten anders dan poort 80 voor HTTP en poort 443 voor HTTPS.
-
-      Dit beleid is standaard uitgeschakeld. Als dit is ingeschakeld, hebben gebruikers te maken met het volgende beveiligingsprobleem: https://crbug.com/600352.
-
-      Dit beleid is bedoeld om ondernemingen de kans te geven bestaande servers over te zetten naar iets anders dan HTTP/0.9. Het beleid zal in de toekomst worden verwijderd.
-
-      Als dit beleid niet is ingesteld, wordt HTTP/0.9 uitgeschakeld voor niet-standaardpoorten.</translation>
-<translation id="7726421241038987229">
-      Deze instelling, SitePerProcess, kan worden gebruikt om gebruikers niet toe te staan het standaardgedrag uit te schakelen waarbij alle sites worden geïsoleerd. Het beleid IsolateOrigins kan ook handig zijn om aanvullende, gedetailleerdere herkomsten te isoleren.
-      Als het beleid is ingeschakeld, kunnen gebruikers het standaardgedrag niet uitschakelen waarbij elke site wordt uitgevoerd in een eigen proces.
-      Als het beleid niet is geconfigureerd of is uitgeschakeld, kan de gebruiker de site-isolatie uitschakelen
-      (bijvoorbeeld met 'Disable site isolation' ('Site-isolatie uitschakelen) in chrome://flags).  Wanneer je dit beleid instelt op uitgeschakeld en/of het beleid niet configureert, wordt site-isolatie niet uitgeschakeld.
-      Voor <ph name="PRODUCT_OS_NAME" /> raden we aan het apparaatbeleid <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ook in te stellen op dezelfde waarde. Als de waarden die zijn opgegeven in de twee beleidsregels niet overeenkomen, kan er een vertraging optreden bij het starten van een gebruikerssessie terwijl de waarde wordt toegepast die is gespecificeerd door het gebruikersbeleid.
-
-      OPMERKING: Dit beleid is niet van toepassing op Android. Als je SitePerProcess wilt inschakelen op Android, gebruik je de beleidsinstelling SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Toestaan dat apparaten een <ph name="PLUGIN_VM_NAME" /> gebruiken op <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Hiermee schakel je authenticatie in twee stappen in plaats van een door de gebruiker gedefinieerde pincode in voor hosts voor externe toegang.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index b66498c..aa84e48 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -433,12 +433,6 @@
 
       Denne innnstillingen må konfigureres med en nettadresse der <ph name="PRODUCT_OS_NAME" /> kan laste ned vilkårene. Vilkårene må være i ren tekst, levert som MIME-typen tekst/ren. Det er ikke tillatt med koding.</translation>
 <translation id="1750315445671978749">Blokkér alle nedlastinger</translation>
-<translation id="1762072363876276024">
-      Denne regelen gjelder påloggingsskjermen. Se også regelen <ph name="SITE_PER_PROCESS_POLICY_NAME" />, som gjelder brukerøkten. Det anbefales å sette begge reglene til samme verdi. Hvis reglene har ulike verdier, kan det medføre at oppstart av brukerøkter blir forsinket mens verdien som spesifiseres av brukerregelen, tas i bruk.
-      Denne innstillingen (DeviceLoginScreenSitePerProcess) kan brukes til å nekte brukere å velge bort standardfunksjonaliteten, som er å isolere alle nettsteder. Merk at DeviceLoginScreenIsolateOrigins-regelen også kan være nyttig for å isolere flere, mer finkornede opprinnelser.
-      Hvis regelen er slått på, kan ikke brukerne velge bort standardfunksjonaliteten der alle nettsteder kjører i sine egne prosesser.
-      Hvis regelen er slått av eller ikke er konfigurert, kan brukeren velge bort nettstedsisolering (f.eks. ved å bruke oppføringen «Slå av nettstedsisolering» i chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Slå på appanbefalinger i nulltilstanden for søkefeltet</translation>
 <translation id="17719159826324007">
       Hvis denne regelen er satt til ArcSession og Android har startet, tvinges enheten til å starte på nytt når brukeren logger av.
@@ -2502,6 +2496,10 @@
       Vær oppmerksom på at dette ikke anbefales, ettersom det gjør det mulig å omgå nameConstraints-utvidelsen som begrenser vertsnavnene et gitt sertifikat kan autoriseres for
 
       Hvis denne innstillingen ikke angis, eller hvis den angis som «false» (usann), klareres ikke tjenersertifikater som mangler en subjectAlternativeName-utvidelse og har enten et DNS-navn eller en IP-adresse.</translation>
+<translation id="5578571772998293651">Tillat brukertilbakemeldinger.
+        Hvis regelen er satt til «false» (usann), kan brukere ikke sende tilbakemeldinger til Google.
+
+        Hvis regelen er satt til «true» (sann) eller ikke er angitt, kan brukere sende tilbakemeldinger til Google via Meny-&gt;Hjelp-&gt;Rapportér et problem eller en tastekombinasjon.</translation>
 <translation id="5581292529942108810">Konfigurer regler knyttet til Chrome Reporting Extension.
 
       Disse reglene gjelder bare når <ph name="CHROME_REPORTING_EXTENSION_NAME" /> er slått på og maskinen er registrert med <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3642,21 +3640,6 @@
 
           Merk: Tillatte verdier for <ph name="MINUTE_FIELD_NAME" />-feltet i <ph name="CHARGE_START_TIME_FIELD_NAME" /> og <ph name="CHARGE_END_TIME_FIELD_NAME" /> er 0, 15, 30 og 45.</translation>
 <translation id="7717938661004793600">Konfigurer tilgjengelighetfunksjonene for <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Denne regelen slår på HTTP/0.9 for andre porter enn 80 for HTTP og 443 for HTTPS.
-
-      Denne regelen er slått av som standard. Hvis den slås på, kan brukere bli eksponert for følgende sikkerhetsproblem: https://crbug.com/600352.
-
-      Denne regelen åpner for at bedrifter kan migrere eksisterende tjenere fra HTTP/0.9, og kommer til å bli fjernet i fremtiden.
-
-      Hvis regelen ikke er angitt, slås HTTP/0.9 av for andre porter enn standardportene.</translation>
-<translation id="7726421241038987229">
-      Denne innstillingen (SitePerProcess) kan brukes til å nekte brukere å velge bort standardatferden, som er å isolere alle nettsteder. Merk at regelen IsolateOrigins også kan være nyttig for å isolere flere, mer finkornede opprinnelser.
-      Hvis regelen er slått på, kan ikke brukerne velge bort standardfunksjonaliteten der alle nettsteder kjører i sine egne prosesser.
-      Hvis regelen er slått av eller ikke er konfigurert, kan brukeren velge bort nettstedsisolering (f.eks. ved å bruke oppføringen «Slå av nettstedsisolering» i chrome://flags).  Nettstedsisolering slås ikke av selv om du slår av regelen og/eller ikke konfigurerer den.
-      På <ph name="PRODUCT_OS_NAME" /> anbefales det også å sette enhetsregelen <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />til samme verdi. Hvis disse to reglene har ulike verdier, kan det medføre at oppstart av brukerøkter blir forsinket mens verdien som spesifiseres av brukerregelen, tas i bruk.
-
-      MERK: Denne regelen gjelder ikke på Android. For å slå på SitePerProcess på Android, bruk regelinnstillingen SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">La enheter bruke en <ph name="PLUGIN_VM_NAME" /> på <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Aktiverer to-delt autentisering for verter med ekstern adgang i stedet for brukerangitt PIN-kode.
 
@@ -3877,6 +3860,7 @@
       Hvis denne retningslinjen ikke angis, er det ingen unntak fra retningslinjen URLBlacklist.</translation>
 <translation id="8176035528522326671">Tillat at bedriftsbrukeren bare er primær flerprofilbruker (standardatferd for bedriftsadministrerte brukere)</translation>
 <translation id="8183108371184777472">Hindre åpning av nettleservinduet</translation>
+<translation id="8186911565834244165">Tillat brukertilbakemeldinger</translation>
 <translation id="8214600119442850823">Konfigurerer passordlagring.</translation>
 <translation id="8217516105848565518">Denne regelen er avviklet. Bruk RemoteAccessHostDomainList i stedet.</translation>
 <translation id="8244171102276095471">Slå på RC4-chifferserier i TLS</translation>
@@ -4299,6 +4283,12 @@
 <translation id="9112897538922695510">Med denne innstillingen kan du registrere en liste over protokollbehandlere. Dette er bare en anbefalt innstilling. Egenskapen |protocol| bør settes til det aktuelle skjemaet, for eksempel «mailto», og egenskapen |url| bør settes til nettadressemønsteret for appen som behandler skjemaet. Mønsteret kan inkludere en «%s» som, hvis den brukes, erstattes av nettadressen som behandles.
 
           Protokollbehandlere som registreres via denne innstillingen, slås sammen med de som er registrert av brukeren, og begge er tilgjengelige for bruk. Brukeren kan overstyre protokollbehandlerne som innstillingen har installert, ved å installere en ny standardbehandler, men kan ikke fjerne en protokollbehandler som er registrert via en innstilling.</translation>
+<translation id="91196902572559194">Denne regelen gir Google-assistenten tillatelse til å lytte etter frasen for taleaktivering.
+
+      Hvis regelen er slått på, lytter Google-assistenten etter frasen for taleaktivering.
+      Hvis regelen er slått av, lytter ikke Google-assistenten etter frasen for taleaktivering.
+      Hvis regelen ikke er angitt, kan brukerne velge om Google-assistenten skal lytte etter frasen for taleaktivering.
+      </translation>
 <translation id="9123211093995421438">Angir det laveste antallet <ph name="PRODUCT_OS_NAME" />-milepæler rollback skal tillates for, med start i den til enhver tid stabile versjonen.
 
       Standarden er 0 for forbrukerregistrerte enheter og 4 (ca. et halvt år) for bedriftsregistrerte enheter.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index ebd5acf5..fe6d90ec 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -442,12 +442,6 @@
 
       Zasada powinna określać URL, z którego <ph name="PRODUCT_OS_NAME" /> może pobrać Warunki korzystania z usługi. Dokument ten musi mieć postać zwykłego tekstu (MIME) bez żadnych znaczników.</translation>
 <translation id="1750315445671978749">Blokuj pobieranie wszystkich plików</translation>
-<translation id="1762072363876276024">
-      Ta zasada dotyczy ekranu logowania. Zobacz też zasadę <ph name="SITE_PER_PROCESS_POLICY_NAME" />, która dotyczy sesji użytkownika. Zalecane jest, by obie zasady miały tę samą wartość. Jeśli wartości są niezgodne, możliwe są opóźnienia przy uruchamianiu sesji użytkownika spowodowane stosowaniem wartości określonej w zasadach dotyczących użytkowników.
-      To ustawienie, DeviceLoginScreenSitePerProcess, pozwala uniemożliwić użytkownikowi wyłączenie domyślnego zachowania, czyli izolacji wszystkich witryn. Możesz też skorzystać z zasady DeviceLoginScreenIsolateOrigins, by dodatkowo izolować źródła według bardziej szczegółowych kryteriów.
-      Jeśli ta zasada jest włączona, użytkownik nie może wyłączyć domyślnego zachowania, przy którym każda witryna działa w obrębie własnego procesu.
-      Jeśli zasada jest wyłączona lub nieskonfigurowana, użytkownik może zmieniać to ustawienie (np. przez zmianę ustawienia „Wyłącz izolację witryn” na stronie chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Włącz rekomendacje aplikacji przy pustym polu wyszukiwania</translation>
 <translation id="17719159826324007">
       Gdy ta zasada jest ustawiona na ArcSession i uruchomiono Androida, po wylogowaniu użytkownika wymuszane jest ponowne uruchomienie urządzenia.
@@ -3580,22 +3574,6 @@
 
 Uwaga: dozwolone wartości w polu <ph name="MINUTE_FIELD_NAME" /> w opcjach <ph name="CHARGE_START_TIME_FIELD_NAME" /> i <ph name="CHARGE_END_TIME_FIELD_NAME" /> to: 0, 15, 30 i 45.</translation>
 <translation id="7717938661004793600">Skonfiguruj ułatwienia dostępu w <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Ta zasada włącza HTTP/0.9 w portach innych niż 80 dla HTTP i 443 dla HTTPS.
-
-      Domyślnie zasada jest wyłączona. Jeśli zostanie włączona, naraża to użytkowników na problem związany z bezpieczeństwem: https://crbug.com/600352
-
-      Ta zasada ma umożliwić firmom migrację istniejących serwerów z HTTP/0.9 i w przyszłości zostanie usunięta.
-
-      Jeśli zasada nie jest skonfigurowana, w portach innych niż domyślne protokół HTTP/0.9 jest wyłączony.</translation>
-<translation id="7726421241038987229">
-      Ustawienie SitePerProcess pozwala uniemożliwić użytkownikowi wyłączenie domyślnego zachowania, czyli izolowania wszystkich witryn. Możesz jednocześnie użyć zasady IsolateOrigins, aby dodatkowo izolować źródła według bardziej szczegółowych kryteriów.
-      Jeśli ta zasada jest włączona, użytkownik nie może wyłączyć domyślnego zachowania, przy którym każda witryna działa w obrębie własnego procesu.
-      Jeśli zasada jest wyłączona lub nie jest skonfigurowana, użytkownik może wyłączyć izolację witryn
-      (np. przez zmianę ustawienia „Wyłącz izolację witryn” na stronie chrome://flags).  Wyłączenie lub nieskonfigurowanie tej zasady nie wyłącza ustawienia Izolacja witryn.
-      W systemie <ph name="PRODUCT_OS_NAME" /> zalecane jest również ustawienie tej samej wartości dla zasady dotyczącej urządzeń <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Jeśli wartości tych dwóch zasad są niezgodne, możliwe są opóźnienia przy uruchamianiu sesji użytkownika spowodowane stosowaniem wartości określonej w zasadach dotyczących użytkowników.
-
-      UWAGA: Ta zasada nie działa w Androidzie. Aby włączyć zasadę SitePerProcess w Androidzie, użyj ustawienia zasady SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Zezwól urządzeniom na korzystanie z wtyczki <ph name="PLUGIN_VM_NAME" /> w systemie <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7749402620209366169">Pozwala włączyć uwierzytelnianie dwuskładnikowe dla hostów zdalnego dostępu zamiast stosowania PIN-u określanego przez użytkownika.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 0b2cfc3..636a96a 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -439,12 +439,6 @@
 
       A política deve ser definida para um URL a partir do qual o <ph name="PRODUCT_OS_NAME" /> possa fazer o download dos Termos de Serviço. Os Termos de Serviço devem estar em texto sem formação, com tipo de texto MIME text/plain. Não são permitidas marcações.</translation>
 <translation id="1750315445671978749">Bloquear todos os downloads</translation>
-<translation id="1762072363876276024">
-      Esta política se aplica à tela de login. Consulte também a política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica à sessão do usuário. É recomendado definir as duas políticas com o mesmo valor. Se os valores não coincidirem, poderá haver um atraso ao entrar em uma sessão enquanto o valor especificado pela política do usuário estiver sendo aplicado.
-      Essa configuração, DeviceLoginScreenSitePerProcess, pode ser usada para impedir que os usuários desativem o comportamento padrão de isolar todos os sites. A política DeviceLoginScreenIsolateOrigins também pode ser útil para isolar outras origens mais refinadas.
-      Se a política for ativada, os usuários não poderão desativar o comportamento padrão, em que cada site executa o próprio processo.
-      Se a política não for configurada ou estiver desativada, o usuário poderá alterar essa configuração (por exemplo, usando a entrada "Disable site isolation" em chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Ativar recomendações de app no estado inicial da caixa de pesquisa</translation>
 <translation id="17719159826324007">
       Esta política, quando definida como ArcSession, força o dispositivo a reinicializar depois que o usuário sai, se o Android tiver sido iniciado.
@@ -3570,21 +3564,6 @@
 
           Observação: os valores permitidos para o campo <ph name="MINUTE_FIELD_NAME" /> em <ph name="CHARGE_START_TIME_FIELD_NAME" /> e <ph name="CHARGE_END_TIME_FIELD_NAME" /> são 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Configurar recursos de acessibilidade do <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Esta política ativa o HTTP/0.9 em portas diferentes de 80 para HTTP e de 443 para HTTPS.
-
-      Esta política fica desativada por padrão e, se ativada, deixa os usuários sujeitos ao problema de segurança https://crbug.com/600352.
-
-      Esta política visa dar a empresas a oportunidade de migrar servidores já existentes de HTTP/0.9 e será removida futuramente.
-
-      Se esta política não for definida, HTTP/0.9 será desativado em portas não padrão.</translation>
-<translation id="7726421241038987229">
-      Essa configuração, SitePerProcess, pode ser usada para impedir que os usuários desativem o comportamento padrão de isolamento de todos os sites. A política IsolateOrigins também pode ser útil para isolar outras origens mais refinadas.
-      Se a política for ativada, os usuários não poderão desativar o comportamento padrão, em que cada site executa o próprio processo.
-      Se a política não for configurada ou estiver desativada, o usuário poderá desativar o "isolamento de sites" (por exemplo, usando a entrada "Disable site isolation" em chrome://flags).  A desativação e/ou não configuração da política não desativa o "isolamento de sites".
-      No <ph name="PRODUCT_OS_NAME" />, também é recomendado definir a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> com o mesmo valor. Se os valores especificados pelas duas políticas não coincidirem, poderá haver um atraso ao entrar em uma sessão enquanto o valor especificado pela política do usuário estiver sendo aplicado.
-
-      OBSERVAÇÃO: esta política não se aplica ao Android. Para ativar SitePerProcess no Android, use a configuração de política SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permite que dispositivos usem um <ph name="PLUGIN_VM_NAME" /> no <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Permite autenticação de dois fatores para hosts de acesso remoto em vez de PIN especificado pelo usuário. 
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index d58f894..722e592 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -450,12 +450,6 @@
 
       Esta política deve estar definida para um URL a partir do qual o <ph name="PRODUCT_OS_NAME" /> possa transferir os Termos de Utilização. Os Termos de Utilização devem estar no formato de texto simples, com o tipo de MIME texto/simples. Não é permitida qualquer marcação.</translation>
 <translation id="1750315445671978749">Bloquear todas as transferências</translation>
-<translation id="1762072363876276024">
-      Esta política aplica-se ao ecrã de início de sessão. Consulte também a política <ph name="SITE_PER_PROCESS_POLICY_NAME" /> aplicável à sessão do utilizador. Recomenda-se que as duas políticas sejam definidas para o mesmo valor. Se os valores não coincidirem, pode ocorrer um atraso ao entrar numa sessão de utilizador enquanto o valor especificado pela Política do Utilizador é aplicado.
-      Esta definição, DeviceLoginScreenSitePerProcess, pode ser utilizada para não permitir que os utilizadores recusem o comportamento predefinido de isolamento de todos os sites. Tenha em atenção que a política DeviceLoginScreenIsolateOrigins também pode ser útil para isolar origens adicionais mais detalhadas.
-      Se a política estiver ativada, os utilizadores não poderão recusar o comportamento predefinido, que prevê que cada site seja executado no seu próprio processo.
-      Se a política não for configurada ou estiver desativada, o utilizador poderá alterar esta definição (por exemplo, ao utilizar a entrada "Desativar isolamento de sites" em chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Ativar Recomendações de aplicações na caixa de pesquisa Estado zero</translation>
 <translation id="17719159826324007">
       Quando definida como ArcSession, esta política força o reinício do dispositivo após o fim de sessão do utilizador se o Android tiver sido iniciado.
@@ -3608,22 +3602,6 @@
 
           Nota: os valores permitidos para o campo <ph name="MINUTE_FIELD_NAME" /> em <ph name="CHARGE_START_TIME_FIELD_NAME" /> e <ph name="CHARGE_END_TIME_FIELD_NAME" /> são 0, 15, 30 e 45.</translation>
 <translation id="7717938661004793600">Configura as funcionalidades de acessibilidade de <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Esta política ativa o protocolo HTTP/0.9 em portas que não sejam a porta 80 para HTTP e a porta 443 para HTTPS.
-
-      Esta política está desativada por predefinição e, se for ativada, deixa os utilizadores suscetíveis ao problema de segurança https://crbug.com/600352.
-
-      Esta política destina-se a permitir que as empresas possam migrar servidores existentes do protocolo HTTP/0.9 e será removida no futuro.
-
-      Se esta política não for definida, o protocolo HTTP/0.9 é desativado nas portas não predefinidas.</translation>
-<translation id="7726421241038987229">
-      Esta definição, SitePerProcess, pode ser utilizada para não permitir que os utilizadores recusem o comportamento predefinido de isolamento de todos os sites. Tenha em atenção que a política IsolateOrigins também pode ser útil para isolar origens adicionais mais detalhadas.
-      Se a política estiver ativada, os utilizadores não poderão recusar o comportamento predefinido, que prevê que cada site seja executado no seu próprio processo.
-      Se a política não for configurada ou estiver desativada, o utilizador poderá recusar o isolamento de sites
-      (por exemplo, ao utilizar a entrada "Desativar isolamento de sites" em chrome://flags).  Definir a política como desativada e/ou não configurar a política não desativa o Isolamento de site.
-      No <ph name="PRODUCT_OS_NAME" />, recomenda-se ainda que a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> seja definida para o mesmo valor. Se os valores especificados pelas duas políticas não coincidirem, poderá ocorrer um atraso ao iniciar uma sessão de utilizador enquanto o valor especificado pela Política do Utilizador é aplicado.
-
-      NOTA: Esta política não se aplica ao Android. Para ativar a política SitePerProcess no Android, utilize a definição da política SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permitir que os dispositivos utilizem um <ph name="PLUGIN_VM_NAME" /> no <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Ativa a autenticação de dois fatores para anfitriões de acesso remoto, em vez de um PIN especificado pelo utilizador.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 61f5862..259df8f1 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -436,12 +436,6 @@
 
       Politica trebuie setată la o adresă URL de la care <ph name="PRODUCT_OS_NAME" /> poate descărca Termenii și condițiile. Termenii și condițiile trebuie să fie în format de text simplu, de tip MIME text/plain. Nu se permite limbajul de markup.</translation>
 <translation id="1750315445671978749">Blochează toate descărcările</translation>
-<translation id="1762072363876276024">
-      Această politică este valabilă pentru ecranul de conectare. Consultă și politica <ph name="SITE_PER_PROCESS_POLICY_NAME" />, care este valabilă pentru sesiunea de utilizator. Se recomandă să setezi ambele politici la aceeași valoare. Dacă valorile nu se potrivesc, poate apărea o întârziere când intri într-o sesiune de utilizator în timp ce este aplicată valoarea indicată de politica de utilizator.
-      Setarea DeviceLoginScreenSitePerProcess poate fi folosită pentru a nu mai permite utilizatorilor să renunțe la comportamentul prestabilit de izolare a tuturor site-urilor. Reține că politica DeviceLoginScreenIsolateOrigins poate fi utilă și pentru izolarea unor origini suplimentare, mai exacte.
-      Dacă politica este activată, utilizatorii nu vor putea să renunțe la comportamentul prestabilit, în care fiecare site rulează procesul propriu.
-      Dacă politica nu este configurată sau este dezactivată, utilizatorul va putea să modifice această setare (de exemplu, folosind intrarea „Dezactivează izolarea site-ului” în chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Activează recomandările de aplicații în starea zero a casetei de căutare</translation>
 <translation id="17719159826324007">
       Când politica este setată la ArcSession, forțează dispozitivul să repornească la deconectarea utilizatorului dacă Android a pornit.
@@ -2481,6 +2475,10 @@
       Reține că acest lucru nu este recomandat, deoarece astfel se poate permite evitarea extensiei nameConstraints care limitează numele de gazdă pentru care poate fi autorizat un anumit certificat.
 
       Dacă politica nu este configurată sau dacă este dezactivată, certificatele de server din care lipsește extensia subjectAlternativeName cu un nume DNS sau o adresă IP nu vor fi considerate de încredere.</translation>
+<translation id="5578571772998293651">Permite feedbackul de la utilizatori.
+        Dacă politica este dezactivată, utilizatorii nu pot trimite feedback la Google.
+
+        Dacă politica nu este configurată sau este activată, utilizatorii pot trimite feedback la Google din Meniu-&gt;Ajutor-&gt;Raportează o problemă sau o combinație de taste.</translation>
 <translation id="5581292529942108810">Configurează politicile privind Chrome Reporting Extension.
 
       Această politică se aplică doar când este activată <ph name="CHROME_REPORTING_EXTENSION_NAME" />, iar dispozitivul este înregistrat cu <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3603,22 +3601,6 @@
 
           Notă: valorile permise pentru câmpul <ph name="MINUTE_FIELD_NAME" /> în <ph name="CHARGE_START_TIME_FIELD_NAME" /> și <ph name="CHARGE_END_TIME_FIELD_NAME" /> sunt: 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Configurați funcțiile de accesibilitate pentru <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Această politică activează compatibilitatea cu HTTP/0.9 pentru HTTP pentru alte porturi decât 80 și pentru HTTPS pentru alte porturi decât 443.
-
-      Această politică este dezactivată în mod prestabilit și, dacă este activată, utilizatorii sunt expuși la problema de securitate prezentată aici https://crbug.com/600352.
-
-      Această politică a fost concepută pentru a oferi companiilor ocazia de a migra serverele existente de la HTTP/0.9 și va fi eliminată în viitor.
-
-      Dacă politica nu este configurată, HTTP/0.9 se va dezactiva pentru porturile care nu sunt prestabilite.</translation>
-<translation id="7726421241038987229">
-      Această setare, SitePerProcess, poate fi folosită pentru a nu permite utilizatorilor să renunțe la comportamentul prestabilit de a izola toate site-urile. Reține că politica IsolateOrigins poate fi utilă și pentru a izola origini suplimentare, mai exacte.
-      Dacă politica este activată, utilizatorii nu vor putea să renunțe la comportamentul prestabilit, în care fiecare site rulează procesul propriu.
-      Dacă politica nu este configurată sau este dezactivată, utilizatorul va putea să renunțe la izolarea site-ului
-      (de exemplu, să folosească intrarea „Dezactivează izolarea site-ului” în in chrome://flags).  Dacă dezactivezi și/sau nu configurezi politica, izolarea site-ului nu va fi dezactivată.
-      În <ph name="PRODUCT_OS_NAME" />, se recomandă să setezi și politica privind dispozitivele <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> la aceeași valoare. Dacă valorile specificate de cele două politici nu se potrivesc, poate avea loc o întârziere când intri într-o sesiune de utilizator în timp ce se aplică valoarea specificată de politica privind utilizatorii.
-
-      NOTĂ: Această politică nu se aplică în Android. Pentru a activa SitePerProcess în Android, folosește setarea politicii SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Permite dispozitivelor să folosească un <ph name="PLUGIN_VM_NAME" /> pe <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Activează autentificarea cu doi factori pentru gazdele de acces la distanță, în locul unui PIN specificat de utilizator.
 
@@ -3841,6 +3823,7 @@
       Dacă această politică nu este setată, nu vor exista excepții de la lista neagră din politica „URLBlacklist”.</translation>
 <translation id="8176035528522326671">Permiteți ca utilizatorul din companie să fie doar utilizatorul principal într-o sesiune cu mai multe profiluri (comportamentul prestabilit pentru utilizatorii gestionați de companie)</translation>
 <translation id="8183108371184777472">Suprimă lansarea unei ferestre de browser</translation>
+<translation id="8186911565834244165">Permite feedbackul de la utilizatori</translation>
 <translation id="8214600119442850823">Configurează managerul de parole.</translation>
 <translation id="8217516105848565518">Această politică este învechită. Folosește RemoteAccessHostDomainList în schimb.</translation>
 <translation id="8244171102276095471">Activează suitele de codificare RC4 în TLS</translation>
@@ -4258,6 +4241,12 @@
 <translation id="9112897538922695510">Vă permite să înregistrați o listă de handlere de protocol. Aceasta poate fi doar o politică recomandată. Valoarea proprietății |protocol| trebuie setată la o schemă ca „mailto”, iar valoarea proprietății |url| trebuie setată la șablonul adresei URL al aplicației care gestionează schema. Șablonul poate include „%s”, care, dacă este prezent, va fi înlocuit cu adresa URL gestionată.
 
           Handlerele de protocol înregistrate de politică sunt combinate cu cele înregistrate de utilizator și ambele sunt disponibile pentru a fi utilizate. Utilizatorul poate înlocui handlerele de protocol instalate de politică instalând un nou handler prestabilit, dar nu poate elimina un handler de protocol înregistrat de politică.</translation>
+<translation id="91196902572559194">Politica oferă Asistentului Google permisiunea de a asculta expresia de activare vocală.
+
+      Dacă politica este activată, Asistentul Google va asculta expresia de activare vocală.
+      Dacă politica este dezactivată, Asistentul Google nu va asculta expresia de activare vocală.
+      Dacă politica nu este setată, utilizatorii pot decide dacă permit Asistentului Google să asculte expresia de activare vocală.
+      </translation>
 <translation id="9123211093995421438">Specifică numărul minim de repere <ph name="PRODUCT_OS_NAME" /> pentru care ar trebui să fie permisă revenirea la versiunea anterioară începând de la versiunea stabilă, în orice moment.
 
       Valoarea prestabilită este 0 pentru consumator, 4 (aproximativ 6 luni) pentru dispozitivele înregistrate de întreprindere.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index f3fed65..b162c5ff 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -440,12 +440,6 @@
 
 Правило должно быть задано в виде URL, с которого <ph name="PRODUCT_OS_NAME" /> будет скачивать Условия использования. Файл с Условиями использования должен быть текстовым, с типом MIME "text/plain" и без какой-либо разметки.</translation>
 <translation id="1750315445671978749">Блокировать все скачивания</translation>
-<translation id="1762072363876276024">
-      Применяется к экрану входа. Ознакомьтесь с правилом <ph name="SITE_PER_PROCESS_POLICY_NAME" />, с помощью которого задаются настройки для сеанса пользователя. Для этих правил рекомендуется выбрать одинаковые значения. В случае противоречия в начале сеанса может возникнуть задержка при применении значения, указанного в правиле для пользователей.
-      Правило DeviceLoginScreenSitePerProcess может использоваться, чтобы запретить пользователям отключать изоляцию всех сайтов, которая применяется по умолчанию. Обратите внимание, что изоляцию отдельных сайтов также удобно настраивать с помощью правила DeviceLoginScreenIsolateOrigins.
-      Если правило DeviceLoginScreenSitePerProcess включено, пользователи не смогут отменить поведение по умолчанию, когда для каждого сайта запускается отдельный процесс.
-      Если правило не настроено или отключено, пользователям доступно изменение этого параметра, например с помощью Disable site isolation (Отключить изоляцию сайтов) на странице chrome://flags.
-      </translation>
 <translation id="1767673020408652620">Включить рекомендации приложений при нулевом состоянии окна поиска</translation>
 <translation id="17719159826324007">
       Когда для этого правила установлено значение ArcSession, устройство будет перезагружаться после выхода пользователя, если запущена система Android.
@@ -2460,6 +2454,10 @@
       Мы не рекомендуем использовать этот вариант, поскольку он позволяет пропускать расширение nameConstraints, ограничивающее список имен хоста, для которых может быть авторизован сертификат.
 
       Если правило не настроено либо для него задано значение False, сертификаты сервера без расширения subjectAlternativeName, содержащие только имя DNS или IP-адрес, будут считаться ненадежными.</translation>
+<translation id="5578571772998293651">Правило разрешает пользователям оставлять отзывы.
+        Если для правила установлено значение false, пользователи не могут отправлять отзывы в Google.
+
+        Если правило не настроено или для него установлено значение true, пользователи могут отправлять отзывы в Google. Для этого нужно нажать "Меню &gt; Справка &gt; Сообщить о проблеме" или использовать сочетание клавиш.</translation>
 <translation id="5581292529942108810">Настройка правил, связанных с Chrome Reporting Extension.
 
       Это правило действует, только когда включено расширение <ph name="CHROME_REPORTING_EXTENSION_NAME" /> и компьютер зарегистрирован при помощи правила <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3580,22 +3578,6 @@
 
           Примечание. Время начала (<ph name="CHARGE_START_TIME_FIELD_NAME" />) должно предшествовать времени окончания (<ph name="CHARGE_END_TIME_FIELD_NAME" />). Обратите внимание: допустимые значения для поля "<ph name="MINUTE_FIELD_NAME" />" во времени начала (<ph name="CHARGE_START_TIME_FIELD_NAME" />) и окончания (<ph name="CHARGE_END_TIME_FIELD_NAME" />) — 0, 15, 30 и 45.</translation>
 <translation id="7717938661004793600">Настраивает специальные возможности <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Правило включает поддержку HTTP/0.9 для портов кроме 80 (HTTP) и 443 (HTTPS).
-
-      По умолчанию правило отключено. Включая его, пользователи подвергаются угрозе безопасности (https://crbug.com/600352).
-
-      Это правило дает предприятиям возможность перевести существующие серверы с HTTP/0.9 на другой протокол. В дальнейшем оно будет удалено.
-
-      Если правило не настроено, протокол HTTP/0.9 будет отключен для портов, не заданных по умолчанию.</translation>
-<translation id="7726421241038987229">
-      Может использоваться, чтобы запретить пользователям отключать изоляцию всех сайтов, которая применяется по умолчанию. Обратите внимание, что изоляцию отдельных сайтов также удобно настраивать с помощью правила IsolateOrigins.
-      Если правило SitePerProcess включено, пользователи не смогут отменить поведение по умолчанию, когда для каждого сайта запускается отдельный процесс.
-      Если правило не настроено или отключено, пользователям доступна отмена изоляции сайтов,
-      например с помощью параметра Disable site isolation (Отключить изоляцию сайтов) на странице chrome://flags.  Само по себе отключение или удаление этого правила не отменяет изоляцию сайтов.
-      В <ph name="PRODUCT_OS_NAME" /> рекомендуется задавать для правил SitePerProcess и <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> одинаковые значения. В случае противоречия в начале сеанса может возникнуть задержка при применении значения, указанного в правиле для пользователей.
-
-      ПРИМЕЧАНИЕ. Это правило не применяется на устройствах Android. Для них можно настроить правило SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Разрешить устройствам использовать правило <ph name="PLUGIN_VM_NAME" /> в <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Включает двухфакторную аутентификацию вместо пользовательского PIN-кода для хостов удаленного доступа.
 
@@ -3818,6 +3800,7 @@
       Если не настраивать это правило, из черного списка не будет исключений.</translation>
 <translation id="8176035528522326671">Разрешить корпоративному пользователю в многопрофильном режиме быть только основным профилем (настройка по умолчанию для корпоративных управляемых профилей)</translation>
 <translation id="8183108371184777472">Запретить запуск браузера</translation>
+<translation id="8186911565834244165">Разрешить отзывы пользователей</translation>
 <translation id="8214600119442850823">Позволяет настроить диспетчер паролей.</translation>
 <translation id="8217516105848565518">Правило больше не поддерживается. Вместо него используется RemoteAccessHostDomainList.</translation>
 <translation id="8244171102276095471">Включить наборы шифров RC4 в TLS</translation>
@@ -4247,6 +4230,12 @@
 <translation id="9112897538922695510">Регистрация списка обработчиков протоколов. Это правило не является обязательным. Свойство protocol должно быть указано по схеме mailto, а свойство URL – по шаблону URL для приложения, которое его обрабатывает. Шаблоны могут включать атрибуты %s, которые будут заменены обрабатываемым URL.
 
           Обработчики протокола, зарегистрированные правилом, объединяются с теми, которые были зарегистрированы пользователями. И те, и другие будут доступны для использования. Пользователь может не применять обработчики протокола, установленные правилом, добавив по умолчанию свой собственный, но не может удалить их.</translation>
+<translation id="91196902572559194">Это правило позволяет включать Google Ассистента с помощью голосовых команд.
+
+      Если правило включено, Google Ассистент будет распознавать голосовую активацию.
+      Если правило выключено, Google Ассистент не будет распознавать голосовую активацию.
+      Если правило не настроено, пользователи будут сами решать, можно ли включать Ассистента с помощью голосовых команд.
+      </translation>
 <translation id="9123211093995421438">Правило позволяет задать минимальное количество точек восстановления (начиная от стабильной версии) для <ph name="PRODUCT_OS_NAME" />.
 
       По умолчанию для обычных пользователей установлено значение 0, для корпоративных – 4 (откат приблизительно на полгода).
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index c2a3daa..802b602 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -425,12 +425,6 @@
 
       Toto pravidlo byť malo byť nastavené ako webová adresa, z ktorej systém <ph name="PRODUCT_OS_NAME" /> môže Zmluvné podmienky stiahnuť. Zmluvné podmienky musia byť uložené vo formáte čistého textu, zobrazované ako typ MIME „text/plain“. Nie sú povolené žiadne značky.</translation>
 <translation id="1750315445671978749">Blokovať všetky súbory na stiahnutie</translation>
-<translation id="1762072363876276024">
-      Toto pravidlo platí pre prihlasovaciu obrazovku. Prečítajte si aj pravidlo <ph name="SITE_PER_PROCESS_POLICY_NAME" />, ktoré upravuje reláciu používateľa. Obe pravidlá odporúčame nastaviť na rovnakú hodnotu. Ak sa hodnoty nezhodujú, môže dôjsť pri prechode do relácie používateľa k oneskoreniu spôsobenému uplatňovaním hodnoty určenej pravidlom pre používateľov.
-      Pomocou tohto nastavenia DeviceLoginScreenSitePerProcess môžete zakázať používateľom deaktiváciu predvoleného správania, ktorým je izolovanie všetkých webov. Na izolovanie ďalších, podrobnejších zdrojov môžete použiť aj pravidlo DeviceLoginScreenIsolateOrigins.
-      Ak toto pravidlo povolíte, používateľa nebudú môcť deaktivovať predvolené správanie, v rámci ktorého sa všetky weby spúšťajú vo vlastných procesoch.
-      Ak ho nenakonfigurujete alebo zakážete, používateľ bude môcť toto nastavenie meniť (napr. použiť vstup Zakázať izolovanie webov na adrese chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Povoliť odporúčania aplikácií v nulovom stave vyhľadávacieho poľa</translation>
 <translation id="17719159826324007">
       Keď toto pravidlo nastavíte na hodnotu ArcSession a je spustený Android, zariadenie sa po odhlásení používateľa reštartuje.
@@ -3655,22 +3649,6 @@
 
           Poznámka: Povolené hodnoty pre pole <ph name="MINUTE_FIELD_NAME" /> v poliach <ph name="CHARGE_START_TIME_FIELD_NAME" /> a <ph name="CHARGE_END_TIME_FIELD_NAME" /> sú 0, 15, 30 a 45.</translation>
 <translation id="7717938661004793600">Konfigurujte funkcie zjednodušenia prístupu v systéme <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Toto pravidlo povoľuje protokol HTTP/0.9 na portoch iných ako 80 (v prípade protokolu HTTP) a 443 (v prípade protokolu HTTPS).
-
-      Toto pravidlo je predvolene zakázané a po povolení vystavuje používateľov problému so zabezpečením – https://crbug.com/600352.
-
-      Jeho cieľom je poskytnúť podnikom možnosť migrovať existujúce servery z protokolu HTTP/0.9. V budúcnosti bude odstránené.
-
-      Ak toto pravidlo nie je nastavené, protokol HTTP/0.9 bude zakázaný na portoch, ktoré nie sú predvolené.</translation>
-<translation id="7726421241038987229">
-      Pomocou tohto nastavenia SitePerProcess môžete zakázať používateľom deaktivovať predvolené správanie, ktorým je izolovanie všetkých webov. Na izolovanie ďalších, podrobnejších zdrojov môžete použiť aj pravidlo IsolateOrigins.
-      Ak toto pravidlo povolíte, používateľa nebudú môcť deaktivovať predvolené správanie, v rámci ktorého sa všetky weby spúšťajú vo vlastných procesoch.
-      Ak ho nenakonfigurujete alebo zakážete, používateľ bude môcť deaktivovať izolovanie webov
-      (napr. pomocou vstupu Zakázať izolovanie webov na adrese chrome://flags).  Ak ho zakážete alebo nenakonfigurujete, izolovanie webov sa nevypne.
-      V systéme <ph name="PRODUCT_OS_NAME" /> odporúčame nastaviť na rovnakú hodnotu aj pravidlo zariadenia <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Ak sa hodnoty určené týmito dvoma pravidlami nezhodujú, môže dôjsť pri prechode do relácie používateľa k oneskoreniu spôsobenému uplatňovaním hodnoty určenej pravidlom pre používateľov.
-
-      POZNÁMKA: Toto pravidlo neplatí v Androide. SitePerProcess povoľte v Androide pomocou nastavenia pravidla SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Povoliť zariadeniam používať doplnok <ph name="PLUGIN_VM_NAME" /> v systéme <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Povoľuje dvojfázové overenie totožnosti pre hostiteľov vzdialeného prístupu namiesto kódu PIN zadaného používateľom.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index 3432cfc..248dd69 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -451,12 +451,6 @@
 
       Pravilnik naj bo nastavljen na URL, s katerega lahko <ph name="PRODUCT_OS_NAME" /> prenese pogoje storitve. Ti morajo biti v obliki navadnega besedila vrste MIME in brez označevanja.</translation>
 <translation id="1750315445671978749">Blokiraj vse prenose</translation>
-<translation id="1762072363876276024">
-      Ta pravilnik se nanaša na zaslon za prijavo. Oglejte si tudi pravilnik <ph name="SITE_PER_PROCESS_POLICY_NAME" />, ki se nanaša na uporabniško sejo. Priporočljivo je, da za oba pravilnika nastavite enako vrednost. Če se vrednosti ne ujemata, lahko pride do zakasnitve pri odpiranju uporabniške seje, medtem ko se uveljavlja vrednost, ki jo določa uporabniški pravilnik.
-      To nastavitev, DeviceLoginScreenSitePerProcess, je mogoče uporabljati, da se uporabnikom ne dovoli onemogočanja privzetega delovanja osamitve vseh spletnih mest. Upoštevajte, da je lahko pravilnik DeviceLoginScreenIsolateOrigins uporaben tudi za osamitev dodatnih, podrobnejših izvorov.
-      Če je pravilnik omogočen, uporabniki ne bodo mogli onemogočiti privzetega delovanja, pri katerem se vsako spletno mesto izvaja v svojem procesu.
-      Če pravilnik ni konfiguriran ali je onemogočen, bo uporabnik lahko spremenil to nastavitev (lahko bo na primer uporabil vnos »Disable site isolation« (onemogoči osamitev spletnih mest) v chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Omogočanje priporočil aplikacij v ničelnem stanju iskalnega polja</translation>
 <translation id="17719159826324007">
       Če je ta pravilnik nastavljen na ArcSession, napravo prisili, da se znova zažene ob odjavi uporabnika, če se je zagnal Android.
@@ -3714,22 +3708,6 @@
 
           Opomba: dovoljene vrednosti za polje <ph name="MINUTE_FIELD_NAME" /> v poljih<ph name="CHARGE_START_TIME_FIELD_NAME" /> in <ph name="CHARGE_END_TIME_FIELD_NAME" /> so 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfiguriranje funkcij za ljudi s posebnimi potrebami za <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Ta pravilnik omogoča protokol HTTP/0.9 za vrata, ki niso 80 (HTTP) ali 443 (HTTPS).
-
-      Ta pravilnik je privzeto onemogočen. Če je omogočen, so uporabniki izpostavljeni tej varnostni težavi: https://crbug.com/600352.
-
-      Namen tega pravilnika je omogočiti podjetjem, da v obstoječih strežnikih prenehajo uporabljati protokol HTTP/0.9. Pravilnik bo v prihodnosti odstranjen.
-
-      Če ta pravilnik ni nastavljen, bo protokol HTTP/0.9 za vrata, ki niso privzeta, onemogočen.</translation>
-<translation id="7726421241038987229">
-      To nastavitev, SitePerProcess, je mogoče uporabljati, da se uporabnikom ne dovoli onemogočanja privzetega delovanja osamitve vseh spletnih mest. Upoštevajte, da je lahko pravilnik IsolateOrigins uporaben tudi za osamitev dodatnih, podrobnejših izvorov.
-      Če je pravilnik omogočen, uporabniki ne bodo mogli onemogočiti privzetega delovanja, pri katerem se vsako spletno mesto izvaja v svojem procesu.
-      Če pravilnik ni konfiguriran ali je onemogočen, bo uporabnik lahko onemogočil osamitev spletnih mest
-      (lahko bo na primer uporabil vnos »Disable site isolation« (onemogoči osamitev spletnih mest) v chrome://flags).  Če nastavite, da je pravilnik onemogočen, in/ali ga ne konfigurirate, osamitve spletnih mest ne izklopite.
-      V sistemu <ph name="PRODUCT_OS_NAME" /> je priporočljivo, da tudi pravilnik za naprave <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> nastavite na enako vrednost. Če se vrednosti, navedene v teh dveh pravilnikih, ne ujemajo, lahko pri vstopu v uporabniško sejo pride do zakasnitve, medtem ko se uveljavlja vrednost, ki jo določa uporabniški pravilnik.
-
-      OPOMBA: Ta pravilnik se ne uporablja v sistemu Android. Če želite omogočiti pravilnik SitePerProcess v Androidu, uporabite nastavitev pravilnika SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Omogočanje napravam, da uporabljajo vtičnik <ph name="PLUGIN_VM_NAME" /> v sistemu <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Za gostitelje oddaljenega dostopa omogoča preverjanje pristnosti v dveh korakih namesto z uporabniško določenim PIN-om.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index a573091..d755a83 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -442,12 +442,6 @@
 
       Смернице треба да буду подешене на URL адресу са које <ph name="PRODUCT_OS_NAME" /> може да преузме Услове коришћења услуге. Услови коришћења услуге морају да буду чисти текст, приказан као текст MIME типа/чисти. Није дозвољено никакво означавање.</translation>
 <translation id="1750315445671978749">Блокирај сва преузимања</translation>
-<translation id="1762072363876276024">
-      Ове смернице се односе на екран за пријављивање. Погледајте и смернице <ph name="SITE_PER_PROCESS_POLICY_NAME" /> које се односе на корисничку сесију. Препоручујемо да подесите и једне и друге смернице на исту вредност. Ако се вредности не подударају, може да дође до кашњења при уласку у корисничку сесију док се примењује вредност коју наводе смернице за корисника.
-      Ово подешавање, DeviceLoginScreenSitePerProcess, може да се користи за спречавање корисника да онемогуће подразумевано понашање изоловања свих сајтова. Имајте у виду да смернице DeviceLoginScreenIsolateOrigins могу да буду корисне и за изоловање додатних, прецизније одређених извора.
-      Ако омогућите ове смернице, корисници не могу да онемогуће подразумевано понашање при ком се сваки сајт покреће у сопственом процесу.
-      Ако не конфигуришете или онемогућите ове смернице, корисник може да промени ово подешавање (нпр. помоћу уноса „Онемогући изоловање сајтова“ у оквиру chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Омогућавају препоруке апликација у оквиру за претрагу без других повезаних резултата</translation>
 <translation id="17719159826324007">
       Ове смернице, када су подешене на ArcSession, приморавају уређај да се рестартује када се корисник одјави ако је Android покренут.
@@ -3662,22 +3656,6 @@
 
           Напомена: Дозвољене вредности за поље <ph name="MINUTE_FIELD_NAME" /> у <ph name="CHARGE_START_TIME_FIELD_NAME" /> и <ph name="CHARGE_END_TIME_FIELD_NAME" /> су 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Конфигуришите функције приступачности за <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Ове смернице омогућавају HTTP/0.9 на портовима који нису 80 за HTTP и 443 за HTTPS.
-
-      Ове смернице су подразумевано онемогућене, а ако се омогуће, корисници могу да имају безбедносни проблем https://crbug.com/600352.
-
-      Сврха ових смерница је да предузећима дају прилику да пребаце постојеће сервере са протокола HTTP/0.9 и оне ће у будућности бити уклоњене.
-
-      Ако не подесите ове смернице, HTTP/0.9 ће бити онемогућен на портовима који нису подразумевани.</translation>
-<translation id="7726421241038987229">
-      Ово подешавање, SitePerProcess, може да се користи за спречавање корисника да онемогуће подразумевано понашање изоловања свих сајтова. Имајте у виду да смернице IsolateOrigins могу да буду корисне и за изоловање додатних, прецизније одређених извора.
-      Ако омогућите ове смернице, корисници не могу да онемогуће подразумевано понашање при ком се сваки сајт покреће у сопственом процесу.
-      Ако не конфигуришете или онемогућите ове смернице, корисник може да онемогући изоловање сајта
-      (нпр. помоћу уноса „Онемогући изоловање сајта“ у оквиру chrome://flags).  Ако онемогућите ове смернице и/или их не конфигуришете, тиме не искључујете изоловање сајтова.
-      Препоручујемо да на систему <ph name="PRODUCT_OS_NAME" /> подесите и смернице за уређај <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> на исту вредност. Ако се вредности које наводе једне и друге смернице не подударају, може да дође до кашњења при уласку у корисничку сесију док се примењује вредност коју наводе смернице за корисника.
-
-      НАПОМЕНА: Ове смернице се не примењују на Android-у. Да бисте омогућили SitePerProcess на Android-у, користите подешавање смерница SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Дозвољавају уређајима да користе <ph name="PLUGIN_VM_NAME" /> на уређају <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Омогућава потврду аутентичности помоћу два фактора за хостове са даљинским приступом уместо PIN-а који дефинише корисник.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 66157b1..689cc01 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -451,12 +451,6 @@
 
       Den här policyn ska ställas in på en webbadress som <ph name="PRODUCT_OS_NAME" /> kan ladda ned användarvillkoren från. Användarvillkoren måste vara oformaterad text av MIME-typ. Ingen kod får användas.</translation>
 <translation id="1750315445671978749">Blockera alla nedladdningar</translation>
-<translation id="1762072363876276024">
-      Den här principen gäller inloggningsskärmen. Se även principen <ph name="SITE_PER_PROCESS_POLICY_NAME" />, som gäller användarsessionen. Vi rekommenderar att samma värde anges för båda principerna. Om värdena inte stämmer överens kan det uppstå en fördröjning när en användarsession startas medan användarprincipen tillämpas.
-      Den här inställningen, DeviceLoginScreenSitePerProcess, kan användas för att förhindra att användarna väljer bort standardbeteendet att isolera alla webbplatser. Observera att det även går att isolera ursprung mer precist med principen DeviceLoginScreenIsolateOrigins.
-      När principen är aktiverad kan användarna inte välja bort standardbeteendet att varje webbplats körs i en egen process.
-      Om principen inte har ställts in eller om den inaktiveras kan användaren ändra inställningen (t.ex. med flaggan Disable site isolation på sidan chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Aktivera apprekommendationer i sökrutan när den är nollställd</translation>
 <translation id="17719159826324007">
       När principen är inställd på ArcSession görs en tvingad omstart när användaren loggar ut om Android har startats.
@@ -3704,22 +3698,6 @@
 
           Obs! Tillåtna värden i fältet <ph name="MINUTE_FIELD_NAME" /> i <ph name="CHARGE_START_TIME_FIELD_NAME" /> och <ph name="CHARGE_END_TIME_FIELD_NAME" /> är 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Konfigurera tillgänglighetsfunktioner i <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Den här principen aktiverar HTTP/0.9 på andra portar än 80 för HTTP och 443 för HTTPS.
-
-      Principen är inaktiverad som standard och om den aktiveras löper användare risk att utsättas för säkerhetsbristen https://crbug.com/600352.
-
-      Principen är avsedd att ge företag möjlighet att migrera befintliga servrar från HTTP/0.9. Principen tas bort framöver.
-
-      Om principen inte har angetts, inaktiveras HTTP/0.9 på portar som inte har angetts som standard.</translation>
-<translation id="7726421241038987229">
-      Den här inställningen, SitePerProcess, kan användas för att förhindra att användarna väljer bort standardbeteendet att isolera alla webbplatser. Observera att det även går att isolera ursprung mer precist med principen IsolateOrigins.
-      När principen är aktiverad kan användarna inte välja bort standardbeteendet att varje webbplats körs i en egen process.
-      Om principen inte har ställts in eller om den inaktiveras kan användaren välja bort webbplatsisolering
-      (t.ex. med flaggan Disable site isolation på sidan chrome://flags).  Att principen inaktiveras och/eller saknar inställning innebär inte att webbplatsisolering inaktiveras.
-      Om du kör <ph name="PRODUCT_OS_NAME" /> rekommenderar vi att samma värde används även för enhetsprincipen <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Om de båda principerna ställs in på olika värden kan det uppstå en fördröjning när en användarsession startas medan värdet för användarprincipen tillämpas.
-
-      OBS! Den här principen gäller inte Android. Om du vill aktivera SitePerProcess på Android använder du principen SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Tillåt att <ph name="PLUGIN_VM_NAME" /> används av enheter på <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Aktiverar tvåfaktorsautentisering för värdar för fjärråtkomst istället för en användarangiven PIN-kod.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index b112fd6c..0e2b0e4 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -428,12 +428,6 @@
 
       Sera itawekwa kwenye URL ambapo <ph name="PRODUCT_OS_NAME" /> inaweza kupakua Sheria na masharti. Lazima Sheria na Masharti yawe maandishi matupu, yawe kama maandishi ya kuandika/matupu ya MIME. Markup hairuhusiwi.</translation>
 <translation id="1750315445671978749">Zuia vipakuliwa vyote</translation>
-<translation id="1762072363876276024">
-      Sera hii inatumika kwenye skrini ya kuingia katika akaunti. Tafadhali ona pia sera ya <ph name="SITE_PER_PROCESS_POLICY_NAME" /> inayotumika kwenye kipindi cha mtumiaji. Tunapendekeza uweke sera zote kuwa thamani sawa. Thamani zisipolingana, ucheleweshaji unaweza kutokea wakati wa kuweka kipindi cha mtumiaji wakati thamani inayobainishwa na sera ya mtumiaji inatumika.
-      Mipangilio hii DeviceLoginScreenSitePerProcess, inaweza kutumika kuzuia watumiaji wasijiondoe kwenye utendaji chaguomsingi wa kutenga tovuti zote. Kumbuka kwamba sera ya DeviceLoginScreenIsolateOrigins huenda pia ikatumika kutenga vyanzo laini zaidi vya ziada.
-      Sera ikiwashwa, watumiaji wataweza kujiondoa kwenye utendaji chaguomsingi ambapo kila tovuti hutumia mchakato wake wenyewe.
-      Usipoweka mipangilio ya sera hii au ukiizima, mtumiaji ataweza kubadilisha mipangilio hii (kwa mfano kwa kutumia maelezo ya "Zima utengaji wa tovuti" katika chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Washa sera ya Mapendekezo ya Programu katika Hali Ombwe ya Kisanduku cha Kutafutia</translation>
 <translation id="17719159826324007">
       Sera hii ikiwekwa kuwa ArcSession, hulazimisha kifaa kuwaka tena mtumiaji akiondoka kwenye akaunti ikiwa Android imefunguka.
@@ -3665,22 +3659,6 @@
 
           Kumbuka: thamani zinazoruhusiwa za sehemu ya <ph name="MINUTE_FIELD_NAME" /> ya <ph name="CHARGE_START_TIME_FIELD_NAME" /> na<ph name="CHARGE_END_TIME_FIELD_NAME" /> ni 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Sanidi vipengele vya ufikiaji vya <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Sera hii huwasha HTTP/0.9 kwenye milango mbali na 80 ya HTTP na 443 ya HTTPS.
-
-      Sera huzimwa kwa chaguomsingi, na ikiwashwa, huwaacha watumiaji katika hali ambayo wanaweza kupata matatizo ya usalama https://crbug.com/600352.
-
-      Sera hii inadhamiria kuwapa wafanyabiashara nafasi ya kuhamisha seva za sasa kutoka HTTP/0.9, na itaondolewa siku zijazo.
-
-      Sera hii isipowekwa, HTTP/0.9 itazimwa kwenye milango ambayo si chaguomsingi.</translation>
-<translation id="7726421241038987229">
-      Mipangilio hii, SitePerProcess, inaweza kutumika kuwazuia watumiaji wasijiondoe kwenye utendaji chaguomsingi wa kutenga tovuti zote. Kumbuka kwamba sera ya IsolateOrigins huenda pia ikatumika kutenga vyanzo laini vya ziada.
-      Sera ikiwashwa, watumiaji wataweza kujiondoa kwenye utendaji chaguomsingi ambapo kila tovuti hutumia mchakato wake wenyewe.
-      Mipangilio ya sera hii isipowekwa au ikizimwa, mtumiaji ataweza kujiondoa kwenye utengaji wa tovuti
-      (kwa mfano, kwa kutumia maelezo ya "Zima utengaji wa tovuti" katika chrome://flags).  Hatua ya kuweka sera hii kuwa imezimwa na/au kukosa kuiweka, haizimi kipengele cha Utengaji wa Tovuti.
-      Kwenye <ph name="PRODUCT_OS_NAME" />, inapendekezwa pia uweke sera ya kifaa ya <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> kuwa na thamani sawa. Ikiwa thamani zilizobainishwa na sera hizo mbili hazilingani, ucheleweshaji unaweza kutokea wakati wa kuingia katika kipindi cha mtumiaji wakati thamani inayobainishwa na sera ya mtumiaji inatumika.
-
-      DOKEZO: Sera hii haitumiki kwenye Android. Ili uwashe SitePerProcess kwenye Android, tumia mipangilio ya sera ya SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Ruhusu vifaa vitumie <ph name="PLUGIN_VM_NAME" /> kwenye<ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Huwezesha matumizi ya uthibitishaji wa hatua mbili badala ya PIN iliyobainishwa na mtumiaji, kwa wapangishaji wa ufikiaji wa mbali.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index b81c551c..54651aa7 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -429,13 +429,13 @@
 
       இந்தக் கொள்கை <ph name="PRODUCT_OS_NAME" /> சேவை விதிமுறைகளைப் பதிவிறக்கும் URL க்கு அமைக்கப்படும். சேவை விதிமுறைகளானது எளிய உரையாகவும், MIME வகை உரை/எளிதாக வழங்கப்பட வேண்டும். எந்த மார்க்-அப்பும் அனுமதிக்கப்படவில்லை.</translation>
 <translation id="1750315445671978749">எல்லாப் பதிவிறக்கங்களையும் தடு</translation>
-<translation id="1762072363876276024">
-      உள்நுழையும் திரைக்கு இந்தக் கொள்கை பொருந்தும். பயனர் அமர்வுக்குப் பொருந்தும் <ph name="SITE_PER_PROCESS_POLICY_NAME" /> கொள்கையையும் பார்க்கவும். இரு கொள்கைகளையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கிறோம். மதிப்புகள் பொருந்தாதபட்சத்தில் பயனர் கொள்கையில் குறிப்பிட்டுள்ள மதிப்பைப் பயன்படுத்தும்போது பயனர் அமர்வில் உள்நுழையத் தாமதமாகலாம்.
-      DeviceLoginScreenSitePerProcess அமைப்பு, அனைத்துத் தளங்களையும் பிரித்து எடுக்கும் இயல்புநிலை செயல்பாடு வேண்டாமெனப் பயனர்கள் நிராகரிப்பதைத் தடுக்கப் பயன்படுத்தப்படக்கூடும். கவனத்திற்கு: சிறிதளவே வித்தியாசப்படும் பிற தளங்களைப் பிரித்து எடுக்க DeviceLoginScreenIsolateOrigins கொள்கையும் உதவக்கூடும்.
-      இந்தக் கொள்கை இயக்கப்பட்டிருந்தால் ஒவ்வொரு தளமும் அதற்குரிய இயல்புநிலை செயல்பாட்டைச் செய்ய வேண்டாமெனப் பயனர்கள் தேர்ந்தெடுக்க முடியாது.
-      இந்தக் கொள்கை உள்ளமைக்கப்படவில்லை என்றாலோ முடக்கப்பட்டு இருந்தாலோ, தளத்தைப் பிரித்து எடுக்க வேண்டாமெனப் பயனர்கள் தேர்ந்தெடுக்க முடியும் (எ.கா. Chrome://flags என்பதிலுள்ள "தளத்தைப் பிரித்து எடுப்பதை முடக்கு" என்ற அமைப்பை இயக்குதல்).
-      </translation>
 <translation id="1767673020408652620">தேடல் பெட்டியின் Zero Stateடில் App Recommendationsஸை இயக்கும்</translation>
+<translation id="17719159826324007">
+      இந்தக் கொள்கையை ArcSession என அமைத்தால் Android தொடங்கப்பட்டிருக்கும் பட்சத்தில் பயனர் வெளியேறும்போது மறுபடி தொடங்க சாதனத்தை வலியுறுத்தும்.
+      'எப்போதும்' என அமைத்தால் ஒவ்வொரு முறை பயனர் வெளியேறும்போதும் மறுபடி தொடங்க சாதனத்தை வலியுறுத்தும்.
+      அமைக்காமல் விட்டுவிட்டால் எந்த மாற்றத்தையும் ஏற்படுத்தாது. அத்துடன் பயனர் வெளியேறும்போது மறுபடி தொடங்க வலியுறுத்தாது. 'ஒருபோதும் வேண்டாம்' என அமைத்தாலும் இவ்வாறே செயல்படும்.
+      அதிகாரப்பூர்வமாக இணைக்கப்படாத பயனர்களிடம் மட்டுமே தாக்கத்தை ஏற்படுத்தும்.
+      </translation>
 <translation id="1781356041596378058">Android டெவெலப்பர் விருப்பங்களுக்கான அணுகலையும் இந்தக் கொள்கை கட்டுப்படுத்தும். இந்தக் கொள்கையை “சரி” என அமைத்தால், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியாது. இந்தக் கொள்கையை “தவறு” என அமைத்தாலோ அமைக்காமல் விட்டாலோ, Android அமைப்புகள் ஆப்ஸில் இருக்கும் பதிப்பு எண்ணை ஏழு முறை தட்டுவதன் மூலம், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியும்.</translation>
 <translation id="1793346220873697538">இயல்பாக ’பின்’ அச்சிடுதலை முடக்கும்</translation>
 <translation id="1797233582739332495">மீண்டும் தொடங்குவது தேவையானது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் அறிவிப்பைப் பயனருக்குக் காட்டு</translation>
@@ -913,6 +913,7 @@
 <translation id="267596348720209223">தேடல் வழங்குநரால் எழுத்துக் குறியாக்கங்கள் ஆதரவளிப்பதைக் குறிப்பிடுகிறது. குறியாக்கங்கள், UTF-8, GB2312 மற்றும் ISO-8859-1 போன்ற பக்கப் பெயர்களால் குறிப்பிடப்படும். அவை, வழங்கப்பட்டுள்ள வரிசையில் முயற்சிக்கின்றன. இந்தக் கொள்கை விருப்பத்தேர்வுக்குரியது. அது அமைக்கப்படவில்லை எனில் இயல்புநிலையான UTF-8 பயன்படுத்தப்படும். 'DefaultSearchProviderEnabled' இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கை ஆதரிக்கப்படும்.</translation>
 <translation id="268577405881275241">தரவு சுருக்க ப்ராக்ஸி அம்சத்தை இயக்கு</translation>
 <translation id="2693108589792503178">கடவுச்சொல்லை மாற்றுவதற்கான URLஐ உள்ளமைக்கவும்.</translation>
+<translation id="2694143893026486692">இணைக்கப்பட்ட பெரிதாக்கி இயக்கப்பட்டுள்ளது</translation>
 <translation id="2706708761587205154">’பின்’ மூலமாக மட்டும் அச்சிடலை அனுமதிக்கும்</translation>
 <translation id="2710534340210290498">இந்தக் கொள்கை 'தவறு' என அமைக்கப்பட்டால் பயனர்களால் திரையைப் பூட்ட முடியாது (பயனர் அமர்விலிருந்து வெளியேற மட்டுமே முடியும்). இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டாலோ அமைக்கப்படாமலேயே இருந்தாலோ கடவுச்சொல்லுடன் அங்கீகரிக்கப்படும் பயனர்களால் திரையைப் பூட்ட முடியும்.</translation>
 <translation id="2731627323327011390">ARC பயன்பாடுகளில் <ph name="PRODUCT_OS_NAME" /> சான்றிதழ்களின் உபயோகத்தை முடக்கு</translation>
@@ -1147,6 +1148,7 @@
           இந்தக் கொள்கை விருப்பத்தேர்விற்குரியது. இதை அமைக்கவில்லை எனில் தேடல் சொல் மாற்றம் எதுவும் செயல்படுத்தப்படாது.
 
           'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கை ஆதரிக்கப்படும்.</translation>
+<translation id="3053265701996417839">Microsoft Windows 7</translation>
 <translation id="306887062252197004">WebDriver அம்சத்தின் பயனர்களை, அதன் செயல்பாட்டில் குறுக்கிடக்கூடிய கொள்கைகளை மீற இந்தக் கொள்கை அனுமதிக்கிறது.
 
       தற்போது SitePerProcess மற்றும் IsolateOrigins கொள்கைகளை இந்தக் கொள்கை முடக்குகிறது.
@@ -1946,7 +1948,7 @@
 <translation id="4639407427807680016">தடுப்புப்பட்டியலிலிருந்து விலக்குவதற்கான நேட்டிவ் செய்தியிடல் ஹோஸ்ட்களின் பெயர்கள்</translation>
 <translation id="4650759511838826572">URL நெறிமுறை திட்டங்களை முடக்கு</translation>
 <translation id="465099050592230505">நிறுவன இணைய அங்காடி URL (தடுக்கப்பட்டது)</translation>
-<translation id="4661889655253181651">குறிப்பிட்ட வகையான உள்ளடக்கங்கள் (எடுத்துக்காட்டாக, குக்கீகள், படங்கள் அல்லது JavaScript போன்றவை) எவ்வாறு கையாளப்பட வேண்டும் என்பதை, குறிப்பிட்ட உள்ளடக்க அமைப்புகள் அனுமதிக்கிறது.</translation>
+<translation id="4661889655253181651">குறிப்பிட்ட வகையான உள்ளடக்கங்கள் (எடுத்துக்காட்டாக, குக்கீகள், படங்கள் அல்லது JavaScript போன்றவை) எவ்வாறு கையாளப்பட வேண்டும் என்பதை, குறிப்பிட்ட உள்ளடக்க அமைப்புகள் அனுமதிக்கின்றன.</translation>
 <translation id="4665897631924472251">நீட்டிப்பு நிர்வகிப்பு அமைப்புகள்</translation>
 <translation id="4668325077104657568">இயல்புநிலை படங்கள் அமைப்பு</translation>
 <translation id="4670865688564083639">குறைந்தபட்சம்:</translation>
@@ -2447,6 +2449,10 @@
       ஹோஸ்ட்பெயர்களை (வழங்கிய சான்றிதழ்களை இவற்றுக்கு அங்கீகரிக்கலாம்) கட்டுப்படுத்தும் nameConstraints நீட்டிப்பை பைபாஸ் செய்ய அனுமதிக்கலாம் என்பதால், இது பரிந்துரைக்கப்படவில்லை என்பதை நினைவில்கொள்ளவும்.
 
       இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ அல்லது தவறு என அமைக்கப்பட்டாலோ, DNS பெயர் அல்லது IP முகவரி உள்ள subjectAlternativeName இல்லாத சேவையகச் சான்றிதழ்கள் நம்பப்படாது.</translation>
+<translation id="5578571772998293651">பயனரின் கருத்தை அனுமதிக்கும்.
+        கொள்கையைத் 'தவறு' என அமைத்தால் Googleளுக்குப் பயனர்களால் கருத்தைத் தெரிவிக்க இயலாது.
+
+        கொள்கையை அமைக்காமல் விட்டாலோ 'சரி' என அமைத்தாலோ பயனர்கள் 'மெனு-&gt;உதவி-&gt;சிக்கலைப் புகாரளி அல்லது விசைச் சேர்க்கை' என்பதற்குச் சென்று கருத்தை அனுப்பலாம்.</translation>
 <translation id="5581292529942108810">Chrome அறிக்கையிடுதல் நீட்டிப்பு தொடர்பான கொள்கைகளை உள்ளமைக்கும்.
 
       <ph name="CHROME_REPORTING_EXTENSION_NAME" /> இயக்கப்பட்டு, <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> இல் சாதனம் பதிவு செய்யப்பட்டால் மட்டுமே, இந்தக் கொள்கை செயலில் இருக்கும்.</translation>
@@ -2916,7 +2922,7 @@
       பிரிண்ட்டருக்கான உள்ளமைவுகளைப் பயனர்களுக்கு நிர்வாகிகள் வழங்கிட
       இந்தக் கொள்கை அனுமதிக்கும்.
 
-      <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> ஆகியவை பிரிண்ட்டர் தேர்வை எளிதாக்கும் வகையில் உள்ளமைக்கக்கூடிய வார்த்தைகளாகும். இறுதிப் பயனர்கள் பிரிண்ட்டரை எளிதாக அடையாளம் காண்பதற்கு <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> ஆகியவை உதவும். அவை பிரிண்ட்டரின் உற்பத்தியாளரையும் மாடலையும் குறிக்கின்றன. <ph name="PRINTER_URI" /> என்பது கிளையண்ட் கம்ப்யூட்டரிலிருந்து தொடர்புகொள்ளத்தக்க முகவரியாக இருக்க வேண்டும் அதில் <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> ஆகியவற்றைக் கொண்டிருக்க வேண்டும். <ph name="PRINTER_UUID" />ஐ விரும்பினால் வழங்கலாம். அவ்வாறு வழங்கினால் அது <ph name="ZEROCONF_DISCOVERY" /> பிரிண்ட்டர்களின் நகல்களை நீக்குவதற்குப் பயன்படுத்தப்படும்.
+      <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> ஆகியவை பிரிண்ட்டர் தேர்வை எளிதாக்கும் வகையில் உள்ளமைக்கக்கூடிய வார்த்தைகளாகும். இறுதிப் பயனர்கள் பிரிண்ட்டரை எளிதாக அடையாளம் காண்பதற்கு <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> ஆகியவை உதவும். அவை பிரிண்ட்டரின் உற்பத்தியாளரையும் மாடலையும் குறிக்கின்றன. <ph name="PRINTER_URI" /> என்பது கிளையண்ட் கம்ப்யூட்டரிலிருந்து தொடர்புகொள்ளத்தக்க முகவரியாக இருக்க வேண்டும், அது <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, <ph name="URI_QUEUE" /> ஆகியவற்றைக் கொண்டிருக்க வேண்டும். <ph name="PRINTER_UUID" />ஐ விரும்பினால் வழங்கலாம். அவ்வாறு வழங்கினால் அது <ph name="ZEROCONF_DISCOVERY" /> பிரிண்ட்டர்களின் நகல்களை நீக்குவதற்குப் பயன்படுத்தப்படும்.
 
       <ph name="PRINTER_EFFECTIVE_MODEL" /> என்பதில் பிரிண்ட்டரின் பெயர் குறிப்பிடப்பட்டிருக்கவோ <ph name="PRINTER_AUTOCONF" /> என்பது 'சரி' என அமைக்கப்பட்டிருக்கவோ வேண்டும். இந்த இரண்டையும் கொண்டிருந்தாலோ இதில் பண்புகள் எதுவுமே இல்லாமல் இருந்தாலோ ஏற்றுக் கொள்ளப்படாது.
 
@@ -3551,21 +3557,6 @@
 
           கவனத்திற்கு: <ph name="CHARGE_START_TIME_FIELD_NAME" /> மற்றும்<ph name="CHARGE_END_TIME_FIELD_NAME" /> ஆகியவற்றிலுள்ள <ph name="MINUTE_FIELD_NAME" /> புலத்திற்கான அனுமதிக்கப்படும் மதிப்புகள்: 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> அணுகல்தன்மை அம்சங்களை உள்ளமைக்கும்.</translation>
-<translation id="7724994675283793633">இந்தக் கொள்கையானது HTTPக்கான 80 மற்றும் HTTPSக்கான 443 ஆகியவற்றைத் தவிர்த்து, பிற போர்ட்டுகளில் HTTP/0.9ஐ இயக்கும்.
-
-      இயல்பாகவே இந்தக் கொள்கை முடக்கப்பட்டிருக்கும். இயக்கினால், https://crbug.com/600352 இல் விவரிக்கப்பட்டுள்ள பாதுகாப்புச் சிக்கலை பயனர்கள் எதிர்கொள்ளக்கூடும்.
-
-      இந்தக் கொள்கையானது HTTP/0.9 இல் ஏற்கனவே இருக்கும் சேவையகங்களை மாற்றுவதற்கான வாய்ப்பை நிறுவனங்களுக்கு வழங்குகிறது. இந்தக் கொள்கை எதிர்காலத்தில் அகற்றப்படும்.
-
-      இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், வழக்கத்திற்கு மாறான போர்ட்டுகளில் HTTP/0.9 முடக்கப்படும்.</translation>
-<translation id="7726421241038987229">
-      SitePerProcess அமைப்பானது அனைத்துத் தளங்களையும் பிரித்து எடுக்கும் இயல்புநிலை செயல்பாடு வேண்டாமெனப் பயனர்கள் நிராகரிப்பதைத் தடுக்கப் பயன்படுத்தப்படக்கூடும். கவனத்திற்கு: சிறிதளவே வித்தியாசப்படும் பிற தளங்களைப் பிரித்து எடுக்க IsolateOrigins கொள்கையும் உதவக்கூடும்.
-      இந்தக் கொள்கை இயக்கப்பட்டிருந்தால் ஒவ்வொரு தளமும் அதற்குரிய இயல்புநிலை செயல்பாட்டைச் செய்ய வேண்டாமெனப் பயனர்கள் தேர்ந்தெடுக்க முடியாது.
-      இந்தக் கொள்கை உள்ளமைக்கப்படவில்லை என்றாலோ முடக்கப்பட்டு இருந்தாலோ, தளத்தைப் பிரித்து எடுக்க வேண்டாமெனப் பயனர்கள் தேர்ந்தெடுக்க முடியும் (எ.கா. Chrome://flags என்பதிலுள்ள "தளத்தைப் பிரித்து எடுப்பதை முடக்கு" என்ற அமைப்பைப் பயன்படுத்துதல்).  இந்தக் கொள்கையை முடக்கினால் மற்றும்/அல்லது உள்ளமைக்கவில்லை என்றால் 'தளத்தைப் பிரித்து எடுத்தல்' ஆஃப் செய்யப்படாது.
-      <ph name="PRODUCT_OS_NAME" /> ஆப்ரேட்டிங் சிஸ்டத்தில் <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> சாதனக் கொள்கையையும் அதே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரு கொள்கைகளிலும் குறிப்பிட்டுள்ள மதிப்புகள் பொருந்தாதபட்சத்தில் பயனர் கொள்கையில் குறிப்பிட்டுள்ள மதிப்பைப் பயன்படுத்தும்போது பயனர் அமர்வில் உள்நுழையத் தாமதமாகலாம்.
-
-      கவனத்திற்கு: இந்தக் கொள்கை Andriodக்குப் பொருந்தாது. Andriodல் SitePerProcessஸை இயக்க SitePerProcessAndroid கொள்கை அமைப்பைப் பயன்படுத்தவும்.
-      </translation>
 <translation id="7747447585227954402"><ph name="PRODUCT_OS_NAME" /> இல் சாதனங்கள் <ph name="PLUGIN_VM_NAME" />ஐப் பயன்படுத்த அனுமதிக்கவும்</translation>
 <translation id="7749402620209366169">பயனர் குறிப்பிடும் PINனுக்குப் பதிலாக, தொலைநிலை அணுகல் ஹோஸ்ட்களுக்கு இருபடி அங்கீகாரத்தைச் செயல்படுத்தும்.
 
@@ -3787,6 +3778,7 @@
       இந்தக் கொள்கையை அமைக்காமல் விட்டால், 'URLBlacklist' கொள்கையிலுள்ள தடுப்புப் பட்டியலில் எந்த விதிவிலக்குகளும் இருக்காது.</translation>
 <translation id="8176035528522326671">நிறுவன பயனரை, முதன்மை பலசுயவிவரப் பயனராவதற்கு மட்டும் அனுமதி (நிர்வகிக்கப்பட்ட நிறுவன பயனர்களுக்கான இயல்பு செயல்பாடு)</translation>
 <translation id="8183108371184777472">உலாவி சாளரம் தொடங்குவதை நிறுத்து</translation>
+<translation id="8186911565834244165">பயனரின் கருத்தை அனுமதித்தல்</translation>
 <translation id="8214600119442850823">கடவுச்சொல் நிர்வாகியை உள்ளமைக்கும்.</translation>
 <translation id="8217516105848565518">இந்தக் கொள்கை தடுக்கப்பட்டுள்ளது. அதற்குப் பதிலாக RemoteAccessHostDomainList கொள்கையைப் பயன்படுத்தவும்.</translation>
 <translation id="8244171102276095471">TLSஸில் உள்ள RC4 சைஃபர் சூட்களை இயக்கும்</translation>
@@ -4192,6 +4184,12 @@
 <translation id="9112897538922695510">நெறிமுறை ஹேண்ட்லர்களின் பட்டியலைப் பதிவுசெய்ய உங்களை அனுமதிக்கிறது. இது மட்டும் தான் பரிந்துரைக்கப்பட்ட கொள்கையாகும். |protocol| பண்புக்கூறு "இதற்கு அனுப்பு" போன்ற அமைப்பிற்கும், |url| பண்புக்கூறு அமைப்பைச் செயல்படுத்தும் ஆப்ஸின் URL அமைப்பிற்கும் அமைக்கப்பட்டிருக்க வேண்டும். '%s' ஆனது செயல்படுத்தப்பட்ட URL க்குப் பதிலாக மாற்றியமைக்கப்படும் படி இருந்தால், அமைப்பில் அதைச் சேர்க்கலாம்.
 
           கொள்கை மூலம் பதிவுசெய்யப்பட்ட நெறிமுறை ஹேண்ட்லர்கள் பயனர் மூலம் பதிவுசெய்யப்பட்ட ஒன்றுடன் இணைக்கப்படும், மேலும் அவை இரண்டும் பயன்படுத்துவதற்குக் கிடைக்கும். புதிய இயல்புநிலை ஹேண்ட்லரை நிறுவுவதன் மூலம், பயனர் கொள்கையினால் நிறுவப்பட்ட நெறிமுறை ஹேண்ட்லர்களில் மேலெழுதலாம், ஆனால் கொள்கை மூலம் பதிவுசெய்யப்பட்ட நெறிமுறை ஹேண்ட்லரை அகற்ற முடியாது.</translation>
+<translation id="91196902572559194">'குரல் மூலம் செயல்படுத்தும் சொற்றொடரை' Google அசிஸ்டண்ட் கேட்பதற்கு இந்தக் கொள்கை அனுமதிக்கும்.
+
+      இந்தக் கொள்கை இயக்கப்பட்டிருந்தால் 'குரல் மூலம் செயல்படுத்தும் சொற்றொடரை' Google அசிஸ்டண்ட் கேட்க இயலும்.
+      இந்தக் கொள்கை முடக்கப்பட்டிருந்தால் 'குரல் மூலம் செயல்படுத்தும் சொற்றொடரை' Google அசிஸ்டண்ட் கேட்க இயலாது.
+      கொள்கை அமைக்கப்படாமல் இருந்தால் 'குரல் மூலம் செயல்படுத்தும் சொற்றொடரை' Google அசிஸ்டண்ட் கேட்பதற்கு அனுமதிக்கலாமா வேண்டாமா என்பதைப் பயனர்களால் தீர்மானிக்க முடியும்.
+      </translation>
 <translation id="9123211093995421438">குறிப்பிட்ட ஏதேனும் நேரத்தில், நிலையான பதிப்பில் இருந்து, எத்தனை <ph name="PRODUCT_OS_NAME" /> மைல்ஸ்டோன்களுக்கு பின்னோக்கி மீட்டமைக்க அனுமதிக்கப்படும் என்ற எண்ணிக்கையைக் குறிப்பிடும்.
 
       இயல்பாக, நுகர்வோருக்கு 0, நிறுவனம் பதிவுசெய்த சாதனங்களுக்கு 4 (தோரா. அரையாண்டு).
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index fe7b08d..d538ae98 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -439,12 +439,6 @@
 
       విధానాన్ని <ph name="PRODUCT_OS_NAME" /> సేవా నిబంధనలను డౌన్‌లోడ్ చేయగల URLకు సెట్ చేయాలి. సేవా నిబంధనలు MIME రకం వచనం/సాదా అందించబడిన విధంగా సాదా వచనంగా ఉండాలి. మార్కప్ అనుమతించబడదు.</translation>
 <translation id="1750315445671978749">అన్ని డౌన్‌లోడ్‌లను బ్లాక్ చేయి</translation>
-<translation id="1762072363876276024">
-      ఈ విధానం సైన్-ఇన్ స్క్రీన్‌కు వర్తిస్తుంది. వినియోగదారు సెషన్‌కు వర్తించే <ph name="SITE_PER_PROCESS_POLICY_NAME" /> విధానాన్ని కూడా దయచేసి చూడండి. రెండు విధానాలను ఒకే విలువకు సెట్ చేయాల్సిందిగా సిఫార్సు చేయడమైనది. ఒకవేళ విలువలు సరిపోలకుంటే, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువను వర్తింపజేస్తున్నప్పుడు వినియోగదారు సెషన్‌లోకి ప్రవేశించే సమయంలో ఆలస్యం కావచ్చు.
-      ఈ DeviceLoginScreenSitePerProcess సెట్టింగ్, అన్ని సైట్‌లను వేరు చేసే డిఫాల్ట్ ప్రవర్తనను వినియోగదారులు నిలిపివేయకుండా అడ్డుకోవడానికి ఉపయోగించబడవచ్చు. ఈ DeviceLoginScreenIsolateOrigins విధానం అదనంగా అందించబడే, మరింత సూక్ష్మస్థాయి ప్రారంభ స్థానాలను వేరు చేయడానికి కూడా ఉపయోగపడవచ్చని గుర్తుంచుకోండి.
-      ఈ విధానాన్ని ప్రారంభించినట్లయితే, ప్రతి సైట్ దాని స్వంత ప్రక్రియను అమలు చేసే డిఫాల్ట్ ప్రవర్తనను వినియోగదారులు నిలిపివేయలేరు.
-      ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా నిలిపివేస్తే, వినియోగదారు ఈ సెట్టింగ్‌ను మార్చగలుగుతారు (ఉదా. chrome://flagsలో "సైట్ ఐసోలేషన్‌ను నిలిపివేయి" నమోదును ఉపయోగించడం).
-      </translation>
 <translation id="1767673020408652620">శోధన బాక్స్ యొక్క జీరో స్టేట్‌లో యాప్ సిఫార్సులను ప్రారంభించండి</translation>
 <translation id="17719159826324007">
       ఈ విధానాన్ని ArcSessionకు సెట్ చేసినప్పుడు, Android ప్రారంభించబడితే గనుక, వినియోగదారు సైన్ అవుట్ చేసినప్పుడు పరికరం తప్పనిసరిగా రీబూట్ అయ్యేలా నిర్దేశిస్తుంది.
@@ -2464,6 +2458,10 @@
       దీని వలన అందించబడిన సర్టిఫికెట్ ప్రామాణీకరించబడే హోస్ట్ పేర్లను నియంత్రించే nameConstraints ఎక్స్‌టెన్షన్‌ను దాటవేయడం అనుమతించబడే అవకాశం ఉన్నందున ఇది సిఫార్సు చేయదగినది కాదని గుర్తుంచుకోండి.
 
       ఈ విధానాన్ని సెట్ చేయకపోతే లేదా 'తప్పు'గా సెట్ చేస్తే, DNS పేరు లేదా IP చిరునామాను కలిగి ఉన్న subjectAlternativeName ఎక్స్‌టెన్షన్ లేని సర్వర్ సర్టిఫికెట్‌లు విశ్వసించబడవు.</translation>
+<translation id="5578571772998293651">వినియోగదారు అభిప్రాయాన్ని అనుమతిస్తుంది.
+        ఈ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే, వినియోగదారులు Googleకు అభిప్రాయాన్ని పంపలేరు.
+
+        ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే లేదా 'ఒప్పు'గా సెట్ చేస్తే, వినియోగదారులు "మెను-&gt;సహాయం-&gt;సమస్యను నివేదించు" లేదా కీ కాంబినేషన్ ద్వారా Googleకు అభిప్రాయాన్ని పంపగలుగుతారు.</translation>
 <translation id="5581292529942108810">Chrome నివేదన ఎక్స్‌టెన్షన్ సంబంధిత విధానాలను కాన్ఫిగర్ చేయండి.
 
       <ph name="CHROME_REPORTING_EXTENSION_NAME" /> ప్రారంభించినప్పుడు, అలాగే మెషీన్‌ని <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />తో నమోదు చేసినప్పుడు మాత్రమే ఈ విధానం వర్తిస్తుంది.</translation>
@@ -3577,22 +3575,6 @@
 
  గమనిక: <ph name="CHARGE_START_TIME_FIELD_NAME" /> మరియు <ph name="CHARGE_END_TIME_FIELD_NAME" />లో <ph name="MINUTE_FIELD_NAME" /> ఫీల్డ్‌లో అనుమతించబడే విలువలు 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> యాక్సెస్‌ ఫీచ‌ర్‌ల‌ను కాన్ఫిగర్ చేయండి.</translation>
-<translation id="7724994675283793633">ఈ విధానం HTTP కోసం 80 మరియు HTTPS కోసం 443 మినహా మిగిలిన పోర్ట్‌లలో HTTP/0.9ని ప్రారంభిస్తుంది.
-
-      ఈ విధానం డిఫాల్ట్‌గా నిలిపివేయబడి ఉంటుంది, దీనిని ప్రారంభిస్తే, వినియోగదారులకు ఇలాంటి భద్రతా సమస్య ఏర్పడవచ్చు, https://crbug.com/600352
-
-      ఈ విధానం సంస్థలకు ఇప్పటికే HTTP/0.9లో ఉన్న సర్వర్‌లను తరలించే అవకాశం ఇవ్వడానికి ఉద్దేశించబడింది మరియు భవిష్యత్తులో నిలిపివేయబడుతుంది.
-
-      ఈ విధానం సెట్ చేయకపోతే, డిఫాల్ట్ యేతర పోర్ట్‌లలో HTTP/0.9 నిలిపివేయబడుతుంది.</translation>
-<translation id="7726421241038987229">
-      ఈ SitePerProcess సెట్టింగ్, అన్ని సైట్‌లను వేరు చేసే డిఫాల్ట్ ప్రవర్తనను వినియోగదారులు నిలిపివేయకుండా అడ్డుకోవడానికి ఉపయోగించబడవచ్చు. ఈ IsolateOrigins విధానం అదనంగా అందించబడే, మరింత సూక్ష్మస్థాయి ప్రారంభ స్థానాలను వేరు చేయడానికి కూడా ఉపయోగపడవచ్చని గుర్తుంచుకోండి.
-      ఈ విధానాన్ని ప్రారంభించినట్లయితే, ప్రతి సైట్ దాని స్వంత ప్రక్రియను అమలు చేసే డిఫాల్ట్ ప్రవర్తనను వినియోగదారులు నిలిపివేయలేరు.
-      ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా నిలిపివేస్తే, సైట్ ఐసోలేషన్‌ను వినియోగదారు నిలిపివేయగలుగుతారు
-      (ఉదా. chrome://flagsలో "సైట్ ఐసోలేషన్‌ను నిలిపివేయి" నమోదును ఉపయోగించడం).  ఈ విధానాన్ని నిలిపివేసే విధంగా సెట్ చేసినా మరియు/లేదా కన్ఫిగర్ చేయకుండా వదిలేసినా, సైట్ ఐసోలేషన్ ఆఫ్ చేయబడదు.
-      <ph name="PRODUCT_OS_NAME" />లో, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> పరికర విధానాన్ని కూడా ఇదే విలువకు సెట్ చేయాల్సిందిగా సిఫార్సు చేయడమైనది. ఈ రెండు విధానాల ద్వారా పేర్కొన్న విలువలు సరిపోలకుంటే, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువను వర్తింపజేస్తున్నప్పుడు వినియోగదారు సెషన్‌లోకి ప్రవేశించే సమయంలో ఆలస్యం కావచ్చు.
-
-      గమనిక: ఈ విధానం Androidలో వర్తించదు. Androidలో SitePerProcessను ప్రారంభించడానికి, SitePerProcessAndroid విధాన సెట్టింగ్‌ను ఉపయోగించండి.
-      </translation>
 <translation id="7747447585227954402"><ph name="PRODUCT_OS_NAME" />లో <ph name="PLUGIN_VM_NAME" />ను ఉపయోగించడానికి పరికరాలకు అనుమతించు</translation>
 <translation id="7749402620209366169">రిమోట్ యాక్సెస్‌ హోస్ట్‌ల కోసం వినియోగదారు-నిర్దిష్ట PINకు బదులుగా రెండు-ద‌శ‌ల‌ ప్రామాణీకరణను ప్రారంభిస్తుంది.
 
@@ -3815,6 +3797,7 @@
       ఈ విధానాన్ని సెట్ చేయకపోతే 'URLBlacklist' విధానం నుండి నిరోధిత జాబితాకు మినహాయింపులు ఉండవు.</translation>
 <translation id="8176035528522326671">ఎంటర్‌ప్రైజ్ వినియోగదారు కేవలం ప్రాథమిక బహుళ ప్రొఫైల్ వినియోగదారుగా ఉండేలా అనుమతించండి (ఎంటర్‌ప్రైజ్-నిర్వాహిత‌ వినియోగదారుల కోసం డిఫాల్ట్ ప్రవర్తన)</translation>
 <translation id="8183108371184777472">బ్రౌజర్ విండో ప్రారంభం కాకుండా నిరోధించండి</translation>
+<translation id="8186911565834244165">వినియోగదారు అభిప్రాయాన్ని అనుమతించండి</translation>
 <translation id="8214600119442850823">పాస్‌వర్డ్ నిర్వాహికిని కాన్ఫిగర్ చేస్తుంది.</translation>
 <translation id="8217516105848565518">ఈ విధానం నిలిపివేయబడింది. బదులుగా, దయచేసి RemoteAccessHostDomainListను ఉపయోగించండి.</translation>
 <translation id="8244171102276095471">TLSలో RC4 సైఫర్ సూట్‌లను ప్రారంభించండి</translation>
@@ -4257,6 +4240,12 @@
 <translation id="9112897538922695510">ప్రోటోకాల్ హ్యాండ్లర్‌ల జాబితాను నమోదు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది కేవలం సిఫార్సు చేయబడిన విధానంగా మాత్రమే పరిగణించబడుతుంది. |protocol| ఫీచర్‌ను 'mailto' వంటి స్కీమ్‌కు సెట్ చేయాలి మరియు |url| ఫీచర్‌ను స్కీమ్‌ను నిర్వహించే యాప్ యొక్క URL నమూనాకు సెట్ చేయాలి. నమూనాలో '%s' ఉండవచ్చు, ఒకవేళ ఉంటే, దానిని నిర్వహించబడే URL భర్తీ చేస్తుంది.
 
           విధానం ద్వారా నమోదు అయిన ప్రోటోకాల్ హ్యాండ్లర్‌లు వినియోగదారు నమోదు చేసిన హ్యాండ్లర్‌లతో విలీనమవుతాయి మరియు రెండూ వినియోగించడానికి అందుబాటులో ఉంటాయి. వినియోగదారు కొత్త డిఫాల్ట్ హ్యాండ్లర్‌‌ను ఇన్‌స్టాల్ చేసి విధానం ద్వారా ఇన్‌స్టాల్ చేయబడిన ప్రోటోకాల్ హ్యాండ్లర్‌లను భర్తీ చేయవచ్చు, కానీ విధానం నమోదు చేసిన ప్రోటోకాల్ హ్యాండ్లర్‌ను తీసివేయలేరు.</translation>
+<translation id="91196902572559194">వాయిస్ యాక్టివేషన్ పదబంధాన్ని వినడానికి ఈ విధానం Google అసిస్టెంట్‌కు అనుమతిని మంజూరు చేస్తుంది.
+
+      ఈ విధానాన్ని ప్రారంభిస్తే, వాయిస్ యాక్టివేషన్ పదబంధాన్ని Google అసిస్టెంట్ వినగలుగుతుంది.
+      ఈ విధానాన్ని నిలిపివేస్తే, వాయిస్ యాక్టివేషన్ పదబంధాన్ని Google అసిస్టెంట్ వినలేదు.
+      ఈ విధానాన్ని సెట్ చేయకుంటే, వాయిస్ యాక్టివేషన్ పదబంధాన్ని వినడానికి Google అసిస్టెంట్‌ను అనుమతించాలో లేదో వినియోగదారులు నిర్ణయం తీసుకోగలుగుతారు.
+      </translation>
 <translation id="9123211093995421438">ఏ సమయంలో అయిన స్థిర వెర్షన్ నుండి పునరుద్ధరించడానికి అనుమతించాల్సిన <ph name="PRODUCT_OS_NAME" /> మైలురాళ్ల క‌నిష్ఠ‌ సంఖ్యను పేర్కొంటుంది.
 
       వినియోగదారు కోసం డిఫాల్ట్ 0, ఎంటర్‌ప్రైజ్ నమోదు చేయబడిన పరికరాల కోసం 4 (సుమారు సగం సంవత్సరం).
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index a002545..9a50aef 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -441,12 +441,6 @@
 
       นโยบายควรที่จะถูกติดตั้งลงใน URL ที่ <ph name="PRODUCT_OS_NAME" /> สามารถดาวน์โหลดข้อกำหนดในการให้บริการได้ โดยข้อกำหนดในการให้บริการจะต้องเป็นข้อความล้วน ซึ่งทำงานเป็นข้อความ/ล้วนชนิด MIME ไม่อนุญาตให้ใช้มาร์กอัป</translation>
 <translation id="1750315445671978749">บล็อกการดาวน์โหลดทั้งหมด</translation>
-<translation id="1762072363876276024">
-      นโยบายนี้จะใช้กับหน้าจอการลงชื่อเข้าใช้ โปรดดูนโยบาย <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ด้วยซึ่งใช้กับเซสชันของผู้ใช้ ขอแนะนำให้ตั้งค่าของนโยบายทั้งสองเป็นค่าเดียวกัน หากค่าไม่ตรงกัน อาจเกิดความล่าช้าเวลาเข้าสู่เซสชันของผู้ใช้ และระบบจะใช้ค่าที่นโยบายผู้ใช้ระบุไว้
-      คุณอาจใช้การตั้งค่า DeviceLoginScreenSitePerProcess นี้เพื่อห้ามไม่ให้ผู้ใช้เลือกไม่ใช้ลักษณะการทำงานเริ่มต้นของการแยกเว็บไซต์ทั้งหมด โปรดทราบว่านโยบาย DeviceLoginScreenIsolateOrigins อาจเป็นประโยชน์ต่อการแยกต้นทางเพิ่มเติมที่ละเอียดยิ่งขึ้นด้วย
-      หากเปิดใช้นโยบายนี้ ผู้ใช้จะเลือกไม่ใช้ลักษณะการทำงานเริ่มต้นที่แต่ละเว็บไซต์ทำงานในกระบวนการของตนเองไม่ได้
-      หากไม่ได้กำหนดค่านโยบายนี้หรือปิดใช้ไว้ ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ (เช่น โดยใช้รายการ "ปิดใช้การแยกเว็บไซต์" ใน chrome://flags)
-      </translation>
 <translation id="1767673020408652620">เปิดใช้แอปแนะนำในสถานะค่าเป็นศูนย์ของช่องค้นหา</translation>
 <translation id="17719159826324007">
       เมื่อตั้งค่าเป็น ArcSession นโยบายนี้จะบังคับให้อุปกรณ์รีบูตเมื่อผู้ใช้ออกจากระบบหาก Android เริ่มต้นแล้ว
@@ -2457,6 +2451,10 @@
       โปรดทราบว่าเราไม่แนะนำวิธีดังกล่าว เนื่องจากวิธีนี้อาจทำให้สามารถข้ามผ่านส่วนขยาย nameConstraints ซึ่งจำกัดชื่อโฮสต์ที่ใบรับรองได้รับสิทธิ์ให้ใช้
 
       หากไม่มีการตั้งค่านโยบายนี้ หรือตั้งค่าเป็น False ระบบจะไม่เชื่อถือใบรับรองเซิร์ฟเวอร์ที่ไม่มีส่วนขยาย subjectAlternativeName ที่มีชื่อ DNS หรือที่อยู่ IP</translation>
+<translation id="5578571772998293651">อนุญาตความคิดเห็นจากผู้ใช้
+        หากตั้งค่านโยบายเป็น "เท็จ" ผู้ใช้จะส่งความคิดเห็นไปที่ Google ไม่ได้
+
+        หากไม่ได้ตั้งนโยบายหรือตั้งค่าเป็น "จริง" ผู้ใช้จะส่งความคิดเห็นไปที่ Google ได้ผ่านทางเมนู-&gt;ความช่วยเหลือ-&gt;รายงานปัญหา หรือโดยการกดแป้นร่วมกัน</translation>
 <translation id="5581292529942108810">กำหนดค่านโยบายที่เกี่ยวข้องกับส่วนขยายการรายงานของ Chrome
 
       นโยบายนี้จะมีผลเฉพาะเมื่อ <ph name="CHROME_REPORTING_EXTENSION_NAME" /> เปิดอยู่ และลงทะเบียนเครื่องกับ <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> แล้ว</translation>
@@ -3578,22 +3576,6 @@
 
           หมายเหตุ: ค่าที่อนุญาตสำหรับช่อง <ph name="MINUTE_FIELD_NAME" /> ใน <ph name="CHARGE_START_TIME_FIELD_NAME" /> และ <ph name="CHARGE_END_TIME_FIELD_NAME" /> คือ 0, 15, 30, 45</translation>
 <translation id="7717938661004793600">กำหนดค่าฟีเจอร์การเข้าถึงของ <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="7724994675283793633">นโยบายนี้เปิดใช้ HTTP/0.9 บนพอร์ตอื่นนอกเหนือจากพอร์ต 80 สำหรับ HTTP และพอร์ต 443 สำหรับ HTTPS
-
-      ระบบปิดใช้นโยบายนี้ไว้โดยค่าเริ่มต้น และหากเปิดใช้จะทำให้ผู้ใช้เสี่ยงต่อปัญหาความปลอดภัย https://crbug.com/600352
-
-      นโยบายนี้มีไว้เพื่อเปิดโอกาสให้องค์กรต่างๆ ย้ายข้อมูลเซิร์ฟเวอร์ที่มีอยู่ออกจาก HTTP/0.9 และจะมีการนำออกในอนาคต
-
-      หากไม่มีการตั้งค่านโยบายนี้ ระบบจะปิดใช้ HTTP/0.9 บนพอร์ตที่ไม่ใช่ค่าเริ่มต้น</translation>
-<translation id="7726421241038987229">
-      คุณอาจใช้การตั้งค่า SitePerProcess นี้เพื่อห้ามไม่ให้ผู้ใช้เลือกไม่ใช้ลักษณะการทำงานเริ่มต้นของการแยกเว็บไซต์ทั้งหมด โปรดทราบว่านโยบาย IsolateOrigins อาจเป็นประโยชน์สำหรับการแยกต้นทางเพิ่มเติมที่ละเอียดยิ่งขึ้นด้วย
-      หากเปิดใช้นโยบายนี้ ผู้ใช้จะเลือกไม่ใช้ลักษณะการทำงานเริ่มต้นที่แต่ละเว็บไซต์ทำงานในกระบวนการของตนเองไม่ได้
-      หากไม่ได้กำหนดค่านโยบายนี้หรือปิดใช้ไว้ ผู้ใช้จะเลือกไม่ใช้การแยกเว็บไซต์ได้
-      (เช่น โดยใช้รายการ "ปิดใช้การแยกเว็บไซต์" ใน chrome://flags)  การตั้งค่านโยบายเป็นปิดใช้และ/หรือการไม่กำหนดค่านโยบายจะไม่เป็นการปิดการแยกเว็บไซต์
-      ใน <ph name="PRODUCT_OS_NAME" /> ขอแนะนำให้ตั้งค่าของนโยบายด้านอุปกรณ์ <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> เป็นค่าเดียวกัน หากค่าที่นโยบายทั้งสองระบุไม่ตรงกัน อาจเกิดความล่าช้าเวลาเข้าสู่เซสชันของผู้ใช้ และระบบจะใช้ค่าที่นโยบายผู้ใช้ระบุไว้
-
-      หมายเหตุ: นโยบายนี้ไม่มีผลกับ Android หากต้องการเปิดใช้ SitePerProcess ใน Android ให้ใช้การตั้งค่านโยบาย SitePerProcessAndroid
-      </translation>
 <translation id="7747447585227954402">อนุญาตให้อุปกรณ์ใช้ <ph name="PLUGIN_VM_NAME" /> ใน <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">เปิดใช้งานการตรวจสอบสิทธิ์แบบสองปัจจัยสำหรับโฮสต์การเข้าถึงระยะไกลแทนการใช้ PIN ที่ระบุโดยผู้ใช้
 
@@ -3815,6 +3797,7 @@
       หากไม่มีการตั้งค่านโยบายนี้ จะไม่มีข้อยกเว้นใดๆ ในรายการที่ไม่อนุญาตจากนโยบาย "URLBlacklist"</translation>
 <translation id="8176035528522326671">อนุญาตให้ผู้ใช้ขององค์กรเป็นผู้ใช้หลักแบบหลายโปรไฟล์เท่านั้น (ค่าเริ่มต้นสำหรับผู้ใช้ที่มีองค์กรเป็นผู้จัดการ)</translation>
 <translation id="8183108371184777472">ระงับการเปิดหน้าต่างเบราว์เซอร์ขึ้นมา</translation>
+<translation id="8186911565834244165">อนุญาตความคิดเห็นจากผู้ใช้</translation>
 <translation id="8214600119442850823">กำหนดค่าตัวจัดการรหัสผ่าน</translation>
 <translation id="8217516105848565518">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ RemoteAccessHostDomainList แทน</translation>
 <translation id="8244171102276095471">เปิดใช้ชุดการเข้ารหัส RC4 ใน TLS</translation>
@@ -4247,6 +4230,12 @@
 <translation id="9112897538922695510">อนุญาตให้คุณลงทะเบียนรายชื่อเครื่องจัดการโปรโตคอล ซึ่งจะแนะนำได้โดยนโยบายเท่านั้น ต้องมีการตั้งค่าพร็อพเพอร์ตี้ |protocol| ในรูปแบบ เช่น "mailto" และต้องมีการตั้งค่าพร็อพเพอร์ตี้ |url| ในรูปแบบ URL ของแอปพลิเคชันที่จัดการรูปแบบดังกล่าว รูปแบบอาจมี "%s" ซึ่งจะแทนที่ด้วย URL ที่มีการจัดการหากปรากฏขึ้น
 
           เครื่องจัดการโปรโตคอลที่นโยบายลงทะเบียนจะรวมเข้ากับเครื่องจัดการที่ผู้ใช้ลงทะเบียน และจะพร้อมใช้งานทั้งสองแบบ ผู้ใช้สามารถแทนที่เครื่องจัดการโปรโตคอลที่นโยบายติดตั้ง โดยการติดตั้งเครื่องจัดการเริ่มต้นใหม่ แต่จะไม่สามารถนำเครื่องจัดการโปรโตคอลที่นโยบายลงทะเบียนออกได้</translation>
+<translation id="91196902572559194">นโยบายนี้ให้สิทธิ์ Google Assistant ในการคอยฟังข้อความการเปิดใช้งานด้วยเสียง
+
+      หากเปิดใช้นโยบาย Google Assistant จะคอยฟังข้อความการเปิดใช้งานด้วยเสียง
+      หากปิดใช้นโยบาย Google Assistant จะไม่คอยฟังข้อความการเปิดใช้งานด้วยเสียง
+      หากไม่ได้ตั้งค่านโยบาย ผู้ใช้จะเลือกได้ว่าจะอนุญาตให้ Google Assistant คอยฟังข้อความการเปิดใช้งานด้วยเสียงหรือไม่
+      </translation>
 <translation id="9123211093995421438">กำหนดจุดขั้นต่ำของ <ph name="PRODUCT_OS_NAME" /> การย้อนกลับควรอนุญาตให้ย้อนได้ถึงเวอร์ชันที่เสถียรแล้วในช่วงเวลาใดก็ตาม
 
       ค่าเริ่มต้นคือ 0 สำหรับผู้บริโภค และ 4 (ประมาณครึ่งปี) สำหรับอุปกรณ์ที่ลงทะเบียนโดยองค์กร
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 51bf2bd1..3d53201bd 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -440,12 +440,6 @@
 
       Politika, <ph name="PRODUCT_OS_NAME" /> tarafından Hizmet Şartları'nın indirilebileceği bir URL'ye ayarlanmalıdır. Hizmet Şartları'nda düz metin kullanılmalı, MIME türü metin/düz olarak sunulmalıdır. Herhangi bir işaretleme kullanılamaz.</translation>
 <translation id="1750315445671978749">Tüm indirmeleri engelle</translation>
-<translation id="1762072363876276024">
-      Bu politika, oturum açma ekranı için geçerlidir. Lütfen kullanıcı oturumu için geçerli olan <ph name="SITE_PER_PROCESS_POLICY_NAME" /> politikasına da bakın. Her iki politikanın da aynı değere ayarlanması önerilir. Değerlerin eşleşmemesi durumunda, kullanıcı oturumuna giriş sırasında kullanıcı politikası tarafından belirtilen değer uygulanırken gecikme yaşanabilir.
-      Bu ayar (DeviceLoginScreenSitePerProcess) kullanıcıların tüm sitelerin izole edilmesine yönelik varsayılan davranışı devre dışı bırakmalarını engellemek için kullanılabilir. DeviceLoginScreenIsolateOrigins politikasının daha ayrıntılı ek kaynakları izole etmede faydalı olabileceğini unutmayın.
-      Bu politika etkinleştirilirse kullanıcılar her sitenin kendi işleminde çalıştığı varsayılan davranışı devre dışı bırakamazlar.
-      Politika yapılandırılmaz veya devre dışı bırakılırsa, kullanıcı bu ayarı değiştirebilir (ör. chrome://flags'de "Site izolasyonunu devre dışı bırak" seçeneğini kullanarak).
-      </translation>
 <translation id="1767673020408652620">Arama Kutusunun Sıfır Durumunda Uygulama Önerileri Politikasını Etkinleştir</translation>
 <translation id="17719159826324007">
       Bu politika ArcSession değerine ayarlandığında, Android başlatılmışsa kullanıcı oturumu kapatıldığında cihazı yeniden başlamaya zorlar.
@@ -2532,6 +2526,10 @@
       Belirli bir sertifikanın yetkilendirilebileceği ana makine adlarını sınırlandıran nameConstraints uzantısının atlanmasına olanak tanıyabileceği için bunun önerilen bir yöntem olmadığını unutmayın.
 
       Bu politika ayarlanmazsa veya false (yanlış) değerine ayarlanırsa bir DNS adı veya IP adresi içerip de subjectAlternativeName uzantısı bulunmayan sunucu sertifikalarına güvenilmez.</translation>
+<translation id="5578571772998293651">Kullanıcı geri bildirimine izin verilir.
+        Politika false (yanlış) değerine ayarlanırsa kullanıcılar Google'a geri bildirim gönderemezler.
+
+        Politika ayarlanmazsa veya true (doğru) değerine ayarlanırsa kullanıcılar Menü-&gt;Yardım-&gt;Sorun bildir veya tuş kombinasyonunu kullanarak Google'a geri bildirim gönderebilirler.</translation>
 <translation id="5581292529942108810">Chrome Raporlama Uzantısı ile ilişkili politikaları yapılandırır.
 
       Bu politika yalnızca <ph name="CHROME_REPORTING_EXTENSION_NAME" /> etkinleştirildiğinde ve makine <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> politikasına kayıtlı olduğunda geçerli olur.</translation>
@@ -3671,22 +3669,6 @@
 
           Not: <ph name="CHARGE_START_TIME_FIELD_NAME" /> ve <ph name="CHARGE_END_TIME_FIELD_NAME" /> alanında <ph name="MINUTE_FIELD_NAME" /> alanı için izin verilen değerler 0, 15, 30, 45'tir.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> erişilebilirlik özelliklerini yapılandır.</translation>
-<translation id="7724994675283793633">Bu politika, HTTP için 80 dışındaki bağlantı noktalarında ve HTTPS için 443 dışındaki bağlantı noktalarında HTTP/0.9 desteğini etkinleştirir.
-
-      Bu politika varsayılan olarak devre dışıdır ve etkinleştirilirse kullanıcıları https://crbug.com/600352 adresinde belirtilen güvenlik sorununa karşı açık durumda bırakır.
-
-      Bu politika, işletmelere mevcut sunucularını HTTP/0.9 dışındaki bir sürüme taşımaları için fırsat vermek amacıyla tasarlanmıştır ve ileride kaldırılacaktır.
-
-      Bu politika ayarlanmazsa HTTP/0.9, varsayılan olmayan bağlantı noktalarında devre dışı bırakılır.</translation>
-<translation id="7726421241038987229">
-      Bu ayar (SitePerProcess), kullanıcıların tüm sitelerin izole edilmesine yönelik varsayılan davranışı devre dışı bırakmalarını engellemek için kullanılabilir. IsolateOrigins politikasının daha ayrıntılı ek kaynakları izole etmede faydalı olabileceğini unutmayın.
-      Bu politika etkinleştirilirse kullanıcılar her sitenin kendi işleminde çalıştığı varsayılan davranışı devre dışı bırakamazlar.
-      Bu politika yapılandırılmaz veya devre dışı bırakılırsa kullanıcı, site izolasyonunu devre dışı bırakabilir
-      (ör. chrome://flags'de "Site izolasyonunu devre dışı bırak" girişiyle).  Politikayı devre dışı olarak ayarlamak ve:/veya politikayı yapılandırmamak Site İzolasyonu'nu kapatmaz.
-      <ph name="PRODUCT_OS_NAME" /> üzerinde <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> cihaz politikasının da aynı değere ayarlanması önerilir. İki politika tarafından belirtilen değerlerin eşleşmemesi durumunda, kullanıcı oturumuna giriş sırasında kullanıcı politikası tarafından belirtilen değer uygulanırken gecikme yaşanabilir.
-
-      NOT: Bu politika Android'de geçerli değildir. Android'de SitePerProcess'i etkinleştirmek için, SitePerProcessAndroid politikası ayarını kullanın.
-      </translation>
 <translation id="7747447585227954402">Cihazların <ph name="PRODUCT_OS_NAME" /> üzerinde bir <ph name="PLUGIN_VM_NAME" /> kullanmasına izin verir</translation>
 <translation id="7749402620209366169">Uzaktan erişim ana makineleri için, kullanıcı tarafından belirlenen PIN yerine iki öğeli kimlik doğrulamayı etkinleştirir.
 
@@ -3914,6 +3896,7 @@
       Bu politika ayarlanmazsa, kara listenin 'URLBlacklist' politikasına göre hiçbir istisnası olmaz.</translation>
 <translation id="8176035528522326671">Kurumsal kullanıcının sadece birincil çok profilli kullanıcı olmasına izin ver (Kurumsal olarak yönetilen kullanıcılar için varsayılan çalışma biçimidir)</translation>
 <translation id="8183108371184777472">Tarayıcı penceresini başlatmayı engelleme</translation>
+<translation id="8186911565834244165">Kullanıcı geri bildirimine izin ver</translation>
 <translation id="8214600119442850823">Şifre yöneticisini yapılandırır.</translation>
 <translation id="8217516105848565518">Bu politika kullanımdan kaldırılmıştır. Bunun yerine lütfen RemoteAccessHostDomainList politikasını kullanın.</translation>
 <translation id="8244171102276095471">TLS'deki RC4 şifre paketlerini etkinleştir</translation>
@@ -4325,6 +4308,12 @@
 <translation id="9112897538922695510">Bir protokol işleyicileri listesini kaydetmenize olanak tanır. Bu, yalnızca önerilen bir politika olabilir. |protocol| özelliğinin "mailto" gibi şemaya ayarlanması ve |url| özelliğinin de şemayı işleyen uygulamanın URL kalıbına ayarlanması gerekir. Kalıp bir "%s" makrosu içerebilir; bu durumda, makro işlenen URL tarafından değiştirilir.
 
           Politika tarafından kaydedilen protokol işleyicileri, kullanıcı tarafından kaydedilenlerle birleştirilir ve her ikisi de kullanılabilir. Kullanıcı, yeni bir varsayılan işleyici yükleyerek politika tarafından yüklenen politika işleyicilerini geçersiz kılabilir, ancak politika tarafından kaydedilen bir protokol işleyicisini kaldıramaz.</translation>
+<translation id="91196902572559194">Bu politika, Google Asistan'a sesli etkinleştirme ifadesini dinleme izni verir.
+
+      Politika etkinleştirilirse Google Asistan, sesli etkinleştirme ifadesini dinler.
+      Politika devre dışı bırakılırsa Google Asistan, sesli etkinleştirme ifadesini dinlemez.
+      Politika ayarlanmazsa kullanıcılar Google Asistan'a sesli etkinleştirme ifadesini dinleme izni verilip verilmeyeceğine karar verebilirler.
+      </translation>
 <translation id="9123211093995421438">Herhangi bir zamanda sabit sürümden başlayarak minimum kaç <ph name="PRODUCT_OS_NAME" /> dönüm noktasında geri almaya izin verileceğini belirler.
 
       Varsayılan sayı, tüketici için 0, kurusal olarak kayıdedilen cihazlar için 4'tür (yaklaşık yarım yıl).
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index bc7d306..705461d2 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -452,12 +452,6 @@
 
       Це правило має встановлюватися на URL-адресу, з якої <ph name="PRODUCT_OS_NAME" /> може завантажити Умови використання. Умови використання мають бути у форматі звичайного тексту, який використовується як тип MIME "текст/звичайний". Розмітка не дозволяється.</translation>
 <translation id="1750315445671978749">Блокувати всі завантаження</translation>
-<translation id="1762072363876276024">
-      Це правило діє для екрана входу. Також перегляньте правило <ph name="SITE_PER_PROCESS_POLICY_NAME" />, яке застосовується до сеансу користувача. Радимо встановити для обох правил однакове значення. Інакше сеанс користувача може починатись із затримкою, оскільки застосовуватиметься значення, указане в політиці користувача.
-      За допомогою налаштування DeviceLoginScreenSitePerProcess можна забороняти користувачам вимикати ізоляцію всіх сайтів за умовчанням. Зауважте, що правило DeviceLoginScreenIsolateOrigins може бути корисним для ізоляції додаткових, детальніших джерел.
-      Якщо це правило ввімкнено, користувачі не зможуть вимкнути поведінку за умовчанням, за якої кожний сайт відкривається окремо.
-      Якщо це правило не встановлено або вимкнено, користувачі зможуть змінювати це налаштування (наприклад, скориставшись записом "Disable site isolation" у chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Увімкнути рекомендації додатків у нульовому стані вікна пошуку</translation>
 <translation id="17719159826324007">
       Якщо для цього правила встановлено значення ArcSession, пристрій примусово перезапускається, коли користувач виходить з облікового запису й запущено Android.
@@ -3616,22 +3610,6 @@
 
           Примітка: дозволені значення параметра <ph name="MINUTE_FIELD_NAME" /> в полях <ph name="CHARGE_START_TIME_FIELD_NAME" /> і <ph name="CHARGE_END_TIME_FIELD_NAME" /> – 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Налаштувати функції доступності <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Це правило вмикає протокол HTTP/0.9 для всіх портів, окрім 80 для HTTP та 443 для HTTPS.
-
-      Це правило вимкнено за умовчанням. Якщо його ввімкнути, у користувачів може виникнути проблема з безпекою, описана на сторінці https://crbug.com/600352.
-
-      Це правило дає можливість підприємствам вимкнути протокол HTTP/0.9 для наявних серверів. У майбутньому його буде видалено.
-
-      Якщо це правило не налаштовано, протокол HTTP/0.9 вимикається для портів не за умовчанням.</translation>
-<translation id="7726421241038987229">
-      За допомогою налаштування SitePerProcess можна забороняти користувачам вимикати ізоляцію всіх сайтів за умовчанням. Зауважте, що правило IsolateOrigins може бути корисним для ізоляції додаткових, детальніших джерел.
-      Якщо це правило ввімкнено, користувачі не зможуть вимкнути поведінку за умовчанням, за якої кожний сайт відкривається окремо.
-      Якщо це правило не налаштовано або вимкнено, користувачі зможуть вимикати ізоляцію сайтів
-      (наприклад, скориставшись записом "Disable site isolation" у chrome://flags).  Якщо для цього правила встановити значення disabled та/або не налаштувати його, ізоляцію сайтів не буде вимкнено.
-      У <ph name="PRODUCT_OS_NAME" /> радимо вибрати таке саме значення для правила <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Інакше сеанс користувача може починатись із затримкою, оскільки застосовуватиметься значення, указане в політиці користувача.
-
-      ПРИМІТКА. Це правило не поширюється на пристрої Android. Щоб увімкнути SitePerProcess на Android, скористайтеся правилом SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Дозволити пристроям використовувати плагін <ph name="PLUGIN_VM_NAME" /> в <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Вмикає для хостів віддаленого доступу двофакторну автентифікацію замість указаного користувачем PIN-коду.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index cfeaed0441..1bf90ed 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -451,12 +451,6 @@
 
       Phải đặt chính sách thành một URL nơi <ph name="PRODUCT_OS_NAME" /> có thể tải xuống Điều khoản dịch vụ. Điều khoản dịch vụ phải là văn bản thuần túy, được phân phối dưới dạng văn bản/thuần túy loại MIME. Không cho phép đánh dấu.</translation>
 <translation id="1750315445671978749">Chặn tất cả các mục tải xuống</translation>
-<translation id="1762072363876276024">
-      Chính sách này áp dụng cho màn hình đăng nhập. Vui lòng xem cả chính sách <ph name="SITE_PER_PROCESS_POLICY_NAME" /> áp dụng cho phiên người dùng. Bạn nên đặt cả hai chính sách về cùng một giá trị. Nếu các giá trị không khớp nhau, thì có thể xảy ra tình trạng chậm trễ khi vào một phiên người dùng mặc dù đang áp dụng giá trị do chính sách người dùng chỉ định.
-      Tùy chọn cài đặt DeviceLoginScreenSitePerProcess này có thể dùng để không cho phép người dùng chọn không sử dụng hoạt động mặc định là cách ly tất cả trang web. Xin lưu ý rằng chính sách DeviceLoginScreenIsolateOrigins cũng có thể hữu ích cho việc cách ly các nguồn gốc bổ sung không dễ thấy.
-      Nếu bạn bật chính sách này, thì người dùng sẽ không thể chọn không sử dụng hoạt động mặc định, trong đó mỗi trang web chạy ở quy trình riêng.
-      Nếu bạn tắt hoặc không định cấu hình chính sách này, thì người dùng có thể thay đổi tùy chọn cài đặt này (ví dụ như sử dụng mục "Tắt tính năng cách ly trang web" trong chrome://flags).
-      </translation>
 <translation id="1767673020408652620">Bật Ứng dụng đề xuất khi hộp tìm kiếm ở trạng thái 0</translation>
 <translation id="17719159826324007">
       Khi bạn đặt chính sách này thành ArcSession, nếu Android đã khởi động, thì chính sách này sẽ buộc thiết bị khởi động lại khi người dùng đăng xuất.
@@ -2541,6 +2535,10 @@
       Lưu ý rằng tùy chọn này không được đề xuất, vì điều này có thể cho phép bỏ qua tiện ích nameConstraints hạn chế tên máy chủ mà một chứng chỉ đã cho có thể được ủy quyền.
 
       Nếu chính sách này chưa được đặt hoặc được đặt thành false, chứng chỉ máy chủ thiếu tiện ích subjectAlternativeName chứa tên DNS hoặc địa chỉ IP sẽ không được tin tưởng.</translation>
+<translation id="5578571772998293651">Cho phép người dùng phản hồi.
+        Nếu bạn đặt chính sách này thành false, thì người dùng không thể gửi ý kiến phản hồi cho Google.
+
+        Nếu bạn không đặt chính sách này hoặc đặt chính sách thành true, thì người dùng có thể gửi ý kiến phản hồi cho Google qua Menu-&gt;Trợ giúp-&gt;Báo cáo vấn đề hoặc tổ hợp phím.</translation>
 <translation id="5581292529942108810">Định cấu hình các chính sách liên quan đến Tiện ích báo cáo của Chrome.
 
       Chính sách này chỉ có hiệu lực khi <ph name="CHROME_REPORTING_EXTENSION_NAME" /> ở trạng thái bật và bạn đã đăng ký máy với <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" />.</translation>
@@ -3686,22 +3684,6 @@
 
           Lưu ý: các giá trị được phép của trường <ph name="MINUTE_FIELD_NAME" /> trong <ph name="CHARGE_START_TIME_FIELD_NAME" /> và <ph name="CHARGE_END_TIME_FIELD_NAME" /> là 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Định cấu hình các tính năng hỗ trợ tiếp cận của <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7724994675283793633">Chính sách này bật HTTP/0.9 trên cổng không phải 80 cho HTTP và 443 cho HTTPS.
-
-      Chính sách này được tắt theo mặc định và nếu được bật sẽ khiến người dùng dễ gặp phải các sự cố bảo mật https://crbug.com/600352.
-
-      Chính sách này nhằm cung cấp cho doanh nghiệp cơ hội để di chuyển các máy chủ hiện có khỏi HTTP/0.9 và sẽ bị xóa trong tương lai.
-
-      Nếu bạn không đặt chính sách này, HTTP/0.9 sẽ bị tắt trên cổng không phải là cổng mặc định.</translation>
-<translation id="7726421241038987229">
-      Tùy chọn cài đặt SitePerProcess này có thể dùng để không cho phép người dùng chọn không sử dụng hoạt động mặc định là cách ly tất cả trang web. Xin lưu ý rằng chính sách IsolateOrigins cũng có thể hữu ích cho việc cách ly các nguồn gốc bổ sung không dễ thấy.
-      Nếu bạn bật chính sách này, thì người dùng sẽ không thể chọn không sử dụng hoạt động mặc định, trong đó mỗi trang web chạy ở quy trình riêng.
-      Nếu bạn tắt hoặc không định cấu hình chính sách này, thì người dùng có thể chọn không sử dụng tính năng cách ly trang web
-      (ví dụ như sử dụng mục "Tắt tính năng cách ly trang web" trong chrome://flags).  Việc tắt và/hoặc không định cấu hình chính sách này sẽ không tắt tính năng Cách ly trang web.
-      Trên <ph name="PRODUCT_OS_NAME" />, bạn cũng nên đặt chính sách thiết bị <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> về cùng giá trị. Nếu các giá trị do 2 chính sách này chỉ định không khớp nhau, thì có thể xảy ra tình trạng chậm trễ khi vào một phiên người dùng mặc dù đang áp dụng giá trị do chính sách người dùng chỉ định.
-
-      LƯU Ý: Chính sách này không áp dụng trên Android. Để bật SitePerProcess trên Android, hãy dùng tùy chọn cài đặt chính sách SitePerProcessAndroid.
-      </translation>
 <translation id="7747447585227954402">Cho phép thiết bị sử dụng một <ph name="PLUGIN_VM_NAME" /> trên <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="7749402620209366169">Bật xác thực hai bước cho máy chủ truy cập từ xa thay vì mã PIN do người dùng chỉ định.
 
@@ -3927,6 +3909,7 @@
       Nếu không thiết lập chính sách này, sẽ không có ngoại lệ nào cho danh sách đen từ chính sách 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">Cho phép người dùng doanh nghiệp trở thành người dùng chính duy nhất có nhiều hồ sơ (Hành vi mặc định cho người dùng do doanh nghiệp quản lý)</translation>
 <translation id="8183108371184777472">Ngăn cửa sổ trình duyệt chạy</translation>
+<translation id="8186911565834244165">Cho phép người dùng phản hồi</translation>
 <translation id="8214600119442850823">Định cấu hình trình quản lý mật khẩu.</translation>
 <translation id="8217516105848565518">Chính sách này không còn dùng nữa. Thay vào đó, hãy sử dụng RemoteAccessHostDomainList.</translation>
 <translation id="8244171102276095471">Bật bộ mật mã RC4 trong TLS</translation>
@@ -4369,6 +4352,12 @@
 <translation id="9112897538922695510">Cho phép bạn đăng ký danh sách trình xử lý giao thức. Đây có thể chỉ là một chính sách được đề xuất. Thuộc tính |protocol| của sản phẩm nên được đặt thành lược đồ chẳng hạn như 'mailto' và thuộc tính |url| nên được đặt thành mẫu URL của ứng dụng xử lý lược đồ. Mẫu có thể bao gồm '%s' mà nếu có mặt sẽ được thay thế bằng URL đã xử lý.
 
           Trình xử lý giao thức do chính sách đăng ký được hợp nhất với trình xử lý do người dùng đăng ký và cả hai đều khả dụng. Người dùng có thể ghi đè trình xử lý giao thức do chính sách cài đặt bằng cách cài đặt trình xử lý mặc định mới nhưng không thể xóa trình xử lý giao thức do chính sách đăng ký.</translation>
+<translation id="91196902572559194">Chính sách này cấp cho Trợ lý Google quyền nghe cụm từ kích hoạt bằng giọng nói.
+
+      Nếu bạn bật chính sách này, thì Trợ lý Google sẽ lắng nghe cụm từ kích hoạt bằng giọng nói.
+      Nếu bạn tắt chính sách này, thì Trợ lý Google sẽ không lắng nghe cụm từ kích hoạt bằng giọng nói.
+      Nếu bạn không đặt chính sách này, thì người dùng có thể quyết định xem có cho phép Trợ lý Google lắng nghe cụm từ kích hoạt bằng giọng nói hay không.
+      </translation>
 <translation id="9123211093995421438">Chỉ định số lượng mốc <ph name="PRODUCT_OS_NAME" /> tối thiểu cho phép khôi phục, bắt đầu từ phiên bản ổn định bất kỳ lúc nào.
 
       Mặc định là 0 đối với người tiêu dùng, 4 (khoảng nửa năm) đối với các thiết bị do doanh nghiệp đăng ký.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 8f61d85..0db22eac8 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -415,12 +415,6 @@
 
       该政策的值应设置为供 <ph name="PRODUCT_OS_NAME" />下载服务条款的网址。该服务条款必须是纯文本,以 MIME 纯文本形式提供,不允许进行任何标记。</translation>
 <translation id="1750315445671978749">拦截所有下载内容</translation>
-<translation id="1762072363876276024">
-      此政策适用于登录屏幕。另请参阅适用于用户会话的 <ph name="SITE_PER_PROCESS_POLICY_NAME" /> 政策。建议将这两项政策设为相同的值。如果这两项政策的值不一致,则在进入用户会话时,若系统正在应用由用户政策指定的值,便可能会出现延迟。
-      DeviceLoginScreenSitePerProcess 设置可用于禁止用户停用隔离所有网站的默认行为。请注意,还可以使用 DeviceLoginScreenIsolateOrigins 政策以更精细的方式隔离其他来源。
-      如果启用了此政策,则用户无法停用让每个网站在自己的进程中运行的默认行为。
-      如果未配置或停用了此政策,则用户可以更改此设置(例如,使用 chrome://flags 中的“停用网站隔离”条目)。
-      </translation>
 <translation id="1767673020408652620">在处于零状态的搜索框内启用应用推荐</translation>
 <translation id="17719159826324007">
       如果将此政策设为 ArcSession,系统会在用户退出后强制设备重新启动(如果 Android 已启动)。
@@ -2409,6 +2403,10 @@
       请注意,我们不建议启用此设置,因为这可能会允许绕过 nameConstraints 扩展项(用于限制可针对哪些主机名授权指定的证书)。
 
       如果此政策未设置或设为 false,系统将不会信任包含 DNS 名称或 IP 地址但缺少 subjectAlternativeName 扩展项的服务器证书。</translation>
+<translation id="5578571772998293651">允许用户提供反馈。
+        如果此政策设为 false,用户无法向 Google 发送反馈。
+
+        如果未设置此政策或将其设为 true,用户可以通过依次点按“菜单”-&gt;“帮助”-&gt;“报告问题”或按下组合键来向 Google 发送反馈。</translation>
 <translation id="5581292529942108810">配置与 Chrome Reporting Extension 相关的政策。
 
       仅当已启用 <ph name="CHROME_REPORTING_EXTENSION_NAME" /> 且已使用 <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> 注册相应设备后,此政策才有效。</translation>
@@ -3500,21 +3498,6 @@
 
           注意:<ph name="CHARGE_START_TIME_FIELD_NAME" /> 和 <ph name="CHARGE_END_TIME_FIELD_NAME" /> 所允许的 <ph name="MINUTE_FIELD_NAME" /> 字段值为 0、15、30、45。</translation>
 <translation id="7717938661004793600">配置 <ph name="PRODUCT_OS_NAME" />辅助功能。</translation>
-<translation id="7724994675283793633">此政策用于在 80 (HTTP) 和 443 (HTTPS) 以外的端口上启用 HTTP/0.9。
-
-      此政策在默认情况下处于停用状态;启用后,会使用户面临安全问题 (https://crbug.com/600352)。
-
-      此政策旨在让企业能够使现有服务器弃用 HTTP/0.9。日后我们将会移除此政策。
-
-      如果此政策未设置,非默认端口上将会停用 HTTP/0.9。</translation>
-<translation id="7726421241038987229">
-      SitePerProcess 设置可用于禁止用户停用隔离所有网站的默认行为。请注意,还可以使用 IsolateOrigins 政策以更精细的方式隔离其他来源。
-      如果启用了此政策,则用户无法停用让每个网站在自己的进程中运行的默认行为。
-      如果未配置或停用了此政策,则用户可以停用网站隔离功能(例如,使用 chrome://flags 中的“停用网站隔离”条目)。将此政策设为停用状态和/或不配置此政策均不会关闭网站隔离功能。
-      在 <ph name="PRODUCT_OS_NAME" /> 上,建议将设备政策 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 也设为相同的值。如果这两项政策指定的值不一致,则在进入用户会话时,若系统正在应用由用户政策指定的值,便可能会出现延迟。
-
-      注意:此政策不适用于 Android 设备。要在 Android 设备上启用 SitePerProcess,请改用 SitePerProcessAndroid 政策设置。
-      </translation>
 <translation id="7747447585227954402">允许设备在 <ph name="PRODUCT_OS_NAME" />上使用 <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7749402620209366169">为远程访问主机启用双重身份验证,而不是采用用户指定的 PIN。
 
@@ -3735,6 +3718,7 @@
       如果未设置此策略,来自“URLBlacklist”策略的黑名单就不存在任何例外情况。</translation>
 <translation id="8176035528522326671">只允许企业用户以主用户的身份登录多个人资料会话(企业托管用户的默认行为)</translation>
 <translation id="8183108371184777472">禁止启动浏览器窗口</translation>
+<translation id="8186911565834244165">允许用户提供反馈</translation>
 <translation id="8214600119442850823">配置密码管理器。</translation>
 <translation id="8217516105848565518">此政策已被弃用。请改用 RemoteAccessHostDomainList。</translation>
 <translation id="8244171102276095471">在 TLS 中启用 RC4 加密套件</translation>
@@ -4132,6 +4116,12 @@
 <translation id="9112897538922695510">可让您注册一个协议处理程序列表。此政策只能是推荐的政策。属性|protocol|应设为“mailto”等协议,属性|url|应设为处理该协议的应用采用的网址格式。该格式中可以包含“%s”(如果有,将被替换为所处理的网址)。
 
           通过政策注册的协议处理程序会与用户注册的协议处理程序合并到一起,两种处理程序都可使用。用户可以通过安装新的默认处理程序来覆盖通过政策安装的协议处理程序,但无法卸载通过政策注册的协议处理程序。</translation>
+<translation id="91196902572559194">此政策用于授权 Google 助理听取语音启动词组。
+
+      如果此政策处于启用状态,Google 助理将会听取语音启动词组。
+      如果停用了此政策,Google 助理将不会听取语音启动词组。
+      如果未设置此政策,用户可以决定是否允许 Google 助理听取语音启动词组。
+      </translation>
 <translation id="9123211093995421438">指定 <ph name="PRODUCT_OS_NAME" />随时可从稳定版回滚到的里程碑的数量下限。
 
       对于由消费者注册的设备,默认值为 0;对于由企业注册的设备,默认值为 4(大约半年)。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 40983f0..7d827799 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -437,12 +437,6 @@
 
       你需將政策設為可供 <ph name="PRODUCT_OS_NAME" /> 下載《服務條款》的網址。《服務條款》需為純文字內容,以 MIME 類型 text/plain 提供。不允許任何標記。</translation>
 <translation id="1750315445671978749">封鎖所有下載作業</translation>
-<translation id="1762072363876276024">
-      這項政策適用於登入畫面。另請查看適用於使用者工作階段的 <ph name="SITE_PER_PROCESS_POLICY_NAME" /> 政策。建議你為這兩項政策設定相同的值。如果兩者的值不相符,進入使用者工作階段時,系統可能會因為套用使用者政策指定的值而發生延遲。
-      這項 DeviceLoginScreenSitePerProcess 設定可在系統預設隔離所有網站時,禁止使用者停用這項行為。請注意,DeviceLoginScreenIsolateOrigins 政策也可用於隔離其他更精細的來源。
-      如果啟用這項政策,當系統預設為以獨立程序執行每個網站時,使用者將無法停用這項行為。
-      如果不設定或停用這項政策,使用者可以變更這項設定 (例如使用 chrome://flags 中的「停用網站隔離」選項)。
-      </translation>
 <translation id="1767673020408652620">在零狀態搜尋框中啟用應用程式推薦</translation>
 <translation id="17719159826324007">
       如果將這項政策設為 [ArcSession],系統會在 Android 已啟動的前提下,於使用者登出時強制裝置重新啟動。
@@ -2448,6 +2442,10 @@
       請注意,這項設定可能會允許略過 nameConstraints 延伸 (用於限制指定的憑證可授權的主機名稱),因此不建議啟用。
 
       如果未設定這項政策,或是將這項政策設為 false,含有 DNS 名稱或 IP 位址但缺少 subjectAlternativeName 延伸的伺服器憑證將不會受到信任。</translation>
+<translation id="5578571772998293651">允許使用者意見回饋功能。
+        如果將這項政策設為 False,使用者無法將意見回饋傳送給 Google。
+
+        如果將這項政策設為 True 或不設定,使用者可以將意見回饋傳送給 Google,方法是依序按一下「選單」圖示 -&gt; [說明] -&gt; [回報問題],或是按下按鍵組合。</translation>
 <translation id="5581292529942108810">設定 Chrome 資訊回報擴充功能相關政策。
 
       只有在已啟用 <ph name="CHROME_REPORTING_EXTENSION_NAME" /> 且已透過 <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> 註冊電腦的情況下,這項政策才會有作用。</translation>
@@ -3530,22 +3528,6 @@
 
           注意:「<ph name="CHARGE_START_TIME_FIELD_NAME" />」和「<ph name="CHARGE_END_TIME_FIELD_NAME" />」的「<ph name="MINUTE_FIELD_NAME" />」欄位中,允許的值為 0、15、30、45。</translation>
 <translation id="7717938661004793600">設定 <ph name="PRODUCT_OS_NAME" /> 無障礙功能。</translation>
-<translation id="7724994675283793633">這項政策可讓你在 80 (HTTP) 和 443 (HTTPS) 以外的通訊埠啟用 HTTP/0.9。
-
-      這項政策預設為停用,啟用後使用者可能會遇到安全性問題 https://crbug.com/600352。
-
-      這項政策的用意是讓企業自行遷移目前使用 HTTP/0.9 的伺服器,日後我們會移除這項政策。
-
-      如果未設定這項政策,則會在非預設通訊埠停用 HTTP/0.9。</translation>
-<translation id="7726421241038987229">
-      這項 SitePerProcess 設定可在系統預設為隔離所有網站時,禁止使用者停用這項行為。請注意,IsolateOrigins 政策也可用於隔離其他更精細的來源。
-      如果啟用這項政策,當系統預設為以獨立程序執行每個網站時,使用者將無法停用這項行為。
-      如果不設定或停用這項政策,使用者可以選擇停用網站隔離功能
-      (例如,使用 chrome://flags 中的「停用網站隔離」選項)。即使將這項政策設為停用和/或不設定,也不會關閉網站隔離功能。
-      在「<ph name="PRODUCT_OS_NAME" />」上,建議你將 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 裝置政策也設定為相同的值。如果兩個政策指定的值不相符,進入使用者工作階段時,系統可能會因為套用使用者政策指定的值而發生延遲。
-
-      注意:這項政策不適用於 Android。如果要在 Android 上啟用 SitePerProcess,請使用 SitePerProcessAndroid 政策設定。
-      </translation>
 <translation id="7747447585227954402">允許裝置在 <ph name="PRODUCT_OS_NAME" /> 使用 <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7749402620209366169">為遠端存取主機啟用雙重驗證機制,而不採用使用者指定的 PIN。
 
@@ -3767,6 +3749,7 @@
       如未設定這項政策,則「URLBlacklist」政策的黑名單不會有例外情況。</translation>
 <translation id="8176035528522326671">僅允許企業使用者成為多重設定檔的主要使用者 (受企業管理的使用者的預設行為)</translation>
 <translation id="8183108371184777472">禁止啟動瀏覽器視窗</translation>
+<translation id="8186911565834244165">允許使用者意見回饋功能</translation>
 <translation id="8214600119442850823">設定密碼管理員</translation>
 <translation id="8217516105848565518">這項政策已遭到淘汰,請改用 RemoteAccessHostDomainList。</translation>
 <translation id="8244171102276095471">在傳輸層安全標準 (TLS) 中啟用 RC4 加密套件</translation>
@@ -4177,6 +4160,12 @@
 <translation id="9112897538922695510">允許你註冊通訊協定處理常式清單 (這是一律建議使用的政策)。屬性 |protocol| 應設定為配置 (例如「mailto」),而屬性 |url| 則應設定為處理該配置的應用程式的網址模式。模式可包含「%s」(如果有的話,會由受處理的網址取代)。
 
           由政策註冊的通訊協定處理常式會與由使用者註冊的通訊協定處理常式合併,兩者皆可供使用。使用者可以安裝新的預設處理常式來覆寫由政策安裝的通訊協定處理常式,但無法移除由政策註冊的通訊協定處理常式。</translation>
+<translation id="91196902572559194">這項政策可授予 Google 助理聽取語音啟動字詞的權限。
+
+      如果啟用這項政策,Google 助理將會聽取語音啟動字詞。
+      如果停用這項政策,Google 助理將不會聽取語音啟動字詞。
+      如果不設定這項政策,使用者可以決定是否讓 Google 助理聽取語音啟動字詞。
+      </translation>
 <translation id="9123211093995421438">指定隨時可從穩定版復原的最少 <ph name="PRODUCT_OS_NAME" />重要事件數。
 
       一般使用者裝置的預設值為 0,企業註冊裝置的預設值為 4 (約半年)。
diff --git a/components/policy/tools/template_writers/writers/admx_writer.py b/components/policy/tools/template_writers/writers/admx_writer.py
index 1236699..8da5024 100755
--- a/components/policy/tools/template_writers/writers/admx_writer.py
+++ b/components/policy/tools/template_writers/writers/admx_writer.py
@@ -284,6 +284,8 @@
         min = schema['minimum']
       if 'maximum' in schema and schema['maximum'] >= 0:
         max = schema['maximum']
+    assert type(min) == int
+    assert type(max) == int
     attributes = {
         'id': policy['name'],
         'valueName': policy['name'],
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 31e3ad23..487712b 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -361,7 +361,7 @@
 <translation id="2878424575911748999">A1</translation>
 <translation id="2881276955470682203">Uložit kartu?</translation>
 <translation id="2903493209154104877">Adresy</translation>
-<translation id="290376772003165898">Není stránka v jazyce <ph name="LANGUAGE" />?</translation>
+<translation id="290376772003165898">Stránka není v jazyce <ph name="LANGUAGE" />?</translation>
 <translation id="2909946352844186028">Byla zjištěna změna sítě.</translation>
 <translation id="2910133103376701357">Vaše zařízení a účet jsou spravovány doménou <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="2916038427272391327">Zavřete ostatní programy</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 323089d..80c2646 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -526,7 +526,7 @@
 <translation id="3736520371357197498">अगर आप अपनी सुरक्षा संबंधी जोखिमों को समझते हैं तो, खतरनाक प्रोग्राम हटाए जाने से पहले आप <ph name="BEGIN_LINK" />इस असुरक्षित साइट पर विज़िट<ph name="END_LINK" /> कर सकते हैं.</translation>
 <translation id="3744899669254331632">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्‍योंकि वेबसाइट ने ऐसे अव्‍यवस्‍थित क्रेडेंशियल भेजे थे जिन्‍हें क्रोमियम प्रोसेस नहीं कर सकता. नेटवर्क की गड़बड़ी और हमले आमतौर पर कुछ समय के लिए होते हैं, इसलिए हो सकता है कि यह पेज बाद में काम करेगा.</translation>
 <translation id="3745099705178523657">आपके पुष्टि करने के बाद, आपके Google खाते के कार्ड का ब्यौरा इस साइट से शेयर किया जाएगा.</translation>
-<translation id="3748148204939282805"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपको सॉफ़्टवेयर इंस्टॉल करने या अपनी व्यक्तिगत जानकारी (उदाहरण के लिए, पासवर्ड, फ़ोन नंबर या क्रेडिट कार्ड) का खुलासा करने जैसा खतरनाक काम करने के लिए फंसा सकते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />ज़्यादा जानें<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="3748148204939282805"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपको सॉफ़्टवेयर इंस्टॉल करने या आपकी व्यक्तिगत जानकारी (उदाहरण के लिए, पासवर्ड, फ़ोन नंबर या क्रेडिट कार्ड) हासिल करने जैसा खतरनाक काम करने के लिए फंसा सकते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />ज़्यादा जानें<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="375403751935624634">सर्वर गड़बड़ी के कारण अनुवाद विफल.</translation>
 <translation id="3759461132968374835">आपने हाल में खराबी की कोई रिपोर्ट नहीं की है. खराबी रिपोर्ट बंद होने पर होने वाली खराबी यहां दिखाई नहीं देगी.</translation>
 <translation id="3761718714832595332">स्थिति छिपाएं</translation>
@@ -940,7 +940,7 @@
 <translation id="6040143037577758943">बंद करें</translation>
 <translation id="6044573915096792553">आकार 12</translation>
 <translation id="6047233362582046994">अगर आप अपनी सुरक्षा को होने वाले खतरों के बारे में जानते हैं तो, खतरनाक ऐप्लिकेशन हटाए जाने से पहले आप <ph name="BEGIN_LINK" />इस साइट पर जा<ph name="END_LINK" /> सकते हैं.</translation>
-<translation id="6047927260846328439">यह सामग्री आपसे धोखे से सॉफ़्टवेयर इंस्‍टॉल करवाने या व्यक्तिगत जानकारी का खुलासा करवाने की कोशिश कर सकती है. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation>
+<translation id="6047927260846328439">यह सामग्री आपसे धोखे से सॉफ़्टवेयर इंस्‍टॉल करवाने या व्यक्तिगत जानकारी मुहैया करवाने की कोशिश कर सकती है. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट, प्रमाणपत्र पिनिंग का उपयोग करती है. नेटवर्क की गड़बड़ियां और हमले आमतौर पर कुछ समय के लिए होते हैं इसलिए यह पेज शायद बाद में ठीक से काम करेगा.</translation>
 <translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">क्या आप अपने कार्ड का इस्तेमाल सभी डिवाइस पर करना चाहते हैं?</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index fda35d3..3b82629 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -1155,6 +1155,7 @@
 <translation id="7334320624316649418">&amp;மறுவரிசைப்படுத்தலை மீண்டும் செய்</translation>
 <translation id="733923710415886693">சான்றிதழ் வெளிப்படைத்தன்மை மூலம் சேவையகத்தின் சான்றிதழ் வெளியிடப்படவில்லை.</translation>
 <translation id="734600844861828519">11x15</translation>
+<translation id="7346048084945669753">அங்கீகரிக்கப்பட்டுள்ளாரா?:</translation>
 <translation id="7349430561505560861">A4-Extra</translation>
 <translation id="7353601530677266744">கட்டளை வரி</translation>
 <translation id="7372973238305370288">தேடல் முடிவு</translation>
@@ -1187,6 +1188,7 @@
 <translation id="7451311239929941790">இந்தச் சிக்கல் குறித்து <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" />.</translation>
 <translation id="7455133967321480974">முழுமையான இயல்புநிலையைப் பயன்படுத்து (தடு)</translation>
 <translation id="7460618730930299168">திரையிலுள்ள உள்ளடக்கமும் நீங்கள் தேர்ந்தெடுத்த உள்ளடக்கமும் மாறுபடுகின்றன. தொடரவா?</translation>
+<translation id="7465410862124366659">இந்தப் பக்கம் <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]க்குச் சொந்தமானது எனக் கண்டறியப்பட்டுள்ளது.</translation>
 <translation id="7473891865547856676">வேண்டாம் நன்றி</translation>
 <translation id="7481312909269577407">அடுத்த பக்கம்</translation>
 <translation id="7485870689360869515">தரவு எதுவும் இல்லை.</translation>
diff --git a/components/viz/test/test_gpu_memory_buffer_manager.cc b/components/viz/test/test_gpu_memory_buffer_manager.cc
index b8baf92..201d1118 100644
--- a/components/viz/test/test_gpu_memory_buffer_manager.cc
+++ b/components/viz/test/test_gpu_memory_buffer_manager.cc
@@ -145,10 +145,8 @@
 TestGpuMemoryBufferManager::TestGpuMemoryBufferManager() {}
 
 TestGpuMemoryBufferManager::~TestGpuMemoryBufferManager() {
-  {
-    base::AutoLock hold(buffers_lock_);
-    DCHECK(buffers_.empty());
-  }
+  base::AutoLock hold(lock_);
+  DCHECK(buffers_.empty());
   DCHECK(clients_.empty());
   if (parent_gpu_memory_buffer_manager_)
     parent_gpu_memory_buffer_manager_->clients_.erase(client_id_);
@@ -156,6 +154,7 @@
 
 std::unique_ptr<TestGpuMemoryBufferManager>
 TestGpuMemoryBufferManager::CreateClientGpuMemoryBufferManager() {
+  base::AutoLock hold(lock_);
   std::unique_ptr<TestGpuMemoryBufferManager> client(
       new TestGpuMemoryBufferManager);
   client->client_id_ = ++last_client_id_;
@@ -167,7 +166,7 @@
 
 void TestGpuMemoryBufferManager::OnGpuMemoryBufferDestroyed(
     gfx::GpuMemoryBufferId gpu_memory_buffer_id) {
-  base::AutoLock hold(buffers_lock_);
+  base::AutoLock hold(lock_);
   DCHECK(buffers_.find(gpu_memory_buffer_id.id) != buffers_.end());
   buffers_.erase(gpu_memory_buffer_id.id);
 }
@@ -178,6 +177,8 @@
     gfx::BufferFormat format,
     gfx::BufferUsage usage,
     gpu::SurfaceHandle surface_handle) {
+  base::AutoLock hold(lock_);
+
   if (fail_on_create_)
     return nullptr;
   const size_t buffer_size = gfx::BufferSizeForBufferFormat(size, format);
@@ -192,7 +193,6 @@
       std::move(shared_memory_region), 0,
       base::checked_cast<int>(
           gfx::RowSizeForBufferFormat(size.width(), format, 0))));
-  base::AutoLock hold(buffers_lock_);
   buffers_[last_gpu_memory_buffer_id_] = result.get();
   return result;
 }
diff --git a/components/viz/test/test_gpu_memory_buffer_manager.h b/components/viz/test/test_gpu_memory_buffer_manager.h
index 180574de..9207724 100644
--- a/components/viz/test/test_gpu_memory_buffer_manager.h
+++ b/components/viz/test/test_gpu_memory_buffer_manager.h
@@ -38,10 +38,13 @@
                                const gpu::SyncToken& sync_token) override;
 
  private:
+  // This class is called by multiple threads at the same time. Hold this lock
+  // for the duration of all member functions, to ensure consistency.
+  // https://crbug.com/690588, https://crbug.com/859020
+  base::Lock lock_;
+
   // Buffers allocated by this manager.
   int last_gpu_memory_buffer_id_ = 1000;
-  // Use of |buffers_| must be protected by the lock.
-  base::Lock buffers_lock_;
   std::map<int, gfx::GpuMemoryBuffer*> buffers_;
 
   // Parent information for child managers.
diff --git a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
index cf9ef06..8a38bd9 100644
--- a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
+++ b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
@@ -166,8 +166,8 @@
   NSTextCheckingTypes userEnabledTextCheckingTypes_;
   NSTextCheckingTypes userDisabledTextCheckingTypes_;
 }
+@property(readonly) NSTextCheckingType allowedTextCheckingTypes;
 @property(readonly) NSTextCheckingType enabledTextCheckingTypes;
-@property(readonly) BOOL inputAllowsTextSubstitution;
 @property(readonly) NSSpellChecker* spellChecker;
 
 - (void)processedWheelEvent:(const blink::WebMouseWheelEvent&)event
@@ -254,16 +254,6 @@
   host_->OnBoundsInWindowChanged(gfxViewBoundsInWindow, true);
 }
 
-- (BOOL)inputAllowsTextSubstitution {
-  if (textInputType_ == ui::TEXT_INPUT_TYPE_NONE)
-    return NO;
-  if (textInputType_ == ui::TEXT_INPUT_TYPE_PASSWORD)
-    return NO;
-  if (textInputFlags_ & blink::kWebTextInputFlagSpellcheckOff)
-    return NO;
-  return YES;
-}
-
 - (NSSpellChecker*)spellChecker {
   if (spellCheckerForTesting_)
     return spellCheckerForTesting_;
@@ -271,11 +261,9 @@
 }
 
 - (void)requestTextSubstitutions {
-  if (!self.inputAllowsTextSubstitution)
-    return;
-
-  NSTextCheckingType enabledTextCheckingTypes = self.enabledTextCheckingTypes;
-  if (!enabledTextCheckingTypes)
+  NSTextCheckingType textCheckingTypes =
+      self.allowedTextCheckingTypes & self.enabledTextCheckingTypes;
+  if (!textCheckingTypes)
     return;
 
   NSString* availableText = base::SysUTF16ToNSString(textSelectionText_);
@@ -286,7 +274,7 @@
   auto* textCheckingResults =
       [self.spellChecker checkString:availableText
                                range:NSMakeRange(0, availableText.length)
-                               types:enabledTextCheckingTypes
+                               types:textCheckingTypes
                              options:nil
               inSpellDocumentWithTag:0
                          orthography:nullptr
@@ -414,6 +402,19 @@
                       }];
 }
 
+- (NSTextCheckingType)allowedTextCheckingTypes {
+  if (textInputType_ == ui::TEXT_INPUT_TYPE_NONE)
+    return 0;
+  if (textInputType_ == ui::TEXT_INPUT_TYPE_PASSWORD)
+    return 0;
+  if (textInputFlags_ & blink::kWebTextInputFlagAutocorrectOff)
+    return 0;
+  NSTextCheckingType checkingTypes = NSTextCheckingTypeReplacement;
+  if (!(textInputFlags_ & blink::kWebTextInputFlagSpellcheckOff))
+    checkingTypes |= NSTextCheckingTypeQuote | NSTextCheckingTypeDash;
+  return checkingTypes;
+}
+
 - (NSTextCheckingType)enabledTextCheckingTypes {
   NSTextCheckingType checkingTypes = 0;
   if (NSSpellChecker.automaticQuoteSubstitutionEnabled)
@@ -1561,7 +1562,7 @@
           (self.enabledTextCheckingTypes & representedTextCheckingType)
               ? NSControlStateValueOn
               : NSControlStateValueOff;
-      return self.inputAllowsTextSubstitution;
+      return (self.allowedTextCheckingTypes & representedTextCheckingType) != 0;
     }
   }
 
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.cc b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
index 98a99207..965f4ac9 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.cc
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
@@ -24,6 +24,7 @@
 #include "content/browser/accessibility/browser_accessibility.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
+#include "content/browser/accessibility/dump_accessibility_test_helper.h"
 #include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/web_contents.h"
@@ -45,11 +46,6 @@
 
 namespace {
 
-const char kCommentToken = '#';
-const char kMarkSkipFile[] = "#<skip";
-const char kMarkEndOfFile[] = "<-- End-of-file -->";
-const char kSignalDiff[] = "*";
-
 // Searches recursively and returns true if an accessibility node is found
 // that represents a fully loaded web document with the given url.
 bool AccessibilityTreeContainsLoadedDocWithUrl(BrowserAccessibility* node,
@@ -135,148 +131,6 @@
   return ax_tree_dump;
 }
 
-base::Optional<base::FilePath>
-DumpAccessibilityTestBase::GetExpectationFilePath(
-    const base::FilePath& test_file_path) {
-  base::ScopedAllowBlockingForTesting allow_blocking;
-  base::FilePath expected_file_path;
-
-  // Try to get version specific expected file.
-  base::FilePath::StringType expected_file_suffix =
-      formatter_->GetVersionSpecificExpectedFileSuffix();
-  if (expected_file_suffix != FILE_PATH_LITERAL("")) {
-    expected_file_path = base::FilePath(
-        test_file_path.RemoveExtension().value() + expected_file_suffix);
-    if (base::PathExists(expected_file_path))
-      return expected_file_path;
-  }
-
-  // If a version specific file does not exist, get the generic one.
-  expected_file_suffix = formatter_->GetExpectedFileSuffix();
-  expected_file_path = base::FilePath(test_file_path.RemoveExtension().value() +
-                                      expected_file_suffix);
-  if (base::PathExists(expected_file_path))
-    return expected_file_path;
-
-  // If no expected file could be found, display error.
-  LOG(INFO) << "File not found: " << expected_file_path.LossyDisplayName();
-  LOG(INFO) << "To run this test, create "
-            << expected_file_path.LossyDisplayName()
-            << " (it can be empty) and then run this test "
-            << "with the switch: --"
-            << switches::kGenerateAccessibilityTestExpectations;
-  return base::nullopt;
-}
-
-base::Optional<std::vector<std::string>>
-DumpAccessibilityTestBase::LoadExpectationFile(
-    const base::FilePath& expected_file) {
-  base::ScopedAllowBlockingForTesting allow_blocking;
-
-  std::string expected_contents_raw;
-  base::ReadFileToString(expected_file, &expected_contents_raw);
-
-  // Tolerate Windows-style line endings (\r\n) in the expected file:
-  // normalize by deleting all \r from the file (if any) to leave only \n.
-  std::string expected_contents;
-  base::RemoveChars(expected_contents_raw, "\r", &expected_contents);
-
-  if (!expected_contents.compare(0, strlen(kMarkSkipFile), kMarkSkipFile)) {
-    return base::nullopt;
-  }
-
-  std::vector<std::string> expected_lines =
-      base::SplitString(expected_contents, "\n", base::KEEP_WHITESPACE,
-                        base::SPLIT_WANT_NONEMPTY);
-
-  // Marking the end of the file with a line of text ensures that
-  // file length differences are found.
-  expected_lines.push_back(kMarkEndOfFile);
-
-  return expected_lines;
-}
-
-bool DumpAccessibilityTestBase::ValidateAgainstExpectation(
-    const base::FilePath& test_file_path,
-    const base::FilePath& expected_file,
-    const std::vector<std::string>& actual_lines,
-    const std::vector<std::string>& expected_lines) {
-  // Output the test path to help anyone who encounters a failure and needs
-  // to know where to look.
-  LOG(INFO) << "Testing: "
-            << test_file_path.NormalizePathSeparatorsTo('/').LossyDisplayName();
-  LOG(INFO) << "Expected output: "
-            << expected_file.NormalizePathSeparatorsTo('/').LossyDisplayName();
-
-  // Perform a diff (or write the initial baseline).
-  std::vector<int> diff_lines = DiffLines(expected_lines, actual_lines);
-  bool is_different = diff_lines.size() > 0;
-  if (is_different) {
-    std::string diff;
-
-    // Mark the expected lines which did not match actual output with a *.
-    diff += "* Line Expected\n";
-    diff += "- ---- --------\n";
-    for (int line = 0, diff_index = 0;
-         line < static_cast<int>(expected_lines.size()); ++line) {
-      bool is_diff = false;
-      if (diff_index < static_cast<int>(diff_lines.size()) &&
-          diff_lines[diff_index] == line) {
-        is_diff = true;
-        ++diff_index;
-      }
-      diff += base::StringPrintf("%1s %4d %s\n", is_diff ? kSignalDiff : "",
-                                 line + 1, expected_lines[line].c_str());
-    }
-    diff += "\nActual\n";
-    diff += "------\n";
-    diff += base::JoinString(actual_lines, "\n");
-    diff += "\n";
-    diff += kMarkEndOfFile;
-    LOG(ERROR) << "Diff:\n" << diff;
-  } else {
-    LOG(INFO) << "Test output matches expectations.";
-  }
-
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kGenerateAccessibilityTestExpectations)) {
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    std::string actual_contents_for_output =
-        base::JoinString(actual_lines, "\n") + "\n";
-    CHECK(base::WriteFile(expected_file, actual_contents_for_output.c_str(),
-                          actual_contents_for_output.size()) ==
-          static_cast<int>(actual_contents_for_output.size()));
-    LOG(INFO) << "Wrote expectations to: " << expected_file.LossyDisplayName();
-  }
-
-  return !is_different;
-}
-
-std::vector<int> DumpAccessibilityTestBase::DiffLines(
-    const std::vector<std::string>& expected_lines,
-    const std::vector<std::string>& actual_lines) {
-  int actual_lines_count = actual_lines.size();
-  int expected_lines_count = expected_lines.size();
-  std::vector<int> diff_lines;
-  int i = 0, j = 0;
-  while (i < actual_lines_count && j < expected_lines_count) {
-    if (expected_lines[j].size() == 0 ||
-        expected_lines[j][0] == kCommentToken) {
-      // Skip comment lines and blank lines in expected output.
-      ++j;
-      continue;
-    }
-
-    if (actual_lines[i] != expected_lines[j])
-      diff_lines.push_back(j);
-    ++i;
-    ++j;
-  }
-
-  // Actual file has been fully checked.
-  return diff_lines;
-}
-
 void DumpAccessibilityTestBase::ParseHtmlForExtraDirectives(
     const std::string& test_html,
     std::vector<std::string>* wait_for,
@@ -352,6 +206,7 @@
     const base::FilePath file_path,
     const char* file_dir) {
   formatter_ = formatter_factory_();
+  DumpAccessibilityTestHelper test_helper(formatter_.get());
 
   // Disable the "hot tracked" state (set when the mouse is hovering over
   // an object) because it makes test output change based on the mouse position.
@@ -372,7 +227,7 @@
   // WAIT-FOR directive in the source file that's looking for something not
   // supported on the current platform.
   base::Optional<base::FilePath> expected_file =
-      GetExpectationFilePath(file_path);
+      test_helper.GetExpectationFilePath(file_path);
   if (!expected_file) {
     LOG(INFO) << "No expectation file present, ignoring test on this "
                  "platform.";
@@ -380,7 +235,7 @@
   }
 
   base::Optional<std::vector<std::string>> expected_lines =
-      LoadExpectationFile(*expected_file);
+      test_helper.LoadExpectationFile(*expected_file);
   if (!expected_lines) {
     LOG(INFO) << "Skipping this test on this platform.";
     return;
@@ -522,7 +377,7 @@
   std::vector<std::string> actual_lines = Dump(run_until);
 
   // Validate against the expectation file.
-  bool matches_expectation = ValidateAgainstExpectation(
+  bool matches_expectation = test_helper.ValidateAgainstExpectation(
       file_path, *expected_file, actual_lines, *expected_lines);
   EXPECT_TRUE(matches_expectation);
   if (!matches_expectation)
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.h b/content/browser/accessibility/dump_accessibility_browsertest_base.h
index 0747650..42154c5d 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.h
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.h
@@ -71,31 +71,6 @@
   // and return it as a string.
   base::string16 DumpUnfilteredAccessibilityTreeAsString();
 
-  // Returns a path to an expectation file for the current platform. If no
-  // suitable expectation file can be found, logs an error message and returns
-  // nullopt.
-  base::Optional<base::FilePath> GetExpectationFilePath(
-      const base::FilePath& test_file_path);
-
-  // Loads the given expectation file. Returns nullopt if the file contains a
-  // skip marker.
-  base::Optional<std::vector<std::string>> LoadExpectationFile(
-      const base::FilePath& expected_file);
-
-  // Compares the given actual dump against the given expectation and generates
-  // a new expectation file if switches::kGenerateAccessibilityTestExpectations
-  // has been set. Returns true if the result matches the expectation.
-  bool ValidateAgainstExpectation(
-      const base::FilePath& test_file_path,
-      const base::FilePath& expected_file,
-      const std::vector<std::string>& actual_lines,
-      const std::vector<std::string>& expected_lines);
-
-  // Utility helper that does a comment-aware equality check.
-  // Returns array of lines from expected file which are different.
-  std::vector<int> DiffLines(const std::vector<std::string>& expected_lines,
-                             const std::vector<std::string>& actual_lines);
-
   // Parse the test html file and parse special directives, usually
   // beginning with an '@' and inside an HTML comment, that control how the
   // test is run and how the results are interpreted.
diff --git a/content/browser/accessibility/dump_accessibility_test_helper.cc b/content/browser/accessibility/dump_accessibility_test_helper.cc
new file mode 100644
index 0000000..8d6dc4d
--- /dev/null
+++ b/content/browser/accessibility/dump_accessibility_test_helper.cc
@@ -0,0 +1,171 @@
+// 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 "content/browser/accessibility/dump_accessibility_test_helper.h"
+
+#include "base/command_line.h"
+#include "base/files/file_util.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/thread_restrictions.h"
+#include "content/browser/accessibility/accessibility_tree_formatter.h"
+#include "content/public/common/content_switches.h"
+
+namespace content {
+
+namespace {
+const char kCommentToken = '#';
+const char kMarkSkipFile[] = "#<skip";
+const char kMarkEndOfFile[] = "<-- End-of-file -->";
+const char kSignalDiff[] = "*";
+}  // namespace
+
+DumpAccessibilityTestHelper::DumpAccessibilityTestHelper(
+    AccessibilityTreeFormatter* formatter)
+    : formatter_(formatter) {}
+
+base::Optional<base::FilePath>
+DumpAccessibilityTestHelper::GetExpectationFilePath(
+    const base::FilePath& test_file_path) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::FilePath expected_file_path;
+
+  // Try to get version specific expected file.
+  base::FilePath::StringType expected_file_suffix =
+      formatter_->GetVersionSpecificExpectedFileSuffix();
+  if (expected_file_suffix != FILE_PATH_LITERAL("")) {
+    expected_file_path = base::FilePath(
+        test_file_path.RemoveExtension().value() + expected_file_suffix);
+    if (base::PathExists(expected_file_path))
+      return expected_file_path;
+  }
+
+  // If a version specific file does not exist, get the generic one.
+  expected_file_suffix = formatter_->GetExpectedFileSuffix();
+  expected_file_path = base::FilePath(test_file_path.RemoveExtension().value() +
+                                      expected_file_suffix);
+  if (base::PathExists(expected_file_path))
+    return expected_file_path;
+
+  // If no expected file could be found, display error.
+  LOG(INFO) << "File not found: " << expected_file_path.LossyDisplayName();
+  LOG(INFO) << "To run this test, create "
+            << expected_file_path.LossyDisplayName()
+            << " (it can be empty) and then run this test "
+            << "with the switch: --"
+            << switches::kGenerateAccessibilityTestExpectations;
+  return base::nullopt;
+}
+
+base::Optional<std::vector<std::string>>
+DumpAccessibilityTestHelper::LoadExpectationFile(
+    const base::FilePath& expected_file) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+
+  std::string expected_contents_raw;
+  base::ReadFileToString(expected_file, &expected_contents_raw);
+
+  // Tolerate Windows-style line endings (\r\n) in the expected file:
+  // normalize by deleting all \r from the file (if any) to leave only \n.
+  std::string expected_contents;
+  base::RemoveChars(expected_contents_raw, "\r", &expected_contents);
+
+  if (!expected_contents.compare(0, strlen(kMarkSkipFile), kMarkSkipFile)) {
+    return base::nullopt;
+  }
+
+  std::vector<std::string> expected_lines =
+      base::SplitString(expected_contents, "\n", base::KEEP_WHITESPACE,
+                        base::SPLIT_WANT_NONEMPTY);
+
+  // Marking the end of the file with a line of text ensures that
+  // file length differences are found.
+  expected_lines.push_back(kMarkEndOfFile);
+
+  return expected_lines;
+}
+
+bool DumpAccessibilityTestHelper::ValidateAgainstExpectation(
+    const base::FilePath& test_file_path,
+    const base::FilePath& expected_file,
+    const std::vector<std::string>& actual_lines,
+    const std::vector<std::string>& expected_lines) {
+  // Output the test path to help anyone who encounters a failure and needs
+  // to know where to look.
+  LOG(INFO) << "Testing: "
+            << test_file_path.NormalizePathSeparatorsTo('/').LossyDisplayName();
+  LOG(INFO) << "Expected output: "
+            << expected_file.NormalizePathSeparatorsTo('/').LossyDisplayName();
+
+  // Perform a diff (or write the initial baseline).
+  std::vector<int> diff_lines = DiffLines(expected_lines, actual_lines);
+  bool is_different = diff_lines.size() > 0;
+  if (is_different) {
+    std::string diff;
+
+    // Mark the expected lines which did not match actual output with a *.
+    diff += "* Line Expected\n";
+    diff += "- ---- --------\n";
+    for (int line = 0, diff_index = 0;
+         line < static_cast<int>(expected_lines.size()); ++line) {
+      bool is_diff = false;
+      if (diff_index < static_cast<int>(diff_lines.size()) &&
+          diff_lines[diff_index] == line) {
+        is_diff = true;
+        ++diff_index;
+      }
+      diff += base::StringPrintf("%1s %4d %s\n", is_diff ? kSignalDiff : "",
+                                 line + 1, expected_lines[line].c_str());
+    }
+    diff += "\nActual\n";
+    diff += "------\n";
+    diff += base::JoinString(actual_lines, "\n");
+    diff += "\n";
+    diff += kMarkEndOfFile;
+    LOG(ERROR) << "Diff:\n" << diff;
+  } else {
+    LOG(INFO) << "Test output matches expectations.";
+  }
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kGenerateAccessibilityTestExpectations)) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    std::string actual_contents_for_output =
+        base::JoinString(actual_lines, "\n") + "\n";
+    CHECK(base::WriteFile(expected_file, actual_contents_for_output.c_str(),
+                          actual_contents_for_output.size()) ==
+          static_cast<int>(actual_contents_for_output.size()));
+    LOG(INFO) << "Wrote expectations to: " << expected_file.LossyDisplayName();
+  }
+
+  return !is_different;
+}
+
+std::vector<int> DumpAccessibilityTestHelper::DiffLines(
+    const std::vector<std::string>& expected_lines,
+    const std::vector<std::string>& actual_lines) {
+  int actual_lines_count = actual_lines.size();
+  int expected_lines_count = expected_lines.size();
+  std::vector<int> diff_lines;
+  int i = 0, j = 0;
+  while (i < actual_lines_count && j < expected_lines_count) {
+    if (expected_lines[j].size() == 0 ||
+        expected_lines[j][0] == kCommentToken) {
+      // Skip comment lines and blank lines in expected output.
+      ++j;
+      continue;
+    }
+
+    if (actual_lines[i] != expected_lines[j])
+      diff_lines.push_back(j);
+    ++i;
+    ++j;
+  }
+
+  // Actual file has been fully checked.
+  return diff_lines;
+}
+
+}  // namespace content
diff --git a/content/browser/accessibility/dump_accessibility_test_helper.h b/content/browser/accessibility/dump_accessibility_test_helper.h
new file mode 100644
index 0000000..71cdf98
--- /dev/null
+++ b/content/browser/accessibility/dump_accessibility_test_helper.h
@@ -0,0 +1,56 @@
+// 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.
+
+#ifndef CONTENT_BROWSER_ACCESSIBILITY_DUMP_ACCESSIBILITY_TEST_HELPER_H_
+#define CONTENT_BROWSER_ACCESSIBILITY_DUMP_ACCESSIBILITY_TEST_HELPER_H_
+
+#include "base/optional.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace content {
+
+class AccessibilityTreeFormatter;
+
+// A helper class for writing accessibility tree dump tests.
+class DumpAccessibilityTestHelper {
+ public:
+  DumpAccessibilityTestHelper(AccessibilityTreeFormatter* formatter);
+  ~DumpAccessibilityTestHelper() = default;
+
+  // Returns a path to an expectation file for the current platform. If no
+  // suitable expectation file can be found, logs an error message and returns
+  // nullopt.
+  base::Optional<base::FilePath> GetExpectationFilePath(
+      const base::FilePath& test_file_path);
+
+  // Loads the given expectation file. Returns nullopt if the file contains a
+  // skip marker.
+  static base::Optional<std::vector<std::string>> LoadExpectationFile(
+      const base::FilePath& expected_file);
+
+  // Compares the given actual dump against the given expectation and generates
+  // a new expectation file if switches::kGenerateAccessibilityTestExpectations
+  // has been set. Returns true if the result matches the expectation.
+  static bool ValidateAgainstExpectation(
+      const base::FilePath& test_file_path,
+      const base::FilePath& expected_file,
+      const std::vector<std::string>& actual_lines,
+      const std::vector<std::string>& expected_lines);
+
+ private:
+  // Utility helper that does a comment-aware equality check.
+  // Returns array of lines from expected file which are different.
+  static std::vector<int> DiffLines(
+      const std::vector<std::string>& expected_lines,
+      const std::vector<std::string>& actual_lines);
+
+  AccessibilityTreeFormatter* formatter_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ACCESSIBILITY_DUMP_ACCESSIBILITY_TEST_HELPER_H_
diff --git a/content/browser/indexed_db/docs/open_and_verify_leveldb_database.code2flow b/content/browser/indexed_db/docs/open_and_verify_leveldb_database.code2flow
index bb2e241..6f3804ac0 100644
--- a/content/browser/indexed_db/docs/open_and_verify_leveldb_database.code2flow
+++ b/content/browser/indexed_db/docs/open_and_verify_leveldb_database.code2flow
@@ -4,109 +4,117 @@
 
 // open_and_verify_leveldb_database.pdf was created from this file by
 // https://www.code2flow.com/app
+OpenOriginState;
 
-function OpenLevelDB {
-  |Read free disk space|;
-  Histogram(FreeDiskSpace);
-  switch (leveldb_env::OpenDB) {
-    case Status Not OK:{
-      Histogram(LevelDBOpenErrors);
-      if (disk space < 100kb)
-        Report disk space as failure reason;
-      return leveldb_env::OpenDB error status;
-    }
-    case Status OK: {
-      Histogram(LevelDB.OpenTime);
-      return Status::OK;
-    }
-  }
-}
-
-OpenAndVerifyLevelDBDatabase;
 switch (Create IDB Directory) {
   case Failure:
     Histogram(FAILED_DIRECTORY);
-    return IOError("Unable to create IndexedDB database path");
+    return **IOError("Unable to create IndexedDB database path")**;
   case Success:
 }
 Create File path & blob path;
 if (File Path is too long) {
   Histogram(ORIGIN_TOO_LONG);
-  return IOError("File path too long);
+  return **IOError("File path too long)**;
 }
 
-call OpenLevelDB;
-
-switch(OpenLevelDB status) {
-  case IOError:
-    Histogram(OPEN_NO_RECOVERY);
-    return OpenLevelDB error status;
-  case Corruption:
-    Set data loss info;
-    break;
-  case OK:
-    if (Corruption Info Exists & Last Open was corrupt) {
-      Histogram(FAILED_PRIOR_CORRUPTION);
-      db_.reset();
-      Populate data loss info
-      (previous corruption);
-      break;
-    }
-    switch (try to read schema) {
-      case Failure reading schema:
-        Histogram(FAILED_IO_ERROR_CHECKING_SCHEMA);
-        db_.reset();
-        Populate data loss info
-        (schema checking failure);
+open-loop-start:
+Start;
+switch(Read corruption info from disk) {
+  case Corruption Info Exists,
+      first open attempt:
+    Histogram(PRIOR_CORRUPTION);
+  case Corruption Info Exists,
+       NOT first open attempt:
+    switch (Destroy the database) {
+      case Success:
         break;
-      case Schema is unknown:
-        Histogram(FAILED_UNKNOWN_SCHEMA);
-        db_.reset();
-        Populate data loss info
-        (unknown schema);
-        break;
-      case Success & Valid:
-        Histogram(OPEN_SUCCESS);
-        goto end;
+      case Failure:
+      goto open-loop-restart;
     }
-}
-switch(DestroyLevelDB(file_path)) {
-  case Not OK:
-    Histogram(CLEANUP_DESTROY_FAILED);
-    return DestroyLevelDB error status;
-  case OK:
-}
-call OpenLevelDB;
-switch(OpenLevelDB status) {
-  case Not OK:
-    Histogram(CLEANUP_REOPEN_FAILED);
-    return OpenLevelDB error status;
-  case OK:
-    Histogram(CLEANUP_REOPEN_SUCCESS);
+    break;
+  case No Corruption file found:
 }
 
-end:
-Histogram(OPEN_SUCCESS);
-block {
-Create BackingStore;
-switch (Parse schema & metadata) {
-  case Failure:
-    Delete Database & BackingStore;
-    break;
-  case Success:
-    if (Should we clean blob journal?) {
-    switch(CleanUpBlobJournal) {
-      case OK:
-        report `Status::OK`;
-        goto done;
-      case Not OK:
-        Histogram(FAILED_CLEANUP_JOURNAL_ERROR);
-        return CleanUpBlobJournal error status;
+block Open LevelDB {
+  |Read free disk space|;
+  switch (leveldb_env::OpenDB) {
+    case Status Not OK:{
+      Histogram(LevelDBOpenErrors);
+      if (disk space < 100kb) {
+        goto error;
+      }
+      goto open-loop-restart;
+    }
+    case Status OK: {
+      Histogram(LevelDB.OpenTime);
     }
   }
 }
-return BackingStore error status;
+
+Create LevelDB Scopes;
+switch (Initialize LevelDB Scopes) {
+  case Failure:
+    Histogram(SCOPES);
+    goto open-loop-restart;
+    break;
+  case Success:
 }
 
-done:
-return done;
\ No newline at end of file
+block Open LevelDBDatabase {
+  Create LevelDBDatabase;
+  switch (Try to read schema) {
+    case Corruption -
+         Failure reading schema:
+      Histogram(CHECKING_SCHEMA);
+      goto open-loop-restart;
+    case Corruption -
+         Schema is unknown:
+      Histogram(UNKNOWN_SCHEMA);
+      goto open-loop-restart;
+    case Success & Valid:
+  }
+}
+
+block Open IndexedDBBackingStore {
+  Create IndexedDBBackingStore;
+  switch (Parse schema & metadata) {
+    case Failure:
+      Histogram(SETUP_METADATA);
+      goto open-loop-restart;
+      break;
+    case Success:
+      if (Should we clean blob journal?) {
+        switch(CleanUpBlobJournal) {
+          case OK:
+            goto open-loop-end;
+          case Not OK:
+            |Histogram(CLEANUP_JOURNAL)|;
+            goto open-loop-restart;
+        }
+      }
+      goto open-loop-end;
+  }
+}
+
+open-loop-restart:
+|Cleanup from open failure|;
+if (Was open failure
+    due to corruption?) {
+  Save corruption info to file;
+}
+if (Has 'Open' been
+    tried >=2 times?) {
+  goto error;
+}
+Go to start;
+goto open-loop-start;
+
+open-loop-end:
+if (Is database on disk
+    (instead of in memory)?)
+  |Histogram(OPEN_SUCCESS)|;
+return **SUCCESS AND DONE**;
+
+error:
+return **ERROR**;
\ No newline at end of file
diff --git a/content/browser/indexed_db/docs/open_and_verify_leveldb_database.pdf b/content/browser/indexed_db/docs/open_and_verify_leveldb_database.pdf
index 29ba7e5..64a23ca 100644
--- a/content/browser/indexed_db/docs/open_and_verify_leveldb_database.pdf
+++ b/content/browser/indexed_db/docs/open_and_verify_leveldb_database.pdf
Binary files differ
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index b35db7e4..2f28916 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -699,17 +699,21 @@
 
   s = transaction->Commit();
   if (!s.ok()) {
+    indexed_db::ReportOpenStatus(
+        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_METADATA_SETUP,
+        origin_);
     INTERNAL_WRITE_ERROR_UNTESTED(SET_UP_METADATA);
     return s;
   }
 
-  if (clean_live_journal)
+  if (clean_live_journal) {
     s = CleanUpBlobJournal(LiveBlobJournalKey::Encode());
-  if (!s.ok()) {
-    indexed_db::ReportOpenStatus(
-        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_CLEANUP_JOURNAL_ERROR,
-        origin_);
-    return s;
+    if (!s.ok()) {
+      indexed_db::ReportOpenStatus(
+          indexed_db::
+              INDEXED_DB_BACKING_STORE_OPEN_FAILED_CLEANUP_JOURNAL_ERROR,
+          origin_);
+    }
   }
 #if DCHECK_IS_ON()
   initialized_ = true;
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
index 2bbbe2ef..46f948a 100644
--- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
@@ -40,6 +40,7 @@
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
 
 using base::ASCIIToUTF16;
 using blink::IndexedDBDatabaseMetadata;
@@ -191,7 +192,8 @@
     idb_factory_ = std::make_unique<TestIDBFactory>(idb_context_.get());
 
     leveldb::Status s;
-    std::tie(origin_state_handle_, s, std::ignore, std::ignore, std::ignore) =
+    std::tie(origin_state_handle_, s, std::ignore, data_loss_info_,
+             std::ignore) =
         idb_factory_->GetOrOpenOriginFactory(origin, idb_context_->data_path());
     if (!origin_state_handle_.IsHeld()) {
       backing_store_ = nullptr;
@@ -226,6 +228,7 @@
 
   IndexedDBOriginStateHandle origin_state_handle_;
   TestableIndexedDBBackingStore* backing_store_ = nullptr;
+  IndexedDBDataLossInfo data_loss_info_;
 
   // Sample keys and values that are consistent.
   IndexedDBKey key1_;
@@ -1488,7 +1491,7 @@
 
   // The factory returns a null backing store pointer when there is a corrupt
   // database.
-  EXPECT_EQ(nullptr, backing_store());
+  EXPECT_TRUE(data_loss_info_.status == blink::mojom::IDBDataLoss::Total);
 }
 
 }  // namespace indexed_db_backing_store_unittest
diff --git a/content/browser/indexed_db/indexed_db_browsertest.cc b/content/browser/indexed_db/indexed_db_browsertest.cc
index f3c5c7e3..60fe46a 100644
--- a/content/browser/indexed_db/indexed_db_browsertest.cc
+++ b/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
@@ -30,6 +31,9 @@
 #include "content/browser/indexed_db/indexed_db_class_factory.h"
 #include "content/browser/indexed_db/indexed_db_context_impl.h"
 #include "content/browser/indexed_db/indexed_db_factory_impl.h"
+#include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
+#include "content/browser/indexed_db/indexed_db_origin_state.h"
+#include "content/browser/indexed_db/indexed_db_origin_state_handle.h"
 #include "content/browser/indexed_db/leveldb/leveldb_env.h"
 #include "content/browser/indexed_db/mock_browsertest_indexed_db_class_factory.h"
 #include "content/browser/web_contents/web_contents_impl.h"
@@ -226,6 +230,21 @@
     return status;
   }
 
+  // Synchronously writes to the IndexedDB database at the given origin by
+  // posting a task to the idb task runner and waiting.
+  void WriteToIndexedDB(const Origin& origin,
+                        std::string key,
+                        std::string value) {
+    base::RunLoop loop;
+    GetContext()->TaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&IndexedDBBrowserTest::WriteToIndexedDBOnIDBSequence,
+                       base::Unretained(this),
+                       base::WrapRefCounted(GetContext()), origin,
+                       std::move(key), std::move(value), loop.QuitClosure()));
+    loop.Run();
+  }
+
  protected:
   static MockBrowserTestIndexedDBClassFactory* GetTestClassFactory() {
     static ::base::LazyInstance<MockBrowserTestIndexedDBClassFactory>::Leaky
@@ -242,6 +261,32 @@
   }
 
  private:
+  void WriteToIndexedDBOnIDBSequence(
+      scoped_refptr<IndexedDBContextImpl> context,
+      const Origin& origin,
+      std::string key,
+      std::string value,
+      base::OnceClosure done) {
+    base::ScopedClosureRunner done_runner(std::move(done));
+    IndexedDBOriginStateHandle handle;
+    leveldb::Status s;
+    std::tie(handle, s, std::ignore, std::ignore, std::ignore) =
+        context->GetIDBFactory()->GetOrOpenOriginFactory(origin,
+                                                         context->data_path());
+    CHECK(s.ok()) << s.ToString();
+    CHECK(handle.IsHeld());
+
+    LevelDBDatabase* db = handle.origin_state()->backing_store()->db();
+    s = db->Put(key, &value);
+    CHECK(s.ok()) << s.ToString();
+
+    // Force close to ensure a cold start on the next database open.
+    handle.origin_state()->ForceClose();
+    handle.Release();
+    CHECK(!context->GetIDBFactory()->IsBackingStoreOpen(origin));
+    context.reset();
+  }
+
   DISALLOW_COPY_AND_ASSIGN(IndexedDBBrowserTest);
 };
 
@@ -336,6 +381,28 @@
   incognito_browser->Close();
 }
 
+IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, NegativeDBSchemaVersion) {
+  const GURL database_open_url = GetTestUrl("indexeddb", "database_test.html");
+  const Origin origin = Origin::Create(database_open_url);
+  // Create the database.
+  SimpleTest(database_open_url);
+  std::string value;
+  EncodeInt(-10, &value);
+  WriteToIndexedDB(origin, SchemaVersionKey::Encode(), value);
+  SimpleTest(GetTestUrl("indexeddb", "open_bad_db.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, NegativeDBDataVersion) {
+  const GURL database_open_url = GetTestUrl("indexeddb", "database_test.html");
+  const Origin origin = Origin::Create(database_open_url);
+  // Create the database.
+  SimpleTest(database_open_url);
+  std::string value;
+  EncodeInt(-10, &value);
+  WriteToIndexedDB(origin, DataVersionKey::Encode(), value);
+  SimpleTest(GetTestUrl("indexeddb", "open_bad_db.html"));
+}
+
 class IndexedDBBrowserTestWithLowQuota : public IndexedDBBrowserTest {
  public:
   IndexedDBBrowserTestWithLowQuota() {}
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc
index 9e47840d..e3fda74 100644
--- a/content/browser/indexed_db/indexed_db_factory_impl.cc
+++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -6,31 +6,38 @@
 
 #include <stdint.h>
 
+#include <tuple>
 #include <utility>
 #include <vector>
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/timer/timer.h"
 #include "content/browser/indexed_db/indexed_db_class_factory.h"
 #include "content/browser/indexed_db/indexed_db_connection.h"
 #include "content/browser/indexed_db/indexed_db_context_impl.h"
+#include "content/browser/indexed_db/indexed_db_data_format_version.h"
 #include "content/browser/indexed_db/indexed_db_database_error.h"
 #include "content/browser/indexed_db/indexed_db_leveldb_operations.h"
 #include "content/browser/indexed_db/indexed_db_metadata_coding.h"
 #include "content/browser/indexed_db/indexed_db_origin_state.h"
 #include "content/browser/indexed_db/indexed_db_pre_close_task_queue.h"
+#include "content/browser/indexed_db/indexed_db_reporting.h"
 #include "content/browser/indexed_db/indexed_db_tombstone_sweeper.h"
 #include "content/browser/indexed_db/indexed_db_tracing.h"
+#include "content/browser/indexed_db/leveldb/leveldb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_exception.h"
 #include "third_party/leveldatabase/env_chromium.h"
 
@@ -40,6 +47,7 @@
 namespace content {
 
 namespace {
+constexpr static const int kNumOpenTries = 2;
 
 leveldb::Status GetDBSizeFromEnv(leveldb::Env* env,
                                  const std::string& path,
@@ -74,6 +82,69 @@
                    " for indexedDB.open."));
 }
 
+// Creates the leveldb and blob storage directories for IndexedDB.
+std::tuple<base::FilePath /*leveldb_path*/,
+           base::FilePath /*blob_path*/,
+           leveldb::Status>
+CreateDatabaseDirectories(const base::FilePath& path_base,
+                          const url::Origin& origin) {
+  leveldb::Status status;
+  if (!base::CreateDirectoryAndGetError(path_base, nullptr)) {
+    status =
+        leveldb::Status::IOError("Unable to create IndexedDB database path");
+    LOG(ERROR) << status.ToString() << ": \"" << path_base.AsUTF8Unsafe()
+               << "\"";
+    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY,
+                     origin);
+    return {base::FilePath(), base::FilePath(), status};
+  }
+
+  base::FilePath leveldb_path =
+      path_base.Append(indexed_db::GetLevelDBFileName(origin));
+  base::FilePath blob_path =
+      path_base.Append(indexed_db::GetBlobStoreFileName(origin));
+  if (indexed_db::IsPathTooLong(leveldb_path)) {
+    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG,
+                     origin);
+    status = leveldb::Status::IOError("File path too long");
+    return {base::FilePath(), base::FilePath(), status};
+  }
+  return {leveldb_path, blob_path, status};
+}
+
+std::tuple<bool, leveldb::Status> AreSchemasKnown(LevelDBDatabase* db) {
+  int64_t db_schema_version = 0;
+  bool found = false;
+  leveldb::Status s = indexed_db::GetInt(db, SchemaVersionKey::Encode(),
+                                         &db_schema_version, &found);
+  if (!s.ok())
+    return {false, s};
+  if (!found) {
+    return {true, s};
+  }
+  if (db_schema_version < 0)
+    return {false, leveldb::Status::Corruption(
+                       "Invalid IndexedDB database schema version.")};
+  if (db_schema_version > indexed_db::kLatestKnownSchemaVersion) {
+    return {false, s};
+  }
+
+  int64_t raw_db_data_version = 0;
+  s = indexed_db::GetInt(db, DataVersionKey::Encode(), &raw_db_data_version,
+                         &found);
+  if (!s.ok())
+    return {false, s};
+  if (!found) {
+    return {true, s};
+  }
+  if (raw_db_data_version < 0)
+    return {false,
+            leveldb::Status::Corruption("Invalid IndexedDB data version.")};
+
+  return {IndexedDBDataFormatVersion::GetCurrent().IsAtLeast(
+              IndexedDBDataFormatVersion::Decode(raw_db_data_version)),
+          s};
+}
 }  // namespace
 
 IndexedDBFactoryImpl::IndexedDBFactoryImpl(
@@ -537,10 +608,16 @@
            leveldb::Status,
            IndexedDBDatabaseError,
            IndexedDBDataLossInfo,
-           bool>
+           /*is_cold_open=*/bool>
 IndexedDBFactoryImpl::GetOrOpenOriginFactory(
     const Origin& origin,
     const base::FilePath& data_directory) {
+  IDB_TRACE("indexed_db::GetOrOpenOriginFactory");
+  // Please see docs/open_and_verify_leveldb_database.code2flow, and the
+  // generated pdf (from https://code2flow.com).
+  // The intended strategy here is to have this function match that flowchart,
+  // where the flowchart should be seen as the 'master' logic template. Please
+  // check the git history of both to make sure they are in sync.
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = factories_per_origin_.find(origin);
   if (it != factories_per_origin_.end()) {
@@ -549,25 +626,46 @@
             /*was_cold_open=*/false};
   }
 
+  bool is_incognito_and_in_memory = data_directory.empty();
   base::FilePath blob_path;
   base::FilePath database_path;
-  leveldb::Status s;
-  if (!data_directory.empty()) {
+  leveldb::Status s = leveldb::Status::OK();
+  if (!is_incognito_and_in_memory) {
     // The database will be on-disk and not in-memory.
     std::tie(database_path, blob_path, s) =
-        indexed_db::CreateDatabaseDirectories(data_directory, origin);
+        CreateDatabaseDirectories(data_directory, origin);
     if (!s.ok())
       return {IndexedDBOriginStateHandle(), s, CreateDefaultError(),
               IndexedDBDataLossInfo(), /*was_cold_open=*/true};
   }
-  std::unique_ptr<LevelDBDatabase> database;
   IndexedDBDataLossInfo data_loss_info;
-  bool disk_full;
-  std::tie(database, s, data_loss_info, disk_full) =
-      indexed_db::OpenAndVerifyLevelDBDatabase(origin, data_directory,
-                                               database_path, leveldb_factory_,
-                                               context_->TaskRunner());
-  if (!s.ok()) {
+  std::unique_ptr<IndexedDBBackingStore> backing_store;
+  bool disk_full = false;
+  for (int i = 0; i < kNumOpenTries; ++i) {
+    std::tie(backing_store, s, data_loss_info, disk_full) =
+        OpenAndVerifyIndexedDBBackingStore(origin, data_directory,
+                                           database_path, blob_path,
+                                           /*is_first_attempt=*/i == 0);
+    if (LIKELY(s.ok()))
+      break;
+    DCHECK(!backing_store);
+    // If the disk is full, always exit immediately.
+    if (disk_full)
+      break;
+    if (s.IsCorruption()) {
+      std::string sanitized_message = leveldb_env::GetCorruptionMessage(s);
+      base::ReplaceSubstringsAfterOffset(&sanitized_message, 0u,
+                                         data_directory.AsUTF8Unsafe(), "...");
+      LOG(ERROR) << "Got corruption for " << origin.Serialize() << ", "
+                 << sanitized_message;
+      IndexedDBBackingStore::RecordCorruptionInfo(data_directory, origin,
+                                                  sanitized_message);
+    }
+  }
+
+  if (UNLIKELY(!s.ok())) {
+    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY,
+                     origin);
     if (disk_full) {
       return {IndexedDBOriginStateHandle(), s,
               IndexedDBDatabaseError(
@@ -581,35 +679,19 @@
               data_loss_info, /*was_cold_open=*/true};
     }
   }
-  bool is_in_memory = data_directory.empty();
-  IndexedDBBackingStore::Mode backing_store_mode =
-      is_in_memory ? IndexedDBBackingStore::Mode::kInMemory
-                   : IndexedDBBackingStore::Mode::kOnDisk;
-  std::unique_ptr<IndexedDBBackingStore> backing_store = CreateBackingStore(
-      backing_store_mode, leveldb_factory_, origin, blob_path,
-      std::move(database), context_->TaskRunner());
-
-  bool first_open_since_startup =
-      backends_opened_since_startup_.insert(origin).second;
-  s = backing_store->Initialize(
-      /*cleanup_live_journal=*/!database_path.empty() &&
-      first_open_since_startup);
-
-  if (!s.ok())
-    return {IndexedDBOriginStateHandle(), s, CreateDefaultError(),
-            data_loss_info, /*was_cold_open=*/true};
-
-  it =
-      factories_per_origin_
-          .emplace(origin,
-                   std::make_unique<IndexedDBOriginState>(
-                       is_in_memory, clock_, leveldb_factory_, &earliest_sweep_,
-                       base::BindOnce(
-                           &IndexedDBFactoryImpl::RemoveOriginState,
-                           origin_state_destruction_weak_factory_.GetWeakPtr(),
-                           origin),
-                       std::move(backing_store)))
-          .first;
+  if (!is_incognito_and_in_memory)
+    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_SUCCESS, origin);
+  it = factories_per_origin_
+           .emplace(origin,
+                    std::make_unique<IndexedDBOriginState>(
+                        /*persist_for_incognito=*/is_incognito_and_in_memory,
+                        clock_, leveldb_factory_, &earliest_sweep_,
+                        base::BindOnce(
+                            &IndexedDBFactoryImpl::RemoveOriginState,
+                            origin_state_destruction_weak_factory_.GetWeakPtr(),
+                            origin),
+                        std::move(backing_store)))
+           .first;
   context_->FactoryOpened(origin);
   return {it->second->CreateHandle(), s, IndexedDBDatabaseError(),
           data_loss_info, /*was_cold_open=*/true};
@@ -627,6 +709,114 @@
       std::move(db), task_runner);
 }
 
+std::tuple<std::unique_ptr<IndexedDBBackingStore>,
+           leveldb::Status,
+           IndexedDBDataLossInfo,
+           bool /* is_disk_full */>
+IndexedDBFactoryImpl::OpenAndVerifyIndexedDBBackingStore(
+    const url::Origin& origin,
+    base::FilePath data_directory,
+    base::FilePath database_path,
+    base::FilePath blob_path,
+    bool is_first_attempt) {
+  // Please see docs/open_and_verify_leveldb_database.code2flow, and the
+  // generated pdf (from https://code2flow.com).
+  // The intended strategy here is to have this function match that flowchart,
+  // where the flowchart should be seen as the 'master' logic template. Please
+  // check the git history of both to make sure they are in sync.
+  DCHECK_EQ(database_path.empty(), data_directory.empty());
+  DCHECK_EQ(blob_path.empty(), data_directory.empty());
+  IDB_TRACE("indexed_db::OpenAndVerifyLevelDBDatabase");
+
+  bool is_incognito_and_in_memory = data_directory.empty();
+  leveldb::Status status;
+  IndexedDBDataLossInfo data_loss_info;
+  data_loss_info.status = blink::mojom::IDBDataLoss::None;
+  if (!is_incognito_and_in_memory) {
+    // Check for previous corruption, and if found then try to delete the
+    // database.
+    std::string corruption_message =
+        indexed_db::ReadCorruptionInfo(data_directory, origin);
+    if (UNLIKELY(!corruption_message.empty())) {
+      LOG(ERROR) << "IndexedDB recovering from a corrupted (and deleted) "
+                    "database.";
+      if (is_first_attempt) {
+        ReportOpenStatus(
+            indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_PRIOR_CORRUPTION,
+            origin);
+      }
+      data_loss_info.status = blink::mojom::IDBDataLoss::Total;
+      data_loss_info.message = base::StrCat(
+          {"IndexedDB (database was corrupt): ", corruption_message});
+      // This is a special case where we want to make sure the database is
+      // deleted, so we try to delete again.
+      status = leveldb_factory_->DestroyLevelDB(database_path);
+      UMA_HISTOGRAM_ENUMERATION(
+          "WebCore.IndexedDB.DestroyCorruptBackingStoreStatus",
+          leveldb_env::GetLevelDBStatusUMAValue(status),
+          leveldb_env::LEVELDB_STATUS_MAX);
+      if (UNLIKELY(!status.ok())) {
+        LOG(ERROR) << "Unable to delete backing store: " << status.ToString();
+        return {nullptr, status, data_loss_info, /*is_disk_full=*/false};
+      }
+    }
+  }
+
+  bool is_disk_full;
+  scoped_refptr<LevelDBState> state;
+
+  // Open the leveldb database.
+  std::tie(state, status, is_disk_full) = leveldb_factory_->OpenLevelDBState(
+      database_path, indexed_db::GetDefaultIndexedDBComparator(),
+      indexed_db::GetDefaultLevelDBComparator());
+
+  if (UNLIKELY(!status.ok()))
+    return {nullptr, status, IndexedDBDataLossInfo(), is_disk_full};
+
+  std::unique_ptr<LevelDBDatabase> database = std::make_unique<LevelDBDatabase>(
+      std::move(state), leveldb_factory_, context_->TaskRunner(),
+      LevelDBDatabase::kDefaultMaxOpenIteratorsPerDatabase);
+
+  bool are_schemas_known = false;
+  std::tie(are_schemas_known, status) = AreSchemasKnown(database.get());
+  if (UNLIKELY(!status.ok())) {
+    LOG(ERROR) << "IndexedDB had an error checking schema, treating it as "
+                  "failure to open: "
+               << status.ToString();
+    ReportOpenStatus(
+        indexed_db::
+            INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA,
+        origin);
+    return {nullptr, status, std::move(data_loss_info), /*is_disk_full=*/false};
+  } else if (UNLIKELY(!are_schemas_known)) {
+    LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it as "
+                  "failure to open.";
+    ReportOpenStatus(
+        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA,
+        origin);
+    return {nullptr, leveldb::Status::Corruption("Unknown IndexedDB schema"),
+            std::move(data_loss_info), /*is_disk_full=*/false};
+  }
+
+  bool first_open_since_startup =
+      backends_opened_since_startup_.insert(origin).second;
+  IndexedDBBackingStore::Mode backing_store_mode =
+      is_incognito_and_in_memory ? IndexedDBBackingStore::Mode::kInMemory
+                                 : IndexedDBBackingStore::Mode::kOnDisk;
+  std::unique_ptr<IndexedDBBackingStore> backing_store = CreateBackingStore(
+      backing_store_mode, leveldb_factory_, origin, blob_path,
+      std::move(database), context_->TaskRunner());
+  status = backing_store->Initialize(
+      /*cleanup_live_journal=*/(!is_incognito_and_in_memory &&
+                                first_open_since_startup));
+
+  if (UNLIKELY(!status.ok()))
+    return {nullptr, status, IndexedDBDataLossInfo(), /*is_disk_full=*/false};
+
+  return {std::move(backing_store), status, std::move(data_loss_info),
+          /*is_disk_full=*/false};
+}
+
 void IndexedDBFactoryImpl::RemoveOriginState(const url::Origin& origin) {
   factories_per_origin_.erase(origin);
 }
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.h b/content/browser/indexed_db/indexed_db_factory_impl.h
index 08bcac8..48c24efc 100644
--- a/content/browser/indexed_db/indexed_db_factory_impl.h
+++ b/content/browser/indexed_db/indexed_db_factory_impl.h
@@ -143,7 +143,8 @@
   IndexedDBContextImpl* context() const { return context_; }
 
  private:
-  friend IndexedDBOriginState;
+  friend class IndexedDBBrowserTest;
+  friend class IndexedDBOriginState;
 
   FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
                            BackingStoreReleasedOnForcedClose);
@@ -163,6 +164,20 @@
   FRIEND_TEST_ALL_PREFIXES(IndexedDBTest,
                            ForceCloseOpenDatabasesOnCommitFailure);
 
+  // |path_base| is the directory that will contain the database directory, the
+  // blob directory, and any data loss info. |database_path| is the directory
+  // for the leveldb database, and |blob_path| is the directory to store blob
+  // files. If |path_base| is empty, then an in-memory database is opened.
+  std::tuple<std::unique_ptr<IndexedDBBackingStore>,
+             leveldb::Status,
+             IndexedDBDataLossInfo,
+             bool /* is_disk_full */>
+  OpenAndVerifyIndexedDBBackingStore(const url::Origin& origin,
+                                     base::FilePath data_directory,
+                                     base::FilePath database_path,
+                                     base::FilePath blob_path,
+                                     bool is_first_attempt);
+
   void RemoveOriginState(const url::Origin& origin);
 
   void OnDatabaseError(const url::Origin& origin,
@@ -182,8 +197,8 @@
   SEQUENCE_CHECKER(sequence_checker_);
   IndexedDBContextImpl* context_;
   indexed_db::LevelDBFactory* const leveldb_factory_;
-  IndexedDBClassFactory* indexed_db_class_factory_;
-  base::Clock* clock_;
+  IndexedDBClassFactory* const indexed_db_class_factory_;
+  base::Clock* const clock_;
   base::Time earliest_sweep_;
 
   base::flat_map<url::Origin, std::unique_ptr<IndexedDBOriginState>>
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.h b/content/browser/indexed_db/indexed_db_leveldb_coding.h
index 539d31f..42b04ac 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding.h
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding.h
@@ -215,7 +215,7 @@
 
 class DataVersionKey {
  public:
-  static std::string Encode();
+  CONTENT_EXPORT static std::string Encode();
 };
 
 class BlobJournalKey {
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
index e4a0c0b..eb9f7f3 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -9,6 +9,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/values.h"
+#include "content/browser/indexed_db/indexed_db_backing_store.h"
 #include "content/browser/indexed_db/indexed_db_data_format_version.h"
 #include "content/browser/indexed_db/indexed_db_data_loss_info.h"
 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
@@ -18,6 +19,8 @@
 #include "content/browser/indexed_db/leveldb/leveldb_env.h"
 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h"
 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h"
+#include "content/browser/indexed_db/leveldb/leveldb_write_batch.h"
+#include "content/browser/indexed_db/scopes/leveldb_scopes.h"
 #include "storage/common/database/database_identifier.h"
 #include "third_party/leveldatabase/env_chromium.h"
 
@@ -55,33 +58,6 @@
   void FindShortSuccessor(std::string* key) const override {}
 };
 
-bool IsPathTooLong(const base::FilePath& leveldb_dir) {
-  int limit = base::GetMaximumPathComponentLength(leveldb_dir.DirName());
-  if (limit == -1) {
-    DLOG(WARNING) << "GetMaximumPathComponentLength returned -1";
-// In limited testing, ChromeOS returns 143, other OSes 255.
-#if defined(OS_CHROMEOS)
-    limit = 143;
-#else
-    limit = 255;
-#endif
-  }
-  size_t component_length = leveldb_dir.BaseName().value().length();
-  if (component_length > static_cast<uint32_t>(limit)) {
-    DLOG(WARNING) << "Path component length (" << component_length
-                  << ") exceeds maximum (" << limit
-                  << ") allowed by this filesystem.";
-    const int min = 140;
-    const int max = 300;
-    const int num_buckets = 12;
-    UMA_HISTOGRAM_CUSTOM_COUNTS(
-        "WebCore.IndexedDB.BackingStore.OverlyLargeOriginLength",
-        component_length, min, max, num_buckets);
-    return true;
-  }
-  return false;
-}
-
 template <typename DBOrTransaction>
 Status GetIntInternal(DBOrTransaction* db,
                       const StringPiece& key,
@@ -98,83 +74,6 @@
     return s;
   return InternalInconsistencyStatus();
 }
-
-WARN_UNUSED_RESULT bool IsSchemaKnown(LevelDBDatabase* db, bool* known) {
-  int64_t db_schema_version = 0;
-  bool found = false;
-  Status s = GetInt(db, SchemaVersionKey::Encode(), &db_schema_version, &found);
-  if (!s.ok())
-    return false;
-  if (!found) {
-    *known = true;
-    return true;
-  }
-  if (db_schema_version < 0)
-    return false;  // Only corruption should cause this.
-  if (db_schema_version > indexed_db::kLatestKnownSchemaVersion) {
-    *known = false;
-    return true;
-  }
-
-  int64_t raw_db_data_version = 0;
-  s = GetInt(db, DataVersionKey::Encode(), &raw_db_data_version, &found);
-  if (!s.ok())
-    return false;
-  if (!found) {
-    *known = true;
-    return true;
-  }
-  if (raw_db_data_version < 0)
-    return false;  // Only corruption should cause this.
-
-  *known = IndexedDBDataFormatVersion::GetCurrent().IsAtLeast(
-      IndexedDBDataFormatVersion::Decode(raw_db_data_version));
-  return true;
-}
-std::tuple<std::unique_ptr<LevelDBDatabase>,
-           leveldb::Status,
-           bool /* is_disk_full */>
-DeleteAndRecreateDatabase(
-    const url::Origin& origin,
-    base::FilePath database_path,
-    LevelDBFactory* ldb_factory,
-    scoped_refptr<base::SequencedTaskRunner> task_runner) {
-  scoped_refptr<LevelDBState> state;
-  DCHECK(!database_path.empty())
-      << "Opening an in-memory database should not have failed.";
-  LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup";
-  state.reset();
-  leveldb::Status status = ldb_factory->DestroyLevelDB(database_path);
-  if (!status.ok()) {
-    LOG(ERROR) << "IndexedDB backing store cleanup failed";
-    ReportOpenStatus(
-        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED,
-        origin);
-    return {nullptr, status, false};
-  }
-
-  LOG(ERROR) << "IndexedDB backing store cleanup succeeded, reopening";
-  state.reset();
-  bool is_disk_full;
-  std::tie(state, status, is_disk_full) = ldb_factory->OpenLevelDBState(
-      database_path, GetDefaultIndexedDBComparator(),
-      GetDefaultLevelDBComparator());
-  if (!status.ok()) {
-    LOG(ERROR) << "IndexedDB backing store reopen after recovery failed";
-    ReportOpenStatus(
-        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED,
-        origin);
-    return {nullptr, status, is_disk_full};
-  }
-  std::unique_ptr<LevelDBDatabase> database = std::make_unique<LevelDBDatabase>(
-      std::move(state), ldb_factory, std::move(task_runner),
-      LevelDBDatabase::kDefaultMaxOpenIteratorsPerDatabase);
-  ReportOpenStatus(
-      indexed_db::INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS, origin);
-
-  return {std::move(database), status, is_disk_full};
-}
-
 }  // namespace
 
 const base::FilePath::CharType kBlobExtension[] = FILE_PATH_LITERAL(".blob");
@@ -206,10 +105,37 @@
       FILE_PATH_LITERAL("corruption_info.json"));
 }
 
+bool IsPathTooLong(const base::FilePath& leveldb_dir) {
+  int limit = base::GetMaximumPathComponentLength(leveldb_dir.DirName());
+  if (limit == -1) {
+    DLOG(WARNING) << "GetMaximumPathComponentLength returned -1";
+// In limited testing, ChromeOS returns 143, other OSes 255.
+#if defined(OS_CHROMEOS)
+    limit = 143;
+#else
+    limit = 255;
+#endif
+  }
+  size_t component_length = leveldb_dir.BaseName().value().length();
+  if (component_length > static_cast<uint32_t>(limit)) {
+    DLOG(WARNING) << "Path component length (" << component_length
+                  << ") exceeds maximum (" << limit
+                  << ") allowed by this filesystem.";
+    const int min = 140;
+    const int max = 300;
+    const int num_buckets = 12;
+    UMA_HISTOGRAM_CUSTOM_COUNTS(
+        "WebCore.IndexedDB.BackingStore.OverlyLargeOriginLength",
+        component_length, min, max, num_buckets);
+    return true;
+  }
+  return false;
+}
+
 std::string ReadCorruptionInfo(const base::FilePath& path_base,
                                const url::Origin& origin) {
   const base::FilePath info_path =
-      path_base.Append(ComputeCorruptionFileName(origin));
+      path_base.Append(indexed_db::ComputeCorruptionFileName(origin));
   std::string message;
   if (IsPathTooLong(info_path))
     return message;
@@ -253,19 +179,21 @@
   return leveldb::Status::IOError("IO Error");
 }
 
-Status GetInt(LevelDBTransaction* txn,
-              const StringPiece& key,
-              int64_t* found_int,
-              bool* found) {
-  return GetIntInternal(txn, key, found_int, found);
-}
-
-Status GetInt(LevelDBDatabase* db,
+template <typename DBOrTransaction>
+Status GetInt(DBOrTransaction* db,
               const StringPiece& key,
               int64_t* found_int,
               bool* found) {
   return GetIntInternal(db, key, found_int, found);
 }
+template Status GetInt<LevelDBTransaction>(LevelDBTransaction* db,
+                                           const StringPiece& key,
+                                           int64_t* found_int,
+                                           bool* found);
+template Status GetInt<LevelDBDatabase>(LevelDBDatabase* db,
+                                        const StringPiece& key,
+                                        int64_t* found_int,
+                                        bool* found);
 
 void PutBool(LevelDBTransaction* transaction,
              const StringPiece& key,
@@ -275,14 +203,29 @@
   transaction->Put(key, &buffer);
 }
 
-void PutInt(LevelDBTransaction* transaction,
-            const StringPiece& key,
-            int64_t value) {
+template <typename Transaction>
+void PutInt(Transaction* transaction, const StringPiece& key, int64_t value) {
   DCHECK_GE(value, 0);
   std::string buffer;
   EncodeInt(value, &buffer);
   transaction->Put(key, &buffer);
 }
+template void PutInt<LevelDBTransaction>(LevelDBTransaction* transaction,
+                                         const StringPiece& key,
+                                         int64_t value);
+template void PutInt<LevelDBDirectTransaction>(
+    LevelDBDirectTransaction* transaction,
+    const StringPiece& key,
+    int64_t value);
+template <>
+void PutInt<LevelDBWriteBatch>(LevelDBWriteBatch* write_batch,
+                               const StringPiece& key,
+                               int64_t value) {
+  DCHECK_GE(value, 0);
+  std::string buffer;
+  EncodeInt(value, &buffer);
+  write_batch->Put(key, base::StringPiece(buffer));
+}
 
 template <typename DBOrTransaction>
 Status GetVarInt(DBOrTransaction* db,
@@ -300,7 +243,6 @@
     return s;
   return InternalInconsistencyStatus();
 }
-
 template Status GetVarInt<LevelDBTransaction>(LevelDBTransaction* txn,
                                               const StringPiece& key,
                                               int64_t* found_int,
@@ -310,13 +252,29 @@
                                            int64_t* found_int,
                                            bool* found);
 
-void PutVarInt(LevelDBTransaction* transaction,
+template <typename Transaction>
+void PutVarInt(Transaction* transaction,
                const StringPiece& key,
                int64_t value) {
   std::string buffer;
   EncodeVarInt(value, &buffer);
   transaction->Put(key, &buffer);
 }
+template void PutVarInt<LevelDBTransaction>(LevelDBTransaction* transaction,
+                                            const StringPiece& key,
+                                            int64_t value);
+template void PutVarInt<LevelDBDirectTransaction>(
+    LevelDBDirectTransaction* transaction,
+    const StringPiece& key,
+    int64_t value);
+template <>
+void PutVarInt<LevelDBWriteBatch>(LevelDBWriteBatch* write_batch,
+                                  const StringPiece& key,
+                                  int64_t value) {
+  std::string buffer;
+  EncodeVarInt(value, &buffer);
+  write_batch->Put(key, base::StringPiece(buffer));
+}
 
 template <typename DBOrTransaction>
 Status GetString(DBOrTransaction* db,
@@ -498,7 +456,16 @@
   return s;
 }
 
-Status GetNewDatabaseId(LevelDBTransaction* transaction, int64_t* new_id) {
+template Status GetNewDatabaseId<LevelDBDirectTransaction>(
+    LevelDBDirectTransaction* transaction,
+    int64_t* new_id);
+
+template Status GetNewDatabaseId<LevelDBTransaction>(
+    LevelDBTransaction* transaction,
+    int64_t* new_id);
+
+template <typename Transaction>
+Status GetNewDatabaseId(Transaction* transaction, int64_t* new_id) {
   *new_id = -1;
   int64_t max_database_id = -1;
   bool found = false;
@@ -654,7 +621,15 @@
   return s;
 }
 
-void SetEarliestSweepTime(LevelDBTransaction* txn, base::Time earliest_sweep) {
+template void SetEarliestSweepTime<LevelDBTransaction>(
+    LevelDBTransaction* db,
+    base::Time earliest_sweep);
+template void SetEarliestSweepTime<LevelDBDirectTransaction>(
+    LevelDBDirectTransaction* db,
+    base::Time earliest_sweep);
+
+template <typename Transaction>
+void SetEarliestSweepTime(Transaction* txn, base::Time earliest_sweep) {
   const std::string earliest_sweep_time_key = EarliestSweepKey::Encode();
   int64_t time_micros = (earliest_sweep - base::Time()).InMicroseconds();
   indexed_db::PutInt(txn, earliest_sweep_time_key, time_micros);
@@ -670,132 +645,5 @@
   return ldb_comparator.get();
 }
 
-std::tuple<base::FilePath /*leveldb_path*/,
-           base::FilePath /*blob_path*/,
-           leveldb::Status>
-CreateDatabaseDirectories(const base::FilePath& path_base,
-                          const url::Origin& origin) {
-  leveldb::Status status;
-  if (!base::CreateDirectoryAndGetError(path_base, nullptr)) {
-    status = Status::IOError("Unable to create IndexedDB database path");
-    LOG(ERROR) << status.ToString() << ": \"" << path_base.AsUTF8Unsafe()
-               << "\"";
-    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY,
-                     origin);
-    return {base::FilePath(), base::FilePath(), status};
-  }
-
-  base::FilePath leveldb_path = path_base.Append(GetLevelDBFileName(origin));
-  base::FilePath blob_path = path_base.Append(GetBlobStoreFileName(origin));
-  if (IsPathTooLong(leveldb_path)) {
-    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG,
-                     origin);
-    status = Status::IOError("File path too long");
-    return {base::FilePath(), base::FilePath(), status};
-  }
-  return {leveldb_path, blob_path, status};
-}
-
-std::tuple<std::unique_ptr<LevelDBDatabase>,
-           leveldb::Status,
-           IndexedDBDataLossInfo,
-           bool /* is_disk_full */>
-OpenAndVerifyLevelDBDatabase(
-    const url::Origin& origin,
-    base::FilePath path_base,
-    base::FilePath database_path,
-    LevelDBFactory* ldb_factory,
-    scoped_refptr<base::SequencedTaskRunner> task_runner) {
-  // Please see docs/open_and_verify_leveldb_database.code2flow, and the
-  // generated pdf (from https://code2flow.com).
-  // The intended strategy here is to have this function match that flowchart,
-  // where the flowchart should be seen as the 'master' logic template. Please
-  // check the git history of both to make sure they are supposed to be in sync.
-  DCHECK_EQ(database_path.empty(), path_base.empty());
-  IDB_TRACE("indexed_db::OpenAndVerifyLevelDBDatabase");
-  bool is_disk_full;
-  std::unique_ptr<LevelDBDatabase> database;
-  leveldb::Status status;
-  scoped_refptr<LevelDBState> state;
-  std::tie(state, status, is_disk_full) = ldb_factory->OpenLevelDBState(
-      database_path, GetDefaultIndexedDBComparator(),
-      GetDefaultLevelDBComparator());
-  bool is_schema_known = false;
-  // On I/O error the database isn't deleted, in case the issue is temporary.
-  if (status.IsIOError()) {
-    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY,
-                     origin);
-    return {std::move(database), status, IndexedDBDataLossInfo(), is_disk_full};
-  }
-
-  IndexedDBDataLossInfo data_loss_info;
-  data_loss_info.status = blink::mojom::IDBDataLoss::None;
-  if (status.IsCorruption()) {
-    // On corruption, recovery will happen in the next section.
-    data_loss_info.status = blink::mojom::IDBDataLoss::Total;
-    data_loss_info.message = leveldb_env::GetCorruptionMessage(status);
-    std::tie(database, status, is_disk_full) = DeleteAndRecreateDatabase(
-        origin, database_path, ldb_factory, task_runner);
-    // If successful, then the database should be empty and doesn't need any of
-    // the corruption or schema checks below.
-    if (status.ok()) {
-      ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_SUCCESS,
-                       origin);
-    }
-    return {std::move(database), status, data_loss_info, is_disk_full};
-  }
-  // The leveldb database is successfully opened.
-  DCHECK(status.ok());
-  database = std::make_unique<LevelDBDatabase>(
-      std::move(state), ldb_factory, std::move(task_runner),
-      LevelDBDatabase::kDefaultMaxOpenIteratorsPerDatabase);
-
-  // Check for previous corruption or invalid schemas.
-  std::string corruption_message;
-  if (!path_base.empty())
-    corruption_message = ReadCorruptionInfo(path_base, origin);
-  if (!corruption_message.empty()) {
-    LOG(ERROR) << "IndexedDB recovering from a corrupted (and deleted) "
-                  "database.";
-    ReportOpenStatus(
-        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_PRIOR_CORRUPTION,
-        origin);
-    status = leveldb::Status::Corruption(corruption_message);
-    database.reset();
-    data_loss_info.status = blink::mojom::IDBDataLoss::Total;
-    data_loss_info.message =
-        "IndexedDB (database was corrupt): " + corruption_message;
-  } else if (!IsSchemaKnown(database.get(), &is_schema_known)) {
-    LOG(ERROR) << "IndexedDB had IO error checking schema, treating it as "
-                  "failure to open";
-    ReportOpenStatus(
-        indexed_db::
-            INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA,
-        origin);
-    database.reset();
-    data_loss_info.status = blink::mojom::IDBDataLoss::Total;
-    data_loss_info.message = "I/O error checking schema";
-  } else if (!is_schema_known) {
-    LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it "
-                  "as failure to open";
-    ReportOpenStatus(
-        indexed_db::INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA,
-        origin);
-    database.reset();
-    data_loss_info.status = blink::mojom::IDBDataLoss::Total;
-    data_loss_info.message = "Unknown schema";
-  }
-  // Try to delete & recreate the database for any of the above issues.
-  if (!database.get()) {
-    DCHECK(!is_schema_known || status.IsCorruption());
-    std::tie(database, status, is_disk_full) = DeleteAndRecreateDatabase(
-        origin, database_path, ldb_factory, task_runner);
-  }
-
-  if (status.ok())
-    ReportOpenStatus(indexed_db::INDEXED_DB_BACKING_STORE_OPEN_SUCCESS, origin);
-  return {std::move(database), status, data_loss_info, is_disk_full};
-}
-
 }  // namespace indexed_db
 }  // namespace content
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.h b/content/browser/indexed_db/indexed_db_leveldb_operations.h
index dfa747e..66848fb 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_operations.h
+++ b/content/browser/indexed_db/indexed_db_leveldb_operations.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 #include <string>
-#include <tuple>
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
@@ -16,7 +15,9 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
+#include "content/browser/indexed_db/indexed_db_data_loss_info.h"
 #include "content/browser/indexed_db/leveldb/leveldb_comparator.h"
+#include "content/browser/indexed_db/scopes/leveldb_scopes_factory.h"
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/indexeddb/indexeddb_key_path.h"
 #include "third_party/leveldatabase/src/include/leveldb/comparator.h"
@@ -29,10 +30,8 @@
 class LevelDBDatabase;
 class LevelDBIterator;
 class LevelDBTransaction;
-struct IndexedDBDataLossInfo;
 
 namespace indexed_db {
-class LevelDBFactory;
 
 extern const base::FilePath::CharType kBlobExtension[];
 extern const base::FilePath::CharType kIndexedDBExtension[];
@@ -42,6 +41,10 @@
 base::FilePath GetLevelDBFileName(const url::Origin& origin);
 base::FilePath ComputeCorruptionFileName(const url::Origin& origin);
 
+// Returns if the given file path is too long for the current operating system's
+// file system.
+bool IsPathTooLong(const base::FilePath& leveldb_dir);
+
 // If a corruption file for the given |origin| at the given |path_base| exists
 // it is deleted, and the message is returned. If the file does not exist, or if
 // there is an error parsing the message, then this method returns an empty
@@ -57,11 +60,8 @@
 
 leveldb::Status IOErrorStatus();
 
-leveldb::Status CONTENT_EXPORT GetInt(LevelDBDatabase* db,
-                                      const base::StringPiece& key,
-                                      int64_t* found_int,
-                                      bool* found);
-leveldb::Status CONTENT_EXPORT GetInt(LevelDBTransaction* txn,
+template <typename DBOrTransaction>
+leveldb::Status CONTENT_EXPORT GetInt(DBOrTransaction* db,
                                       const base::StringPiece& key,
                                       int64_t* found_int,
                                       bool* found);
@@ -69,7 +69,9 @@
 void PutBool(LevelDBTransaction* transaction,
              const base::StringPiece& key,
              bool value);
-void CONTENT_EXPORT PutInt(LevelDBTransaction* transaction,
+
+template <typename TransactionOrWriteBatch>
+void CONTENT_EXPORT PutInt(TransactionOrWriteBatch* transaction,
                            const base::StringPiece& key,
                            int64_t value);
 
@@ -79,7 +81,8 @@
                                              int64_t* found_int,
                                              bool* found);
 
-void PutVarInt(LevelDBTransaction* transaction,
+template <typename TransactionOrWriteBatch>
+void PutVarInt(TransactionOrWriteBatch* transaction,
                const base::StringPiece& key,
                int64_t value);
 
@@ -128,9 +131,9 @@
     const std::string& encoded_primary_key,
     bool* exists);
 
-WARN_UNUSED_RESULT leveldb::Status GetNewDatabaseId(
-    LevelDBTransaction* transaction,
-    int64_t* new_id);
+template <typename Transaction>
+WARN_UNUSED_RESULT leveldb::Status GetNewDatabaseId(Transaction* transaction,
+                                                    int64_t* new_id);
 
 WARN_UNUSED_RESULT bool CheckObjectStoreAndMetaDataType(
     const LevelDBIterator* it,
@@ -163,34 +166,13 @@
     LevelDBDatabase* db,
     base::Time* earliest_sweep);
 
-void SetEarliestSweepTime(LevelDBTransaction* txn, base::Time earliest_sweep);
+template <typename Transaction>
+void SetEarliestSweepTime(Transaction* txn, base::Time earliest_sweep);
 
 CONTENT_EXPORT const LevelDBComparator* GetDefaultIndexedDBComparator();
 
 CONTENT_EXPORT const leveldb::Comparator* GetDefaultLevelDBComparator();
 
-// Creates the leveldb and blob storage directories for IndexedDB.
-std::tuple<base::FilePath /*leveldb_path*/,
-           base::FilePath /*blob_path*/,
-           leveldb::Status>
-CreateDatabaseDirectories(const base::FilePath& path_base,
-                          const url::Origin& origin);
-
-// |path_base| is the directory that will contain the database directory, the
-// blob directory, and any data loss info. |database_path| is the directory for
-// the leveldb database. If |path_base| is empty, then an in-memory database is
-// opened.
-std::tuple<std::unique_ptr<LevelDBDatabase>,
-           leveldb::Status,
-           IndexedDBDataLossInfo,
-           bool /* is_disk_full */>
-OpenAndVerifyLevelDBDatabase(
-    const url::Origin& origin,
-    base::FilePath path_base,
-    base::FilePath database_path,
-    LevelDBFactory* ldb_factory,
-    scoped_refptr<base::SequencedTaskRunner> task_runner);
-
 }  // namespace indexed_db
 }  // namespace content
 
diff --git a/content/browser/indexed_db/indexed_db_origin_state_handle.h b/content/browser/indexed_db/indexed_db_origin_state_handle.h
index bfa2326..12a780a 100644
--- a/content/browser/indexed_db/indexed_db_origin_state_handle.h
+++ b/content/browser/indexed_db/indexed_db_origin_state_handle.h
@@ -36,6 +36,7 @@
  protected:
   friend class IndexedDBFactoryImpl;
   friend class IndexedDBFactoryTest;
+  friend class IndexedDBBrowserTest;
   friend class indexed_db_backing_store_unittest::IndexedDBBackingStoreTest;
 
   // Returns null if the factory was destroyed, which should only happen on
diff --git a/content/browser/indexed_db/indexed_db_reporting.h b/content/browser/indexed_db/indexed_db_reporting.h
index 6fe9fde..f5579fe 100644
--- a/content/browser/indexed_db/indexed_db_reporting.h
+++ b/content/browser/indexed_db/indexed_db_reporting.h
@@ -70,6 +70,7 @@
   INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY,
   INDEXED_DB_BACKING_STORE_OPEN_FAILED_PRIOR_CORRUPTION,
   INDEXED_DB_BACKING_STORE_OPEN_FAILED_CLEANUP_JOURNAL_ERROR,
+  INDEXED_DB_BACKING_STORE_OPEN_FAILED_METADATA_SETUP,
   INDEXED_DB_BACKING_STORE_OPEN_MAX,
 };
 
diff --git a/content/browser/renderer_host/DEPS b/content/browser/renderer_host/DEPS
index 76bb5ac6..752e437d 100644
--- a/content/browser/renderer_host/DEPS
+++ b/content/browser/renderer_host/DEPS
@@ -3,6 +3,7 @@
   "+components/viz/common",
   "+components/viz/host",
   "+components/viz/service",
+  "+jni",
   "+third_party/blink/public/platform/web_gesture_curve.h",
   "+third_party/zlib",
   "+ui/events/gestures/blink/web_gesture_curve_impl.h",
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index db2145e..fd3fbc4e0 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -9,6 +9,8 @@
 #include <utility>
 
 #include "base/android/build_info.h"
+#include "base/android/callback_android.h"
+#include "base/android/jni_string.h"
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -21,6 +23,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "cc/base/math_util.h"
 #include "cc/layers/layer.h"
@@ -74,6 +77,7 @@
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/use_zoom_for_dsf_policy.h"
+#include "content/public/android/content_jni_headers/RenderWidgetHostViewImpl_jni.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -92,6 +96,7 @@
 #include "ui/events/blink/web_input_event_traits.h"
 #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
 #include "ui/gfx/android/view_configuration.h"
+#include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/geometry/dip_util.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/touch_selection/touch_selection_controller.h"
@@ -154,6 +159,44 @@
   }
 }
 
+std::string CompressAndSaveBitmap(const std::string& dir,
+                                  const SkBitmap& bitmap) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::WILL_BLOCK);
+  std::vector<unsigned char> data;
+  if (!gfx::JPEGCodec::Encode(bitmap, 85, &data)) {
+    LOG(ERROR) << "Failed to encode bitmap to JPEG";
+    return std::string();
+  }
+
+  base::FilePath screenshot_dir(dir);
+  if (!base::DirectoryExists(screenshot_dir)) {
+    if (!base::CreateDirectory(screenshot_dir)) {
+      LOG(ERROR) << "Failed to create screenshot directory";
+      return std::string();
+    }
+  }
+
+  base::FilePath screenshot_path;
+  base::ScopedFILE out_file(
+      base::CreateAndOpenTemporaryFileInDir(screenshot_dir, &screenshot_path));
+  if (!out_file) {
+    LOG(ERROR) << "Failed to create temporary screenshot file";
+    return std::string();
+  }
+  unsigned int bytes_written =
+      fwrite(reinterpret_cast<const char*>(data.data()), 1, data.size(),
+             out_file.get());
+
+  // If there were errors, don't leave a partial file around.
+  if (bytes_written != data.size()) {
+    base::DeleteFile(screenshot_path, false);
+    LOG(ERROR) << "Error writing screenshot file to disk";
+    return std::string();
+  }
+  return screenshot_path.value();
+}
+
 }  // namespace
 
 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
@@ -244,6 +287,11 @@
   view_.set_event_handler(nullptr);
   DCHECK(!ime_adapter_android_);
   DCHECK(!delegated_frame_host_);
+  if (obj_) {
+    Java_RenderWidgetHostViewImpl_clearNativePtr(
+        base::android::AttachCurrentThread(), obj_);
+    obj_.Reset();
+  }
 }
 
 void RenderWidgetHostViewAndroid::AddDestructionObserver(
@@ -444,6 +492,68 @@
   UpdateWebViewBackgroundColorIfNecessary();
 }
 
+base::android::ScopedJavaLocalRef<jobject>
+RenderWidgetHostViewAndroid::GetJavaObject() {
+  if (!obj_) {
+    JNIEnv* env = base::android::AttachCurrentThread();
+    obj_.Reset(env, Java_RenderWidgetHostViewImpl_create(
+                        env, reinterpret_cast<intptr_t>(this))
+                        .obj());
+  }
+  return base::android::ScopedJavaLocalRef<jobject>(obj_);
+}
+
+bool RenderWidgetHostViewAndroid::IsReady(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  return HasValidFrame();
+}
+
+void RenderWidgetHostViewAndroid::DismissTextHandles(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  DismissTextHandles();
+}
+
+jint RenderWidgetHostViewAndroid::GetBackgroundColor(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  base::Optional<SkColor> color =
+      RenderWidgetHostViewAndroid::GetCachedBackgroundColor();
+  if (!color)
+    return SK_ColorTRANSPARENT;
+  return *color;
+}
+
+void RenderWidgetHostViewAndroid::ShowContextMenuAtTouchHandle(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    jint x,
+    jint y) {
+  if (host()) {
+    host()->ShowContextMenuAtPoint(gfx::Point(x, y),
+                                   ui::MENU_SOURCE_TOUCH_HANDLE);
+  }
+}
+
+void RenderWidgetHostViewAndroid::WriteContentBitmapToDiskAsync(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    jint width,
+    jint height,
+    const base::android::JavaParamRef<jstring>& jpath,
+    const base::android::JavaParamRef<jobject>& jcallback) {
+  base::OnceCallback<void(const SkBitmap&)> result_callback = base::BindOnce(
+      &RenderWidgetHostViewAndroid::OnFinishGetContentBitmap,
+      weak_ptr_factory_.GetWeakPtr(),
+      base::android::ScopedJavaGlobalRef<jobject>(env, obj),
+      base::android::ScopedJavaGlobalRef<jobject>(env, jcallback),
+      base::android::ConvertJavaStringToUTF8(env, jpath));
+
+  CopyFromSurface(gfx::Rect(), gfx::Size(width, height),
+                  std::move(result_callback));
+}
+
 void RenderWidgetHostViewAndroid::Focus() {
   if (view_.HasFocus())
     GotFocus();
@@ -979,9 +1089,7 @@
 
 void RenderWidgetHostViewAndroid::EvictFrameIfNecessary() {
   if (!host()->delegate()->IsFullscreenForCurrentTab() ||
-      current_surface_size_ == view_.GetPhysicalBackingSize() ||
-      !base::FeatureList::IsEnabled(
-          features::kHideIncorrectlySizedFullscreenFrames)) {
+      current_surface_size_ == view_.GetPhysicalBackingSize()) {
     return;
   }
   // When we're in a fullscreen and and doing a resize we show black
@@ -1404,6 +1512,27 @@
   EvictFrameIfNecessary();
 }
 
+void RenderWidgetHostViewAndroid::OnFinishGetContentBitmap(
+    const base::android::JavaRef<jobject>& obj,
+    const base::android::JavaRef<jobject>& callback,
+    const std::string& path,
+    const SkBitmap& bitmap) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  if (!bitmap.drawsNothing()) {
+    auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
+        {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
+    base::PostTaskAndReplyWithResult(
+        task_runner.get(), FROM_HERE,
+        base::BindOnce(&CompressAndSaveBitmap, path, bitmap),
+        base::BindOnce(
+            &base::android::RunStringCallbackAndroid,
+            base::android::ScopedJavaGlobalRef<jobject>(env, callback.obj())));
+    return;
+  }
+  // If readback failed, call empty callback
+  base::android::RunStringCallbackAndroid(callback, std::string());
+}
+
 void RenderWidgetHostViewAndroid::ShowInternal() {
   bool show = is_showing_ && is_window_activity_started_ && is_window_visible_;
   if (!show)
@@ -1931,13 +2060,6 @@
     host()->delegate()->MoveCaret(point);
 }
 
-void RenderWidgetHostViewAndroid::ShowContextMenuAtPoint(
-    const gfx::Point& point,
-    ui::MenuSourceType source_type) {
-  if (host())
-    host()->ShowContextMenuAtPoint(point, source_type);
-}
-
 void RenderWidgetHostViewAndroid::DismissTextHandles() {
   if (touch_selection_controller_)
     touch_selection_controller_->HideAndDisallowShowingAutomatically();
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 1539d1e..7089548 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -11,6 +11,7 @@
 #include <map>
 #include <memory>
 
+#include "base/android/jni_android.h"
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/containers/queue.h"
@@ -353,6 +354,33 @@
   void SetWebContentsAccessibility(
       WebContentsAccessibilityAndroid* web_contents_accessibility);
 
+  base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
+
+  // Methods called from Java
+  bool IsReady(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+  void DismissTextHandles(JNIEnv* env,
+                          const base::android::JavaParamRef<jobject>& obj);
+
+  // Returns an int equivalent to an Optional<SKColor>, with a value of 0
+  // indicating SKTransparent for not set.
+  jint GetBackgroundColor(JNIEnv* env,
+                          const base::android::JavaParamRef<jobject>& obj);
+
+  void ShowContextMenuAtTouchHandle(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      jint x,
+      jint y);
+
+  void WriteContentBitmapToDiskAsync(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      jint width,
+      jint height,
+      const base::android::JavaParamRef<jstring>& jpath,
+      const base::android::JavaParamRef<jobject>& jcallback);
+
   ui::DelegatedFrameHostAndroid* delegated_frame_host_for_testing() {
     return delegated_frame_host_.get();
   }
@@ -389,6 +417,11 @@
   void OnDidUpdateVisualPropertiesComplete(
       const cc::RenderFrameMetadata& metadata);
 
+  void OnFinishGetContentBitmap(const base::android::JavaRef<jobject>& obj,
+                                const base::android::JavaRef<jobject>& callback,
+                                const std::string& path,
+                                const SkBitmap& bitmap);
+
   void ShowInternal();
   void HideInternal();
   void AttachLayers();
@@ -557,6 +590,8 @@
 
   WebContentsAccessibilityAndroid* web_contents_accessibility_ = nullptr;
 
+  base::android::ScopedJavaGlobalRef<jobject> obj_;
+
   base::WeakPtrFactory<RenderWidgetHostViewAndroid> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid);
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc
index a681496..c657fec 100644
--- a/content/browser/web_contents/web_contents_android.cc
+++ b/content/browser/web_contents/web_contents_android.cc
@@ -10,7 +10,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/android/callback_android.h"
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
@@ -49,7 +48,6 @@
 #include "ui/android/overscroll_refresh_handler.h"
 #include "ui/android/window_android.h"
 #include "ui/gfx/android/java_bitmap.h"
-#include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -142,45 +140,6 @@
   Java_WebContentsImpl_onAccessibilitySnapshot(env, j_root, callback);
 }
 
-std::string CompressAndSaveBitmap(const std::string& dir,
-                                  const SkBitmap& bitmap) {
-  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
-                                                base::BlockingType::WILL_BLOCK);
-
-  std::vector<unsigned char> data;
-  if (!gfx::JPEGCodec::Encode(bitmap, 85, &data)) {
-    LOG(ERROR) << "Failed to encode bitmap to JPEG";
-    return std::string();
-  }
-
-  base::FilePath screenshot_dir(dir);
-  if (!base::DirectoryExists(screenshot_dir)) {
-    if (!base::CreateDirectory(screenshot_dir)) {
-      LOG(ERROR) << "Failed to create screenshot directory";
-      return std::string();
-    }
-  }
-
-  base::FilePath screenshot_path;
-  base::ScopedFILE out_file(
-      base::CreateAndOpenTemporaryFileInDir(screenshot_dir, &screenshot_path));
-  if (!out_file) {
-    LOG(ERROR) << "Failed to create temporary screenshot file";
-    return std::string();
-  }
-  unsigned int bytes_written =
-      fwrite(reinterpret_cast<const char*>(data.data()), 1, data.size(),
-             out_file.get());
-
-  // If there were errors, don't leave a partial file around.
-  if (bytes_written != data.size()) {
-    base::DeleteFile(screenshot_path, false);
-    LOG(ERROR) << "Error writing screenshot file to disk";
-    return std::string();
-  }
-  return screenshot_path.value();
-}
-
 }  // namespace
 
 // static
@@ -395,6 +354,15 @@
   web_contents_->CollapseSelection();
 }
 
+ScopedJavaLocalRef<jobject> WebContentsAndroid::GetRenderWidgetHostView(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj) {
+  RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
+  if (!rwhva)
+    return nullptr;
+  return rwhva->GetJavaObject();
+}
+
 RenderWidgetHostViewAndroid*
     WebContentsAndroid::GetRenderWidgetHostViewAndroid() {
   RenderWidgetHostView* rwhv = NULL;
@@ -479,13 +447,6 @@
   return web_contents_->FocusLocationBarByDefault();
 }
 
-jboolean WebContentsAndroid::IsRenderWidgetHostViewReady(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
-  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
-  return view && view->HasValidFrame();
-}
-
 void WebContentsAndroid::ExitFullscreen(JNIEnv* env,
                                         const JavaParamRef<jobject>& obj) {
   web_contents_->ExitFullscreen(/*will_cause_resize=*/false);
@@ -695,27 +656,6 @@
   web_contents_->SetSpatialNavigationDisabled(disabled);
 }
 
-void WebContentsAndroid::WriteContentBitmapToDisk(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint width,
-    jint height,
-    const JavaParamRef<jstring>& jpath,
-    const JavaParamRef<jobject>& jcallback) {
-  base::OnceCallback<void(const SkBitmap&)> result_callback = base::BindOnce(
-      &WebContentsAndroid::OnFinishGetContentBitmap, weak_factory_.GetWeakPtr(),
-      ScopedJavaGlobalRef<jobject>(env, obj),
-      ScopedJavaGlobalRef<jobject>(env, jcallback),
-      ConvertJavaStringToUTF8(env, jpath));
-  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
-  if (!view) {
-    std::move(result_callback).Run(SkBitmap());
-    return;
-  }
-  view->CopyFromSurface(gfx::Rect(), gfx::Size(width, height),
-                        std::move(result_callback));
-}
-
 void WebContentsAndroid::ReloadLoFiImages(JNIEnv* env,
                                           const JavaParamRef<jobject>& obj) {
   static_cast<WebContentsImpl*>(web_contents_)->ReloadLoFiImages();
@@ -738,25 +678,6 @@
                  ScopedJavaGlobalRef<jobject>(env, jcallback)));
 }
 
-void WebContentsAndroid::DismissTextHandles(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
-  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
-  if (view)
-    view->DismissTextHandles();
-}
-
-void WebContentsAndroid::ShowContextMenuAtTouchHandle(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
-    int x,
-    int y) {
-  RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
-  if (view)
-    view->ShowContextMenuAtPoint(gfx::Point(x, y),
-                                 ui::MENU_SOURCE_TOUCH_HANDLE);
-}
-
 void WebContentsAndroid::SetHasPersistentVideo(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
@@ -814,26 +735,6 @@
   return native_view->GetEventForwarder();
 }
 
-void WebContentsAndroid::OnFinishGetContentBitmap(
-    const JavaRef<jobject>& obj,
-    const JavaRef<jobject>& callback,
-    const std::string& path,
-    const SkBitmap& bitmap) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  if (!bitmap.drawsNothing()) {
-    auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
-        {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
-    base::PostTaskAndReplyWithResult(
-        task_runner.get(), FROM_HERE,
-        base::BindOnce(&CompressAndSaveBitmap, path, bitmap),
-        base::BindOnce(&base::android::RunStringCallbackAndroid,
-                       ScopedJavaGlobalRef<jobject>(env, callback.obj())));
-    return;
-  }
-  // If readback failed, call empty callback
-  base::android::RunStringCallbackAndroid(callback, std::string());
-}
-
 void WebContentsAndroid::OnFinishDownloadImage(
     const JavaRef<jobject>& obj,
     const JavaRef<jobject>& callback,
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h
index e8ee623..9a67b89 100644
--- a/content/browser/web_contents/web_contents_android.h
+++ b/content/browser/web_contents/web_contents_android.h
@@ -109,9 +109,6 @@
   jboolean FocusLocationBarByDefault(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj);
-  jboolean IsRenderWidgetHostViewReady(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
   void ExitFullscreen(JNIEnv* env,
                       const base::android::JavaParamRef<jobject>& obj);
   void ScrollFocusedEditableNodeIntoView(
@@ -189,15 +186,6 @@
       const base::android::JavaParamRef<jobject>& obj,
       bool disabled);
 
-  // Relay the access from Java layer to RWHV::CopyFromSurface() through JNI.
-  void WriteContentBitmapToDisk(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint width,
-      jint height,
-      const base::android::JavaParamRef<jstring>& jpath,
-      const base::android::JavaParamRef<jobject>& jcallback);
-
   void ReloadLoFiImages(JNIEnv* env,
                         const base::android::JavaParamRef<jobject>& obj);
 
@@ -208,13 +196,6 @@
                     jint max_bitmap_size,
                     jboolean bypass_cache,
                     const base::android::JavaParamRef<jobject>& jcallback);
-  void DismissTextHandles(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& obj);
-  void ShowContextMenuAtTouchHandle(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      int x,
-      int y);
   void SetHasPersistentVideo(JNIEnv* env,
                              const base::android::JavaParamRef<jobject>& obj,
                              jboolean value);
@@ -265,6 +246,10 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj);
 
+  base::android::ScopedJavaLocalRef<jobject> GetRenderWidgetHostView(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj);
+
   RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
 
   class DestructionObserver : public base::CheckedObserver {
@@ -278,11 +263,6 @@
   void RemoveDestructionObserver(DestructionObserver* observer);
 
  private:
-  void OnFinishGetContentBitmap(const base::android::JavaRef<jobject>& obj,
-                                const base::android::JavaRef<jobject>& callback,
-                                const std::string& path,
-                                const SkBitmap& bitmap);
-
   void OnFinishDownloadImage(const base::android::JavaRef<jobject>& obj,
                              const base::android::JavaRef<jobject>& callback,
                              int id,
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index 517a9443..f31512fe 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -405,11 +405,11 @@
   AuthenticatorPtr ConstructAuthenticatorWithTimer(
       scoped_refptr<base::TestMockTimeTaskRunner> task_runner) {
     connector_ = service_manager::Connector::Create(&request_);
-    fake_hid_manager_ = std::make_unique<device::FakeHidManager>();
+    fake_hid_manager_ = std::make_unique<device::FakeFidoHidManager>();
     connector_->OverrideBinderForTesting(
         service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
         device::mojom::HidManager::Name_,
-        base::Bind(&device::FakeHidManager::AddBinding,
+        base::Bind(&device::FakeFidoHidManager::AddBinding,
                    base::Unretained(fake_hid_manager_.get())));
 
     // Set up a timer for testing.
@@ -487,7 +487,7 @@
   std::unique_ptr<AuthenticatorImpl> authenticator_impl_;
   service_manager::mojom::ConnectorRequest request_;
   std::unique_ptr<service_manager::Connector> connector_;
-  std::unique_ptr<device::FakeHidManager> fake_hid_manager_;
+  std::unique_ptr<device::FakeFidoHidManager> fake_hid_manager_;
   base::Optional<base::test::ScopedFeatureList> scoped_feature_list_;
   scoped_refptr<::testing::NiceMock<device::MockBluetoothAdapter>>
       mock_adapter_;
@@ -2446,11 +2446,11 @@
       std::unique_ptr<MockAuthenticatorRequestDelegateObserver> delegate,
       scoped_refptr<base::TestMockTimeTaskRunner> task_runner) {
     connector_ = service_manager::Connector::Create(&request_);
-    fake_hid_manager_ = std::make_unique<device::FakeHidManager>();
+    fake_hid_manager_ = std::make_unique<device::FakeFidoHidManager>();
     connector_->OverrideBinderForTesting(
         service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
         device::mojom::HidManager::Name_,
-        base::Bind(&device::FakeHidManager::AddBinding,
+        base::Bind(&device::FakeFidoHidManager::AddBinding,
                    base::Unretained(fake_hid_manager_.get())));
 
     // Set up a timer for testing.
@@ -3990,11 +3990,11 @@
       GURL effective_origin_url,
       scoped_refptr<base::TestMockTimeTaskRunner> task_runner) {
     connector_ = service_manager::Connector::Create(&request_);
-    fake_hid_manager_ = std::make_unique<device::FakeHidManager>();
+    fake_hid_manager_ = std::make_unique<device::FakeFidoHidManager>();
     connector_->OverrideBinderForTesting(
         service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
         device::mojom::HidManager::Name_,
-        base::BindRepeating(&device::FakeHidManager::AddBinding,
+        base::BindRepeating(&device::FakeFidoHidManager::AddBinding,
                             base::Unretained(fake_hid_manager_.get())));
 
     // Set up a timer for testing.
@@ -4009,7 +4009,7 @@
   std::unique_ptr<InternalAuthenticatorImpl> internal_authenticator_impl_;
   service_manager::mojom::ConnectorRequest request_;
   std::unique_ptr<service_manager::Connector> connector_;
-  std::unique_ptr<device::FakeHidManager> fake_hid_manager_;
+  std::unique_ptr<device::FakeFidoHidManager> fake_hid_manager_;
 };
 
 // Verify behavior for various combinations of origins and RP IDs.
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 58a0d6bb..2a8039dc 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -541,6 +541,9 @@
 
   WebRuntimeFeatures::EnableStreamsNative(
       base::FeatureList::IsEnabled(blink::features::kStreamsNative));
+
+  WebRuntimeFeatures::EnableMouseSubframeNoImplicitCapture(
+      base::FeatureList::IsEnabled(features::kMouseSubframeNoImplicitCapture));
 }
 
 }  // namespace
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 5b4d304..120f34c3 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -148,6 +148,7 @@
     "java/src/org/chromium/content/browser/TtsPlatformImpl.java",
     "java/src/org/chromium/content/browser/PopupController.java",
     "java/src/org/chromium/content/browser/RenderCoordinatesImpl.java",
+    "java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java",
     "java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java",
     "java/src/org/chromium/content/browser/SmsReceiver.java",
     "java/src/org/chromium/content/browser/SpareChildConnection.java",
@@ -269,6 +270,7 @@
     "java/src/org/chromium/content_public/browser/NavigationHistory.java",
     "java/src/org/chromium/content_public/browser/RenderCoordinates.java",
     "java/src/org/chromium/content_public/browser/RenderFrameHost.java",
+    "java/src/org/chromium/content_public/browser/RenderWidgetHostView.java",
     "java/src/org/chromium/content_public/browser/ScreenOrientationDelegate.java",
     "java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java",
     "java/src/org/chromium/content_public/browser/SelectionClient.java",
@@ -405,6 +407,7 @@
     "java/src/org/chromium/content/browser/MediaSessionImpl.java",
     "java/src/org/chromium/content/browser/MemoryMonitorAndroid.java",
     "java/src/org/chromium/content/browser/NfcHost.java",
+    "java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java",
     "java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java",
     "java/src/org/chromium/content/browser/SmsReceiver.java",
     "java/src/org/chromium/content/browser/SpeechRecognitionImpl.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java b/content/public/android/java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java
new file mode 100644
index 0000000..9de4f7f
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java
@@ -0,0 +1,101 @@
+// 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.
+
+package org.chromium.content.browser;
+
+import org.chromium.base.Callback;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.content_public.browser.RenderWidgetHostView;
+
+/**
+ * The Android implementation of RenderWidgetHostView.  This is a Java wrapper to allow
+ * communicating with the native RenderWidgetHostViewAndroid object (note the different class
+ * names). This object allows the browser to access and control the renderer's top level View.
+ */
+@JNINamespace("content")
+public class RenderWidgetHostViewImpl implements RenderWidgetHostView {
+    private long mNativeRenderWidgetHostView;
+
+    // Remember the stack for clearing native the native stack for debugging use after destroy.
+    private Throwable mNativeDestroyThrowable;
+
+    @CalledByNative
+    private static RenderWidgetHostViewImpl create(long renderWidgetHostViewLong) {
+        return new RenderWidgetHostViewImpl(renderWidgetHostViewLong);
+    }
+
+    /** Do not call this constructor from Java, use native WebContents->GetRenderWidgetHostView. */
+    private RenderWidgetHostViewImpl(long renderWidgetHostViewLong) {
+        mNativeRenderWidgetHostView = renderWidgetHostViewLong;
+    }
+
+    @Override
+    public boolean isReady() {
+        checkNotDestroyed();
+        return nativeIsReady(getNativePtr());
+    }
+
+    @Override
+    public int getBackgroundColor() {
+        return nativeGetBackgroundColor(getNativePtr());
+    }
+
+    /**
+     * Removes handles used in text selection.
+     */
+    public void dismissTextHandles() {
+        if (isDestroyed()) return;
+        nativeDismissTextHandles(getNativePtr());
+    }
+
+    /**
+     * Shows the paste popup menu and the touch handles at the specified location.
+     * @param x The horizontal location of the touch in dps.
+     * @param y The vertical location of the touch in dps.
+     */
+    public void showContextMenuAtTouchHandle(int x, int y) {
+        checkNotDestroyed();
+        nativeShowContextMenuAtTouchHandle(getNativePtr(), x, y);
+    }
+
+    @Override
+    public void writeContentBitmapToDiskAsync(
+            int width, int height, String path, Callback<String> callback) {
+        if (isDestroyed()) callback.onResult("RWHVA already destroyed!");
+        nativeWriteContentBitmapToDiskAsync(getNativePtr(), width, height, path, callback);
+    }
+
+    //====================
+    // Support for native.
+    //====================
+
+    public boolean isDestroyed() {
+        return getNativePtr() == 0;
+    }
+
+    private long getNativePtr() {
+        return mNativeRenderWidgetHostView;
+    }
+
+    @CalledByNative
+    private void clearNativePtr() {
+        mNativeRenderWidgetHostView = 0;
+        mNativeDestroyThrowable = new RuntimeException("clearNativePtr");
+    }
+
+    private void checkNotDestroyed() {
+        if (getNativePtr() != 0) return;
+        throw new IllegalStateException(
+                "Native RenderWidgetHostViewAndroid already destroyed", mNativeDestroyThrowable);
+    }
+
+    private native boolean nativeIsReady(long nativeRenderWidgetHostViewAndroid);
+    private native int nativeGetBackgroundColor(long nativeRenderWidgetHostViewAndroid);
+    private native void nativeDismissTextHandles(long nativeRenderWidgetHostViewAndroid);
+    private native void nativeShowContextMenuAtTouchHandle(
+            long nativeRenderWidgetHostViewAndroid, int x, int y);
+    private native void nativeWriteContentBitmapToDiskAsync(long nativeRenderWidgetHostViewAndroid,
+            int width, int height, String path, Callback<String> callback);
+}
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
index 7f6b4032..ba69655b 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
@@ -807,7 +807,9 @@
 
     private void onImeEvent() {
         for (ImeEventObserver observer : mEventObservers) observer.onImeEvent();
-        if (mNodeEditable) mWebContents.dismissTextHandles();
+        if (mNodeEditable && mWebContents.getRenderWidgetHostView() != null) {
+            mWebContents.getRenderWidgetHostView().dismissTextHandles();
+        }
     }
 
     boolean sendCompositionToNative(
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
index 6bc5ba2..0eb8d8d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -442,6 +442,18 @@
         return actionMode;
     }
 
+    private void dismissTextHandles() {
+        if (mWebContents.getRenderWidgetHostView() != null) {
+            mWebContents.getRenderWidgetHostView().dismissTextHandles();
+        }
+    }
+
+    private void showContextMenuAtTouchHandle(int left, int bottom) {
+        if (mWebContents.getRenderWidgetHostView() != null) {
+            mWebContents.getRenderWidgetHostView().showContextMenuAtTouchHandle(left, bottom);
+        }
+    }
+
     private void createAndShowPastePopup() {
         if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) {
             return;
@@ -454,13 +466,13 @@
                     @Override
                     public void paste() {
                         SelectionPopupControllerImpl.this.paste();
-                        mWebContents.dismissTextHandles();
+                        dismissTextHandles();
                     }
 
                     @Override
                     public void pasteAsPlainText() {
                         SelectionPopupControllerImpl.this.pasteAsPlainText();
-                        mWebContents.dismissTextHandles();
+                        dismissTextHandles();
                     }
 
                     @Override
@@ -606,7 +618,7 @@
             } else {
                 // Hide popups and clear selection.
                 destroyActionModeAndUnselect();
-                mWebContents.dismissTextHandles();
+                dismissTextHandles();
                 PopupController.hideAll(mWebContents);
                 // Clear the selection. The selection is cleared on destroying IME
                 // and also here since we may receive destroy first, for example
@@ -1256,7 +1268,7 @@
                 break;
 
             case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED:
-                mWebContents.showContextMenuAtTouchHandle(left, bottom);
+                showContextMenuAtTouchHandle(left, bottom);
                 if (mHandleObserver != null) {
                     mHandleObserver.handleDragStopped();
                 }
@@ -1284,8 +1296,7 @@
                 if (mWasPastePopupShowingOnInsertionDragStart) {
                     destroyPastePopup();
                 } else {
-                    mWebContents.showContextMenuAtTouchHandle(
-                            mSelectionRect.left, mSelectionRect.bottom);
+                    showContextMenuAtTouchHandle(mSelectionRect.left, mSelectionRect.bottom);
                 }
                 mWasPastePopupShowingOnInsertionDragStart = false;
                 break;
@@ -1304,8 +1315,7 @@
 
             case SelectionEventType.INSERTION_HANDLE_DRAG_STOPPED:
                 if (mWasPastePopupShowingOnInsertionDragStart) {
-                    mWebContents.showContextMenuAtTouchHandle(
-                            mSelectionRect.left, mSelectionRect.bottom);
+                    showContextMenuAtTouchHandle(mSelectionRect.left, mSelectionRect.bottom);
                 }
                 mWasPastePopupShowingOnInsertionDragStart = false;
                 if (mHandleObserver != null) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
index edc7f97..e19cd63 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -17,7 +17,6 @@
 import android.support.annotation.Nullable;
 import android.view.Surface;
 
-import org.chromium.base.Callback;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.UserData;
@@ -28,6 +27,7 @@
 import org.chromium.content.browser.AppWebMessagePort;
 import org.chromium.content.browser.MediaSessionImpl;
 import org.chromium.content.browser.RenderCoordinatesImpl;
+import org.chromium.content.browser.RenderWidgetHostViewImpl;
 import org.chromium.content.browser.ViewEventSinkImpl;
 import org.chromium.content.browser.WindowEventObserver;
 import org.chromium.content.browser.WindowEventObserverManager;
@@ -365,6 +365,15 @@
     }
 
     @Override
+    public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() {
+        if (mNativeWebContentsAndroid == 0) return null;
+        RenderWidgetHostViewImpl rwhvi = nativeGetRenderWidgetHostView(mNativeWebContentsAndroid);
+        if (rwhvi == null || rwhvi.isDestroyed()) return null;
+
+        return rwhvi;
+    }
+
+    @Override
     public String getTitle() {
         checkNotDestroyed();
         return nativeGetTitle(mNativeWebContentsAndroid);
@@ -517,11 +526,6 @@
         return nativeFocusLocationBarByDefault(mNativeWebContentsAndroid);
     }
 
-    @Override
-    public boolean isReady() {
-        checkNotDestroyed();
-        return nativeIsRenderWidgetHostViewReady(mNativeWebContentsAndroid);
-    }
 
     @Override
     public void exitFullscreen() {
@@ -751,13 +755,6 @@
     }
 
     @Override
-    public void writeContentBitmapToDiskAsync(
-            int width, int height, String path, Callback<String> callback) {
-        checkNotDestroyed();
-        nativeWriteContentBitmapToDisk(mNativeWebContentsAndroid, width, height, path, callback);
-    }
-
-    @Override
     public void reloadLoFiImages() {
         checkNotDestroyed();
         nativeReloadLoFiImages(mNativeWebContentsAndroid);
@@ -777,22 +774,6 @@
         callback.onFinishDownloadImage(id, httpStatusCode, imageUrl, bitmaps, sizes);
     }
 
-    /**
-     * Removes handles used in text selection.
-     */
-    public void dismissTextHandles() {
-        if (isDestroyed()) return;
-        nativeDismissTextHandles(mNativeWebContentsAndroid);
-    }
-
-    /**
-     * Shows paste popup menu at the touch handle at specified location.
-     */
-    public void showContextMenuAtTouchHandle(int x, int y) {
-        checkNotDestroyed();
-        nativeShowContextMenuAtTouchHandle(mNativeWebContentsAndroid, x, y);
-    }
-
     @Override
     public void setHasPersistentVideo(boolean value) {
         checkNotDestroyed();
@@ -988,6 +969,8 @@
             long nativeWebContentsAndroid, WindowAndroid windowAndroid);
     private native RenderFrameHost nativeGetMainFrame(long nativeWebContentsAndroid);
     private native RenderFrameHost nativeGetFocusedFrame(long nativeWebContentsAndroid);
+    private native RenderWidgetHostViewImpl nativeGetRenderWidgetHostView(
+            long nativeWebContentsAndroid);
     private native String nativeGetTitle(long nativeWebContentsAndroid);
     private native String nativeGetVisibleURL(long nativeWebContentsAndroid);
     private native String nativeGetEncoding(long nativeWebContentsAndroid);
@@ -1009,7 +992,6 @@
     private native int nativeGetBackgroundColor(long nativeWebContentsAndroid);
     private native boolean nativeIsShowingInterstitialPage(long nativeWebContentsAndroid);
     private native boolean nativeFocusLocationBarByDefault(long nativeWebContentsAndroid);
-    private native boolean nativeIsRenderWidgetHostViewReady(long nativeWebContentsAndroid);
     private native void nativeExitFullscreen(long nativeWebContentsAndroid);
     private native void nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid);
     private native void nativeSelectWordAroundCaret(long nativeWebContentsAndroid);
@@ -1038,15 +1020,10 @@
             long nativeWebContentsAndroid, OverscrollRefreshHandler nativeOverscrollRefreshHandler);
     private native void nativeSetSpatialNavigationDisabled(
             long nativeWebContentsAndroid, boolean disabled);
-    private native void nativeWriteContentBitmapToDisk(long nativeWebContentsAndroid, int width,
-            int height, String path, Callback<String> callback);
     private native void nativeReloadLoFiImages(long nativeWebContentsAndroid);
     private native int nativeDownloadImage(long nativeWebContentsAndroid,
             String url, boolean isFavicon, int maxBitmapSize,
             boolean bypassCache, ImageDownloadCallback callback);
-    private native void nativeDismissTextHandles(long nativeWebContentsAndroid);
-    private native void nativeShowContextMenuAtTouchHandle(
-            long nativeWebContentsAndroid, int x, int y);
     private native void nativeSetHasPersistentVideo(long nativeWebContentsAndroid, boolean value);
     private native boolean nativeHasActiveEffectivelyFullscreenVideo(long nativeWebContentsAndroid);
     private native boolean nativeIsPictureInPictureAllowedForFullscreenVideo(
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/RenderWidgetHostView.java b/content/public/android/java/src/org/chromium/content_public/browser/RenderWidgetHostView.java
new file mode 100644
index 0000000..3fc8f15b
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content_public/browser/RenderWidgetHostView.java
@@ -0,0 +1,39 @@
+// 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.
+
+package org.chromium.content_public.browser;
+
+import org.chromium.base.Callback;
+
+/**
+ * The Android interface to allow communicating with the RenderWidgetHostViewImpl and the native
+ * RenderWidgetHostViewAndroid object.  This object allows the browser to access and control the
+ * renderer's top level View.
+ */
+public interface RenderWidgetHostView {
+    /**
+     * If the view is ready to draw contents to the screen. In hardware mode,
+     * the initialization of the surface texture may not occur until after the
+     * view has been added to the layout. This method will return {@code true}
+     * once the texture is actually ready.
+     */
+    boolean isReady();
+
+    /**
+     * Get the Background color from underlying RenderWidgetHost for this WebContent.
+     */
+    int getBackgroundColor();
+
+    /**
+     * Requests an image snapshot of the content and stores it in the specified folder.
+     *
+     * @param width The width of the resulting bitmap, or 0 for "auto."
+     * @param height The height of the resulting bitmap, or 0 for "auto."
+     * @param path The folder in which to store the screenshot.
+     * @param callback May be called synchronously, or at a later point, to deliver the bitmap
+     *                 result (or a failure code).
+     */
+    void writeContentBitmapToDiskAsync(
+            int width, int height, String path, Callback<String> callback);
+}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
index cdfff84..904d11db 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -10,7 +10,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
-import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.ui.OverscrollRefreshHandler;
 import org.chromium.ui.base.EventForwarder;
@@ -94,6 +93,7 @@
     /**
      * @return The top level WindowAndroid associated with this WebContents.  This can be null.
      */
+    @Nullable
     WindowAndroid getTopLevelNativeWindow();
 
     /*
@@ -108,6 +108,7 @@
      * @return The {@link ViewAndroidDelegate} from which to get the container view.
      *         This can be null.
      */
+    @Nullable
     ViewAndroidDelegate getViewAndroidDelegate();
 
     /**
@@ -140,9 +141,17 @@
      * @return The focused frame associated with this WebContents. Will be null if the WebContents
      * does not have focus.
      */
+    @Nullable
     RenderFrameHost getFocusedFrame();
 
     /**
+     * @return The root level view from the renderer, or {@code null} in some cases where there is
+     *         none.
+     */
+    @Nullable
+    RenderWidgetHostView getRenderWidgetHostView();
+
+    /**
      * @return The title for the current visible page.
      */
     String getTitle();
@@ -206,7 +215,9 @@
 
     /**
      * Get the Background color from underlying RenderWidgetHost for this WebContent.
+     * @deprecated TODO(donnd): remove this when addressing https://crbug.com/968150.
      */
+    @Deprecated()
     int getBackgroundColor();
 
     /**
@@ -219,13 +230,6 @@
      */
     boolean focusLocationBarByDefault();
 
-    /**
-     * If the view is ready to draw contents to the screen. In hardware mode,
-     * the initialization of the surface texture may not occur until after the
-     * view has been added to the layout. This method will return {@code true}
-     * once the texture is actually ready.
-     */
-    boolean isReady();
 
      /**
      * Inform WebKit that Fullscreen mode has been exited by the user.
@@ -287,7 +291,7 @@
      *                 will be made on the main thread.
      *                 If no result is required, pass null.
      */
-    void evaluateJavaScript(String script, JavaScriptCallback callback);
+    void evaluateJavaScript(String script, @Nullable JavaScriptCallback callback);
 
     /**
      * Injects the passed Javascript code in the current page and evaluates it.
@@ -300,7 +304,7 @@
      *                 If no result is required, pass null.
      */
     @VisibleForTesting
-    void evaluateJavaScriptForTests(String script, JavaScriptCallback callback);
+    void evaluateJavaScriptForTests(String script, @Nullable JavaScriptCallback callback);
 
     /**
      * Adds a log message to dev tools console. |level| must be a value of
@@ -319,8 +323,8 @@
      * @param sentPorts The sent message ports, if any. Pass null if there is no
      *                  message ports to pass.
      */
-    void postMessageToFrame(String frameName, String message,
-            String sourceOrigin, String targetOrigin, MessagePort[] ports);
+    void postMessageToFrame(@Nullable String frameName, String message, String sourceOrigin,
+            String targetOrigin, @Nullable MessagePort[] ports);
 
     /**
      * Creates a message channel for sending postMessage requests and returns the ports for
@@ -406,18 +410,6 @@
     void setSpatialNavigationDisabled(boolean disabled);
 
     /**
-     * Requests an image snapshot of the content and stores it in the specified folder.
-     *
-     * @param width The width of the resulting bitmap, or 0 for "auto."
-     * @param height The height of the resulting bitmap, or 0 for "auto."
-     * @param path The folder in which to store the screenshot.
-     * @param callback May be called synchronously, or at a later point, to deliver the bitmap
-     *                 result (or a failure code).
-     */
-    void writeContentBitmapToDiskAsync(
-            int width, int height, String path, Callback<String> callback);
-
-    /**
      * Reloads all the Lo-Fi images in this WebContents.
      */
     void reloadLoFiImages();
diff --git a/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java b/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java
index ee65947..eb30357 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java
@@ -43,6 +43,7 @@
 import org.chromium.content.browser.GestureListenerManagerImpl;
 import org.chromium.content.browser.PopupController;
 import org.chromium.content.browser.RenderCoordinatesImpl;
+import org.chromium.content.browser.RenderWidgetHostViewImpl;
 import org.chromium.content.browser.webcontents.WebContentsImpl;
 import org.chromium.content_public.browser.SelectionClient;
 import org.chromium.content_public.browser.SelectionMetricsLogger;
@@ -70,6 +71,7 @@
     private ActionMode mActionMode;
     private PackageManager mPackageManager;
     private SmartSelectionMetricsLogger mLogger;
+    private RenderWidgetHostViewImpl mRenderWidgetHostViewImpl;
     private RenderCoordinatesImpl mRenderCoordinates;
     private ContentResolver mContentResolver;
     private PopupController mPopupController;
@@ -142,6 +144,7 @@
         mViewAndroidDelegate = ViewAndroidDelegate.createBasicDelegate(mView);
         mActionMode = Mockito.mock(ActionMode.class);
         mPackageManager = Mockito.mock(PackageManager.class);
+        mRenderWidgetHostViewImpl = Mockito.mock(RenderWidgetHostViewImpl.class);
         mRenderCoordinates = Mockito.mock(RenderCoordinatesImpl.class);
         mLogger = Mockito.mock(SmartSelectionMetricsLogger.class);
         mPopupController = Mockito.mock(PopupController.class);
@@ -160,6 +163,7 @@
 
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getContentResolver()).thenReturn(mContentResolver);
+        when(mWebContents.getRenderWidgetHostView()).thenReturn(mRenderWidgetHostViewImpl);
         when(mWebContents.getRenderCoordinates()).thenReturn(mRenderCoordinates);
         when(mRenderCoordinates.getDeviceScaleFactor()).thenReturn(1.f);
         when(mWebContents.getViewAndroidDelegate()).thenReturn(mViewAndroidDelegate);
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 60f3f67..1f02c6e3c 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -285,6 +285,10 @@
 const base::Feature kMojoVideoCaptureSecondary{
     "MojoVideoCaptureSecondary", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// When enable, iframe does not implicit capture mouse event.
+const base::Feature kMouseSubframeNoImplicitCapture{
+    "MouseSubframeNoImplicitCapture", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If the network service is enabled, runs it in process.
 const base::Feature kNetworkServiceInProcess {
   "NetworkServiceInProcess",
@@ -725,10 +729,6 @@
 const base::Feature kAndroidAutofillAccessibility{
     "AndroidAutofillAccessibility", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enables hiding incorrectly-sized frames while in fullscreen.
-const base::Feature kHideIncorrectlySizedFullscreenFrames{
-    "HideIncorrectlySizedFullscreenFrames", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Sets moderate binding to background renderers playing media, when enabled.
 // Else the renderer will have strong binding.
 const base::Feature kBackgroundMediaRendererHasModerateBinding{
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 93a5f858..3657df1 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -68,6 +68,7 @@
 CONTENT_EXPORT extern const base::Feature kMimeHandlerViewInCrossProcessFrame;
 CONTENT_EXPORT extern const base::Feature kMojoVideoCapture;
 CONTENT_EXPORT extern const base::Feature kMojoVideoCaptureSecondary;
+CONTENT_EXPORT extern const base::Feature kMouseSubframeNoImplicitCapture;
 CONTENT_EXPORT extern const base::Feature kNetworkQualityEstimatorWebHoldback;
 CONTENT_EXPORT extern const base::Feature kNetworkServiceInProcess;
 CONTENT_EXPORT extern const base::Feature kNotificationContentImage;
@@ -156,7 +157,6 @@
 CONTENT_EXPORT extern const base::Feature
     kBackgroundMediaRendererHasModerateBinding;
 CONTENT_EXPORT extern const base::Feature kForce60HzRefreshRate;
-CONTENT_EXPORT extern const base::Feature kHideIncorrectlySizedFullscreenFrames;
 CONTENT_EXPORT extern const base::Feature kWarmUpNetworkProcess;
 CONTENT_EXPORT extern const base::Feature kWebNfc;
 #endif  // defined(OS_ANDROID)
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
index 59d9426f..283a3c0 100644
--- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
+++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
@@ -8,14 +8,15 @@
 import android.graphics.Rect;
 import android.os.Handler;
 import android.os.Parcel;
+import android.support.annotation.Nullable;
 
-import org.chromium.base.Callback;
 import org.chromium.content_public.browser.AccessibilitySnapshotCallback;
 import org.chromium.content_public.browser.ImageDownloadCallback;
 import org.chromium.content_public.browser.JavaScriptCallback;
 import org.chromium.content_public.browser.MessagePort;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.RenderFrameHost;
+import org.chromium.content_public.browser.RenderWidgetHostView;
 import org.chromium.content_public.browser.ViewEventSink;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
@@ -84,6 +85,12 @@
     }
 
     @Override
+    @Nullable
+    public RenderWidgetHostView getRenderWidgetHostView() {
+        return null;
+    }
+
+    @Override
     public String getTitle() {
         return null;
     }
@@ -142,11 +149,6 @@
     }
 
     @Override
-    public boolean isReady() {
-        return false;
-    }
-
-    @Override
     public void exitFullscreen() {}
 
     @Override
@@ -232,10 +234,6 @@
     public void setSpatialNavigationDisabled(boolean disabled) {}
 
     @Override
-    public void writeContentBitmapToDiskAsync(
-            int width, int height, String path, Callback<String> callback) {}
-
-    @Override
     public void reloadLoFiImages() {}
 
     @Override
diff --git a/content/renderer/input/input_event_prediction.cc b/content/renderer/input/input_event_prediction.cc
index 2051ef2..944f4fb 100644
--- a/content/renderer/input/input_event_prediction.cc
+++ b/content/renderer/input/input_event_prediction.cc
@@ -26,6 +26,8 @@
 constexpr char kPredictor[] = "predictor";
 constexpr char kInputEventPredictorTypeLsq[] = "lsq";
 constexpr char kInputEventPredictorTypeEmpty[] = "empty";
+constexpr char kInputEventPredictorTypeKalmanTimeFiltered[] =
+    "kalman_time_filtered";
 
 constexpr uint32_t kPredictEventCount = 3;
 constexpr base::TimeDelta kPredictionInterval =
@@ -54,6 +56,8 @@
     selected_predictor_type_ = PredictorType::kLsq;
   else if (predictor_type == kInputEventPredictorTypeEmpty)
     selected_predictor_type_ = PredictorType::kEmpty;
+  else if (predictor_type == kInputEventPredictorTypeKalmanTimeFiltered)
+    selected_predictor_type_ = PredictorType::kKalmanTimeFiltered;
   else
     selected_predictor_type_ = PredictorType::kKalman;
 
@@ -107,7 +111,11 @@
     case PredictorType::kLsq:
       return std::make_unique<ui::LeastSquaresPredictor>();
     case PredictorType::kKalman:
-      return std::make_unique<ui::KalmanPredictor>();
+      return std::make_unique<ui::KalmanPredictor>(
+          false /* enable_time_filtering */);
+    case PredictorType::kKalmanTimeFiltered:
+      return std::make_unique<ui::KalmanPredictor>(
+          true /* enable_time_filtering */);
   }
 }
 
diff --git a/content/renderer/input/input_event_prediction.h b/content/renderer/input/input_event_prediction.h
index 2e75144..383650c 100644
--- a/content/renderer/input/input_event_prediction.h
+++ b/content/renderer/input/input_event_prediction.h
@@ -44,7 +44,7 @@
   FRIEND_TEST_ALL_PREFIXES(InputEventPredictionTest, PredictorType);
   FRIEND_TEST_ALL_PREFIXES(InputEventPredictionTest, ResamplingDisabled);
 
-  enum class PredictorType { kEmpty, kLsq, kKalman };
+  enum class PredictorType { kEmpty, kLsq, kKalman, kKalmanTimeFiltered };
 
   // Initialize selected_predictor_type_ from field trial parameters of
   // kResamplingInputEvent flag if resampling is enable. Otherwise set it
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 3b96460..55f2afe3 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -38,6 +38,8 @@
     "../browser/accessibility/accessibility_event_recorder_uia_win.cc",
     "../browser/accessibility/accessibility_event_recorder_uia_win.h",
     "../browser/accessibility/accessibility_event_recorder_win.cc",
+    "../browser/accessibility/dump_accessibility_test_helper.cc",
+    "../browser/accessibility/dump_accessibility_test_helper.h",
     "../browser/background_fetch/background_fetch_test_base.cc",
     "../browser/background_fetch/background_fetch_test_base.h",
     "../browser/background_fetch/background_fetch_test_browser_context.cc",
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-win.txt b/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
index d950ffe..bdd3285 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
@@ -1,3 +1,3 @@
 EVENT_OBJECT_SELECTIONWITHIN on role=ROLE_SYSTEM_LIST INVISIBLE SetSize=3
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Apple" INVISIBLE,FOCUSABLE,SELECTABLE PosInSet=1 SetSize=3
-EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP
+EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP SetSize=3
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
index d3e5cdf4..64feb950 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
@@ -2,4 +2,4 @@
 EVENT_OBJECT_SELECTIONWITHIN on role=ROLE_SYSTEM_LIST INVISIBLE SetSize=3
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Apple" INVISIBLE,FOCUSABLE,SELECTABLE PosInSet=1 SetSize=3
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Orange" SELECTED,FOCUSABLE,SELECTABLE PosInSet=2 SetSize=3
-EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX value="Orange" FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP
+EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX value="Orange" FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP SetSize=3
diff --git a/content/test/data/accessibility/event/menulist-focus-expected-win.txt b/content/test/data/accessibility/event/menulist-focus-expected-win.txt
index b7ae895..e56669f 100644
--- a/content/test/data/accessibility/event/menulist-focus-expected-win.txt
+++ b/content/test/data/accessibility/event/menulist-focus-expected-win.txt
@@ -1 +1 @@
-EVENT_OBJECT_FOCUS on <select> role=ROLE_SYSTEM_COMBOBOX value="Apple" FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP
+EVENT_OBJECT_FOCUS on <select> role=ROLE_SYSTEM_COMBOBOX value="Apple" FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP SetSize=3
diff --git a/content/test/data/accessibility/html/select-expected-auralinux.txt b/content/test/data/accessibility/html/select-expected-auralinux.txt
index 596ea75..fe283adf 100644
--- a/content/test/data/accessibility/html/select-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/select-expected-auralinux.txt
@@ -1,16 +1,16 @@
 [document web]
 ++[section]
-++++[combo box] expandable haspopup:menu
+++++[combo box] expandable haspopup:menu setsize:3
 ++++++[menu] setsize:3
 ++++++++[menu item] name='Placeholder option' selectable selected posinset:1 setsize:3
 ++++++++[menu item] name='Option 1' selectable posinset:2 setsize:3
 ++++++++[menu item] name='Option 2' selectable posinset:3 setsize:3
-++++[combo box] expandable haspopup:menu
+++++[combo box] expandable haspopup:menu setsize:3
 ++++++[menu] setsize:3
 ++++++++[menu item] name='Option 1' selectable posinset:1 setsize:3
 ++++++++[menu item] name='Option 2' selectable selected posinset:2 setsize:3
 ++++++++[menu item] name='Option 3' selectable posinset:3 setsize:3
-++++[combo box] expandable required haspopup:menu
+++++[combo box] expandable required haspopup:menu setsize:3
 ++++++[menu] setsize:3
 ++++++++[menu item] name='Option 1' selectable selected posinset:1 setsize:3
 ++++++++[menu item] name='Option 2' selectable posinset:2 setsize:3
diff --git a/content/test/data/accessibility/html/select-expected-blink.txt b/content/test/data/accessibility/html/select-expected-blink.txt
index 43677b6..a881ebd 100644
--- a/content/test/data/accessibility/html/select-expected-blink.txt
+++ b/content/test/data/accessibility/html/select-expected-blink.txt
@@ -1,16 +1,16 @@
 rootWebArea focusable
 ++genericContainer
-++++popUpButton collapsed focusable value='Placeholder option' haspopup=menu
+++++popUpButton collapsed focusable value='Placeholder option' setSize=3 haspopup=menu
 ++++++menuListPopup invisible setSize=3
 ++++++++menuListOption focusable name='Placeholder option' setSize=3 posInSet=1 selected=true
 ++++++++menuListOption focusable invisible name='Option 1' setSize=3 posInSet=2 selected=false
 ++++++++menuListOption focusable invisible name='Option 2' setSize=3 posInSet=3 selected=false
-++++popUpButton collapsed focusable value='Option 2' haspopup=menu
+++++popUpButton collapsed focusable value='Option 2' setSize=3 haspopup=menu
 ++++++menuListPopup invisible setSize=3
 ++++++++menuListOption focusable invisible name='Option 1' setSize=3 posInSet=1 selected=false
 ++++++++menuListOption focusable name='Option 2' setSize=3 posInSet=2 selected=true
 ++++++++menuListOption focusable invisible name='Option 3' setSize=3 posInSet=3 selected=false
-++++popUpButton collapsed focusable required value='Option 1' haspopup=menu
+++++popUpButton collapsed focusable required value='Option 1' setSize=3 haspopup=menu
 ++++++menuListPopup invisible setSize=3
 ++++++++menuListOption focusable name='Option 1' setSize=3 posInSet=1 selected=true
 ++++++++menuListOption focusable invisible name='Option 2' setSize=3 posInSet=2 selected=false
diff --git a/content/test/data/indexeddb/open_missing_table.js b/content/test/data/indexeddb/open_missing_table.js
index 1a1f4b9..ad76f1a 100644
--- a/content/test/data/indexeddb/open_missing_table.js
+++ b/content/test/data/indexeddb/open_missing_table.js
@@ -14,7 +14,8 @@
 function upgradeNeeded(evt) {
   event = evt;
   shouldBe("event.dataLoss", "'total'");
-  shouldBe("event.dataLossMessage", "'missing files'");
+  shouldBe("event.dataLossMessage",
+           "'IndexedDB (database was corrupt): missing files'");
   gotUpgradeNeeded = true;
 }
 
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc
index 7dbe8df..67176574 100644
--- a/device/fido/get_assertion_handler_unittest.cc
+++ b/device/fido/get_assertion_handler_unittest.cc
@@ -867,7 +867,7 @@
     scoped_fake_win_webauthn_api.set_available(enable_api);
 
     // Simulate a connected HID device.
-    ScopedFakeHidManager fake_hid_manager;
+    ScopedFakeFidoHidManager fake_hid_manager;
     fake_hid_manager.AddFidoHidDevice("guid");
 
     TestGetAssertionRequestCallback cb;
diff --git a/device/fido/hid/fake_hid_impl_for_testing.cc b/device/fido/hid/fake_hid_impl_for_testing.cc
index 7c9c255..f64f60a 100644
--- a/device/fido/hid/fake_hid_impl_for_testing.cc
+++ b/device/fido/hid/fake_hid_impl_for_testing.cc
@@ -86,21 +86,22 @@
           }));
 }
 
-bool FakeHidConnection::mock_connection_error_ = false;
+bool FakeFidoHidConnection::mock_connection_error_ = false;
 
-FakeHidConnection::FakeHidConnection(device::mojom::HidDeviceInfoPtr device)
+FakeFidoHidConnection::FakeFidoHidConnection(
+    device::mojom::HidDeviceInfoPtr device)
     : device_(std::move(device)) {}
 
-FakeHidConnection::~FakeHidConnection() = default;
+FakeFidoHidConnection::~FakeFidoHidConnection() = default;
 
-void FakeHidConnection::Read(ReadCallback callback) {
+void FakeFidoHidConnection::Read(ReadCallback callback) {
   std::vector<uint8_t> buffer = {'F', 'a', 'k', 'e', ' ', 'H', 'i', 'd'};
   std::move(callback).Run(true, 0, buffer);
 }
 
-void FakeHidConnection::Write(uint8_t report_id,
-                              const std::vector<uint8_t>& buffer,
-                              WriteCallback callback) {
+void FakeFidoHidConnection::Write(uint8_t report_id,
+                                  const std::vector<uint8_t>& buffer,
+                                  WriteCallback callback) {
   if (mock_connection_error_) {
     std::move(callback).Run(false);
     return;
@@ -109,31 +110,33 @@
   std::move(callback).Run(true);
 }
 
-void FakeHidConnection::GetFeatureReport(uint8_t report_id,
-                                         GetFeatureReportCallback callback) {
+void FakeFidoHidConnection::GetFeatureReport(
+    uint8_t report_id,
+    GetFeatureReportCallback callback) {
   NOTREACHED();
 }
 
-void FakeHidConnection::SendFeatureReport(uint8_t report_id,
-                                          const std::vector<uint8_t>& buffer,
-                                          SendFeatureReportCallback callback) {
+void FakeFidoHidConnection::SendFeatureReport(
+    uint8_t report_id,
+    const std::vector<uint8_t>& buffer,
+    SendFeatureReportCallback callback) {
   NOTREACHED();
 }
 
-FakeHidManager::FakeHidManager() = default;
+FakeFidoHidManager::FakeFidoHidManager() = default;
 
-FakeHidManager::~FakeHidManager() = default;
+FakeFidoHidManager::~FakeFidoHidManager() = default;
 
-void FakeHidManager::AddBinding(mojo::ScopedMessagePipeHandle handle) {
+void FakeFidoHidManager::AddBinding(mojo::ScopedMessagePipeHandle handle) {
   bindings_.AddBinding(this,
                        device::mojom::HidManagerRequest(std::move(handle)));
 }
 
-void FakeHidManager::AddBinding2(device::mojom::HidManagerRequest request) {
+void FakeFidoHidManager::AddBinding2(device::mojom::HidManagerRequest request) {
   bindings_.AddBinding(this, std::move(request));
 }
 
-void FakeHidManager::AddFidoHidDevice(std::string guid) {
+void FakeFidoHidManager::AddFidoHidDevice(std::string guid) {
   auto c_info = device::mojom::HidCollectionInfo::New();
   c_info->usage = device::mojom::HidUsageAndPage::New(1, 0xf1d0);
   auto device = device::mojom::HidDeviceInfo::New();
@@ -147,7 +150,7 @@
   AddDevice(std::move(device));
 }
 
-void FakeHidManager::GetDevicesAndSetClient(
+void FakeFidoHidManager::GetDevicesAndSetClient(
     device::mojom::HidManagerClientAssociatedPtrInfo client,
     GetDevicesCallback callback) {
   GetDevices(std::move(callback));
@@ -157,7 +160,7 @@
   clients_.AddPtr(std::move(client_ptr));
 }
 
-void FakeHidManager::GetDevices(GetDevicesCallback callback) {
+void FakeFidoHidManager::GetDevices(GetDevicesCallback callback) {
   std::vector<device::mojom::HidDeviceInfoPtr> device_list;
   for (auto& map_entry : devices_)
     device_list.push_back(map_entry.second->Clone());
@@ -165,9 +168,10 @@
   std::move(callback).Run(std::move(device_list));
 }
 
-void FakeHidManager::Connect(const std::string& device_guid,
-                             mojom::HidConnectionClientPtr connection_client,
-                             ConnectCallback callback) {
+void FakeFidoHidManager::Connect(
+    const std::string& device_guid,
+    mojom::HidConnectionClientPtr connection_client,
+    ConnectCallback callback) {
   auto device_it = devices_.find(device_guid);
   auto connection_it = connections_.find(device_guid);
   if (device_it == devices_.end() || connection_it == connections_.end()) {
@@ -178,7 +182,7 @@
   std::move(callback).Run(std::move(connection_it->second));
 }
 
-void FakeHidManager::AddDevice(device::mojom::HidDeviceInfoPtr device) {
+void FakeFidoHidManager::AddDevice(device::mojom::HidDeviceInfoPtr device) {
   device::mojom::HidDeviceInfo* device_info = device.get();
   clients_.ForAllPtrs([device_info](device::mojom::HidManagerClient* client) {
     client->DeviceAdded(device_info->Clone());
@@ -187,14 +191,14 @@
   devices_[device->guid] = std::move(device);
 }
 
-void FakeHidManager::AddDeviceAndSetConnection(
+void FakeFidoHidManager::AddDeviceAndSetConnection(
     device::mojom::HidDeviceInfoPtr device,
     device::mojom::HidConnectionPtr connection) {
   connections_[device->guid] = std::move(connection);
   AddDevice(std::move(device));
 }
 
-void FakeHidManager::RemoveDevice(const std::string device_guid) {
+void FakeFidoHidManager::RemoveDevice(const std::string device_guid) {
   auto it = devices_.find(device_guid);
   if (it == devices_.end())
     return;
@@ -206,15 +210,16 @@
   devices_.erase(it);
 }
 
-ScopedFakeHidManager::ScopedFakeHidManager() {
+ScopedFakeFidoHidManager::ScopedFakeFidoHidManager() {
   service_manager::mojom::ConnectorRequest request;
   connector_ = service_manager::Connector::Create(&request);
   connector_->OverrideBinderForTesting(
       service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
       device::mojom::HidManager::Name_,
-      base::BindRepeating(&FakeHidManager::AddBinding, base::Unretained(this)));
+      base::BindRepeating(&FakeFidoHidManager::AddBinding,
+                          base::Unretained(this)));
 }
 
-ScopedFakeHidManager::~ScopedFakeHidManager() = default;
+ScopedFakeFidoHidManager::~ScopedFakeFidoHidManager() = default;
 
 }  // namespace device
diff --git a/device/fido/hid/fake_hid_impl_for_testing.h b/device/fido/hid/fake_hid_impl_for_testing.h
index 45499654..108800c 100644
--- a/device/fido/hid/fake_hid_impl_for_testing.h
+++ b/device/fido/hid/fake_hid_impl_for_testing.h
@@ -69,11 +69,11 @@
   DISALLOW_COPY_AND_ASSIGN(MockFidoHidConnection);
 };
 
-class FakeHidConnection : public device::mojom::HidConnection {
+class FakeFidoHidConnection : public device::mojom::HidConnection {
  public:
-  explicit FakeHidConnection(device::mojom::HidDeviceInfoPtr device);
+  explicit FakeFidoHidConnection(device::mojom::HidDeviceInfoPtr device);
 
-  ~FakeHidConnection() override;
+  ~FakeFidoHidConnection() override;
 
   // device::mojom::HidConnection implemenation:
   void Read(ReadCallback callback) override;
@@ -91,13 +91,13 @@
  private:
   device::mojom::HidDeviceInfoPtr device_;
 
-  DISALLOW_COPY_AND_ASSIGN(FakeHidConnection);
+  DISALLOW_COPY_AND_ASSIGN(FakeFidoHidConnection);
 };
 
-class FakeHidManager : public device::mojom::HidManager {
+class FakeFidoHidManager : public device::mojom::HidManager {
  public:
-  FakeHidManager();
-  ~FakeHidManager() override;
+  FakeFidoHidManager();
+  ~FakeFidoHidManager() override;
 
   // Invoke AddDevice with a device info struct that mirrors a FIDO USB device.
   void AddFidoHidDevice(std::string guid);
@@ -123,15 +123,15 @@
   mojo::AssociatedInterfacePtrSet<device::mojom::HidManagerClient> clients_;
   mojo::BindingSet<device::mojom::HidManager> bindings_;
 
-  DISALLOW_COPY_AND_ASSIGN(FakeHidManager);
+  DISALLOW_COPY_AND_ASSIGN(FakeFidoHidManager);
 };
 
-// ScopedFakeHidManager automatically binds itself to the device service for the
-// duration of its lifetime.
-class ScopedFakeHidManager : public FakeHidManager {
+// ScopedFakeFidoHidManager automatically binds itself to the device service for
+// the duration of its lifetime.
+class ScopedFakeFidoHidManager : public FakeFidoHidManager {
  public:
-  ScopedFakeHidManager();
-  ~ScopedFakeHidManager() override;
+  ScopedFakeFidoHidManager();
+  ~ScopedFakeFidoHidManager() override;
 
   service_manager::Connector* service_manager_connector() {
     return connector_.get();
@@ -140,7 +140,7 @@
  private:
   std::unique_ptr<service_manager::Connector> connector_;
 
-  DISALLOW_COPY_AND_ASSIGN(ScopedFakeHidManager);
+  DISALLOW_COPY_AND_ASSIGN(ScopedFakeFidoHidManager);
 };
 
 }  // namespace device
diff --git a/device/fido/hid/fido_hid_device_unittest.cc b/device/fido/hid/fido_hid_device_unittest.cc
index 39fe23a..19ba1f4 100644
--- a/device/fido/hid/fido_hid_device_unittest.cc
+++ b/device/fido/hid/fido_hid_device_unittest.cc
@@ -118,7 +118,7 @@
 
 std::unique_ptr<MockFidoHidConnection>
 CreateHidConnectionWithHidInitExpectations(base::span<const uint8_t> channel_id,
-                                           FakeHidManager* fake_hid_manager,
+                                           FakeFidoHidManager* fake_hid_manager,
                                            ::testing::Sequence sequence) {
   auto hid_device = TestHidDevice();
   device::mojom::HidConnectionPtr connection_client;
@@ -185,7 +185,7 @@
 class FidoHidDeviceTest : public ::testing::Test {
  public:
   void SetUp() override {
-    fake_hid_manager_ = std::make_unique<FakeHidManager>();
+    fake_hid_manager_ = std::make_unique<FakeFidoHidManager>();
     fake_hid_manager_->AddBinding2(mojo::MakeRequest(&hid_manager_));
   }
 
@@ -193,7 +193,7 @@
   base::test::ScopedTaskEnvironment scoped_task_environment_{
       base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME};
   device::mojom::HidManagerPtr hid_manager_;
-  std::unique_ptr<FakeHidManager> fake_hid_manager_;
+  std::unique_ptr<FakeFidoHidManager> fake_hid_manager_;
 };
 
 TEST_F(FidoHidDeviceTest, TestDeviceError) {
@@ -212,7 +212,7 @@
   auto& device = u2f_devices.front();
 
   // Mock connection where writes always fail.
-  FakeHidConnection::mock_connection_error_ = true;
+  FakeFidoHidConnection::mock_connection_error_ = true;
 
   TestDeviceCallbackReceiver receiver_0;
   device->DeviceTransact(GetMockDeviceRequest(), receiver_0.callback());
@@ -229,7 +229,7 @@
                                              receiver_2.callback(), 0);
   TestDeviceCallbackReceiver receiver_3;
   device->DeviceTransact(GetMockDeviceRequest(), receiver_3.callback());
-  FakeHidConnection::mock_connection_error_ = false;
+  FakeFidoHidConnection::mock_connection_error_ = false;
 
   EXPECT_EQ(FidoDevice::State::kDeviceError, device->state_);
   EXPECT_FALSE(receiver_1.value());
diff --git a/device/fido/hid/fido_hid_discovery_unittest.cc b/device/fido/hid/fido_hid_discovery_unittest.cc
index 345e1ad..4b2a46a 100644
--- a/device/fido/hid/fido_hid_discovery_unittest.cc
+++ b/device/fido/hid/fido_hid_discovery_unittest.cc
@@ -43,7 +43,7 @@
 class FidoHidDiscoveryTest : public ::testing::Test {
  protected:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
-  ScopedFakeHidManager fake_hid_manager_;
+  ScopedFakeFidoHidManager fake_hid_manager_;
 };
 
 TEST_F(FidoHidDiscoveryTest, TestAddRemoveDevice) {
diff --git a/docs/android_dynamic_feature_modules.md b/docs/android_dynamic_feature_modules.md
index 89481fee2..4096ef3 100644
--- a/docs/android_dynamic_feature_modules.md
+++ b/docs/android_dynamic_feature_modules.md
@@ -51,8 +51,7 @@
 ```xml
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:dist="http://schemas.android.com/apk/distribution"
-    featureSplit="foo"
-    package="{{manifest_package}}">
+    featureSplit="foo">
 
     <!-- dist:onDemand="true" makes this a separately installed module.
          dist:onDemand="false" would always install the module alongside the
@@ -98,17 +97,6 @@
 import("//chrome/android/features/dynamic_feature_modules.gni")
 
 template("foo_module_tmpl") {
-  _manifest = "$target_gen_dir/$target_name/AndroidManifest.xml"
-  _manifest_target = "${target_name}__manifest"
-  jinja_template(_manifest_target) {
-    input = "//chrome/android/features/foo/java/AndroidManifest.xml"
-    output = _manifest
-    variables = [
-      "target_sdk_version=$android_sdk_version",
-      "manifest_package=${invoker.manifest_package}",
-    ]
-  }
-
   android_app_bundle_module(target_name) {
     forward_variables_from(invoker,
                            [
@@ -118,8 +106,9 @@
                              "version_code",
                              "version_name",
                            ])
-    android_manifest = _manifest
-    android_manifest_dep = ":${_manifest_target}"
+    android_manifest = "//chrome/android/features/foo/java/AndroidManifest.xml"
+    min_sdk_version = 21
+    target_sdk_version = android_sdk_version
     proguard_enabled = !is_java_debug
     aapt_locale_whitelist = locales
     package_name = "foo"
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 84c2a1a..9f6c9fef 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -2021,9 +2021,9 @@
     }
 
     if (request->is_web_view) {
-      // If this is a PlzNavigate request, then we can skip this check. IDs will
+      // If this is a navigation request, then we can skip this check. IDs will
       // be -1 and the request is trusted.
-      if (!request->is_browser_side_navigation &&
+      if (!request->is_navigation_request &&
           (listener->id.render_process_id !=
            request->web_view_embedder_process_id)) {
         continue;
diff --git a/extensions/browser/api/web_request/web_request_info.cc b/extensions/browser/api/web_request/web_request_info.cc
index 7e1bb92e..c6aae01 100644
--- a/extensions/browser/api/web_request/web_request_info.cc
+++ b/extensions/browser/api/web_request/web_request_info.cc
@@ -170,7 +170,7 @@
       routing_id(routing_id),
       frame_id(render_frame_id),
       method(request.method),
-      is_browser_side_navigation(!!navigation_ui_data),
+      is_navigation_request(!!navigation_ui_data),
       initiator(request.request_initiator),
       type(static_cast<content::ResourceType>(request.resource_type)),
       is_async(is_async),
@@ -236,7 +236,7 @@
       routing_id(params.routing_id),
       frame_id(params.frame_id),
       method(std::move(params.method)),
-      is_browser_side_navigation(params.is_browser_side_navigation),
+      is_navigation_request(params.is_navigation_request),
       initiator(std::move(params.initiator)),
       frame_data(std::move(params.frame_data)),
       type(params.type),
diff --git a/extensions/browser/api/web_request/web_request_info.h b/extensions/browser/api/web_request/web_request_info.h
index 925445b..949e5717 100644
--- a/extensions/browser/api/web_request/web_request_info.h
+++ b/extensions/browser/api/web_request/web_request_info.h
@@ -65,7 +65,7 @@
   int routing_id = MSG_ROUTING_NONE;
   int frame_id = -1;
   std::string method;
-  bool is_browser_side_navigation = false;
+  bool is_navigation_request = false;
   base::Optional<url::Origin> initiator;
   base::Optional<content::ResourceType> type;
   WebRequestResourceType web_request_type = WebRequestResourceType::OTHER;
@@ -119,7 +119,7 @@
   const std::string method;
 
   // Indicates whether the request is for a browser-side navigation.
-  const bool is_browser_side_navigation;
+  const bool is_navigation_request;
 
   // The origin of the context which initiated the request. May be null for
   // browser-initiated requests such as navigations.
diff --git a/extensions/browser/api/web_request/web_request_permissions.cc b/extensions/browser/api/web_request/web_request_permissions.cc
index c7a6f32..afcbdacb 100644
--- a/extensions/browser/api/web_request/web_request_permissions.cc
+++ b/extensions/browser/api/web_request/web_request_permissions.cc
@@ -249,7 +249,7 @@
 
   if (is_request_from_browser) {
     // Hide all non-navigation requests made by the browser. crbug.com/884932.
-    if (!request.is_browser_side_navigation &&
+    if (!request.is_navigation_request &&
         request.type != content::ResourceType::kNavigationPreload) {
       return true;
     }
diff --git a/extensions/browser/api/web_request/web_request_permissions_unittest.cc b/extensions/browser/api/web_request/web_request_permissions_unittest.cc
index b42112ba..8c757dd 100644
--- a/extensions/browser/api/web_request/web_request_permissions_unittest.cc
+++ b/extensions/browser/api/web_request/web_request_permissions_unittest.cc
@@ -113,9 +113,8 @@
     request.render_process_id = render_process_id;
 
     request.web_request_type = ToWebRequestResourceType(type);
-    request.is_browser_side_navigation =
-        type == content::ResourceType::kMainFrame ||
-        type == content::ResourceType::kSubFrame;
+    request.is_navigation_request = type == content::ResourceType::kMainFrame ||
+                                    type == content::ResourceType::kSubFrame;
     return request;
   };
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 5437d7b..a0fbdb50 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -76,7 +76,7 @@
 <translation id="1923342640370224680">Den seneste time</translation>
 <translation id="1941314575388338491">Tryk to gange for at kopiere.</translation>
 <translation id="1952172573699511566">Websites viser tekst på dit foretrukne sprog, når det er muligt.</translation>
-<translation id="1952728750904661634">Log ind med en administreret konto</translation>
+<translation id="1952728750904661634">Log ind med en mangerstyret konto</translation>
 <translation id="1974060860693918893">Avanceret</translation>
 <translation id="1989112275319619282">Gennemse</translation>
 <translation id="2015722694326466240">Angiv en adgangskode på din enhed, før du kan se adgangskoder.</translation>
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index ef849a3..df8e0304 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -273,24 +273,6 @@
       assertWithMatcher:grey_notNil()];
 }
 
-// Tests that the element fetch duration is logged once.
-- (void)testContextMenuElementFetchDurationMetric {
-  chrome_test_util::HistogramTester histogramTester;
-
-  const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText];
-
-  LongPressElement(kLogoPageChromiumImageId);
-  TapOnContextMenuButton(OpenImageButton());
-  [ChromeEarlGrey waitForPageToFinishLoading];
-
-  histogramTester.ExpectTotalCount("ContextMenu.DOMElementFetchDuration", 1,
-                                   ^(NSString* error) {
-                                     GREYFail(error);
-                                   });
-}
-
 // Tests that system touches are cancelled when the context menu is shown.
 - (void)testContextMenuCancelSystemTouchesMetric {
   chrome_test_util::HistogramTester histogramTester;
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
index d6cc4e4..8719ceb 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
@@ -27,14 +27,18 @@
   static void CreateForWebState(web::WebState* web_state);
   // Sets the InfobarBadgeTabHelperDelegate to |delegate|.
   void SetDelegate(id<InfobarBadgeTabHelperDelegate> delegate);
-  // Updates Infobar badge for the case where an InfobarBanner was dismissed.
-  void UpdateBadgeForInfobarBannerDismissed();
-  // Updates Infobar badge for the case where an InfobarModal was presented.
-  void UpdateBadgeForInfobarModalPresented();
-  // Updates Infobar badge for the case where an InfobarModal was dismissed.
-  void UpdateBadgeForInfobarModalDismissed();
-  // Updates Infobar badge for the case where an Infobar was accepted.
-  void UpdateBadgeForInfobarAccepted();
+  // Updates Infobar badge for the case where an Infobar banner of |infobarType|
+  // was dismissed.
+  void UpdateBadgeForInfobarBannerDismissed(InfobarType infobarType);
+  // Updates Infobar badge for the case where an Infobar modal of |infobarType|
+  // was presented.
+  void UpdateBadgeForInfobarModalPresented(InfobarType infobarType);
+  // Updates Infobar badge for the case where an Infobar modal of |infobarType|
+  // was dismissed.
+  void UpdateBadgeForInfobarModalDismissed(InfobarType infobarType);
+  // Updates Infobar badge for the case where Infobar of |infobarType| was
+  // accepted.
+  void UpdateBadgeForInfobarAccepted(InfobarType infobarType);
 
   // Returns wheter an Infobar badge is being displayed for the TabHelper
   // Webstate.
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
index 73b5511..eb3bb742 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
@@ -31,19 +31,23 @@
   delegate_ = delegate;
 }
 
-void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed() {
+void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed(
+    InfobarType infobarType) {
   delegate_.badgeState &= ~InfobarBadgeStateSelected;
 }
 
-void InfobarBadgeTabHelper::UpdateBadgeForInfobarModalPresented() {
+void InfobarBadgeTabHelper::UpdateBadgeForInfobarModalPresented(
+    InfobarType infobarType) {
   delegate_.badgeState |= InfobarBadgeStateSelected;
 }
 
-void InfobarBadgeTabHelper::UpdateBadgeForInfobarModalDismissed() {
+void InfobarBadgeTabHelper::UpdateBadgeForInfobarModalDismissed(
+    InfobarType infobarType) {
   delegate_.badgeState &= ~InfobarBadgeStateSelected;
 }
 
-void InfobarBadgeTabHelper::UpdateBadgeForInfobarAccepted() {
+void InfobarBadgeTabHelper::UpdateBadgeForInfobarAccepted(
+    InfobarType infobarType) {
   delegate_.badgeState |= InfobarBadgeStateAccepted;
   is_badge_accepted_ = true;
 }
@@ -98,7 +102,7 @@
                                                   bool display) {
   InfoBarIOS* infobar_ios = static_cast<InfoBarIOS*>(infobar);
   id<InfobarUIDelegate> controller_ = infobar_ios->InfobarUIDelegate();
-  if (IsInfobarUIRebootEnabled() && [controller_ isPresented]) {
+  if (IsInfobarUIRebootEnabled() && controller_.hasBadge) {
     is_infobar_displaying_ = display;
     infobar_type_ = controller_.infobarType;
     [delegate_ displayBadge:display type:infobar_type_];
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm b/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm
index 3f2f3369..4f0eb18a 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper_unittest.mm
@@ -51,17 +51,17 @@
 @end
 
 @implementation InfobarBadgeUITestDelegate
-- (void)infobarBannerWasDismissed {
-  self.infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed();
+- (void)infobarBannerWasDismissed:(InfobarType)infobarType {
+  self.infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed(infobarType);
 }
-- (void)infobarModalWasPresented {
-  self.infobarBadgeTabHelper->UpdateBadgeForInfobarModalPresented();
+- (void)infobarModalWasPresented:(InfobarType)infobarType {
+  self.infobarBadgeTabHelper->UpdateBadgeForInfobarModalPresented(infobarType);
 }
-- (void)infobarModalWillDismiss {
-  self.infobarBadgeTabHelper->UpdateBadgeForInfobarModalDismissed();
+- (void)infobarModalWillDismiss:(InfobarType)infobarType {
+  self.infobarBadgeTabHelper->UpdateBadgeForInfobarModalDismissed(infobarType);
 }
-- (void)infobarWasAccepted {
-  self.infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted();
+- (void)infobarWasAccepted:(InfobarType)infobarType {
+  self.infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted(infobarType);
 }
 @end
 
@@ -202,19 +202,23 @@
 // Test each UpdateBadge public method individually.
 TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeStates) {
   // Test that dismissing the Banner unselects the badge.
-  tab_helper()->UpdateBadgeForInfobarBannerDismissed();
+  tab_helper()->UpdateBadgeForInfobarBannerDismissed(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_FALSE(infobar_badge_tab_delegate_.badgeState &
                InfobarBadgeStateSelected);
   // Test that dismissing the Modal unselects the badge.
-  tab_helper()->UpdateBadgeForInfobarModalDismissed();
+  tab_helper()->UpdateBadgeForInfobarModalDismissed(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_FALSE(infobar_badge_tab_delegate_.badgeState &
                InfobarBadgeStateSelected);
   // Test that presenting the Modal selects the badge.
-  tab_helper()->UpdateBadgeForInfobarModalPresented();
+  tab_helper()->UpdateBadgeForInfobarModalPresented(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateSelected);
   // Test that accepting the Infobar sets the badge to accepted state.
-  tab_helper()->UpdateBadgeForInfobarAccepted();
+  tab_helper()->UpdateBadgeForInfobarAccepted(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateAccepted);
 }
@@ -223,17 +227,20 @@
 // accepted state.
 TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeAcceptedState) {
   // Accept the Infobar.
-  tab_helper()->UpdateBadgeForInfobarAccepted();
+  tab_helper()->UpdateBadgeForInfobarAccepted(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateAccepted);
   // Test badge is still "accepted" after Modal presentation.
-  tab_helper()->UpdateBadgeForInfobarModalPresented();
+  tab_helper()->UpdateBadgeForInfobarModalPresented(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateAccepted);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateSelected);
   // Test badge is still "accepted" after Modal dismissal.
-  tab_helper()->UpdateBadgeForInfobarModalDismissed();
+  tab_helper()->UpdateBadgeForInfobarModalDismissed(
+      InfobarType::kInfobarTypePasswordSave);
   EXPECT_TRUE(infobar_badge_tab_delegate_.badgeState &
               InfobarBadgeStateAccepted);
   EXPECT_FALSE(infobar_badge_tab_delegate_.badgeState &
@@ -284,7 +291,8 @@
 TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerAccepted) {
   EXPECT_FALSE(infobar_badge_tab_delegate_.badgeState &
                InfobarBadgeStateAccepted);
-  tab_helper()->UpdateBadgeForInfobarAccepted();
+  tab_helper()->UpdateBadgeForInfobarAccepted(
+      InfobarType::kInfobarTypePasswordSave);
   [infobar_container_coordinator_ dismissBanner];
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
diff --git a/ios/chrome/browser/infobars/infobar_controller.mm b/ios/chrome/browser/infobars/infobar_controller.mm
index f0549c34..9125345 100644
--- a/ios/chrome/browser/infobars/infobar_controller.mm
+++ b/ios/chrome/browser/infobars/infobar_controller.mm
@@ -23,6 +23,7 @@
 @synthesize infoBarDelegate = _infoBarDelegate;
 @synthesize infobarType = _infobarType;
 @synthesize presented = _presented;
+@synthesize hasBadge = _hasBadge;
 
 #pragma mark - Public
 
@@ -32,6 +33,7 @@
   if (self) {
     _infoBarDelegate = infoBarDelegate;
     _presented = NO;
+    _hasBadge = NO;
   }
   return self;
 }
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 532e3d8..9623fe2 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1143,6 +1143,14 @@
 }
 
 - (void)userEnteredTabSwitcher {
+  // TODO(crbug.com/977761): In preparation for dismissing BVC, make sure any
+  // ongoing ViewController presentations are stopped.
+  if (IsInfobarUIRebootEnabled() &&
+      (self.infobarContainerCoordinator.infobarBannerState !=
+       InfobarBannerPresentationState::NotPresented)) {
+    [self.infobarContainerCoordinator dismissInfobarBannerAnimated:NO
+                                                        completion:nil];
+  }
   [self.bubblePresenter userEnteredTabSwitcher];
 }
 
@@ -1648,7 +1656,8 @@
   // TODO(crbug.com/976411):This should probably move to the BannerVC once/if
   // the dismiss event from BVC is observable.
   if (IsInfobarUIRebootEnabled() &&
-      [self.infobarContainerCoordinator isPresentingInfobarBanner]) {
+      (self.infobarContainerCoordinator.infobarBannerState !=
+       InfobarBannerPresentationState::NotPresented)) {
     [self.infobarContainerCoordinator dismissInfobarBannerAnimated:NO
                                                         completion:nil];
   }
@@ -1890,7 +1899,8 @@
   // presented. Dismiss it in case the user or system has triggered another
   // presentation.
   if (IsInfobarUIRebootEnabled() &&
-      [self.infobarContainerCoordinator isPresentingInfobarBanner]) {
+      (self.infobarContainerCoordinator.infobarBannerState !=
+       InfobarBannerPresentationState::NotPresented)) {
     [self.infobarContainerCoordinator
         dismissInfobarBannerAnimated:NO
                           completion:^{
@@ -3404,7 +3414,8 @@
   // controller that allows interaction with the rest of the App while its being
   // presented. Dismiss it in case the user or system has triggered repost form.
   if (IsInfobarUIRebootEnabled() &&
-      [self.infobarContainerCoordinator isPresentingInfobarBanner]) {
+      (self.infobarContainerCoordinator.infobarBannerState !=
+       InfobarBannerPresentationState::NotPresented)) {
     [self.infobarContainerCoordinator
         dismissInfobarBannerAnimated:NO
                           completion:presentDialog];
diff --git a/ios/chrome/browser/ui/infobars/BUILD.gn b/ios/chrome/browser/ui/infobars/BUILD.gn
index a304aee..18d799c 100644
--- a/ios/chrome/browser/ui/infobars/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/BUILD.gn
@@ -21,6 +21,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/fullscreen",
+    "//ios/chrome/browser/ui/infobars/banners:public",
     "//ios/chrome/browser/ui/infobars/coordinators",
     "//ios/chrome/browser/upgrade",
     "//ios/chrome/browser/web:tab_id_tab_helper",
diff --git a/ios/chrome/browser/ui/infobars/banners/BUILD.gn b/ios/chrome/browser/ui/infobars/banners/BUILD.gn
index f049edf..c5df288e 100644
--- a/ios/chrome/browser/ui/infobars/banners/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/banners/BUILD.gn
@@ -25,6 +25,7 @@
     "infobar_banner_constants.h",
     "infobar_banner_constants.mm",
     "infobar_banner_interaction_delegate.h",
+    "infobar_banner_presentation_state.h",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_presentation_state.h b/ios/chrome/browser/ui/infobars/banners/infobar_banner_presentation_state.h
new file mode 100644
index 0000000..6fab0be9
--- /dev/null
+++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_presentation_state.h
@@ -0,0 +1,22 @@
+// 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.
+
+#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_BANNERS_INFOBAR_BANNER_PRESENTATION_STATE_H_
+#define IOS_CHROME_BROWSER_UI_INFOBARS_BANNERS_INFOBAR_BANNER_PRESENTATION_STATE_H_
+
+// Presentation states for InfobarBanner.
+enum class InfobarBannerPresentationState {
+  // The InfobarBanner is not presented and is not part of the view hierarchy.
+  NotPresented = 0,
+  // The InfobarBanner presentation is taking place. e.g. The presentation
+  // is being animated and hasn't completed yet, this means that the banner is
+  // interactable but not part of the view hierarcy yet.
+  IsAnimating = 1,
+  // The InfobarBanner is currently presented. e.g. The presentation has
+  // finished and the InfobarBanner is now presented and part of the
+  // view hierarchy.
+  Presented = 2,
+};
+
+#endif  // IOS_CHROME_BROWSER_UI_INFOBARS_BANNERS_INFOBAR_BANNER_PRESENTATION_STATE_H_
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
index 58c946f8..7138858 100644
--- a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
@@ -276,6 +276,7 @@
 #pragma mark - Private Methods
 
 - (void)bannerInfobarButtonWasPressed:(UIButton*)sender {
+  [self.interactionDelegate infobarBannerStartedInteraction];
   [self.metricsRecorder recordBannerEvent:MobileMessagesBannerEvent::Accepted];
   [self.delegate bannerInfobarButtonWasPressed:sender];
 }
@@ -388,6 +389,7 @@
 // Animate the Banner being tapped by scaling it down and then to its original
 // state. After the animation it presentd the Infobar Modal.
 - (void)animateBannerTappedAndPresentModal {
+  [self.interactionDelegate infobarBannerStartedInteraction];
   [UIView animateWithDuration:kTappedBannerAnimationDurationInSeconds
       animations:^{
         self.view.superview.transform = CGAffineTransformMakeScale(
diff --git a/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn b/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
index 8aa5501..dcd02ea7 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
@@ -27,6 +27,7 @@
     "//ios/chrome/browser/ui/infobars:infobars_ui",
     "//ios/chrome/browser/ui/infobars:public",
     "//ios/chrome/browser/ui/infobars/banners",
+    "//ios/chrome/browser/ui/infobars/banners:public",
     "//ios/chrome/browser/ui/infobars/modals",
     "//ios/chrome/browser/ui/infobars/presentation",
     "//ios/chrome/browser/ui/table_view",
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
index de425da..a6417a8 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
@@ -28,6 +28,8 @@
 class InfoBarDelegate;
 }
 
+enum class InfobarBannerPresentationState;
+
 // Must be subclassed. Defines common behavior for all Infobars.
 @interface InfobarCoordinator : ChromeCoordinator <InfobarUIDelegate,
                                                    InfobarBannerDelegate,
@@ -91,9 +93,8 @@
 // The InfobarContainer for this InfobarCoordinator.
 @property(nonatomic, weak) id<InfobarContainer> infobarContainer;
 
-// YES if an InfobarBanner is being presented.
-@property(nonatomic, assign, getter=isPresentingInfobarBanner)
-    BOOL presentingInfobarBanner;
+// The InfobarBanner presentation state.
+@property(nonatomic, assign) InfobarBannerPresentationState infobarBannerState;
 
 // YES if the banner has ever been presented for this Coordinator.
 @property(nonatomic, assign, readonly) BOOL bannerWasPresented;
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
index bb95d990..dcbe446 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -7,6 +7,7 @@
 #include "base/mac/foundation_util.h"
 #import "ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_factory.h"
+#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_presentation_state.h"
 #import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h"
 #import "ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h"
 #import "ios/chrome/browser/ui/infobars/presentation/infobar_banner_positioner.h"
@@ -57,6 +58,8 @@
 // Property defined in InfobarUIDelegate.
 @synthesize delegate = _delegate;
 // Property defined in InfobarUIDelegate.
+@synthesize hasBadge = _hasBadge;
+// Property defined in InfobarUIDelegate.
 @synthesize infobarType = _infobarType;
 // Property defined in InfobarUIDelegate.
 @synthesize presented = _presented;
@@ -68,6 +71,7 @@
   if (self) {
     _infobarDelegate = infoBarDelegate;
     _presented = YES;
+    _hasBadge = YES;
     _infobarType = infobarType;
   }
   return self;
@@ -81,6 +85,12 @@
   DCHECK(self.baseViewController);
   DCHECK(self.bannerViewController);
 
+  // If |self.baseViewController| is not part of the ViewHierarchy the banner
+  // shouldn't be presented.
+  if (!self.baseViewController.view.window) {
+    return;
+  }
+
   // Make sure to display the Toolbar/s before presenting the Banner.
   animatedFullscreenDisabler_ =
       std::make_unique<AnimatedScopedFullscreenDisabler>(
@@ -101,6 +111,7 @@
     interactableBanner.interactionDelegate = self.bannerTransitionDriver;
   }
 
+  self.infobarBannerState = InfobarBannerPresentationState::IsAnimating;
   __weak __typeof(self) weakSelf = self;
   [self.baseViewController
       presentViewController:self.bannerViewController
@@ -110,8 +121,9 @@
                        configureAccessibilityForBannerInViewController:
                            weakSelf.baseViewController
                                                             presenting:YES];
-                   weakSelf.presentingInfobarBanner = YES;
                    weakSelf.bannerWasPresented = YES;
+                   weakSelf.infobarBannerState =
+                       InfobarBannerPresentationState::Presented;
                    [weakSelf infobarBannerWasPresented];
                    if (completion)
                      completion();
@@ -120,7 +132,8 @@
 
 - (void)presentInfobarModal {
   ProceduralBlock modalPresentation = ^{
-    DCHECK(!self.bannerViewController);
+    DCHECK(self.infobarBannerState !=
+           InfobarBannerPresentationState::Presented);
     DCHECK(self.baseViewController);
     self.modalTransitionDriver = [[InfobarModalTransitionDriver alloc]
         initWithTransitionMode:InfobarModalTransitionBase];
@@ -131,7 +144,9 @@
   };
 
   // Dismiss InfobarBanner first if being presented.
-  if (self.baseViewController.presentedViewController) {
+  if (self.baseViewController.presentedViewController &&
+      self.baseViewController.presentedViewController ==
+          self.bannerViewController) {
     [self dismissInfobarBanner:self animated:NO completion:modalPresentation];
   } else {
     modalPresentation();
@@ -166,7 +181,7 @@
 
 - (void)bannerInfobarButtonWasPressed:(id)sender {
   [self performInfobarAction];
-  [self.badgeDelegate infobarWasAccepted];
+  [self.badgeDelegate infobarWasAccepted:self.infobarType];
   [self dismissInfobarBanner:sender animated:YES completion:nil];
 }
 
@@ -187,8 +202,9 @@
   // Make sure the banner is completely presented before trying to dismiss it.
   [self.bannerTransitionDriver completePresentationTransitionIfRunning];
 
-  if (self.baseViewController.presentedViewController ==
-      self.bannerViewController) {
+  if (self.baseViewController.presentedViewController &&
+      self.baseViewController.presentedViewController ==
+          self.bannerViewController) {
     [self.baseViewController
         dismissViewControllerAnimated:animated
                            completion:^{
@@ -202,10 +218,10 @@
 }
 
 - (void)infobarBannerWasDismissed {
-  self.presentingInfobarBanner = NO;
+  self.infobarBannerState = InfobarBannerPresentationState::NotPresented;
   [self configureAccessibilityForBannerInViewController:self.baseViewController
                                              presenting:NO];
-  [self.badgeDelegate infobarBannerWasDismissed];
+  [self.badgeDelegate infobarBannerWasDismissed:self.infobarType];
   self.bannerTransitionDriver = nil;
   animatedFullscreenDisabler_ = nullptr;
   [self infobarWasDismissed];
@@ -244,7 +260,7 @@
 
 - (void)modalInfobarButtonWasAccepted:(id)sender {
   [self performInfobarAction];
-  [self.badgeDelegate infobarWasAccepted];
+  [self.badgeDelegate infobarWasAccepted:self.infobarType];
   [self dismissInfobarModal:sender animated:YES completion:nil];
 }
 
@@ -254,7 +270,7 @@
   DCHECK(self.baseViewController);
   if (self.baseViewController.presentedViewController) {
     // Deselect infobar badge in parallel with modal dismissal.
-    [self.badgeDelegate infobarModalWillDismiss];
+    [self.badgeDelegate infobarModalWillDismiss:self.infobarType];
     __weak __typeof(self) weakSelf = self;
 
     // If the Modal is being presented by the Banner, call dismiss on it.
@@ -285,14 +301,14 @@
   // infobarModalWillDismiss call is needed, because sometimes the
   // baseViewController will dismiss the modal without going through the
   // coordinator.
-  [self.badgeDelegate infobarModalWillDismiss];
+  [self.badgeDelegate infobarModalWillDismiss:self.infobarType];
   self.modalTransitionDriver = nil;
 
   // If InfobarBanner is being presented it means that this Modal was presented
   // by an InfobarBanner. If this is the case InfobarBanner will call
   // infobarWasDismissed and clean up once it gets dismissed, this prevents
   // counting the dismissal metrics twice.
-  if (!self.presentingInfobarBanner)
+  if (self.infobarBannerState != InfobarBannerPresentationState::Presented)
     [self infobarWasDismissed];
 }
 
@@ -346,7 +362,7 @@
   [presentingViewController presentViewController:navController
                                          animated:YES
                                        completion:nil];
-  [self.badgeDelegate infobarModalWasPresented];
+  [self.badgeDelegate infobarModalWasPresented:self.infobarType];
 }
 
 // Configures the Banner Accessibility in order to give VoiceOver users the
diff --git a/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h b/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h
index 352c36f..553d369 100644
--- a/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h
+++ b/ios/chrome/browser/ui/infobars/infobar_badge_ui_delegate.h
@@ -7,21 +7,24 @@
 
 #import <UIKit/UIKit.h>
 
+enum class InfobarType;
+
 // Delegate that handles any followup actions to Infobar UI events.
 @protocol InfobarBadgeUIDelegate
 
-// Called whenever an InfobarBanner was dismissed.
-- (void)infobarBannerWasDismissed;
+// Called whenever an InfobarBanner of type |infobarType| was dismissed.
+- (void)infobarBannerWasDismissed:(InfobarType)infobarType;
 
-// Called whenever an InfobarModal was presented.
-- (void)infobarModalWasPresented;
+// Called whenever an InfobarModal of type |infobarType| was presented.
+- (void)infobarModalWasPresented:(InfobarType)infobarType;
 
-// Called whenever an InfobarModal is about to be dismissed.
-- (void)infobarModalWillDismiss;
+// Called whenever an InfobarModal of type |infobarType| is about to be
+// dismissed.
+- (void)infobarModalWillDismiss:(InfobarType)infobarType;
 
-// Called whenever an Infobar accept/confirm button was tapped. It is
-// triggered by either the banner or modal button.
-- (void)infobarWasAccepted;
+// Called whenever an Infobar of type |infobarType| accept/confirm button was
+// tapped. It is triggered by either the banner or modal button.
+- (void)infobarWasAccepted:(InfobarType)infobarType;
 
 @end
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.h b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.h
index 6d01424..eb057eb 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.h
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.h
@@ -7,6 +7,8 @@
 
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
+#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_presentation_state.h"
+
 namespace web {
 class WebState;
 }
@@ -50,8 +52,9 @@
 // YES if an Infobar is being presented for |webState|.
 - (BOOL)isInfobarPresentingForWebState:(web::WebState*)webState;
 
-// Dismisses the InfobarBanner, if none is being presented |completion| will
-// still run.
+// Dismisses the InfobarBanner. If the presentation is taking place it will stop
+// it and dismiss the banner. If none is being presented |completion| will still
+// run.
 - (void)dismissInfobarBannerAnimated:(BOOL)animated
                           completion:(void (^)())completion;
 
@@ -64,9 +67,10 @@
 // The SyncPresenter delegate for this Coordinator.
 @property(nonatomic, weak) id<SyncPresenter> syncPresenter;
 
-// YES if an InfobarBanner is being presented.
-@property(nonatomic, assign, getter=isPresentingInfobarBanner)
-    BOOL presentingInfobarBanner;
+// The current InfobarBanner presentation state (Only one Infobar Banner can be
+// presented at the time).
+@property(nonatomic, assign, readonly)
+    InfobarBannerPresentationState infobarBannerState;
 
 @end
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
index baa3abd..20d98f4 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
@@ -157,12 +157,11 @@
   self.dispatcher = static_cast<id<ApplicationCommands>>(_commandDispatcher);
 }
 
-- (BOOL)isPresentingInfobarBanner {
+- (InfobarBannerPresentationState)infobarBannerState {
   DCHECK(IsInfobarUIRebootEnabled());
   InfobarCoordinator* infobarCoordinator =
       static_cast<InfobarCoordinator*>(self.activeChildCoordinator);
-  _presentingInfobarBanner = [infobarCoordinator isPresentingInfobarBanner];
-  return _presentingInfobarBanner;
+  return infobarCoordinator.infobarBannerState;
 }
 
 #pragma mark - InfobarConsumer
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
index 72c1cb0..f3a51fb 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
@@ -120,12 +120,14 @@
 
   ~InfobarContainerCoordinatorTest() override {
     // Make sure InfobarBanner has been dismissed.
-    if (infobar_container_coordinator_.presentingInfobarBanner) {
+    if (infobar_container_coordinator_.infobarBannerState ==
+        InfobarBannerPresentationState::Presented) {
       [infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
                                                         completion:nil];
       EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
           base::test::ios::kWaitForUIElementTimeout, ^bool {
-            return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+            return infobar_container_coordinator_.infobarBannerState ==
+                   InfobarBannerPresentationState::NotPresented;
           }));
     }
     [infobar_container_coordinator_ stop];
@@ -167,68 +169,84 @@
   std::unique_ptr<ConfirmInfoBarDelegate> legacy_infobar_delegate_;
 };
 
-// Tests isPresentingInfobarBanner returns YES once an InfobarBanner is
-// presented.
-TEST_F(InfobarContainerCoordinatorTest, TestIsPresentingInfobarBanner) {
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+// Tests infobarBannerState is InfobarBannerPresentationState::Presented once an
+// InfobarBanner is presented.
+TEST_F(InfobarContainerCoordinatorTest,
+       InfobarBannerPresentationStatePresented) {
+  EXPECT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
   AddInfobar();
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 }
 
 // Tests that the InfobarBanner is automatically dismissed after
 // kInfobarBannerPresentationDurationInSeconds seconds.
 TEST_F(InfobarContainerCoordinatorTest, TestAutomaticInfobarBannerDismissal) {
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 
   AddInfobar();
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
 
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       kInfobarBannerPresentationDurationInSeconds, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 }
 
 // Tests that the InfobarBanner is correctly dismissed after calling
 // dismissInfobarBannerAnimated.
 TEST_F(InfobarContainerCoordinatorTest, TestInfobarBannerDismissal) {
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 
   AddInfobar();
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   [infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
                                                     completion:nil];
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 }
 
-// Tests that a legacy Infobar can be presented and isPresentingInfobarBanner is
-// still NO.
+// Tests that a legacy Infobar can be presented and
+// infobarBannerState is still NotPresented.
 TEST_F(InfobarContainerCoordinatorTest, TestLegacyInfobarPresentation) {
   EXPECT_FALSE([infobar_container_coordinator_
       isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::NotPresented);
   AddLegacyInfobar();
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
   EXPECT_TRUE([infobar_container_coordinator_
       isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
 }
@@ -237,15 +255,19 @@
 // presented InfobarBanner.
 TEST_F(InfobarContainerCoordinatorTest,
        TestInfobarBannerPresentationBeforeLegacyPresentation) {
-  EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
   AddInfobar();
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
   AddLegacyInfobar();
-  EXPECT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  EXPECT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 }
 
 // Tests that a presented LegacyInfobar doesn't interfere with presenting an
@@ -257,13 +279,16 @@
   AddLegacyInfobar();
   ASSERT_TRUE([infobar_container_coordinator_
       isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
   AddInfobar();
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 }
 
 // Tests that the InfobarBanner is dismissed when changing Webstates.
@@ -273,17 +298,21 @@
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   web_state_list_->ActivateWebStateAt(1);
 
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 }
 
 // Tests that the InfobarBanner is not presented again after returning from a
@@ -294,41 +323,50 @@
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   web_state_list_->ActivateWebStateAt(1);
 
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return !(infobar_container_coordinator_.infobarBannerState ==
+                 InfobarBannerPresentationState::Presented);
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 
   web_state_list_->ActivateWebStateAt(0);
   // Wait for any potential presentation.
   base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSecondsD(1));
 
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
 }
 
-// Tests isPresentingInfobarBanner is NO once an InfobarBanner has been
+// Tests infobarBannerState is NotPresented once an InfobarBanner has been
 // dismissed directly by its base VC.
 TEST_F(InfobarContainerCoordinatorTest, TestInfobarBannerDismissalByBaseVC) {
   AddInfobar();
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   [base_view_controller_ dismissViewControllerAnimated:NO completion:nil];
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::NotPresented);
 }
 
 // Tests that the ChildCoordinator is deleted once it stops.
@@ -339,29 +377,35 @@
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return [infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
       }));
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   ASSERT_EQ(NSUInteger(1),
             infobar_container_coordinator_.childCoordinators.count);
-  ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_TRUE(infobar_container_coordinator_.infobarBannerState ==
+              InfobarBannerPresentationState::Presented);
 
   // Dismiss the Banner before closing the Webstate to avoid bug 966057.
   [infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
                                                     completion:nil];
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
 
   web_state_list_->CloseWebStateAt(0, 0);
 
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
-        return ![infobar_container_coordinator_ isPresentingInfobarBanner];
+        return infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
       }));
-  ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
+  ASSERT_FALSE(infobar_container_coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented);
   ASSERT_EQ(NSUInteger(0),
             infobar_container_coordinator_.childCoordinators.count);
 }
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm b/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm
index 11c0f29a..b6540bb 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_mediator.mm
@@ -97,47 +97,50 @@
 
 #pragma mark - InfobarBadgeUIDelegate
 
-- (void)infobarBannerWasDismissed {
+- (void)infobarBannerWasDismissed:(InfobarType)infobarType {
   if (IsInfobarUIRebootEnabled()) {
+    // TODO(crbug.com/977340): When switching tabs, GetActiveWebState() does not
+    // return the correct WebState associated with the InfobarBadgeTabHelper
+    // that manages the infobar.
     web::WebState* webState = self.webStateList->GetActiveWebState();
     DCHECK(webState);
     InfobarBadgeTabHelper* infobarBadgeTabHelper =
         InfobarBadgeTabHelper::FromWebState(webState);
     DCHECK(infobarBadgeTabHelper);
-    infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed();
+    infobarBadgeTabHelper->UpdateBadgeForInfobarBannerDismissed(infobarType);
   }
 }
 
-- (void)infobarModalWasPresented {
+- (void)infobarModalWasPresented:(InfobarType)infobarType {
   if (IsInfobarUIRebootEnabled()) {
     web::WebState* webState = self.webStateList->GetActiveWebState();
     DCHECK(webState);
     InfobarBadgeTabHelper* infobarBadgeTabHelper =
         InfobarBadgeTabHelper::FromWebState(webState);
     DCHECK(infobarBadgeTabHelper);
-    infobarBadgeTabHelper->UpdateBadgeForInfobarModalPresented();
+    infobarBadgeTabHelper->UpdateBadgeForInfobarModalPresented(infobarType);
   }
 }
 
-- (void)infobarModalWillDismiss {
+- (void)infobarModalWillDismiss:(InfobarType)infobarType {
   if (IsInfobarUIRebootEnabled()) {
     web::WebState* webState = self.webStateList->GetActiveWebState();
     DCHECK(webState);
     InfobarBadgeTabHelper* infobarBadgeTabHelper =
         InfobarBadgeTabHelper::FromWebState(webState);
     DCHECK(infobarBadgeTabHelper);
-    infobarBadgeTabHelper->UpdateBadgeForInfobarModalDismissed();
+    infobarBadgeTabHelper->UpdateBadgeForInfobarModalDismissed(infobarType);
   }
 }
 
-- (void)infobarWasAccepted {
+- (void)infobarWasAccepted:(InfobarType)infobarType {
   if (IsInfobarUIRebootEnabled()) {
     web::WebState* webState = self.webStateList->GetActiveWebState();
     DCHECK(webState);
     InfobarBadgeTabHelper* infobarBadgeTabHelper =
         InfobarBadgeTabHelper::FromWebState(webState);
     DCHECK(infobarBadgeTabHelper);
-    infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted();
+    infobarBadgeTabHelper->UpdateBadgeForInfobarAccepted(infobarType);
   }
 }
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_ui_delegate.h b/ios/chrome/browser/ui/infobars/infobar_ui_delegate.h
index afb1a493..8ce5e9ee 100644
--- a/ios/chrome/browser/ui/infobars/infobar_ui_delegate.h
+++ b/ios/chrome/browser/ui/infobars/infobar_ui_delegate.h
@@ -27,6 +27,9 @@
 // YES if the container should modally present the Infobar.
 @property(nonatomic, assign, getter=isPresented) BOOL presented;
 
+// YES if a badge should be displayed for this Infobar.
+@property(nonatomic, assign, readonly) BOOL hasBadge;
+
 // The InfobarType for this Infobar.
 @property(nonatomic, assign) InfobarType infobarType;
 
diff --git a/ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.mm b/ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.mm
index 877ca13..b7047dfad 100644
--- a/ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.mm
+++ b/ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.mm
@@ -71,8 +71,7 @@
 #pragma mark - Public Methods
 
 - (void)completePresentationTransitionIfRunning {
-  if (self.bannerAnimator.presenting &&
-      self.bannerAnimator.propertyAnimator.running) {
+  if (self.bannerAnimator.propertyAnimator.running) {
     [self.bannerAnimator.propertyAnimator stopAnimation:NO];
     [self.bannerAnimator.propertyAnimator
         finishAnimationAtPosition:UIViewAnimatingPositionCurrent];
diff --git a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
index e316af90..7cde85cd 100644
--- a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
@@ -125,7 +125,8 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_nil()];
 
-  [self waitForWebViewContainingTexts:{"AbortError", "Request cancelled"}];
+  [self waitForWebViewContainingTexts:{"AbortError",
+                                       "User closed the Payment Request UI."}];
 }
 
 // Tests that tapping the link to Chrome Settings closes the Payment Request UI,
@@ -159,7 +160,8 @@
                                           kAutofillProfileTableViewID)]
       assertWithMatcher:grey_notNil()];
 
-  [self waitForWebViewContainingTexts:{"AbortError", "Request cancelled"}];
+  [self waitForWebViewContainingTexts:{"AbortError",
+                                       "User closed the Payment Request UI."}];
 }
 
 // Tests that tapping the pay button closes the Payment Request UI, accepts the
diff --git a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
index 0aea14b..8007042 100644
--- a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
@@ -347,7 +347,7 @@
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
-  [self waitForWebViewContainingTexts:{"Request cancelled"}];
+  [self waitForWebViewContainingTexts:{"User closed the Payment Request UI."}];
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
@@ -500,7 +500,7 @@
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
-  [self waitForWebViewContainingTexts:{"Request cancelled"}];
+  [self waitForWebViewContainingTexts:{"User closed the Payment Request UI."}];
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
@@ -657,7 +657,7 @@
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
-  [self waitForWebViewContainingTexts:{"Request cancelled"}];
+  [self waitForWebViewContainingTexts:{"User closed the Payment Request UI."}];
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index ff2fa9d6..e097c63 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -97,7 +97,7 @@
 const NSTimeInterval kTimeoutInterval = 60.0;
 
 // Error messages used in Payment Request API.
-NSString* const kCancelErrorMessage = @"Request cancelled";
+NSString* const kCancelErrorMessage = @"User closed the Payment Request UI.";
 
 struct PendingPaymentResponse {
   std::string methodName;
diff --git a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_ta.xtb b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_ta.xtb
index ead5da8..932beba 100644
--- a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_ta.xtb
+++ b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_ta.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
 <translation id="1613742542373525524">APPLICATION_NAME பயன்பாட்டினால் இந்த இணைப்பைச் செயல்படுத்த முடியாது.</translation>
+<translation id="4655616150233109325">Chromeமில் திற</translation>
 <translation id="4743991241988563337">பின்னர் படிப்பதற்காகச் சேமி</translation>
 <translation id="6930009216791986919">புத்தகக்குறிகளில் சேர்</translation>
 <translation id="6965382102122355670">சரி</translation>
diff --git a/ios/web/navigation/crw_session_controller.mm b/ios/web/navigation/crw_session_controller.mm
index 05b854e..9a5a096 100644
--- a/ios/web/navigation/crw_session_controller.mm
+++ b/ios/web/navigation/crw_session_controller.mm
@@ -379,7 +379,6 @@
 }
 
 - (void)clearForwardItems {
-  DCHECK_EQ(self.pendingItemIndex, -1);
   [self discardTransientItem];
 
   NSInteger forwardItemStartIndex = _lastCommittedItemIndex + 1;
@@ -445,7 +444,6 @@
   _items.push_back(std::move(item));
   _previousItemIndex = _lastCommittedItemIndex;
   self.lastCommittedItemIndex = self.items.size() - 1;
-  self.pendingItemIndex = -1;
 }
 
 - (void)addTransientItemWithURL:(const GURL&)URL {
diff --git a/ios/web/navigation/legacy_navigation_manager_impl.mm b/ios/web/navigation/legacy_navigation_manager_impl.mm
index 6090cc3..f68d3d6 100644
--- a/ios/web/navigation/legacy_navigation_manager_impl.mm
+++ b/ios/web/navigation/legacy_navigation_manager_impl.mm
@@ -112,8 +112,7 @@
 
 void LegacyNavigationManagerImpl::CommitPendingItem(
     std::unique_ptr<NavigationItemImpl> item) {
-  if (web::features::StorePendingItemInContext() &&
-      GetPendingItemIndex() == -1) {
+  if (web::features::StorePendingItemInContext() && item) {
     [session_controller_ commitPendingItem:std::move(item)];
   } else {
     CommitPendingItem();
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm
index 2588ece..6645a21 100644
--- a/ios/web/navigation/navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -2626,8 +2626,20 @@
     return;
   }
   ASSERT_EQ(0, navigation_manager()->GetItemCount());
+  navigation_manager()->AddPendingItem(
+      GURL("http://www.url.com/0"), Referrer(), ui::PAGE_TRANSITION_TYPED,
+      web::NavigationInitiationType::BROWSER_INITIATED,
+      web::NavigationManager::UserAgentOverrideOption::INHERIT);
+
+  [mock_wk_list_ setCurrentURL:@"http://www.url.com/1"
+                  backListURLs:nil
+               forwardListURLs:nil];
   navigation_manager()->CommitPendingItem(nullptr);
-  ASSERT_EQ(0, navigation_manager()->GetItemCount());
+
+  EXPECT_EQ(1, navigation_manager()->GetItemCount());
+  ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
+  EXPECT_EQ("http://www.url.com/0",
+            navigation_manager()->GetLastCommittedItem()->GetURL());
 }
 
 // Tests NavigationManagerImpl::CommitPendingItem() with a valid pending item.
@@ -2665,6 +2677,10 @@
 
   ASSERT_EQ(2, navigation_manager()->GetItemCount());
 
+  // Emulate 2 simultanious navigations to verify that pending item index does
+  // not prevent passed item commit.
+  navigation_manager()->SetPendingItemIndex(0);
+
   // Call CommitPendingItem() with a valid pending item.
   auto item = std::make_unique<web::NavigationItemImpl>();
   item->SetURL(GURL("http://www.url.com/new"));
@@ -2679,7 +2695,7 @@
     EXPECT_EQ(0, navigation_manager()->GetPreviousItemIndex());
   }
   EXPECT_EQ(1, navigation_manager()->GetLastCommittedItemIndex());
-  EXPECT_EQ(-1, navigation_manager()->GetPendingItemIndex());
+  EXPECT_EQ(0, navigation_manager()->GetPendingItemIndex());
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
   EXPECT_FALSE(
       navigation_manager()->GetLastCommittedItem()->GetTimestamp().is_null());
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index dd8035bc..b275c27 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -263,7 +263,7 @@
 
 void WKBasedNavigationManagerImpl::CommitPendingItem(
     std::unique_ptr<NavigationItemImpl> item) {
-  if (!features::StorePendingItemInContext() || pending_item_index_ != -1) {
+  if (!features::StorePendingItemInContext() || !item) {
     CommitPendingItem();
     return;
   }
@@ -325,7 +325,6 @@
     }
   }
 
-  pending_item_index_ = -1;
   // If the last committed item is the empty window open item, then don't update
   // previous item because the new commit replaces the last committed item.
   if (!last_committed_item_was_empty_window_open_item) {
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.mm b/ios/web/web_state/ui/crw_context_menu_controller.mm
index df8d23c..fcd8d49f 100644
--- a/ios/web/web_state/ui/crw_context_menu_controller.mm
+++ b/ios/web/web_state/ui/crw_context_menu_controller.mm
@@ -7,7 +7,6 @@
 #import <objc/runtime.h>
 #include <stddef.h>
 
-#include "base/feature_list.h"
 #include "base/ios/ios_util.h"
 #include "base/logging.h"
 #include "base/mac/foundation_util.h"
@@ -126,9 +125,6 @@
 - (void)setDOMElementForLastTouch:(NSDictionary*)element;
 // Called to process a message received from JavaScript.
 - (void)didReceiveScriptMessage:(WKScriptMessage*)message;
-// Logs the time taken to fetch DOM element details.
-- (void)logElementFetchDurationWithStartTime:
-    (base::TimeTicks)elementFetchStartTime;
 // Cancels the display of the context menu and clears associated element fetch
 // request state.
 - (void)cancelContextMenuDisplay;
@@ -388,25 +384,10 @@
   // this CRWContextMenuController instance.
   if (fetchRequest) {
     [_pendingElementFetchRequests removeObjectForKey:requestID];
-
-    // Only log performance metric if the response is from the main frame in
-    // order to keep metric comparible.
-    if (message.frameInfo.mainFrame) {
-      [self logElementFetchDurationWithStartTime:fetchRequest.creationTime];
-    }
     [fetchRequest runHandlerWithResponse:response];
-  } else {
-    UMA_HISTOGRAM_BOOLEAN(
-        "ContextMenu.UnexpectedFindElementResultHandlerMessage", true);
   }
 }
 
-- (void)logElementFetchDurationWithStartTime:
-    (base::TimeTicks)elementFetchStartTime {
-  UMA_HISTOGRAM_TIMES("ContextMenu.DOMElementFetchDuration",
-                      base::TimeTicks::Now() - elementFetchStartTime);
-}
-
 - (void)cancelContextMenuDisplay {
   if (_contextMenuNeedsDisplay) {
     UMA_HISTOGRAM_ENUMERATION(kContextMenuDelayedElementDetailsHistogram,
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index 910b48b..b3053327 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -221,7 +221,11 @@
     if (!out.empty())
       out.append("; ");
     out.append(it->first);
-    if (it->first != kSecureTokenName && it->first != kHttpOnlyTokenName) {
+    // Determine whether to emit the pair's value component. We should always
+    // print it for the first pair(see crbug.com/977619). After the first pair,
+    // we need to consider whether the name component is a special token.
+    if (it == pairs_.begin() ||
+        (it->first != kSecureTokenName && it->first != kHttpOnlyTokenName)) {
       out.append("=");
       out.append(it->second);
     }
diff --git a/net/cookies/parsed_cookie_unittest.cc b/net/cookies/parsed_cookie_unittest.cc
index 66beb9e..eb038f6 100644
--- a/net/cookies/parsed_cookie_unittest.cc
+++ b/net/cookies/parsed_cookie_unittest.cc
@@ -528,6 +528,64 @@
   EXPECT_FALSE(pc.SetSameSite("\r"));
 }
 
+TEST(ParsedCookieTest, ToCookieLineSpecialTokens) {
+  // Special tokens "secure" and "httponly" should be treated as any other name
+  // when they are in the first position.
+  {
+    ParsedCookie pc("");
+    pc.SetName("secure");
+    EXPECT_EQ(pc.ToCookieLine(), "secure=");
+  }
+  {
+    ParsedCookie pc("secure");
+    EXPECT_EQ(pc.ToCookieLine(), "=secure");
+  }
+  {
+    ParsedCookie pc("secure=foo");
+    EXPECT_EQ(pc.ToCookieLine(), "secure=foo");
+  }
+  {
+    ParsedCookie pc("foo=secure");
+    EXPECT_EQ(pc.ToCookieLine(), "foo=secure");
+  }
+  {
+    ParsedCookie pc("httponly=foo");
+    EXPECT_EQ(pc.ToCookieLine(), "httponly=foo");
+  }
+  {
+    ParsedCookie pc("foo");
+    pc.SetName("secure");
+    EXPECT_EQ(pc.ToCookieLine(), "secure=foo");
+  }
+  {
+    ParsedCookie pc("bar");
+    pc.SetName("httponly");
+    EXPECT_EQ(pc.ToCookieLine(), "httponly=bar");
+  }
+  {
+    ParsedCookie pc("foo=bar; baz=bob");
+    EXPECT_EQ(pc.ToCookieLine(), "foo=bar; baz=bob");
+  }
+  // Outside of the first position, the value associated with a special name
+  // should not be printed.
+  {
+    ParsedCookie pc("name=foo; secure");
+    EXPECT_EQ(pc.ToCookieLine(), "name=foo; secure");
+  }
+  {
+    ParsedCookie pc("name=foo; secure=bar");
+    EXPECT_EQ(pc.ToCookieLine(), "name=foo; secure");
+  }
+  {
+    ParsedCookie pc("name=foo; httponly=baz");
+    EXPECT_EQ(pc.ToCookieLine(), "name=foo; httponly");
+  }
+  {
+    ParsedCookie pc("name=foo; bar=secure");
+    EXPECT_EQ(pc.ToCookieLine(), "name=foo; bar=secure");
+  }
+}
+
 TEST(ParsedCookieTest, SameSiteValues) {
   struct TestCase {
     const char* cookie;
diff --git a/net/dns/host_resolver_proc.cc b/net/dns/host_resolver_proc.cc
index 4f4bce2..0824540 100644
--- a/net/dns/host_resolver_proc.cc
+++ b/net/dns/host_resolver_proc.cc
@@ -280,9 +280,9 @@
     base::TimeDelta::FromSeconds(6);
 
 ProcTaskParams::ProcTaskParams(HostResolverProc* resolver_proc,
-                               size_t max_retry_attempts)
+                               size_t in_max_retry_attempts)
     : resolver_proc(resolver_proc),
-      max_retry_attempts(max_retry_attempts),
+      max_retry_attempts(in_max_retry_attempts),
       unresponsive_delay(kDnsDefaultUnresponsiveDelay),
       retry_factor(2) {
   // Maximum of 4 retry attempts for host resolution.
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index 52ed2e8..0cbac6e 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -1679,12 +1679,29 @@
 void NetworkQualityEstimator::OnPeerToPeerConnectionsCountChange(
     uint32_t count) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  webrtc_active_connections_count_ = count;
+
+  if (p2p_connections_count_ == count)
+    return;
+
+  if (p2p_connections_count_ == 0 && count > 0) {
+    DCHECK(!p2p_connections_count_active_timestamp_);
+    p2p_connections_count_active_timestamp_ = tick_clock_->NowTicks();
+  }
+
+  if (p2p_connections_count_ > 0 && count == 0) {
+    DCHECK(p2p_connections_count_active_timestamp_);
+    base::TimeDelta duration = tick_clock_->NowTicks() -
+                               p2p_connections_count_active_timestamp_.value();
+    UMA_HISTOGRAM_LONG_TIMES("NQE.PeerToPeerConnectionsDuration", duration);
+    p2p_connections_count_active_timestamp_ = base::nullopt;
+  }
+
+  p2p_connections_count_ = count;
 }
 
 uint32_t NetworkQualityEstimator::GetPeerToPeerConnectionsCountChange() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return webrtc_active_connections_count_;
+  return p2p_connections_count_;
 }
 
 }  // namespace net
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h
index 460040d..cfc7778 100644
--- a/net/nqe/network_quality_estimator.h
+++ b/net/nqe/network_quality_estimator.h
@@ -538,7 +538,13 @@
   // type.
   void ClampKbpsBasedOnEct();
 
-  uint32_t webrtc_active_connections_count_ = 0u;
+  // Current count of active peer to peer connections.
+  uint32_t p2p_connections_count_ = 0u;
+
+  // Earliest timestamp since when there is at least one active peer to peer
+  // connection count. Set to current timestamp when |p2p_connections_count_|
+  // changes from 0 to 1. Reset to null when |p2p_connections_count_| becomes 0.
+  base::Optional<base::TimeTicks> p2p_connections_count_active_timestamp_;
 
   // Determines if the requests to local host can be used in estimating the
   // network quality. Set to true only for tests.
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index 168c4257..d0eb0d1 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -2942,4 +2942,26 @@
   }
 }
 
+TEST_F(NetworkQualityEstimatorTest, PeerToPeerConnectionCounts) {
+  TestNetworkQualityEstimator estimator;
+  base::SimpleTestTickClock tick_clock;
+  estimator.SetTickClockForTesting(&tick_clock);
+  base::HistogramTester histogram_tester;
+
+  estimator.OnPeerToPeerConnectionsCountChange(3u);
+  base::TimeDelta advance_1 = base::TimeDelta::FromMinutes(4);
+  tick_clock.Advance(advance_1);
+  histogram_tester.ExpectTotalCount("NQE.PeerToPeerConnectionsDuration", 0);
+
+  estimator.OnPeerToPeerConnectionsCountChange(1u);
+  base::TimeDelta advance_2 = base::TimeDelta::FromMinutes(6);
+  tick_clock.Advance(advance_2);
+  histogram_tester.ExpectTotalCount("NQE.PeerToPeerConnectionsDuration", 0);
+
+  estimator.OnPeerToPeerConnectionsCountChange(0u);
+  histogram_tester.ExpectUniqueSample("NQE.PeerToPeerConnectionsDuration",
+                                      (advance_1 + advance_2).InMilliseconds(),
+                                      1);
+}
+
 }  // namespace net
diff --git a/remoting/android/BUILD.gn b/remoting/android/BUILD.gn
index c375405d..d120999 100644
--- a/remoting/android/BUILD.gn
+++ b/remoting/android/BUILD.gn
@@ -81,7 +81,7 @@
 instrumentation_test_apk("remoting_test_apk") {
   android_manifest = "$root_gen_dir/remoting/android_test/AndroidManifest.xml"
   android_manifest_dep = ":remoting_test_apk_manifest"
-  target_sdk_version = 28
+  target_sdk_version = 23
   apk_name = "ChromotingTest"
   apk_under_test = ":remoting_apk"
   java_files = [
diff --git a/remoting/android/remoting_apk_tmpl.gni b/remoting/android/remoting_apk_tmpl.gni
index 1921cec..2260788 100644
--- a/remoting/android/remoting_apk_tmpl.gni
+++ b/remoting/android/remoting_apk_tmpl.gni
@@ -14,6 +14,7 @@
 
     android_manifest = "$root_gen_dir/remoting/android/AndroidManifest.xml"
     android_manifest_dep = "//remoting/android:remoting_apk_manifest"
+    target_sdk_version = 28
     shared_libraries = [ "//remoting/client/jni:remoting_client_jni" ]
     version_name = chrome_version_name
     version_code = chrome_version_code
diff --git a/remoting/base/grpc_support/grpc_async_executor_unittest.cc b/remoting/base/grpc_support/grpc_async_executor_unittest.cc
index 20bcdb6..4cd8a88 100644
--- a/remoting/base/grpc_support/grpc_async_executor_unittest.cc
+++ b/remoting/base/grpc_support/grpc_async_executor_unittest.cc
@@ -35,6 +35,11 @@
 using ::testing::Return;
 
 using EchoStreamResponder = test::GrpcServerStreamResponder<EchoResponse>;
+using MockOnceClosure = base::MockCallback<base::OnceClosure>;
+
+base::RepeatingClosure NotReachedClosure() {
+  return base::BindRepeating([]() { NOTREACHED(); });
+}
 
 base::RepeatingCallback<void(const EchoResponse&)>
 NotReachedStreamingCallback() {
@@ -51,6 +56,9 @@
   return response;
 }
 
+#define EXPECT_CLOSURE_CALL_ONCE(mock_closure) \
+  EXPECT_CALL(mock_closure, Run()).Times(1)
+
 }  // namespace
 
 class GrpcAsyncExecutorTest : public testing::Test {
@@ -65,12 +73,14 @@
 
   std::unique_ptr<ScopedGrpcServerStream> StartEchoStreamOnExecutor(
       const std::string& request_text,
+      base::OnceClosure on_channel_ready,
       const base::RepeatingCallback<void(const EchoResponse&)>& on_incoming_msg,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
       GrpcAsyncExecutor* executor);
 
   std::unique_ptr<ScopedGrpcServerStream> StartEchoStream(
       const std::string& request_text,
+      base::OnceClosure on_channel_ready,
       const base::RepeatingCallback<void(const EchoResponse&)>& on_incoming_msg,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed);
 
@@ -120,6 +130,7 @@
 std::unique_ptr<ScopedGrpcServerStream>
 GrpcAsyncExecutorTest::StartEchoStreamOnExecutor(
     const std::string& request_text,
+    base::OnceClosure on_channel_ready,
     const base::RepeatingCallback<void(const EchoResponse&)>& on_incoming_msg,
     base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
     GrpcAsyncExecutor* executor) {
@@ -129,18 +140,20 @@
   auto grpc_request = CreateGrpcAsyncServerStreamingRequest(
       base::BindOnce(&GrpcAsyncExecutorTestService::Stub::AsyncStreamEcho,
                      base::Unretained(stub_.get())),
-      request, on_incoming_msg, std::move(on_channel_closed), &scoped_stream);
+      request, std::move(on_channel_ready), on_incoming_msg,
+      std::move(on_channel_closed), &scoped_stream);
   executor->ExecuteRpc(std::move(grpc_request));
   return scoped_stream;
 }
 
 std::unique_ptr<ScopedGrpcServerStream> GrpcAsyncExecutorTest::StartEchoStream(
     const std::string& request_text,
+    base::OnceClosure on_channel_ready,
     const base::RepeatingCallback<void(const EchoResponse&)>& on_incoming_msg,
     base::OnceCallback<void(const grpc::Status&)> on_channel_closed) {
-  return StartEchoStreamOnExecutor(request_text, on_incoming_msg,
-                                   std::move(on_channel_closed),
-                                   executor_.get());
+  return StartEchoStreamOnExecutor(
+      request_text, std::move(on_channel_ready), on_incoming_msg,
+      std::move(on_channel_closed), executor_.get());
 }
 
 void GrpcAsyncExecutorTest::HandleOneEchoRequest() {
@@ -316,13 +329,14 @@
   auto grpc_request = CreateGrpcAsyncServerStreamingRequest(
       base::BindOnce(&GrpcAsyncExecutorTestService::Stub::AsyncStreamEcho,
                      base::Unretained(stub_.get())),
-      request, NotReachedStreamingCallback(), NotReachedStatusCallback(),
-      &scoped_stream_1);
+      request, NotReachedClosure(), NotReachedStreamingCallback(),
+      NotReachedStatusCallback(), &scoped_stream_1);
   scoped_stream_1.reset();
   executor_->ExecuteRpc(std::move(grpc_request));
 
-  auto scoped_stream_2 = StartEchoStream(
-      "Hello 2", NotReachedStreamingCallback(), NotReachedStatusCallback());
+  auto scoped_stream_2 = StartEchoStream("Hello 2", NotReachedClosure(),
+                                         NotReachedStreamingCallback(),
+                                         NotReachedStatusCallback());
 
   // Verify that the second request is received instead of the first one.
   EchoRequest received_request;
@@ -334,9 +348,9 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamNotAcceptedByServer) {
   base::RunLoop run_loop;
-  auto scoped_stream = StartEchoStream(
-      "Hello", NotReachedStreamingCallback(),
-      base::BindLambdaForTesting([&](const grpc::Status&) { NOTREACHED(); }));
+  auto scoped_stream = StartEchoStream("Hello", NotReachedClosure(),
+                                       NotReachedStreamingCallback(),
+                                       NotReachedStatusCallback());
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindLambdaForTesting([&]() {
         executor_.reset();
@@ -347,10 +361,12 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamImmediatelyClosedByServer) {
   base::RunLoop run_loop;
-  auto scoped_stream =
-      StartEchoStream("Hello", NotReachedStreamingCallback(),
-                      test::CheckStatusThenQuitRunLoopCallback(
-                          FROM_HERE, grpc::StatusCode::OK, &run_loop));
+  MockOnceClosure on_channel_ready;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready);
+  auto scoped_stream = StartEchoStream(
+      "Hello", on_channel_ready.Get(), NotReachedStreamingCallback(),
+      test::CheckStatusThenQuitRunLoopCallback(FROM_HERE, grpc::StatusCode::OK,
+                                               &run_loop));
   auto responder = HandleEchoStream(FROM_HERE, "Hello");
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindLambdaForTesting([&]() { responder.reset(); }));
@@ -359,8 +375,10 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamImmediatelyClosedByServerWithError) {
   base::RunLoop run_loop;
+  MockOnceClosure on_channel_ready;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready);
   auto scoped_stream = StartEchoStream(
-      "Hello", NotReachedStreamingCallback(),
+      "Hello", on_channel_ready.Get(), NotReachedStreamingCallback(),
       test::CheckStatusThenQuitRunLoopCallback(
           FROM_HERE, grpc::StatusCode::UNAUTHENTICATED, &run_loop));
   auto responder = HandleEchoStream(FROM_HERE, "Hello");
@@ -373,9 +391,12 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamsOneMessageThenClosedByServer) {
   base::RunLoop run_loop;
+  MockOnceClosure on_channel_ready;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready);
   std::unique_ptr<EchoStreamResponder> responder;
   auto scoped_stream = StartEchoStream(
-      "Hello", base::BindLambdaForTesting([&](const EchoResponse& response) {
+      "Hello", on_channel_ready.Get(),
+      base::BindLambdaForTesting([&](const EchoResponse& response) {
         ASSERT_EQ("Echo 1", response.text());
         responder->WaitForSendMessageResult();
         responder.reset();
@@ -391,6 +412,9 @@
   base::RunLoop run_loop;
   std::unique_ptr<EchoStreamResponder> responder;
 
+  MockOnceClosure on_channel_ready;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready);
+
   base::MockCallback<base::RepeatingCallback<void(const EchoResponse&)>>
       mock_on_incoming_msg;
 
@@ -410,10 +434,10 @@
         }));
   }
 
-  auto scoped_stream =
-      StartEchoStream("Hello", mock_on_incoming_msg.Get(),
-                      test::CheckStatusThenQuitRunLoopCallback(
-                          FROM_HERE, grpc::StatusCode::OK, &run_loop));
+  auto scoped_stream = StartEchoStream(
+      "Hello", on_channel_ready.Get(), mock_on_incoming_msg.Get(),
+      test::CheckStatusThenQuitRunLoopCallback(FROM_HERE, grpc::StatusCode::OK,
+                                               &run_loop));
   responder = HandleEchoStream(FROM_HERE, "Hello");
   responder->SendMessage(ResponseForText("Echo 1"));
   run_loop.Run();
@@ -421,7 +445,8 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamOpenThenClosedByClientAtDestruction) {
   base::RunLoop run_loop;
-  auto scoped_stream = StartEchoStream("Hello", NotReachedStreamingCallback(),
+  auto scoped_stream = StartEchoStream("Hello", NotReachedClosure(),
+                                       NotReachedStreamingCallback(),
                                        NotReachedStatusCallback());
   auto responder = HandleEchoStream(FROM_HERE, "Hello");
   base::SequencedTaskRunnerHandle::Get()->PostTask(
@@ -436,7 +461,8 @@
 
 TEST_F(GrpcAsyncExecutorTest, ServerStreamClosedByStreamHolder) {
   base::RunLoop run_loop;
-  auto scoped_stream = StartEchoStream("Hello", NotReachedStreamingCallback(),
+  auto scoped_stream = StartEchoStream("Hello", NotReachedClosure(),
+                                       NotReachedStreamingCallback(),
                                        NotReachedStatusCallback());
   auto responder = HandleEchoStream(FROM_HERE, "Hello");
   base::SequencedTaskRunnerHandle::Get()->PostTask(
@@ -452,8 +478,13 @@
 TEST_F(GrpcAsyncExecutorTest, ServerStreamsOneMessageThenClosedByStreamHolder) {
   base::RunLoop run_loop;
   std::unique_ptr<EchoStreamResponder> responder;
+
+  MockOnceClosure on_channel_ready;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready);
+
   std::unique_ptr<ScopedGrpcServerStream> scoped_stream = StartEchoStream(
-      "Hello", base::BindLambdaForTesting([&](const EchoResponse& response) {
+      "Hello", on_channel_ready.Get(),
+      base::BindLambdaForTesting([&](const EchoResponse& response) {
         ASSERT_EQ("Echo 1", response.text());
         ASSERT_TRUE(responder->WaitForSendMessageResult());
         scoped_stream.reset();
@@ -515,6 +546,12 @@
         });
   }
 
+  MockOnceClosure on_channel_ready_1;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready_1);
+
+  MockOnceClosure on_channel_ready_2;
+  EXPECT_CLOSURE_CALL_ONCE(on_channel_ready_2);
+
   base::MockCallback<base::RepeatingCallback<void(const grpc::Status&)>>
       mock_status_callback;
   EXPECT_CALL(mock_status_callback,
@@ -522,17 +559,17 @@
       .WillOnce(Return())
       .WillOnce([&](const grpc::Status&) { run_loop.QuitWhenIdle(); });
 
-  auto scoped_stream_1 =
-      StartEchoStreamOnExecutor("Hello 1", mock_on_incoming_msg_1.Get(),
-                                mock_status_callback.Get(), &executor_1);
+  auto scoped_stream_1 = StartEchoStreamOnExecutor(
+      "Hello 1", on_channel_ready_1.Get(), mock_on_incoming_msg_1.Get(),
+      mock_status_callback.Get(), &executor_1);
   EchoRequest request_1;
   responder_1 = server_->HandleStreamRequest(
       &GrpcAsyncExecutorTestService::AsyncService::RequestStreamEcho,
       &request_1);
 
-  auto scoped_stream_2 =
-      StartEchoStreamOnExecutor("Hello 2", mock_on_incoming_msg_2.Get(),
-                                mock_status_callback.Get(), &executor_2);
+  auto scoped_stream_2 = StartEchoStreamOnExecutor(
+      "Hello 2", on_channel_ready_2.Get(), mock_on_incoming_msg_2.Get(),
+      mock_status_callback.Get(), &executor_2);
   EchoRequest request_2;
   responder_2 = server_->HandleStreamRequest(
       &GrpcAsyncExecutorTestService::AsyncService::RequestStreamEcho,
diff --git a/remoting/base/grpc_support/grpc_async_server_streaming_request.cc b/remoting/base/grpc_support/grpc_async_server_streaming_request.cc
index f36f0c5..a95b0b1 100644
--- a/remoting/base/grpc_support/grpc_async_server_streaming_request.cc
+++ b/remoting/base/grpc_support/grpc_async_server_streaming_request.cc
@@ -21,11 +21,13 @@
 }  // namespace
 
 GrpcAsyncServerStreamingRequestBase::GrpcAsyncServerStreamingRequestBase(
+    base::OnceClosure on_channel_ready,
     base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
     std::unique_ptr<ScopedGrpcServerStream>* scoped_stream)
     : weak_factory_(this) {
   DCHECK(on_channel_closed);
   DCHECK_NE(nullptr, scoped_stream);
+  on_channel_ready_ = std::move(on_channel_ready);
   on_channel_closed_ = std::move(on_channel_closed);
   *scoped_stream =
       std::make_unique<ScopedGrpcServerStream>(weak_factory_.GetWeakPtr());
@@ -61,7 +63,13 @@
   }
   if (state_ == State::STARTING) {
     VLOG(1) << "Streaming call started: " << this;
+    state_ = State::PENDING_INITIAL_METADATA;
+    return true;
+  }
+  if (state_ == State::PENDING_INITIAL_METADATA) {
+    VLOG(1) << "Received initial metadata: " << this;
     state_ = State::STREAMING;
+    ResolveChannelReady();
     return true;
   }
   if (state_ == State::STREAMING) {
@@ -76,6 +84,9 @@
 void GrpcAsyncServerStreamingRequestBase::Reenqueue(void* event_tag) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   switch (state_) {
+    case State::PENDING_INITIAL_METADATA:
+      ReadInitialMetadata(event_tag);
+      break;
     case State::STREAMING:
       WaitForIncomingMessage(event_tag);
       break;
@@ -100,6 +111,11 @@
   return state_ == State::STARTING;
 }
 
+void GrpcAsyncServerStreamingRequestBase::ResolveChannelReady() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  RunTask(std::move(on_channel_ready_));
+}
+
 void GrpcAsyncServerStreamingRequestBase::ResolveChannelClosed() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   RunTask(base::BindOnce(std::move(on_channel_closed_), status_));
diff --git a/remoting/base/grpc_support/grpc_async_server_streaming_request.h b/remoting/base/grpc_support/grpc_async_server_streaming_request.h
index 8e49a9a..357fbdd 100644
--- a/remoting/base/grpc_support/grpc_async_server_streaming_request.h
+++ b/remoting/base/grpc_support/grpc_async_server_streaming_request.h
@@ -33,6 +33,7 @@
 class GrpcAsyncServerStreamingRequestBase : public GrpcAsyncRequest {
  public:
   GrpcAsyncServerStreamingRequestBase(
+      base::OnceClosure on_channel_ready,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
       std::unique_ptr<ScopedGrpcServerStream>* scoped_stream);
   ~GrpcAsyncServerStreamingRequestBase() override;
@@ -40,6 +41,7 @@
  protected:
   enum class State {
     STARTING,
+    PENDING_INITIAL_METADATA,
     STREAMING,
 
     // Server has closed the stream and we are getting back the reason.
@@ -56,6 +58,7 @@
   // has been deleted right before it is being executed.
   void RunTask(base::OnceClosure task);
 
+  virtual void ReadInitialMetadata(void* event_tag) = 0;
   virtual void ResolveIncomingMessage() = 0;
   virtual void WaitForIncomingMessage(void* event_tag) = 0;
   virtual void FinishStream(void* event_tag) = 0;
@@ -66,8 +69,10 @@
   void Reenqueue(void* event_tag) override;
   void OnRequestCanceled() override;
   bool CanStartRequest() const override;
+  void ResolveChannelReady();
   void ResolveChannelClosed();
 
+  base::OnceClosure on_channel_ready_;
   base::OnceCallback<void(const grpc::Status&)> on_channel_closed_;
   State state_ = State::STARTING;
 
@@ -99,15 +104,18 @@
   CreateGrpcAsyncServerStreamingRequest(
       GrpcAsyncServerStreamingRpcFunction<Req, Res> rpc_function,
       const Req& request,
+      base::OnceClosure on_channel_ready,
       const base::RepeatingCallback<void(const Res&)>& on_incoming_msg,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
       std::unique_ptr<ScopedGrpcServerStream>* scoped_stream);
 
   GrpcAsyncServerStreamingRequest(
+      base::OnceClosure on_channel_ready,
       const OnIncomingMessageCallback& on_incoming_msg,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
       std::unique_ptr<ScopedGrpcServerStream>* scoped_stream)
-      : GrpcAsyncServerStreamingRequestBase(std::move(on_channel_closed),
+      : GrpcAsyncServerStreamingRequestBase(std::move(on_channel_ready),
+                                            std::move(on_channel_closed),
                                             scoped_stream) {
     on_incoming_msg_ = on_incoming_msg;
   }
@@ -127,6 +135,11 @@
   }
 
   // GrpcAsyncServerStreamingRequestBase implementations.
+  void ReadInitialMetadata(void* event_tag) override {
+    DCHECK(reader_);
+    reader_->ReadInitialMetadata(event_tag);
+  }
+
   void ResolveIncomingMessage() override {
     RunTask(base::BindOnce(on_incoming_msg_, response_));
   }
@@ -161,13 +174,15 @@
 CreateGrpcAsyncServerStreamingRequest(
     GrpcAsyncServerStreamingRpcFunction<RequestType, ResponseType> rpc_function,
     const RequestType& request,
+    base::OnceClosure on_channel_ready,
     const base::RepeatingCallback<void(const ResponseType&)>& on_incoming_msg,
     base::OnceCallback<void(const grpc::Status&)> on_channel_closed,
     std::unique_ptr<ScopedGrpcServerStream>* scoped_stream) {
   // Cannot use make_unique because the constructor is private.
   std::unique_ptr<GrpcAsyncServerStreamingRequest<ResponseType>> grpc_request(
       new GrpcAsyncServerStreamingRequest<ResponseType>(
-          on_incoming_msg, std::move(on_channel_closed), scoped_stream));
+          std::move(on_channel_ready), on_incoming_msg,
+          std::move(on_channel_closed), scoped_stream));
   grpc_request->SetCreateReaderCallback(base::BindOnce(
       std::move(rpc_function), grpc_request->context(), request));
   return grpc_request;
diff --git a/remoting/signaling/ftl_message_reception_channel.cc b/remoting/signaling/ftl_message_reception_channel.cc
index da90b39..252d25e8 100644
--- a/remoting/signaling/ftl_message_reception_channel.cc
+++ b/remoting/signaling/ftl_message_reception_channel.cc
@@ -65,6 +65,13 @@
   return reconnect_retry_backoff_;
 }
 
+void FtlMessageReceptionChannel::OnReceiveMessagesStreamReady() {
+  DCHECK_EQ(State::STARTING, state_);
+  state_ = State::STARTED;
+  RunStreamReadyCallbacks();
+  BeginStreamTimers();
+}
+
 void FtlMessageReceptionChannel::OnReceiveMessagesStreamClosed(
     const grpc::Status& status) {
   if (state_ == State::STOPPED) {
@@ -97,9 +104,7 @@
       stream_pong_timer_->Reset();
       break;
     case ftl::ReceiveMessagesResponse::BodyCase::kStartOfBatch:
-      state_ = State::STARTED;
-      RunStreamReadyCallbacks();
-      BeginStreamTimers();
+      VLOG(1) << "Received start of batch";
       break;
     case ftl::ReceiveMessagesResponse::BodyCase::kEndOfBatch:
       VLOG(1) << "Received end of batch";
@@ -156,6 +161,8 @@
   DCHECK_EQ(State::STOPPED, state_);
   state_ = State::STARTING;
   receive_messages_stream_ = stream_opener_.Run(
+      base::BindOnce(&FtlMessageReceptionChannel::OnReceiveMessagesStreamReady,
+                     weak_factory_.GetWeakPtr()),
       base::BindRepeating(&FtlMessageReceptionChannel::OnMessageReceived,
                           weak_factory_.GetWeakPtr()),
       base::BindOnce(&FtlMessageReceptionChannel::OnReceiveMessagesStreamClosed,
diff --git a/remoting/signaling/ftl_message_reception_channel.h b/remoting/signaling/ftl_message_reception_channel.h
index 3cf388e..7b28fe172 100644
--- a/remoting/signaling/ftl_message_reception_channel.h
+++ b/remoting/signaling/ftl_message_reception_channel.h
@@ -52,6 +52,7 @@
     STARTED,
   };
 
+  void OnReceiveMessagesStreamReady();
   void OnReceiveMessagesStreamClosed(const grpc::Status& status);
   void OnMessageReceived(const ftl::ReceiveMessagesResponse& response);
 
diff --git a/remoting/signaling/ftl_message_reception_channel_unittest.cc b/remoting/signaling/ftl_message_reception_channel_unittest.cc
index 7fd74dad..5adb839 100644
--- a/remoting/signaling/ftl_message_reception_channel_unittest.cc
+++ b/remoting/signaling/ftl_message_reception_channel_unittest.cc
@@ -59,12 +59,6 @@
   return std::make_unique<FakeScopedGrpcServerStream>();
 }
 
-ftl::ReceiveMessagesResponse CreateStartOfBatchResponse() {
-  ftl::ReceiveMessagesResponse response;
-  response.mutable_start_of_batch();
-  return response;
-}
-
 // Creates a gmock EXPECT_CALL action that:
 //   1. Creates a fake server stream and returns it as the start stream result
 //   2. Posts a task to call |on_stream_opened| at the end of current sequence
@@ -73,8 +67,9 @@
 template <typename OnStreamOpenedLambda>
 decltype(auto) StartStream(
     OnStreamOpenedLambda on_stream_opened,
-    base::WeakPtr<FakeScopedGrpcServerStream>* optional_out_stream) {
-  return [=](const ReceiveMessagesResponseCallback& on_incoming_msg,
+    base::WeakPtr<FakeScopedGrpcServerStream>* optional_out_stream = nullptr) {
+  return [=](base::OnceClosure on_channel_ready,
+             const ReceiveMessagesResponseCallback& on_incoming_msg,
              StatusCallback on_channel_closed) {
     auto fake_stream = CreateFakeServerStream();
     if (optional_out_stream) {
@@ -82,17 +77,13 @@
     }
     auto on_stream_opened_cb = base::BindLambdaForTesting(on_stream_opened);
     base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(on_stream_opened_cb, on_incoming_msg,
-                                  std::move(on_channel_closed)));
+        FROM_HERE,
+        base::BindOnce(on_stream_opened_cb, std::move(on_channel_ready),
+                       on_incoming_msg, std::move(on_channel_closed)));
     return fake_stream;
   };
 }
 
-template <typename OnStreamOpenedLambda>
-decltype(auto) StartStream(OnStreamOpenedLambda on_stream_opened) {
-  return StartStream(on_stream_opened, nullptr);
-}
-
 base::OnceClosure NotReachedClosure() {
   return base::BindOnce([]() { NOTREACHED(); });
 }
@@ -149,9 +140,10 @@
        TestStartReceivingMessages_StoppedImmediately) {
   base::RunLoop run_loop;
 
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             channel_->StopReceivingMessages();
           }));
@@ -168,9 +160,10 @@
        TestStartReceivingMessages_NotAuthenticated) {
   base::RunLoop run_loop;
 
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             std::move(on_channel_closed)
                 .Run(grpc::Status(grpc::StatusCode::UNAUTHENTICATED, ""));
@@ -188,11 +181,12 @@
        TestStartReceivingMessages_StreamStarted) {
   base::RunLoop run_loop;
 
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
           }));
 
   channel_->StartReceivingMessages(run_loop.QuitClosure(),
@@ -206,9 +200,10 @@
   base::RunLoop run_loop;
 
   base::WeakPtr<FakeScopedGrpcServerStream> old_stream;
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // The first open stream attempt fails with UNAVAILABLE error.
             ASSERT_EQ(0, GetRetryFailureCount());
@@ -225,15 +220,15 @@
           },
           &old_stream))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // Second open stream attempt succeeds.
 
             // Assert old stream closed.
             ASSERT_FALSE(old_stream);
 
-            // Send a StartOfBatch and verify it resets the failure counter.
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
 
             ASSERT_EQ(0, GetRetryFailureCount());
           }));
@@ -256,11 +251,12 @@
       .WillOnce(Return())
       .WillOnce([&]() { run_loop.Quit(); });
 
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
           }));
 
   channel_->StartReceivingMessages(stream_ready_callback.Get(),
@@ -291,11 +287,12 @@
               Run(Property(&ftl::InboxMessage::message_id, kMessage2Id)))
       .WillOnce(Invoke([&](const ftl::InboxMessage&) { run_loop.Quit(); }));
 
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
 
             ftl::ReceiveMessagesResponse response;
             *response.mutable_inbox_message() = message_1;
@@ -320,11 +317,12 @@
   base::RunLoop run_loop;
 
   base::WeakPtr<FakeScopedGrpcServerStream> old_stream;
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
             scoped_task_environment_.FastForwardBy(
                 FtlMessageReceptionChannel::kPongTimeout);
 
@@ -337,16 +335,15 @@
           },
           &old_stream))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // Stream is reopened.
 
             // Assert old stream closed.
             ASSERT_FALSE(old_stream);
 
-            // Sends a StartOfBatch and verify that it resets the failure
-            // counter.
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
             ASSERT_EQ(0, GetRetryFailureCount());
             run_loop.Quit();
           }));
@@ -361,12 +358,13 @@
   base::RunLoop run_loop;
 
   base::WeakPtr<FakeScopedGrpcServerStream> old_stream;
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             auto fake_server_stream = CreateFakeServerStream();
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
 
             // Keep sending pong until lifetime exceeded.
             base::TimeDelta pong_period =
@@ -383,13 +381,12 @@
           },
           &old_stream))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             ASSERT_FALSE(old_stream);
 
-            // The stream is reopened. Send StartOfBatch and verify that it
-            // resets the failure counter.
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
             ASSERT_EQ(0, GetRetryFailureCount());
             run_loop.Quit();
           }));
@@ -405,13 +402,14 @@
 
   int failure_count = 0;
   int hitting_max_delay_count = 0;
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillRepeatedly(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // Quit if delay is ~kBackoffMaxDelay three times.
             if (hitting_max_delay_count == 3) {
-              on_incoming_msg.Run(CreateStartOfBatchResponse());
+              std::move(on_channel_ready).Run();
               ASSERT_EQ(0, GetRetryFailureCount());
               run_loop.Quit();
               return;
@@ -452,9 +450,10 @@
   base::RunLoop run_loop;
 
   base::WeakPtr<FakeScopedGrpcServerStream> old_stream;
-  EXPECT_CALL(mock_stream_opener_, Run(_, _))
+  EXPECT_CALL(mock_stream_opener_, Run(_, _, _))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // The first open stream attempt fails with UNAUTHENTICATED error.
             ASSERT_EQ(0, GetRetryFailureCount());
@@ -468,7 +467,8 @@
           },
           &old_stream))
       .WillOnce(StartStream(
-          [&](const ReceiveMessagesResponseCallback& on_incoming_msg,
+          [&](base::OnceClosure on_channel_ready,
+              const ReceiveMessagesResponseCallback& on_incoming_msg,
               StatusCallback on_channel_closed) {
             // Second open stream attempt succeeds.
 
@@ -477,8 +477,7 @@
 
             ASSERT_EQ(1, GetRetryFailureCount());
 
-            // Send a StartOfBatch and verify it resets the failure counter.
-            on_incoming_msg.Run(CreateStartOfBatchResponse());
+            std::move(on_channel_ready).Run();
 
             ASSERT_EQ(0, GetRetryFailureCount());
           }));
diff --git a/remoting/signaling/ftl_messaging_client.cc b/remoting/signaling/ftl_messaging_client.cc
index f33719b..b84fed1 100644
--- a/remoting/signaling/ftl_messaging_client.cc
+++ b/remoting/signaling/ftl_messaging_client.cc
@@ -192,6 +192,7 @@
 
 std::unique_ptr<ScopedGrpcServerStream>
 FtlMessagingClient::OpenReceiveMessagesStream(
+    base::OnceClosure on_channel_ready,
     const base::RepeatingCallback<void(const ftl::ReceiveMessagesResponse&)>&
         on_incoming_msg,
     base::OnceCallback<void(const grpc::Status&)> on_channel_closed) {
@@ -202,7 +203,8 @@
   auto grpc_request = CreateGrpcAsyncServerStreamingRequest(
       base::BindOnce(&Messaging::Stub::AsyncReceiveMessages,
                      base::Unretained(messaging_stub_.get())),
-      request, on_incoming_msg, std::move(on_channel_closed), &stream);
+      request, std::move(on_channel_ready), on_incoming_msg,
+      std::move(on_channel_closed), &stream);
   FtlGrpcContext::FillClientContext(grpc_request->context());
   executor_->ExecuteRpc(std::move(grpc_request));
   return stream;
diff --git a/remoting/signaling/ftl_messaging_client.h b/remoting/signaling/ftl_messaging_client.h
index 9001a6e5..1255515 100644
--- a/remoting/signaling/ftl_messaging_client.h
+++ b/remoting/signaling/ftl_messaging_client.h
@@ -68,6 +68,7 @@
                              const ftl::AckMessagesResponse& response);
 
   std::unique_ptr<ScopedGrpcServerStream> OpenReceiveMessagesStream(
+      base::OnceClosure on_channel_ready,
       const base::RepeatingCallback<void(const ftl::ReceiveMessagesResponse&)>&
           on_incoming_msg,
       base::OnceCallback<void(const grpc::Status&)> on_channel_closed);
diff --git a/remoting/signaling/ftl_messaging_client_unittest.cc b/remoting/signaling/ftl_messaging_client_unittest.cc
index ed59e91..f708975 100644
--- a/remoting/signaling/ftl_messaging_client_unittest.cc
+++ b/remoting/signaling/ftl_messaging_client_unittest.cc
@@ -487,8 +487,11 @@
         exit_runloop_when_called_twice.Get().Run();
       });
 
+  base::MockCallback<base::OnceClosure> on_channel_ready;
+  EXPECT_CALL(on_channel_ready, Run()).Times(1);
+
   scoped_stream = mock_message_reception_channel_->stream_opener()->Run(
-      mock_on_incoming_msg.Get(),
+      on_channel_ready.Get(), mock_on_incoming_msg.Get(),
       base::BindOnce([](const grpc::Status&) { NOTREACHED(); }));
 
   run_loop.Run();
diff --git a/remoting/signaling/message_reception_channel.h b/remoting/signaling/message_reception_channel.h
index 9807c6a..1b289d2 100644
--- a/remoting/signaling/message_reception_channel.h
+++ b/remoting/signaling/message_reception_channel.h
@@ -23,6 +23,7 @@
  public:
   using StreamOpener =
       base::RepeatingCallback<std::unique_ptr<ScopedGrpcServerStream>(
+          base::OnceClosure on_channel_ready,
           const base::RepeatingCallback<void(
               const ftl::ReceiveMessagesResponse&)>& on_incoming_msg,
           base::OnceCallback<void(const grpc::Status&)> on_channel_closed)>;
diff --git a/testing/buildbot/chromium.chrome.json b/testing/buildbot/chromium.chrome.json
index eaf3669..be68841 100644
--- a/testing/buildbot/chromium.chrome.json
+++ b/testing/buildbot/chromium.chrome.json
@@ -778,7 +778,6 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.browser_tests.filter"
         ],
-        "experiment_percentage": 100,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -800,7 +799,6 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.browser_tests.filter"
         ],
-        "experiment_percentage": 100,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/filters/chromeos.browser_tests.filter b/testing/buildbot/filters/chromeos.browser_tests.filter
index 0ce3eea..b869b1e5 100644
--- a/testing/buildbot/filters/chromeos.browser_tests.filter
+++ b/testing/buildbot/filters/chromeos.browser_tests.filter
@@ -38,6 +38,9 @@
 -SupervisionTransitionScreenTest.SuccessfulTransition/0
 -SupervisionTransitionScreenTest.TransitionTimeout/0
 
+# TODO(crbug.com/978051): Enable this.
+-TabManagerTestWithTwoTabs.TabProactiveDiscardAndFocusBeforeFreezeCompletes
+
 # TODO(crbug.com/977749): Enable this.
 -TestAsNormalAndGuestUser/SpokenFeedbackTest.OverviewMode/0
 -TestAsNormalAndGuestUser/SpokenFeedbackTest.OverviewMode/1
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 27dc8ae..71b247d0 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -93,7 +93,6 @@
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.browser_tests.filter',
         ],
-        'experiment_percentage': 100,
       },
       'linux-chromeos-oobe-code-coverage': {
         'swarming': {
@@ -1504,7 +1503,6 @@
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.browser_tests.filter',
         ],
-        'experiment_percentage': 100,
       },
       'linux-chromeos-oobe-code-coverage': {
         'swarming': {
diff --git a/testing/merge_scripts/code_coverage/merge_results.py b/testing/merge_scripts/code_coverage/merge_results.py
index b51135e5..afc2803 100755
--- a/testing/merge_scripts/code_coverage/merge_results.py
+++ b/testing/merge_scripts/code_coverage/merge_results.py
@@ -17,7 +17,6 @@
 import os
 import subprocess
 import sys
-import tempfile
 
 import merge_lib as coverage_merger
 
@@ -84,24 +83,6 @@
         params.output_json,
     ]
 
-    # TODO(crbug.com/960994): Without specifying an output directory, the layout
-    # merge script will use the CWD as the output directory and then tries to
-    # wipe out the content in that directory, and unfortunately, the CWD is a
-    # temporary directory that has been used to hold the coverage profdata, so
-    # without the following hack, the merge script will deletes all the profdata
-    # files and lead to build failures.
-    #
-    # This temporary workaround is only used for evaluating the stability of the
-    # linux-coverage-rel trybot, it should be removed before merging into
-    # linxu-rel as it's not reliable enough, for example, things could break if
-    # the name or arguments of the script are changed.
-    if params.additional_merge_script.endswith('merge_web_test_results.py'):
-      new_args.extend([
-        '--output-directory',
-        tempfile.mkdtemp(),
-        '--allow-existing-output-directory',
-      ])
-
     if params.additional_merge_script_args:
       new_args += json.loads(params.additional_merge_script_args)
 
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 14f9458..255bb01 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3051,25 +3051,6 @@
             ]
         }
     ],
-    "ModernMediaControls": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "UseModernMediaControls"
-                    ]
-                }
-            ]
-        }
-    ],
     "MojoChannel": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index c37fd3b5..65d7361 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: 8f11724067248acc330b4d1f12f0c76d03f2cfb1
+Revision: e9324d926a9189e222741fce6e676f0944661a72
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel
index 331030a..17d725c1 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -124,8 +124,10 @@
     linkopts = ABSL_DEFAULT_LINKOPTS,
     deps = [
         ":compressed_tuple",
+        "//absl/base:core_headers",
         "//absl/memory",
         "//absl/meta:type_traits",
+        "//absl/types:span",
     ],
 )
 
diff --git a/third_party/abseil-cpp/absl/container/BUILD.gn b/third_party/abseil-cpp/absl/container/BUILD.gn
index 5ae19c407..8ebbc7c 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.gn
+++ b/third_party/abseil-cpp/absl/container/BUILD.gn
@@ -62,8 +62,10 @@
   ]
   deps = [
     ":compressed_tuple",
+    "../base:core_headers",
     "../meta:type_traits",
     "../memory",
+    "../types:span",
   ]
 }
 
diff --git a/third_party/abseil-cpp/absl/container/CMakeLists.txt b/third_party/abseil-cpp/absl/container/CMakeLists.txt
index c75b0a2..6df331e1 100644
--- a/third_party/abseil-cpp/absl/container/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/container/CMakeLists.txt
@@ -124,7 +124,9 @@
     ${ABSL_DEFAULT_COPTS}
   DEPS
     absl::compressed_tuple
+    absl::core_headers
     absl::memory
+    absl::span
     absl::type_traits
   PUBLIC
 )
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h
index 046182d..10881b22 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -70,7 +70,16 @@
       N > 0, "InlinedVector cannot be instantiated with `0` inlined elements.");
 
   using Storage = inlined_vector_internal::Storage<T, N, A>;
+  using rvalue_reference = typename Storage::rvalue_reference;
+  using MoveIterator = typename Storage::MoveIterator;
   using AllocatorTraits = typename Storage::AllocatorTraits;
+  using IsMemcpyOk = typename Storage::IsMemcpyOk;
+
+  template <typename Iterator>
+  using IteratorValueAdapter =
+      typename Storage::template IteratorValueAdapter<Iterator>;
+  using CopyValueAdapter = typename Storage::CopyValueAdapter;
+  using DefaultValueAdapter = typename Storage::DefaultValueAdapter;
 
   template <typename Iterator>
   using EnableIfAtLeastForwardIterator = absl::enable_if_t<
@@ -80,8 +89,6 @@
   using DisableIfAtLeastForwardIterator = absl::enable_if_t<
       !inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value>;
 
-  using rvalue_reference = typename Storage::rvalue_reference;
-
  public:
   using allocator_type = typename Storage::allocator_type;
   using value_type = typename Storage::value_type;
@@ -111,34 +118,14 @@
   explicit InlinedVector(size_type n,
                          const allocator_type& alloc = allocator_type())
       : storage_(alloc) {
-    if (n > static_cast<size_type>(N)) {
-      pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), n);
-      storage_.SetAllocatedData(new_data, n);
-      UninitializedFill(storage_.GetAllocatedData(),
-                        storage_.GetAllocatedData() + n);
-      storage_.SetAllocatedSize(n);
-    } else {
-      UninitializedFill(storage_.GetInlinedData(),
-                        storage_.GetInlinedData() + n);
-      storage_.SetInlinedSize(n);
-    }
+    storage_.Initialize(DefaultValueAdapter(), n);
   }
 
   // Creates an inlined vector with `n` copies of `v`.
   InlinedVector(size_type n, const_reference v,
                 const allocator_type& alloc = allocator_type())
       : storage_(alloc) {
-    if (n > static_cast<size_type>(N)) {
-      pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), n);
-      storage_.SetAllocatedData(new_data, n);
-      UninitializedFill(storage_.GetAllocatedData(),
-                        storage_.GetAllocatedData() + n, v);
-      storage_.SetAllocatedSize(n);
-    } else {
-      UninitializedFill(storage_.GetInlinedData(),
-                        storage_.GetInlinedData() + n, v);
-      storage_.SetInlinedSize(n);
-    }
+    storage_.Initialize(CopyValueAdapter(v), n);
   }
 
   // Creates an inlined vector of copies of the values in `list`.
@@ -157,15 +144,8 @@
   InlinedVector(ForwardIterator first, ForwardIterator last,
                 const allocator_type& alloc = allocator_type())
       : storage_(alloc) {
-    auto length = std::distance(first, last);
-    reserve(size() + length);
-    if (storage_.GetIsAllocated()) {
-      UninitializedCopy(first, last, storage_.GetAllocatedData() + size());
-      storage_.SetAllocatedSize(size() + length);
-    } else {
-      UninitializedCopy(first, last, storage_.GetInlinedData() + size());
-      storage_.SetInlinedSize(size() + length);
-    }
+    storage_.Initialize(IteratorValueAdapter<ForwardIterator>(first),
+                        std::distance(first, last));
   }
 
   // Creates an inlined vector with elements constructed from the provided input
@@ -185,14 +165,11 @@
   // Creates a copy of an `other` inlined vector using a specified allocator.
   InlinedVector(const InlinedVector& other, const allocator_type& alloc)
       : storage_(alloc) {
-    reserve(other.size());
-    if (storage_.GetIsAllocated()) {
-      UninitializedCopy(other.begin(), other.end(),
-                        storage_.GetAllocatedData());
-      storage_.SetAllocatedSize(other.size());
+    if (IsMemcpyOk::value && !other.storage_.GetIsAllocated()) {
+      storage_.MemcpyFrom(other.storage_);
     } else {
-      UninitializedCopy(other.begin(), other.end(), storage_.GetInlinedData());
-      storage_.SetInlinedSize(other.size());
+      storage_.Initialize(IteratorValueAdapter<const_pointer>(other.data()),
+                          other.size());
     }
   }
 
@@ -215,20 +192,21 @@
       absl::allocator_is_nothrow<allocator_type>::value ||
       std::is_nothrow_move_constructible<value_type>::value)
       : storage_(*other.storage_.GetAllocPtr()) {
-    if (other.storage_.GetIsAllocated()) {
-      // We can just steal the underlying buffer from the source.
-      // That leaves the source empty, so we clear its size.
+    if (IsMemcpyOk::value) {
+      storage_.MemcpyFrom(other.storage_);
+      other.storage_.SetInlinedSize(0);
+    } else if (other.storage_.GetIsAllocated()) {
       storage_.SetAllocatedData(other.storage_.GetAllocatedData(),
                                 other.storage_.GetAllocatedCapacity());
-      storage_.SetAllocatedSize(other.size());
+      storage_.SetAllocatedSize(other.storage_.GetSize());
       other.storage_.SetInlinedSize(0);
     } else {
-      UninitializedCopy(
-          std::make_move_iterator(other.storage_.GetInlinedData()),
-          std::make_move_iterator(other.storage_.GetInlinedData() +
-                                  other.size()),
-          storage_.GetInlinedData());
-      storage_.SetInlinedSize(other.size());
+      IteratorValueAdapter<MoveIterator> other_values(
+          MoveIterator(other.storage_.GetInlinedData()));
+      inlined_vector_internal::ConstructElements(
+          storage_.GetAllocPtr(), storage_.GetInlinedData(), &other_values,
+          other.storage_.GetSize());
+      storage_.SetInlinedSize(other.storage_.GetSize());
     }
   }
 
@@ -248,28 +226,19 @@
   InlinedVector(InlinedVector&& other, const allocator_type& alloc) noexcept(
       absl::allocator_is_nothrow<allocator_type>::value)
       : storage_(alloc) {
-    if (other.storage_.GetIsAllocated()) {
-      if (*storage_.GetAllocPtr() == *other.storage_.GetAllocPtr()) {
-        // We can just steal the allocation from the source.
-        storage_.SetAllocatedSize(other.size());
-        storage_.SetAllocatedData(other.storage_.GetAllocatedData(),
-                                  other.storage_.GetAllocatedCapacity());
-        other.storage_.SetInlinedSize(0);
-      } else {
-        // We need to use our own allocator
-        reserve(other.size());
-        UninitializedCopy(std::make_move_iterator(other.begin()),
-                          std::make_move_iterator(other.end()),
-                          storage_.GetAllocatedData());
-        storage_.SetAllocatedSize(other.size());
-      }
+    if (IsMemcpyOk::value) {
+      storage_.MemcpyFrom(other.storage_);
+      other.storage_.SetInlinedSize(0);
+    } else if ((*storage_.GetAllocPtr() == *other.storage_.GetAllocPtr()) &&
+               other.storage_.GetIsAllocated()) {
+      storage_.SetAllocatedData(other.storage_.GetAllocatedData(),
+                                other.storage_.GetAllocatedCapacity());
+      storage_.SetAllocatedSize(other.storage_.GetSize());
+      other.storage_.SetInlinedSize(0);
     } else {
-      UninitializedCopy(
-          std::make_move_iterator(other.storage_.GetInlinedData()),
-          std::make_move_iterator(other.storage_.GetInlinedData() +
-                                  other.size()),
-          storage_.GetInlinedData());
-      storage_.SetInlinedSize(other.size());
+      storage_.Initialize(
+          IteratorValueAdapter<MoveIterator>(MoveIterator(other.data())),
+          other.size());
     }
   }
 
@@ -495,26 +464,22 @@
   InlinedVector& operator=(InlinedVector&& other) {
     if (ABSL_PREDICT_FALSE(this == std::addressof(other))) return *this;
 
-    if (other.storage_.GetIsAllocated()) {
-      clear();
-      storage_.SetAllocatedSize(other.size());
-      storage_.SetAllocatedData(other.storage_.GetAllocatedData(),
-                                other.storage_.GetAllocatedCapacity());
+    if (IsMemcpyOk::value || other.storage_.GetIsAllocated()) {
+      inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), data(),
+                                               size());
+      if (storage_.GetIsAllocated()) {
+        AllocatorTraits::deallocate(*storage_.GetAllocPtr(),
+                                    storage_.GetAllocatedData(),
+                                    storage_.GetAllocatedCapacity());
+      }
+      storage_.MemcpyFrom(other.storage_);
       other.storage_.SetInlinedSize(0);
     } else {
-      if (storage_.GetIsAllocated()) clear();
-      // Both are inlined now.
-      if (size() < other.size()) {
-        auto mid = std::make_move_iterator(other.begin() + size());
-        std::copy(std::make_move_iterator(other.begin()), mid, begin());
-        UninitializedCopy(mid, std::make_move_iterator(other.end()), end());
-      } else {
-        auto new_end = std::copy(std::make_move_iterator(other.begin()),
-                                 std::make_move_iterator(other.end()), begin());
-        Destroy(new_end, end());
-      }
-      storage_.SetInlinedSize(other.size());
+      storage_.Assign(IteratorValueAdapter<MoveIterator>(
+                          MoveIterator(other.storage_.GetInlinedData())),
+                      other.size());
     }
+
     return *this;
   }
 
@@ -522,23 +487,7 @@
   //
   // Replaces the contents of the inlined vector with `n` copies of `v`.
   void assign(size_type n, const_reference v) {
-    if (n <= size()) {  // Possibly shrink
-      std::fill_n(begin(), n, v);
-      erase(begin() + n, end());
-      return;
-    }
-    // Grow
-    reserve(n);
-    std::fill_n(begin(), size(), v);
-    if (storage_.GetIsAllocated()) {
-      UninitializedFill(storage_.GetAllocatedData() + size(),
-                        storage_.GetAllocatedData() + n, v);
-      storage_.SetAllocatedSize(n);
-    } else {
-      UninitializedFill(storage_.GetInlinedData() + size(),
-                        storage_.GetInlinedData() + n, v);
-      storage_.SetInlinedSize(n);
-    }
+    storage_.Assign(CopyValueAdapter(v), n);
   }
 
   // Overload of `InlinedVector::assign()` to replace the contents of the
@@ -553,24 +502,8 @@
   template <typename ForwardIterator,
             EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
   void assign(ForwardIterator first, ForwardIterator last) {
-    auto length = std::distance(first, last);
-
-    // Prefer reassignment to copy construction for elements.
-    if (static_cast<size_type>(length) <= size()) {
-      erase(std::copy(first, last, begin()), end());
-      return;
-    }
-
-    reserve(length);
-    iterator out = begin();
-    for (; out != end(); ++first, ++out) *out = *first;
-    if (storage_.GetIsAllocated()) {
-      UninitializedCopy(first, last, out);
-      storage_.SetAllocatedSize(length);
-    } else {
-      UninitializedCopy(first, last, out);
-      storage_.SetInlinedSize(length);
-    }
+    storage_.Assign(IteratorValueAdapter<ForwardIterator>(first),
+                    std::distance(first, last));
   }
 
   // Overload of `InlinedVector::assign()` to replace the contents of the
@@ -655,7 +588,15 @@
   // of `v` starting at `pos`. Returns an `iterator` pointing to the first of
   // the newly inserted elements.
   iterator insert(const_iterator pos, size_type n, const_reference v) {
-    return InsertWithCount(pos, n, v);
+    assert(pos >= begin() && pos <= end());
+    if (ABSL_PREDICT_FALSE(n == 0)) {
+      return const_cast<iterator>(pos);
+    }
+    value_type copy = v;
+    std::pair<iterator, iterator> it_pair = ShiftRight(pos, n);
+    std::fill(it_pair.first, it_pair.second, copy);
+    UninitializedFill(it_pair.second, it_pair.first + n, copy);
+    return it_pair.first;
   }
 
   // Overload of `InlinedVector::insert()` for copying the contents of the
@@ -675,7 +616,17 @@
             EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
   iterator insert(const_iterator pos, ForwardIterator first,
                   ForwardIterator last) {
-    return InsertWithForwardRange(pos, first, last);
+    assert(pos >= begin() && pos <= end());
+    if (ABSL_PREDICT_FALSE(first == last)) {
+      return const_cast<iterator>(pos);
+    }
+    auto n = std::distance(first, last);
+    std::pair<iterator, iterator> it_pair = ShiftRight(pos, n);
+    size_type used_spots = it_pair.second - it_pair.first;
+    auto open_spot = std::next(first, used_spots);
+    std::copy(first, open_spot, it_pair.first);
+    UninitializedCopy(open_spot, last, it_pair.second);
+    return it_pair.first;
   }
 
   // Overload of `InlinedVector::insert()` for inserting elements constructed
@@ -727,17 +678,26 @@
   reference emplace_back(Args&&... args) {
     size_type s = size();
     if (ABSL_PREDICT_FALSE(s == capacity())) {
-      return GrowAndEmplaceBack(std::forward<Args>(args)...);
-    }
-    pointer space;
-    if (storage_.GetIsAllocated()) {
-      storage_.SetAllocatedSize(s + 1);
-      space = storage_.GetAllocatedData();
+      size_type new_capacity = 2 * capacity();
+      pointer new_data =
+          AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
+      reference new_element =
+          Construct(new_data + s, std::forward<Args>(args)...);
+      UninitializedCopy(std::make_move_iterator(data()),
+                        std::make_move_iterator(data() + s), new_data);
+      ResetAllocation(new_data, new_capacity, s + 1);
+      return new_element;
     } else {
-      storage_.SetInlinedSize(s + 1);
-      space = storage_.GetInlinedData();
+      pointer space;
+      if (storage_.GetIsAllocated()) {
+        storage_.SetAllocatedSize(s + 1);
+        space = storage_.GetAllocatedData();
+      } else {
+        storage_.SetInlinedSize(s + 1);
+        space = storage_.GetInlinedData();
+      }
+      return Construct(space + s, std::forward<Args>(args)...);
     }
-    return Construct(space + s, std::forward<Args>(args)...);
   }
 
   // `InlinedVector::push_back()`
@@ -757,15 +717,8 @@
   // by `1` (unless the inlined vector is empty, in which case this is a no-op).
   void pop_back() noexcept {
     assert(!empty());
-    size_type s = size();
-    if (storage_.GetIsAllocated()) {
-      Destroy(storage_.GetAllocatedData() + s - 1,
-              storage_.GetAllocatedData() + s);
-      storage_.SetAllocatedSize(s - 1);
-    } else {
-      Destroy(storage_.GetInlinedData() + s - 1, storage_.GetInlinedData() + s);
-      storage_.SetInlinedSize(s - 1);
-    }
+    AllocatorTraits::destroy(*storage_.GetAllocPtr(), data() + (size() - 1));
+    storage_.SubtractSize(1);
   }
 
   // `InlinedVector::erase()`
@@ -832,10 +785,20 @@
   // effects. Otherwise, `reserve()` will reallocate, performing an n-time
   // element-wise move of everything contained.
   void reserve(size_type n) {
-    if (n > capacity()) {
-      // Make room for new elements
-      EnlargeBy(n - size());
+    if (n <= capacity()) {
+      return;
     }
+    const size_type s = size();
+    size_type target = (std::max)(static_cast<size_type>(N), n);
+    size_type new_capacity = capacity();
+    while (new_capacity < target) {
+      new_capacity <<= 1;
+    }
+    pointer new_data =
+        AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
+    UninitializedCopy(std::make_move_iterator(data()),
+                      std::make_move_iterator(data() + s), new_data);
+    ResetAllocation(new_data, new_capacity, s);
   }
 
   // `InlinedVector::shrink_to_fit()`
@@ -850,240 +813,21 @@
   // If `size() > N` and `size() < capacity()` the elements will be moved to a
   // smaller heap allocation.
   void shrink_to_fit() {
-    const auto s = size();
-    if (ABSL_PREDICT_FALSE(!storage_.GetIsAllocated() || s == capacity()))
-      return;
-
-    if (s <= N) {
-      // Move the elements to the inlined storage.
-      // We have to do this using a temporary, because `inlined_storage` and
-      // `allocation_storage` are in a union field.
-      auto temp = std::move(*this);
-      assign(std::make_move_iterator(temp.begin()),
-             std::make_move_iterator(temp.end()));
-      return;
+    if (storage_.GetIsAllocated()) {
+      storage_.ShrinkToFit();
     }
-
-    // Reallocate storage and move elements.
-    // We can't simply use the same approach as above, because `assign()` would
-    // call into `reserve()` internally and reserve larger capacity than we need
-    pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), s);
-    UninitializedCopy(std::make_move_iterator(storage_.GetAllocatedData()),
-                      std::make_move_iterator(storage_.GetAllocatedData() + s),
-                      new_data);
-    ResetAllocation(new_data, s, s);
   }
 
   // `InlinedVector::swap()`
   //
   // Swaps the contents of this inlined vector with the contents of `other`.
   void swap(InlinedVector& other) {
-    if (ABSL_PREDICT_FALSE(this == std::addressof(other))) return;
-
-    SwapImpl(other);
-  }
-
- private:
-  template <typename H, typename TheT, size_t TheN, typename TheA>
-  friend H AbslHashValue(H h, const absl::InlinedVector<TheT, TheN, TheA>& a);
-
-  void ResetAllocation(pointer new_data, size_type new_capacity,
-                       size_type new_size) {
-    if (storage_.GetIsAllocated()) {
-      Destroy(storage_.GetAllocatedData(),
-              storage_.GetAllocatedData() + size());
-      assert(begin() == storage_.GetAllocatedData());
-      AllocatorTraits::deallocate(*storage_.GetAllocPtr(),
-                                  storage_.GetAllocatedData(),
-                                  storage_.GetAllocatedCapacity());
-    } else {
-      Destroy(storage_.GetInlinedData(), storage_.GetInlinedData() + size());
-    }
-
-    storage_.SetAllocatedData(new_data, new_capacity);
-    storage_.SetAllocatedSize(new_size);
-  }
-
-  template <typename... Args>
-  reference Construct(pointer p, Args&&... args) {
-    absl::allocator_traits<allocator_type>::construct(
-        *storage_.GetAllocPtr(), p, std::forward<Args>(args)...);
-    return *p;
-  }
-
-  template <typename Iterator>
-  void UninitializedCopy(Iterator src, Iterator src_last, pointer dst) {
-    for (; src != src_last; ++dst, ++src) Construct(dst, *src);
-  }
-
-  template <typename... Args>
-  void UninitializedFill(pointer dst, pointer dst_last, const Args&... args) {
-    for (; dst != dst_last; ++dst) Construct(dst, args...);
-  }
-
-  // Destroy [`from`, `to`) in place.
-  void Destroy(pointer from, pointer to) {
-    for (pointer cur = from; cur != to; ++cur) {
-      absl::allocator_traits<allocator_type>::destroy(*storage_.GetAllocPtr(),
-                                                      cur);
-    }
-#if !defined(NDEBUG)
-    // Overwrite unused memory with `0xab` so we can catch uninitialized usage.
-    // Cast to `void*` to tell the compiler that we don't care that we might be
-    // scribbling on a vtable pointer.
-    if (from != to) {
-      auto len = sizeof(value_type) * std::distance(from, to);
-      std::memset(reinterpret_cast<void*>(from), 0xab, len);
-    }
-#endif  // !defined(NDEBUG)
-  }
-
-  // Enlarge the underlying representation so we can store `size_ + delta` elems
-  // in allocated space. The size is not changed, and any newly added memory is
-  // not initialized.
-  void EnlargeBy(size_type delta) {
-    const size_type s = size();
-    assert(s <= capacity());
-
-    size_type target = (std::max)(static_cast<size_type>(N), s + delta);
-
-    // Compute new capacity by repeatedly doubling current capacity
-    // TODO(psrc): Check and avoid overflow?
-    size_type new_capacity = capacity();
-    while (new_capacity < target) {
-      new_capacity <<= 1;
-    }
-
-    pointer new_data =
-        AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
-
-    UninitializedCopy(std::make_move_iterator(data()),
-                      std::make_move_iterator(data() + s), new_data);
-
-    ResetAllocation(new_data, new_capacity, s);
-  }
-
-  // Shift all elements from `position` to `end()` by `n` places to the right.
-  // If the vector needs to be enlarged, memory will be allocated.
-  // Returns `iterator`s pointing to the start of the previously-initialized
-  // portion and the start of the uninitialized portion of the created gap.
-  // The number of initialized spots is `pair.second - pair.first`. The number
-  // of raw spots is `n - (pair.second - pair.first)`.
-  //
-  // Updates the size of the InlinedVector internally.
-  std::pair<iterator, iterator> ShiftRight(const_iterator position,
-                                           size_type n) {
-    iterator start_used = const_cast<iterator>(position);
-    iterator start_raw = const_cast<iterator>(position);
-    size_type s = size();
-    size_type required_size = s + n;
-
-    if (required_size > capacity()) {
-      // Compute new capacity by repeatedly doubling current capacity
-      size_type new_capacity = capacity();
-      while (new_capacity < required_size) {
-        new_capacity <<= 1;
-      }
-      // Move everyone into the new allocation, leaving a gap of `n` for the
-      // requested shift.
-      pointer new_data =
-          AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
-      size_type index = position - begin();
-      UninitializedCopy(std::make_move_iterator(data()),
-                        std::make_move_iterator(data() + index), new_data);
-      UninitializedCopy(std::make_move_iterator(data() + index),
-                        std::make_move_iterator(data() + s),
-                        new_data + index + n);
-      ResetAllocation(new_data, new_capacity, s);
-
-      // New allocation means our iterator is invalid, so we'll recalculate.
-      // Since the entire gap is in new space, there's no used space to reuse.
-      start_raw = begin() + index;
-      start_used = start_raw;
-    } else {
-      // If we had enough space, it's a two-part move. Elements going into
-      // previously-unoccupied space need an `UninitializedCopy()`. Elements
-      // going into a previously-occupied space are just a `std::move()`.
-      iterator pos = const_cast<iterator>(position);
-      iterator raw_space = end();
-      size_type slots_in_used_space = raw_space - pos;
-      size_type new_elements_in_used_space = (std::min)(n, slots_in_used_space);
-      size_type new_elements_in_raw_space = n - new_elements_in_used_space;
-      size_type old_elements_in_used_space =
-          slots_in_used_space - new_elements_in_used_space;
-
-      UninitializedCopy(
-          std::make_move_iterator(pos + old_elements_in_used_space),
-          std::make_move_iterator(raw_space),
-          raw_space + new_elements_in_raw_space);
-      std::move_backward(pos, pos + old_elements_in_used_space, raw_space);
-
-      // If the gap is entirely in raw space, the used space starts where the
-      // raw space starts, leaving no elements in used space. If the gap is
-      // entirely in used space, the raw space starts at the end of the gap,
-      // leaving all elements accounted for within the used space.
-      start_used = pos;
-      start_raw = pos + new_elements_in_used_space;
-    }
-    storage_.AddSize(n);
-    return std::make_pair(start_used, start_raw);
-  }
-
-  template <typename... Args>
-  reference GrowAndEmplaceBack(Args&&... args) {
-    assert(size() == capacity());
-    const size_type s = size();
-
-    size_type new_capacity = 2 * capacity();
-    pointer new_data =
-        AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
-
-    reference new_element =
-        Construct(new_data + s, std::forward<Args>(args)...);
-    UninitializedCopy(std::make_move_iterator(data()),
-                      std::make_move_iterator(data() + s), new_data);
-
-    ResetAllocation(new_data, new_capacity, s + 1);
-
-    return new_element;
-  }
-
-  iterator InsertWithCount(const_iterator position, size_type n,
-                           const_reference v) {
-    assert(position >= begin() && position <= end());
-    if (ABSL_PREDICT_FALSE(n == 0)) return const_cast<iterator>(position);
-
-    value_type copy = v;
-    std::pair<iterator, iterator> it_pair = ShiftRight(position, n);
-    std::fill(it_pair.first, it_pair.second, copy);
-    UninitializedFill(it_pair.second, it_pair.first + n, copy);
-
-    return it_pair.first;
-  }
-
-  template <typename ForwardIt>
-  iterator InsertWithForwardRange(const_iterator position, ForwardIt first,
-                                  ForwardIt last) {
-    static_assert(absl::inlined_vector_internal::IsAtLeastForwardIterator<
-                      ForwardIt>::value,
-                  "");
-    assert(position >= begin() && position <= end());
-
-    if (ABSL_PREDICT_FALSE(first == last))
-      return const_cast<iterator>(position);
-
-    auto n = std::distance(first, last);
-    std::pair<iterator, iterator> it_pair = ShiftRight(position, n);
-    size_type used_spots = it_pair.second - it_pair.first;
-    auto open_spot = std::next(first, used_spots);
-    std::copy(first, open_spot, it_pair.first);
-    UninitializedCopy(open_spot, last, it_pair.second);
-    return it_pair.first;
-  }
-
-  void SwapImpl(InlinedVector& other) {
     using std::swap;
 
+    if (ABSL_PREDICT_FALSE(this == std::addressof(other))) {
+      return;
+    }
+
     bool is_allocated = storage_.GetIsAllocated();
     bool other_is_allocated = other.storage_.GetIsAllocated();
 
@@ -1170,6 +914,127 @@
     assert(a->size() == b_size);
   }
 
+ private:
+  template <typename H, typename TheT, size_t TheN, typename TheA>
+  friend H AbslHashValue(H h, const absl::InlinedVector<TheT, TheN, TheA>& a);
+
+  void ResetAllocation(pointer new_data, size_type new_capacity,
+                       size_type new_size) {
+    if (storage_.GetIsAllocated()) {
+      Destroy(storage_.GetAllocatedData(),
+              storage_.GetAllocatedData() + size());
+      assert(begin() == storage_.GetAllocatedData());
+      AllocatorTraits::deallocate(*storage_.GetAllocPtr(),
+                                  storage_.GetAllocatedData(),
+                                  storage_.GetAllocatedCapacity());
+    } else {
+      Destroy(storage_.GetInlinedData(), storage_.GetInlinedData() + size());
+    }
+
+    storage_.SetAllocatedData(new_data, new_capacity);
+    storage_.SetAllocatedSize(new_size);
+  }
+
+  template <typename... Args>
+  reference Construct(pointer p, Args&&... args) {
+    absl::allocator_traits<allocator_type>::construct(
+        *storage_.GetAllocPtr(), p, std::forward<Args>(args)...);
+    return *p;
+  }
+
+  template <typename Iterator>
+  void UninitializedCopy(Iterator src, Iterator src_last, pointer dst) {
+    for (; src != src_last; ++dst, ++src) Construct(dst, *src);
+  }
+
+  template <typename... Args>
+  void UninitializedFill(pointer dst, pointer dst_last, const Args&... args) {
+    for (; dst != dst_last; ++dst) Construct(dst, args...);
+  }
+
+  // Destroy [`from`, `to`) in place.
+  void Destroy(pointer from, pointer to) {
+    for (pointer cur = from; cur != to; ++cur) {
+      absl::allocator_traits<allocator_type>::destroy(*storage_.GetAllocPtr(),
+                                                      cur);
+    }
+#if !defined(NDEBUG)
+    // Overwrite unused memory with `0xab` so we can catch uninitialized usage.
+    // Cast to `void*` to tell the compiler that we don't care that we might be
+    // scribbling on a vtable pointer.
+    if (from != to) {
+      auto len = sizeof(value_type) * std::distance(from, to);
+      std::memset(reinterpret_cast<void*>(from), 0xab, len);
+    }
+#endif  // !defined(NDEBUG)
+  }
+
+  // Shift all elements from `position` to `end()` by `n` places to the right.
+  // If the vector needs to be enlarged, memory will be allocated.
+  // Returns `iterator`s pointing to the start of the previously-initialized
+  // portion and the start of the uninitialized portion of the created gap.
+  // The number of initialized spots is `pair.second - pair.first`. The number
+  // of raw spots is `n - (pair.second - pair.first)`.
+  //
+  // Updates the size of the InlinedVector internally.
+  std::pair<iterator, iterator> ShiftRight(const_iterator position,
+                                           size_type n) {
+    iterator start_used = const_cast<iterator>(position);
+    iterator start_raw = const_cast<iterator>(position);
+    size_type s = size();
+    size_type required_size = s + n;
+
+    if (required_size > capacity()) {
+      // Compute new capacity by repeatedly doubling current capacity
+      size_type new_capacity = capacity();
+      while (new_capacity < required_size) {
+        new_capacity <<= 1;
+      }
+      // Move everyone into the new allocation, leaving a gap of `n` for the
+      // requested shift.
+      pointer new_data =
+          AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
+      size_type index = position - begin();
+      UninitializedCopy(std::make_move_iterator(data()),
+                        std::make_move_iterator(data() + index), new_data);
+      UninitializedCopy(std::make_move_iterator(data() + index),
+                        std::make_move_iterator(data() + s),
+                        new_data + index + n);
+      ResetAllocation(new_data, new_capacity, s);
+
+      // New allocation means our iterator is invalid, so we'll recalculate.
+      // Since the entire gap is in new space, there's no used space to reuse.
+      start_raw = begin() + index;
+      start_used = start_raw;
+    } else {
+      // If we had enough space, it's a two-part move. Elements going into
+      // previously-unoccupied space need an `UninitializedCopy()`. Elements
+      // going into a previously-occupied space are just a `std::move()`.
+      iterator pos = const_cast<iterator>(position);
+      iterator raw_space = end();
+      size_type slots_in_used_space = raw_space - pos;
+      size_type new_elements_in_used_space = (std::min)(n, slots_in_used_space);
+      size_type new_elements_in_raw_space = n - new_elements_in_used_space;
+      size_type old_elements_in_used_space =
+          slots_in_used_space - new_elements_in_used_space;
+
+      UninitializedCopy(
+          std::make_move_iterator(pos + old_elements_in_used_space),
+          std::make_move_iterator(raw_space),
+          raw_space + new_elements_in_raw_space);
+      std::move_backward(pos, pos + old_elements_in_used_space, raw_space);
+
+      // If the gap is entirely in raw space, the used space starts where the
+      // raw space starts, leaving no elements in used space. If the gap is
+      // entirely in used space, the raw space starts at the end of the gap,
+      // leaving all elements accounted for within the used space.
+      start_used = pos;
+      start_raw = pos + new_elements_in_used_space;
+    }
+    storage_.AddSize(n);
+    return std::make_pair(start_used, start_raw);
+  }
+
   Storage storage_;
 };
 
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc b/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
index a8368d4..b99bbd6 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
@@ -383,6 +383,12 @@
   BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize);        \
   BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize)
 
+#define ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_FunctionTemplate, T)      \
+  BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize, kLargeSize); \
+  BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize, kSmallSize); \
+  BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize, kLargeSize); \
+  BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize, kSmallSize)
+
 template <typename T>
 using InlVec = absl::InlinedVector<T, kInlinedCapacity>;
 
@@ -525,6 +531,214 @@
 ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromMove, TrivialType);
 ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromMove, NontrivialType);
 
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_AssignSizeRef(benchmark::State& state) {
+  auto size = ToSize;
+  auto ref = T();
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */ [](InlVec<T>* vec, size_t) { vec->resize(FromSize); },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(size);
+        benchmark::DoNotOptimize(ref);
+        vec->assign(size, ref);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignSizeRef, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignSizeRef, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_AssignRange(benchmark::State& state) {
+  std::array<T, ToSize> arr{};
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */ [](InlVec<T>* vec, size_t) { vec->resize(FromSize); },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(arr);
+        vec->assign(arr.begin(), arr.end());
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignRange, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignRange, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_AssignFromCopy(benchmark::State& state) {
+  InlVec<T> other_vec(ToSize);
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */ [](InlVec<T>* vec, size_t) { vec->resize(FromSize); },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(other_vec);
+        *vec = other_vec;
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromCopy, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromCopy, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_AssignFromMove(benchmark::State& state) {
+  using VecT = InlVec<T>;
+  std::array<VecT, kBatchSize> vector_batch{};
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [&](InlVec<T>* vec, size_t i) {
+        vector_batch[i].clear();
+        vector_batch[i].resize(ToSize);
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t i) {
+        benchmark::DoNotOptimize(vector_batch[i]);
+        *vec = std::move(vector_batch[i]);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromMove, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromMove, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_ResizeSize(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) { vec->resize(ToSize); });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSize, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSize, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_ResizeSizeRef(benchmark::State& state) {
+  auto t = T();
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(t);
+        vec->resize(ToSize, t);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSizeRef, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSizeRef, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_InsertSizeRef(benchmark::State& state) {
+  auto t = T();
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(t);
+        auto* pos = vec->data() + (vec->size() / 2);
+        vec->insert(pos, t);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertSizeRef, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertSizeRef, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_InsertRange(benchmark::State& state) {
+  InlVec<T> other_vec(ToSize);
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t) {
+        benchmark::DoNotOptimize(other_vec);
+        auto* pos = vec->data() + (vec->size() / 2);
+        vec->insert(pos, other_vec.begin(), other_vec.end());
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertRange, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertRange, NontrivialType);
+
+template <typename T, size_t FromSize>
+void BM_EmplaceBack(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) { vec->emplace_back(); });
+}
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EmplaceBack, TrivialType);
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EmplaceBack, NontrivialType);
+
+template <typename T, size_t FromSize>
+void BM_PopBack(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) { vec->pop_back(); });
+}
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_PopBack, TrivialType);
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_PopBack, NontrivialType);
+
+template <typename T, size_t FromSize>
+void BM_EraseOne(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) {
+        auto* pos = vec->data() + (vec->size() / 2);
+        vec->erase(pos);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseOne, TrivialType);
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseOne, NontrivialType);
+
+template <typename T, size_t FromSize>
+void BM_EraseRange(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) {
+        auto* pos = vec->data() + (vec->size() / 2);
+        vec->erase(pos, pos + 1);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseRange, TrivialType);
+ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseRange, NontrivialType);
+
 template <typename T, size_t FromSize>
 void BM_Clear(benchmark::State& state) {
   BatchedBenchmark<T>(
@@ -535,4 +749,56 @@
 ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_Clear, TrivialType);
 ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_Clear, NontrivialType);
 
+template <typename T, size_t FromSize, size_t ToCapacity>
+void BM_Reserve(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [](InlVec<T>* vec, size_t) { vec->reserve(ToCapacity); });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Reserve, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Reserve, NontrivialType);
+
+template <typename T, size_t FromCapacity, size_t ToCapacity>
+void BM_ShrinkToFit(benchmark::State& state) {
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [](InlVec<T>* vec, size_t) {
+        vec->clear();
+        vec->resize(ToCapacity);
+        vec->reserve(FromCapacity);
+      },
+      /* test_vec = */ [](InlVec<T>* vec, size_t) { vec->shrink_to_fit(); });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ShrinkToFit, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ShrinkToFit, NontrivialType);
+
+template <typename T, size_t FromSize, size_t ToSize>
+void BM_Swap(benchmark::State& state) {
+  using VecT = InlVec<T>;
+  std::array<VecT, kBatchSize> vector_batch{};
+  BatchedBenchmark<T>(
+      state,
+      /* prepare_vec = */
+      [&](InlVec<T>* vec, size_t i) {
+        vector_batch[i].clear();
+        vector_batch[i].resize(ToSize);
+        vec->resize(FromSize);
+      },
+      /* test_vec = */
+      [&](InlVec<T>* vec, size_t i) {
+        using std::swap;
+        benchmark::DoNotOptimize(vector_batch[i]);
+        swap(*vec, vector_batch[i]);
+      });
+}
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Swap, TrivialType);
+ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Swap, NontrivialType);
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc b/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc
index 1aae0b0..e7c47127 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc
@@ -12,7 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <array>
+#include <initializer_list>
+#include <iterator>
 #include <memory>
+#include <utility>
 
 #include "gtest/gtest.h"
 #include "absl/base/internal/exception_safety_testing.h"
@@ -36,6 +40,26 @@
 using ThrowAllocMovableThrowerVec =
     absl::InlinedVector<MovableThrower, kInlinedCapacity, ThrowAlloc>;
 
+// In GCC, if an element of a `std::initializer_list` throws during construction
+// the elements that were constructed before it are not destroyed. This causes
+// incorrect exception safety test failures. Thus, `testing::nothrow_ctor` is
+// required. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139
+#define ABSL_INTERNAL_MAKE_INIT_LIST(T, N)                     \
+  (N > kInlinedCapacity                                        \
+       ? std::initializer_list<T>{T(0, testing::nothrow_ctor), \
+                                  T(1, testing::nothrow_ctor), \
+                                  T(2, testing::nothrow_ctor), \
+                                  T(3, testing::nothrow_ctor), \
+                                  T(4, testing::nothrow_ctor), \
+                                  T(5, testing::nothrow_ctor), \
+                                  T(6, testing::nothrow_ctor), \
+                                  T(7, testing::nothrow_ctor)} \
+                                                               \
+       : std::initializer_list<T>{T(0, testing::nothrow_ctor), \
+                                  T(1, testing::nothrow_ctor)})
+static_assert((kLargeSize == 8 || kSmallSize == 2),
+              "Must update ABSL_INTERNAL_MAKE_INIT_LIST(...).");
+
 template <typename TheVecT, size_t... TheSizes>
 class TestParams {
  public:
@@ -61,6 +85,24 @@
                      TestParams<ThrowAllocMovableThrowerVec, kLargeSize>,
                      TestParams<ThrowAllocMovableThrowerVec, kSmallSize>>;
 
+using TwoSizeTestParams = ::testing::Types<
+    TestParams<ThrowerVec, kLargeSize, kLargeSize>,
+    TestParams<ThrowerVec, kLargeSize, kSmallSize>,
+    TestParams<ThrowerVec, kSmallSize, kLargeSize>,
+    TestParams<ThrowerVec, kSmallSize, kSmallSize>,
+    TestParams<MovableThrowerVec, kLargeSize, kLargeSize>,
+    TestParams<MovableThrowerVec, kLargeSize, kSmallSize>,
+    TestParams<MovableThrowerVec, kSmallSize, kLargeSize>,
+    TestParams<MovableThrowerVec, kSmallSize, kSmallSize>,
+    TestParams<ThrowAllocThrowerVec, kLargeSize, kLargeSize>,
+    TestParams<ThrowAllocThrowerVec, kLargeSize, kSmallSize>,
+    TestParams<ThrowAllocThrowerVec, kSmallSize, kLargeSize>,
+    TestParams<ThrowAllocThrowerVec, kSmallSize, kSmallSize>,
+    TestParams<ThrowAllocMovableThrowerVec, kLargeSize, kLargeSize>,
+    TestParams<ThrowAllocMovableThrowerVec, kLargeSize, kSmallSize>,
+    TestParams<ThrowAllocMovableThrowerVec, kSmallSize, kLargeSize>,
+    TestParams<ThrowAllocMovableThrowerVec, kSmallSize, kSmallSize>>;
+
 template <typename>
 struct NoSizeTest : ::testing::Test {};
 TYPED_TEST_SUITE(NoSizeTest, NoSizeTestParams);
@@ -69,6 +111,25 @@
 struct OneSizeTest : ::testing::Test {};
 TYPED_TEST_SUITE(OneSizeTest, OneSizeTestParams);
 
+template <typename>
+struct TwoSizeTest : ::testing::Test {};
+TYPED_TEST_SUITE(TwoSizeTest, TwoSizeTestParams);
+
+template <typename VecT>
+bool InlinedVectorInvariants(VecT* vec) {
+  if (*vec != *vec) return false;
+  if (vec->size() > vec->capacity()) return false;
+  if (vec->size() > vec->max_size()) return false;
+  if (vec->capacity() > vec->max_size()) return false;
+  if (vec->data() != std::addressof(vec->at(0))) return false;
+  if (vec->data() != vec->begin()) return false;
+  if (*vec->data() != *vec->begin()) return false;
+  if (vec->begin() > vec->end()) return false;
+  if ((vec->end() - vec->begin()) != vec->size()) return false;
+  if (std::distance(vec->begin(), vec->end()) != vec->size()) return false;
+  return true;
+}
+
 // Function that always returns false is correct, but refactoring is required
 // for clarity. It's needed to express that, as a contract, certain operations
 // should not throw at all. Execution of this function means an exception was
@@ -88,6 +149,129 @@
   testing::TestThrowingCtor<VecT>(allocator_type{});
 }
 
+TYPED_TEST(OneSizeTest, SizeConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  testing::TestThrowingCtor<VecT>(size);
+
+  testing::TestThrowingCtor<VecT>(size, allocator_type{});
+}
+
+TYPED_TEST(OneSizeTest, SizeRefConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using value_type = typename VecT::value_type;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  testing::TestThrowingCtor<VecT>(size, value_type{});
+
+  testing::TestThrowingCtor<VecT>(size, value_type{}, allocator_type{});
+}
+
+TYPED_TEST(OneSizeTest, InitializerListConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using value_type = typename VecT::value_type;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  testing::TestThrowingCtor<VecT>(
+      ABSL_INTERNAL_MAKE_INIT_LIST(value_type, size));
+
+  testing::TestThrowingCtor<VecT>(
+      ABSL_INTERNAL_MAKE_INIT_LIST(value_type, size), allocator_type{});
+}
+
+TYPED_TEST(OneSizeTest, RangeConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using value_type = typename VecT::value_type;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  std::array<value_type, size> arr{};
+
+  testing::TestThrowingCtor<VecT>(arr.begin(), arr.end());
+
+  testing::TestThrowingCtor<VecT>(arr.begin(), arr.end(), allocator_type{});
+}
+
+TYPED_TEST(OneSizeTest, CopyConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  VecT other_vec{size};
+
+  testing::TestThrowingCtor<VecT>(other_vec);
+
+  testing::TestThrowingCtor<VecT>(other_vec, allocator_type{});
+}
+
+TYPED_TEST(OneSizeTest, MoveConstructor) {
+  using VecT = typename TypeParam::VecT;
+  using allocator_type = typename VecT::allocator_type;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  if (!absl::allocator_is_nothrow<allocator_type>::value) {
+    testing::TestThrowingCtor<VecT>(VecT{size});
+
+    testing::TestThrowingCtor<VecT>(VecT{size}, allocator_type{});
+  }
+}
+
+TYPED_TEST(TwoSizeTest, Assign) {
+  using VecT = typename TypeParam::VecT;
+  using value_type = typename VecT::value_type;
+  constexpr static auto from_size = TypeParam::GetSizeAt(0);
+  constexpr static auto to_size = TypeParam::GetSizeAt(1);
+
+  auto tester = testing::MakeExceptionSafetyTester()
+                    .WithInitialValue(VecT{from_size})
+                    .WithContracts(InlinedVectorInvariants<VecT>);
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    *vec = ABSL_INTERNAL_MAKE_INIT_LIST(value_type, to_size);
+  }));
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    VecT other_vec{to_size};
+    *vec = other_vec;
+  }));
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    VecT other_vec{to_size};
+    *vec = std::move(other_vec);
+  }));
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    value_type val{};
+    vec->assign(to_size, val);
+  }));
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    vec->assign(ABSL_INTERNAL_MAKE_INIT_LIST(value_type, to_size));
+  }));
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    std::array<value_type, to_size> arr{};
+    vec->assign(arr.begin(), arr.end());
+  }));
+}
+
+TYPED_TEST(OneSizeTest, PopBack) {
+  using VecT = typename TypeParam::VecT;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  auto tester = testing::MakeExceptionSafetyTester()
+                    .WithInitialValue(VecT(size))
+                    .WithContracts(NoThrowGuarantee<VecT>);
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    vec->pop_back();  //
+  }));
+}
+
 TYPED_TEST(OneSizeTest, Clear) {
   using VecT = typename TypeParam::VecT;
   constexpr static auto size = TypeParam::GetSizeAt(0);
@@ -101,4 +285,17 @@
   }));
 }
 
+TYPED_TEST(OneSizeTest, ShrinkToFit) {
+  using VecT = typename TypeParam::VecT;
+  constexpr static auto size = TypeParam::GetSizeAt(0);
+
+  auto tester = testing::MakeExceptionSafetyTester()
+                    .WithInitialValue(VecT{size})
+                    .WithContracts(InlinedVectorInvariants<VecT>);
+
+  EXPECT_TRUE(tester.Test([](VecT* vec) {
+    vec->shrink_to_fit();  //
+  }));
+}
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
index 6037001a..60fe89b 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
@@ -190,6 +190,12 @@
   }
 }
 
+TEST(IntVec, PopBackNoOverflow) {
+  IntVec v = {1};
+  v.pop_back();
+  EXPECT_EQ(v.size(), 0);
+}
+
 TEST(IntVec, AtThrows) {
   IntVec v = {1, 2, 3};
   EXPECT_EQ(v.at(2), 3);
diff --git a/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h b/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h
index bb3471f5..1713ad6 100644
--- a/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h
+++ b/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h
@@ -32,6 +32,7 @@
 #ifndef ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_
 #define ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_
 
+#include <initializer_list>
 #include <tuple>
 #include <type_traits>
 #include <utility>
@@ -75,17 +76,30 @@
 #endif
 }
 
+// We can't use EBCO on other CompressedTuples because that would mean that we
+// derive from multiple Storage<> instantiations with the same I parameter,
+// and potentially from multiple identical Storage<> instantiations.  So anytime
+// we use type inheritance rather than encapsulation, we mark
+// CompressedTupleImpl, to make this easy to detect.
+struct uses_inheritance {};
+
 template <typename T>
 constexpr bool ShouldUseBase() {
-  return std::is_class<T>::value && std::is_empty<T>::value && !IsFinal<T>();
+  return std::is_class<T>::value && std::is_empty<T>::value && !IsFinal<T>() &&
+         !std::is_base_of<uses_inheritance, T>::value;
 }
 
 // The storage class provides two specializations:
 //  - For empty classes, it stores T as a base class.
 //  - For everything else, it stores T as a member.
-template <typename D, size_t I, bool = ShouldUseBase<ElemT<D, I>>()>
+template <typename T, size_t I,
+#if defined(_MSC_VER)
+          bool UseBase =
+              ShouldUseBase<typename std::enable_if<true, T>::type>()>
+#else
+          bool UseBase = ShouldUseBase<T>()>
+#endif
 struct Storage {
-  using T = ElemT<D, I>;
   T value;
   constexpr Storage() = default;
   explicit constexpr Storage(T&& v) : value(absl::forward<T>(v)) {}
@@ -95,10 +109,8 @@
   T&& get() && { return std::move(*this).value; }
 };
 
-template <typename D, size_t I>
-struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC Storage<D, I, true>
-    : ElemT<D, I> {
-  using T = internal_compressed_tuple::ElemT<D, I>;
+template <typename T, size_t I>
+struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC Storage<T, I, true> : T {
   constexpr Storage() = default;
   explicit constexpr Storage(T&& v) : T(absl::forward<T>(v)) {}
   constexpr const T& get() const& { return *this; }
@@ -107,29 +119,54 @@
   T&& get() && { return std::move(*this); }
 };
 
-template <typename D, typename I>
+template <typename D, typename I, bool ShouldAnyUseBase>
 struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl;
 
-template <typename... Ts, size_t... I>
-struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC
-    CompressedTupleImpl<CompressedTuple<Ts...>, absl::index_sequence<I...>>
+template <typename... Ts, size_t... I, bool ShouldAnyUseBase>
+struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl<
+    CompressedTuple<Ts...>, absl::index_sequence<I...>, ShouldAnyUseBase>
     // We use the dummy identity function through std::integral_constant to
     // convince MSVC of accepting and expanding I in that context. Without it
     // you would get:
     //   error C3548: 'I': parameter pack cannot be used in this context
-    : Storage<CompressedTuple<Ts...>,
-              std::integral_constant<size_t, I>::value>... {
+    : uses_inheritance,
+      Storage<Ts, std::integral_constant<size_t, I>::value>... {
   constexpr CompressedTupleImpl() = default;
   explicit constexpr CompressedTupleImpl(Ts&&... args)
-      : Storage<CompressedTuple<Ts...>, I>(absl::forward<Ts>(args))... {}
+      : Storage<Ts, I>(absl::forward<Ts>(args))... {}
+  friend CompressedTuple<Ts...>;
 };
 
+template <typename... Ts, size_t... I>
+struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl<
+    CompressedTuple<Ts...>, absl::index_sequence<I...>, false>
+    // We use the dummy identity function as above...
+    : Storage<Ts, std::integral_constant<size_t, I>::value, false>... {
+  constexpr CompressedTupleImpl() = default;
+  explicit constexpr CompressedTupleImpl(Ts&&... args)
+      : Storage<Ts, I, false>(absl::forward<Ts>(args))... {}
+  friend CompressedTuple<Ts...>;
+};
+
+std::false_type Or(std::initializer_list<std::false_type>);
+std::true_type Or(std::initializer_list<bool>);
+
+// MSVC requires this to be done separately rather than within the declaration
+// of CompressedTuple below.
+template <typename... Ts>
+constexpr bool ShouldAnyUseBase() {
+  return decltype(
+      Or({std::integral_constant<bool, ShouldUseBase<Ts>()>()...})){};
+}
+
 }  // namespace internal_compressed_tuple
 
 // Helper class to perform the Empty Base Class Optimization.
 // Ts can contain classes and non-classes, empty or not. For the ones that
 // are empty classes, we perform the CompressedTuple. If all types in Ts are
-// empty classes, then CompressedTuple<Ts...> is itself an empty class.
+// empty classes, then CompressedTuple<Ts...> is itself an empty class.  (This
+// does not apply when one or more of those empty classes is itself an empty
+// CompressedTuple.)
 //
 // To access the members, use member .get<N>() function.
 //
@@ -145,7 +182,8 @@
 template <typename... Ts>
 class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple
     : private internal_compressed_tuple::CompressedTupleImpl<
-          CompressedTuple<Ts...>, absl::index_sequence_for<Ts...>> {
+          CompressedTuple<Ts...>, absl::index_sequence_for<Ts...>,
+          internal_compressed_tuple::ShouldAnyUseBase<Ts...>()> {
  private:
   template <int I>
   using ElemT = internal_compressed_tuple::ElemT<CompressedTuple, I>;
@@ -157,24 +195,24 @@
 
   template <int I>
   ElemT<I>& get() & {
-    return internal_compressed_tuple::Storage<CompressedTuple, I>::get();
+    return internal_compressed_tuple::Storage<ElemT<I>, I>::get();
   }
 
   template <int I>
   constexpr const ElemT<I>& get() const& {
-    return internal_compressed_tuple::Storage<CompressedTuple, I>::get();
+    return internal_compressed_tuple::Storage<ElemT<I>, I>::get();
   }
 
   template <int I>
   ElemT<I>&& get() && {
     return std::move(*this)
-        .internal_compressed_tuple::template Storage<CompressedTuple, I>::get();
+        .internal_compressed_tuple::template Storage<ElemT<I>, I>::get();
   }
 
   template <int I>
   constexpr const ElemT<I>&& get() const&& {
     return absl::move(*this)
-        .internal_compressed_tuple::template Storage<CompressedTuple, I>::get();
+        .internal_compressed_tuple::template Storage<ElemT<I>, I>::get();
   }
 };
 
diff --git a/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc b/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc
index 28e7741..3b0ec45 100644
--- a/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/compressed_tuple_test.cc
@@ -22,10 +22,8 @@
 #include "absl/memory/memory.h"
 #include "absl/utility/utility.h"
 
-namespace absl {
-namespace container_internal {
-namespace {
-
+// These are declared at global scope purely so that error messages
+// are smaller and easier to understand.
 enum class CallType { kConstRef, kConstMove };
 
 template <int>
@@ -45,6 +43,10 @@
   U value2;
 };
 
+namespace absl {
+namespace container_internal {
+namespace {
+
 TEST(CompressedTupleTest, Sizeof) {
   EXPECT_EQ(sizeof(int), sizeof(CompressedTuple<int>));
   EXPECT_EQ(sizeof(int), sizeof(CompressedTuple<int, Empty<0>>));
@@ -120,9 +122,14 @@
   EXPECT_EQ(4 * sizeof(char),
             sizeof(CompressedTuple<CompressedTuple<char, char>,
                                    CompressedTuple<char, char>>));
-  EXPECT_TRUE(
-      (std::is_empty<CompressedTuple<CompressedTuple<Empty<0>>,
-                                     CompressedTuple<Empty<1>>>>::value));
+  EXPECT_TRUE((std::is_empty<CompressedTuple<Empty<0>, Empty<1>>>::value));
+
+  // Make sure everything still works when things are nested.
+  struct CT_Empty : CompressedTuple<Empty<0>> {};
+  CompressedTuple<Empty<0>, CT_Empty> nested_empty;
+  auto contained = nested_empty.get<0>();
+  auto nested = nested_empty.get<1>().get<0>();
+  EXPECT_TRUE((std::is_same<decltype(contained), decltype(nested)>::value));
 }
 
 TEST(CompressedTupleTest, Reference) {
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
index f4eb92e..f117ee0c 100644
--- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -21,9 +21,11 @@
 #include <memory>
 #include <utility>
 
+#include "absl/base/macros.h"
 #include "absl/container/internal/compressed_tuple.h"
 #include "absl/memory/memory.h"
 #include "absl/meta/type_traits.h"
+#include "absl/types/span.h"
 
 namespace absl {
 namespace inlined_vector_internal {
@@ -33,6 +35,14 @@
     typename std::iterator_traits<Iterator>::iterator_category,
     std::forward_iterator_tag>;
 
+template <typename AllocatorType>
+using IsMemcpyOk = absl::conjunction<
+    std::is_same<std::allocator<typename AllocatorType::value_type>,
+                 AllocatorType>,
+    absl::is_trivially_copy_constructible<typename AllocatorType::value_type>,
+    absl::is_trivially_copy_assignable<typename AllocatorType::value_type>,
+    absl::is_trivially_destructible<typename AllocatorType::value_type>>;
+
 template <typename AllocatorType, typename ValueType, typename SizeType>
 void DestroyElements(AllocatorType* alloc_ptr, ValueType* destroy_first,
                      SizeType destroy_size) {
@@ -52,6 +62,31 @@
 #endif  // NDEBUG
 }
 
+template <typename AllocatorType, typename ValueType, typename ValueAdapter,
+          typename SizeType>
+void ConstructElements(AllocatorType* alloc_ptr, ValueType* construct_first,
+                       ValueAdapter* values_ptr, SizeType construct_size) {
+  // If any construction fails, all completed constructions are rolled back.
+  for (SizeType i = 0; i < construct_size; ++i) {
+    ABSL_INTERNAL_TRY {
+      values_ptr->ConstructNext(alloc_ptr, construct_first + i);
+    }
+    ABSL_INTERNAL_CATCH_ANY {
+      inlined_vector_internal::DestroyElements(alloc_ptr, construct_first, i);
+
+      ABSL_INTERNAL_RETHROW;
+    }
+  }
+}
+
+template <typename ValueType, typename ValueAdapter, typename SizeType>
+void AssignElements(ValueType* assign_first, ValueAdapter* values_ptr,
+                    SizeType assign_size) {
+  for (SizeType i = 0; i < assign_size; ++i) {
+    values_ptr->AssignNext(assign_first + i);
+  }
+}
+
 template <typename AllocatorType>
 struct StorageView {
   using pointer = typename AllocatorType::pointer;
@@ -62,6 +97,100 @@
   size_type capacity;
 };
 
+template <typename AllocatorType, typename Iterator>
+class IteratorValueAdapter {
+  using pointer = typename AllocatorType::pointer;
+  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
+
+ public:
+  explicit IteratorValueAdapter(const Iterator& it) : it_(it) {}
+
+  void ConstructNext(AllocatorType* alloc_ptr, pointer construct_at) {
+    AllocatorTraits::construct(*alloc_ptr, construct_at, *it_);
+    ++it_;
+  }
+
+  void AssignNext(pointer assign_at) {
+    *assign_at = *it_;
+    ++it_;
+  }
+
+ private:
+  Iterator it_;
+};
+
+template <typename AllocatorType>
+class CopyValueAdapter {
+  using pointer = typename AllocatorType::pointer;
+  using const_pointer = typename AllocatorType::const_pointer;
+  using const_reference = typename AllocatorType::const_reference;
+  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
+
+ public:
+  explicit CopyValueAdapter(const_reference v) : ptr_(std::addressof(v)) {}
+
+  void ConstructNext(AllocatorType* alloc_ptr, pointer construct_at) {
+    AllocatorTraits::construct(*alloc_ptr, construct_at, *ptr_);
+  }
+
+  void AssignNext(pointer assign_at) { *assign_at = *ptr_; }
+
+ private:
+  const_pointer ptr_;
+};
+
+template <typename AllocatorType>
+class DefaultValueAdapter {
+  using pointer = typename AllocatorType::pointer;
+  using value_type = typename AllocatorType::value_type;
+  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
+
+ public:
+  explicit DefaultValueAdapter() {}
+
+  void ConstructNext(AllocatorType* alloc_ptr, pointer construct_at) {
+    AllocatorTraits::construct(*alloc_ptr, construct_at);
+  }
+
+  void AssignNext(pointer assign_at) { *assign_at = value_type(); }
+};
+
+template <typename AllocatorType>
+class AllocationTransaction {
+  using value_type = typename AllocatorType::value_type;
+  using pointer = typename AllocatorType::pointer;
+  using size_type = typename AllocatorType::size_type;
+  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
+
+ public:
+  explicit AllocationTransaction(AllocatorType* alloc_ptr)
+      : alloc_data_(*alloc_ptr, nullptr) {}
+
+  AllocationTransaction(const AllocationTransaction&) = delete;
+  void operator=(const AllocationTransaction&) = delete;
+
+  AllocatorType& GetAllocator() { return alloc_data_.template get<0>(); }
+  pointer& GetData() { return alloc_data_.template get<1>(); }
+  size_type& GetCapacity() { return capacity_; }
+
+  bool DidAllocate() { return GetData() != nullptr; }
+  pointer Allocate(size_type capacity) {
+    GetData() = AllocatorTraits::allocate(GetAllocator(), capacity);
+    GetCapacity() = capacity;
+    return GetData();
+  }
+
+  ~AllocationTransaction() {
+    if (DidAllocate()) {
+      AllocatorTraits::deallocate(GetAllocator(), GetData(), GetCapacity());
+    }
+  }
+
+ private:
+  container_internal::CompressedTuple<AllocatorType, pointer> alloc_data_;
+  size_type capacity_ = 0;
+};
+
 template <typename T, size_t N, typename A>
 class Storage {
  public:
@@ -78,10 +207,23 @@
   using const_iterator = const_pointer;
   using reverse_iterator = std::reverse_iterator<iterator>;
   using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+  using MoveIterator = std::move_iterator<iterator>;
   using AllocatorTraits = absl::allocator_traits<allocator_type>;
+  using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<allocator_type>;
 
   using StorageView = inlined_vector_internal::StorageView<allocator_type>;
 
+  template <typename Iterator>
+  using IteratorValueAdapter =
+      inlined_vector_internal::IteratorValueAdapter<allocator_type, Iterator>;
+  using CopyValueAdapter =
+      inlined_vector_internal::CopyValueAdapter<allocator_type>;
+  using DefaultValueAdapter =
+      inlined_vector_internal::DefaultValueAdapter<allocator_type>;
+
+  using AllocationTransaction =
+      inlined_vector_internal::AllocationTransaction<allocator_type>;
+
   Storage() : metadata_() {}
 
   explicit Storage(const allocator_type& alloc)
@@ -128,19 +270,50 @@
     return std::addressof(metadata_.template get<0>());
   }
 
+  void SetIsAllocated() { GetSizeAndIsAllocated() |= 1; }
+
+  void UnsetIsAllocated() {
+    SetIsAllocated();
+    GetSizeAndIsAllocated() -= 1;
+  }
+
   void SetAllocatedSize(size_type size) {
     GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
   }
 
   void SetInlinedSize(size_type size) { GetSizeAndIsAllocated() = size << 1; }
 
+  void SetSize(size_type size) {
+    GetSizeAndIsAllocated() =
+        (size << 1) | static_cast<size_type>(GetIsAllocated());
+  }
+
   void AddSize(size_type count) { GetSizeAndIsAllocated() += count << 1; }
 
+  void SubtractSize(size_type count) {
+    assert(count <= GetSize());
+    GetSizeAndIsAllocated() -= count << 1;
+  }
+
   void SetAllocatedData(pointer data, size_type capacity) {
     data_.allocated.allocated_data = data;
     data_.allocated.allocated_capacity = capacity;
   }
 
+  void DeallocateIfAllocated() {
+    if (GetIsAllocated()) {
+      AllocatorTraits::deallocate(*GetAllocPtr(), GetAllocatedData(),
+                                  GetAllocatedCapacity());
+    }
+  }
+
+  void AcquireAllocation(AllocationTransaction* allocation_tx_ptr) {
+    SetAllocatedData(allocation_tx_ptr->GetData(),
+                     allocation_tx_ptr->GetCapacity());
+    allocation_tx_ptr->GetData() = nullptr;
+    allocation_tx_ptr->GetCapacity() = 0;
+  }
+
   void SwapSizeAndIsAllocated(Storage* other) {
     using std::swap;
     swap(GetSizeAndIsAllocated(), other->GetSizeAndIsAllocated());
@@ -151,8 +324,23 @@
     swap(data_.allocated, other->data_.allocated);
   }
 
+  void MemcpyFrom(const Storage& other_storage) {
+    assert(IsMemcpyOk::value || other_storage.GetIsAllocated());
+
+    GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
+    data_ = other_storage.data_;
+  }
+
   void DestroyAndDeallocate();
 
+  template <typename ValueAdapter>
+  void Initialize(ValueAdapter values, size_type new_size);
+
+  template <typename ValueAdapter>
+  void Assign(ValueAdapter values, size_type new_size);
+
+  void ShrinkToFit();
+
  private:
   size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
 
@@ -185,15 +373,124 @@
 
 template <typename T, size_t N, typename A>
 void Storage<T, N, A>::DestroyAndDeallocate() {
-  namespace ivi = inlined_vector_internal;
+  inlined_vector_internal::DestroyElements(
+      GetAllocPtr(), (GetIsAllocated() ? GetAllocatedData() : GetInlinedData()),
+      GetSize());
+  DeallocateIfAllocated();
+}
 
+template <typename T, size_t N, typename A>
+template <typename ValueAdapter>
+auto Storage<T, N, A>::Initialize(ValueAdapter values, size_type new_size)
+    -> void {
+  // Only callable from constructors!
+  assert(!GetIsAllocated());
+  assert(GetSize() == 0);
+
+  pointer construct_data;
+
+  if (new_size > static_cast<size_type>(N)) {
+    // Because this is only called from the `InlinedVector` constructors, it's
+    // safe to take on the allocation with size `0`. If `ConstructElements(...)`
+    // throws, deallocation will be automatically handled by `~Storage()`.
+    construct_data = AllocatorTraits::allocate(*GetAllocPtr(), new_size);
+    SetAllocatedData(construct_data, new_size);
+    SetIsAllocated();
+  } else {
+    construct_data = GetInlinedData();
+  }
+
+  inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
+                                             &values, new_size);
+
+  // Since the initial size was guaranteed to be `0` and the allocated bit is
+  // already correct for either case, *adding* `new_size` gives us the correct
+  // result faster than setting it directly.
+  AddSize(new_size);
+}
+
+template <typename T, size_t N, typename A>
+template <typename ValueAdapter>
+auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
   StorageView storage_view = MakeStorageView();
 
-  ivi::DestroyElements(GetAllocPtr(), storage_view.data, storage_view.size);
+  AllocationTransaction allocation_tx(GetAllocPtr());
 
-  if (GetIsAllocated()) {
-    AllocatorTraits::deallocate(*GetAllocPtr(), storage_view.data,
-                                storage_view.capacity);
+  absl::Span<value_type> assign_loop;
+  absl::Span<value_type> construct_loop;
+  absl::Span<value_type> destroy_loop;
+
+  if (new_size > storage_view.capacity) {
+    construct_loop = {allocation_tx.Allocate(new_size), new_size};
+    destroy_loop = {storage_view.data, storage_view.size};
+  } else if (new_size > storage_view.size) {
+    assign_loop = {storage_view.data, storage_view.size};
+    construct_loop = {storage_view.data + storage_view.size,
+                      new_size - storage_view.size};
+  } else {
+    assign_loop = {storage_view.data, new_size};
+    destroy_loop = {storage_view.data + new_size, storage_view.size - new_size};
+  }
+
+  inlined_vector_internal::AssignElements(assign_loop.data(), &values,
+                                          assign_loop.size());
+  inlined_vector_internal::ConstructElements(
+      GetAllocPtr(), construct_loop.data(), &values, construct_loop.size());
+  inlined_vector_internal::DestroyElements(GetAllocPtr(), destroy_loop.data(),
+                                           destroy_loop.size());
+
+  if (allocation_tx.DidAllocate()) {
+    DeallocateIfAllocated();
+    AcquireAllocation(&allocation_tx);
+    SetIsAllocated();
+  }
+
+  SetSize(new_size);
+}
+
+template <typename T, size_t N, typename A>
+auto Storage<T, N, A>::ShrinkToFit() -> void {
+  // May only be called on allocated instances!
+  assert(GetIsAllocated());
+
+  StorageView storage_view = {GetAllocatedData(), GetSize(),
+                              GetAllocatedCapacity()};
+
+  AllocationTransaction allocation_tx(GetAllocPtr());
+
+  IteratorValueAdapter<MoveIterator> move_values(
+      MoveIterator(storage_view.data));
+
+  pointer construct_data;
+
+  if (storage_view.size <= static_cast<size_type>(N)) {
+    construct_data = GetInlinedData();
+  } else if (storage_view.size < GetAllocatedCapacity()) {
+    construct_data = allocation_tx.Allocate(storage_view.size);
+  } else {
+    return;
+  }
+
+  ABSL_INTERNAL_TRY {
+    inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
+                                               &move_values, storage_view.size);
+  }
+  ABSL_INTERNAL_CATCH_ANY {
+    // Writing to inlined data will trample on the existing state, thus it needs
+    // to be restored when a construction fails.
+    SetAllocatedData(storage_view.data, storage_view.capacity);
+    ABSL_INTERNAL_RETHROW;
+  }
+
+  inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
+                                           storage_view.size);
+  AllocatorTraits::deallocate(*GetAllocPtr(), storage_view.data,
+                              storage_view.capacity);
+
+  if (allocation_tx.DidAllocate()) {
+    AcquireAllocation(&allocation_tx);
+  } else {
+    UnsetIsAllocated();
   }
 }
 
diff --git a/third_party/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake b/third_party/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake
index eaef30b..6394c15 100644
--- a/third_party/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake
+++ b/third_party/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake
@@ -24,7 +24,7 @@
     if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
       # AppleClang doesn't have lsan
       # https://developer.apple.com/documentation/code_diagnostics
-      if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 3.5)
+      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)
         set(ABSL_LSAN_LINKOPTS "-fsanitize=leak")
         set(ABSL_HAVE_LSAN ON)
       endif()
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
index c4948d4..88400e98 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
@@ -218,3 +218,21 @@
     "/wd4996"
     "/DNOMINMAX"
 )
+
+list(APPEND ABSL_RANDOM_HWAES_ARM32_FLAGS
+    "-mfpu=neon"
+)
+
+list(APPEND ABSL_RANDOM_HWAES_ARM64_FLAGS
+    "-march=armv8-a+crypto"
+)
+
+list(APPEND ABSL_RANDOM_HWAES_MSVC_X64_FLAGS
+    "/O2"
+    "/Ob2"
+)
+
+list(APPEND ABSL_RANDOM_HWAES_X64_FLAGS
+    "-maes"
+    "-msse4.1"
+)
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
index 422b3a9..d7edc93 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
@@ -219,3 +219,21 @@
     "/wd4996",
     "/DNOMINMAX",
 ]
+
+ABSL_RANDOM_HWAES_ARM32_FLAGS = [
+    "-mfpu=neon",
+]
+
+ABSL_RANDOM_HWAES_ARM64_FLAGS = [
+    "-march=armv8-a+crypto",
+]
+
+ABSL_RANDOM_HWAES_MSVC_X64_FLAGS = [
+    "/O2",
+    "/Ob2",
+]
+
+ABSL_RANDOM_HWAES_X64_FLAGS = [
+    "-maes",
+    "-msse4.1",
+]
diff --git a/third_party/abseil-cpp/absl/copts/configure_copts.bzl b/third_party/abseil-cpp/absl/copts/configure_copts.bzl
index 00159317..8c4efe7 100644
--- a/third_party/abseil-cpp/absl/copts/configure_copts.bzl
+++ b/third_party/abseil-cpp/absl/copts/configure_copts.bzl
@@ -16,6 +16,10 @@
     "ABSL_MSVC_FLAGS",
     "ABSL_MSVC_LINKOPTS",
     "ABSL_MSVC_TEST_FLAGS",
+    "ABSL_RANDOM_HWAES_ARM32_FLAGS",
+    "ABSL_RANDOM_HWAES_ARM64_FLAGS",
+    "ABSL_RANDOM_HWAES_MSVC_X64_FLAGS",
+    "ABSL_RANDOM_HWAES_X64_FLAGS",
 )
 
 ABSL_DEFAULT_COPTS = select({
@@ -46,3 +50,40 @@
     "//absl:windows": ABSL_MSVC_LINKOPTS,
     "//conditions:default": [],
 })
+
+# ABSL_RANDOM_RANDEN_COPTS blaze copts flags which are required by each
+# environment to build an accelerated RandenHwAes library.
+ABSL_RANDOM_RANDEN_COPTS = select({
+    # APPLE
+    ":cpu_darwin_x86_64": ABSL_RANDOM_HWAES_X64_FLAGS,
+    ":cpu_darwin": ABSL_RANDOM_HWAES_X64_FLAGS,
+    ":cpu_x64_windows_msvc": ABSL_RANDOM_HWAES_MSVC_X64_FLAGS,
+    ":cpu_x64_windows": ABSL_RANDOM_HWAES_MSVC_X64_FLAGS,
+    ":cpu_haswell": ABSL_RANDOM_HWAES_X64_FLAGS,
+    ":cpu_ppc": ["-mcrypto"],
+
+    # Supported by default or unsupported.
+    "//conditions:default": [],
+})
+
+# absl_random_randen_copts_init:
+#  Initialize the config targets based on cpu, os, etc. used to select
+#  the required values for ABSL_RANDOM_RANDEN_COPTS
+def absl_random_randen_copts_init():
+    """Initialize the config_settings used by ABSL_RANDOM_RANDEN_COPTS."""
+
+    # CPU configs.
+    # These configs have consistent flags to enable HWAES intsructions.
+    cpu_configs = [
+        "ppc",
+        "haswell",
+        "darwin_x86_64",
+        "darwin",
+        "x64_windows_msvc",
+        "x64_windows",
+    ]
+    for cpu in cpu_configs:
+        native.config_setting(
+            name = "cpu_%s" % cpu,
+            values = {"cpu": cpu},
+        )
diff --git a/third_party/abseil-cpp/absl/copts/copts.py b/third_party/abseil-cpp/absl/copts/copts.py
index 5bede34..d850bb4f 100644
--- a/third_party/abseil-cpp/absl/copts/copts.py
+++ b/third_party/abseil-cpp/absl/copts/copts.py
@@ -199,4 +199,18 @@
         # Object file doesn't export any previously undefined symbols
         "-ignore:4221",
     ],
+    # "HWAES" is an abbreviation for "hardware AES" (AES - Advanced Encryption
+    # Standard). These flags are used for detecting whether or not the target
+    # architecture has hardware support for AES instructions which can be used
+    # to improve performance of some random bit generators.
+    "ABSL_RANDOM_HWAES_ARM64_FLAGS": ["-march=armv8-a+crypto"],
+    "ABSL_RANDOM_HWAES_ARM32_FLAGS": ["-mfpu=neon"],
+    "ABSL_RANDOM_HWAES_X64_FLAGS": [
+        "-maes",
+        "-msse4.1",
+    ],
+    "ABSL_RANDOM_HWAES_MSVC_X64_FLAGS": [
+        "/O2",  # Maximize speed
+        "/Ob2",  # Aggressive inlining
+    ],
 }
diff --git a/third_party/abseil-cpp/absl/random/BUILD.bazel b/third_party/abseil-cpp/absl/random/BUILD.bazel
new file mode 100644
index 0000000..00d42c9
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/BUILD.bazel
@@ -0,0 +1,390 @@
+# ABSL random-number generation libraries.
+
+load(
+    "//absl:copts/configure_copts.bzl",
+    "ABSL_DEFAULT_COPTS",
+    "ABSL_DEFAULT_LINKOPTS",
+    "ABSL_EXCEPTIONS_FLAG",
+    "ABSL_EXCEPTIONS_FLAG_LINKOPTS",
+    "ABSL_TEST_COPTS",
+)
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])  # Apache 2.0
+
+cc_library(
+    name = "random",
+    hdrs = ["random.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":seed_sequences",
+        "//absl/random/internal:nonsecure_base",
+        "//absl/random/internal:pcg_engine",
+        "//absl/random/internal:pool_urbg",
+        "//absl/random/internal:randen_engine",
+    ],
+)
+
+cc_library(
+    name = "distributions",
+    srcs = [
+        "discrete_distribution.cc",
+        "gaussian_distribution.cc",
+    ],
+    hdrs = [
+        "bernoulli_distribution.h",
+        "beta_distribution.h",
+        "discrete_distribution.h",
+        "distribution_format_traits.h",
+        "distributions.h",
+        "exponential_distribution.h",
+        "gaussian_distribution.h",
+        "log_uniform_int_distribution.h",
+        "poisson_distribution.h",
+        "uniform_int_distribution.h",
+        "uniform_real_distribution.h",
+        "zipf_distribution.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/base:base_internal",
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/random/internal:distribution_impl",
+        "//absl/random/internal:distributions",
+        "//absl/random/internal:fast_uniform_bits",
+        "//absl/random/internal:fastmath",
+        "//absl/random/internal:iostream_state_saver",
+        "//absl/random/internal:traits",
+        "//absl/random/internal:uniform_helper",
+        "//absl/strings",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "seed_gen_exception",
+    srcs = ["seed_gen_exception.cc"],
+    hdrs = ["seed_gen_exception.h"],
+    copts = ABSL_DEFAULT_COPTS + ABSL_EXCEPTIONS_FLAG,
+    linkopts = ABSL_EXCEPTIONS_FLAG_LINKOPTS + ABSL_DEFAULT_LINKOPTS,
+    deps = ["//absl/base:config"],
+)
+
+cc_library(
+    name = "seed_sequences",
+    srcs = ["seed_sequences.cc"],
+    hdrs = [
+        "seed_sequences.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":seed_gen_exception",
+        "//absl/container:inlined_vector",
+        "//absl/random/internal:nonsecure_base",
+        "//absl/random/internal:pool_urbg",
+        "//absl/random/internal:salted_seed_seq",
+        "//absl/random/internal:seed_material",
+        "//absl/types:span",
+    ],
+)
+
+cc_test(
+    name = "bernoulli_distribution_test",
+    size = "small",
+    timeout = "eternal",  # Android can take a very long time
+    srcs = ["bernoulli_distribution_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/random/internal:sequence_urbg",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "beta_distribution_test",
+    size = "small",
+    timeout = "eternal",  # Android can take a very long time
+    srcs = ["beta_distribution_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "distributions_test",
+    size = "small",
+    srcs = [
+        "distributions_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/random/internal:distribution_test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "generators_test",
+    size = "small",
+    srcs = ["generators_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "log_uniform_int_distribution_test",
+    size = "medium",
+    srcs = [
+        "log_uniform_int_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "discrete_distribution_test",
+    size = "medium",
+    srcs = [
+        "discrete_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "poisson_distribution_test",
+    size = "small",
+    timeout = "eternal",  # Android can take a very long time
+    srcs = [
+        "poisson_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = [
+        # Too Slow.
+        "no_test_android_arm",
+        "no_test_loonix",
+    ],
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/container:flat_hash_map",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "exponential_distribution_test",
+    size = "small",
+    srcs = ["exponential_distribution_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "gaussian_distribution_test",
+    size = "small",
+    timeout = "eternal",  # Android can take a very long time
+    srcs = [
+        "gaussian_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "uniform_int_distribution_test",
+    size = "medium",
+    timeout = "long",
+    srcs = [
+        "uniform_int_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "uniform_real_distribution_test",
+    size = "medium",
+    srcs = [
+        "uniform_real_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = [
+        "no_test_android_arm",
+        "no_test_android_arm64",
+        "no_test_android_x86",
+    ],
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "zipf_distribution_test",
+    size = "medium",
+    srcs = [
+        "zipf_distribution_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distributions",
+        ":random",
+        "//absl/base",
+        "//absl/random/internal:distribution_test_util",
+        "//absl/random/internal:sequence_urbg",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "examples_test",
+    size = "small",
+    srcs = ["examples_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":random",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "seed_sequences_test",
+    size = "small",
+    srcs = ["seed_sequences_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":random",
+        ":seed_sequences",
+        "//absl/random/internal:nonsecure_base",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+BENCHMARK_TAGS = [
+    "benchmark",
+    "no_test_android_arm",
+    "no_test_android_arm64",
+    "no_test_android_x86",
+    "no_test_darwin_x86_64",
+    "no_test_ios_x86_64",
+    "no_test_loonix",
+    "no_test_msvc_x64",
+    "no_test_wasm",
+]
+
+# Benchmarks for various methods / test utilities
+cc_test(
+    name = "benchmarks",
+    size = "small",
+    srcs = [
+        "benchmarks.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = BENCHMARK_TAGS,
+    deps = [
+        ":distributions",
+        ":random",
+        ":seed_sequences",
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/random/internal:fast_uniform_bits",
+        "//absl/random/internal:randen_engine",
+        "@com_github_google_benchmark//:benchmark_main",
+    ],
+)
diff --git a/third_party/abseil-cpp/absl/random/BUILD.gn b/third_party/abseil-cpp/absl/random/BUILD.gn
new file mode 100644
index 0000000..c0e094a
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/BUILD.gn
@@ -0,0 +1,126 @@
+# 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.
+
+import("//build_overrides/build.gni")
+
+# Usage of Abseil in Chromium is guarded by an explicit opt-in list, before
+# adding projects to this list please reach out to cxx@chromium.org and CC:
+# - https://cs.chromium.org/chromium/src/third_party/abseil-cpp/OWNERS
+#
+# More information can be found at:
+# https://docs.google.com/document/d/1DgS1-A3rzboTLjpf4m1sqkJgWjnY_Ru2dokk1X1vBDU
+if (build_with_chromium) {
+  visibility = [
+    "//libassistant/*",
+    "//third_party/webrtc/*",
+    "//third_party/abseil-cpp/*",
+    "//third_party/googletest:gtest",
+    "//third_party/openscreen/*",
+  ]
+} else {
+  visibility = [ "*" ]
+}
+
+source_set("random") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "random.h",
+  ]
+  deps = [
+    ":distributions",
+    ":seed_sequences",
+    "../random/internal:nonsecure_base",
+    "../random/internal:pcg_engine",
+    "../random/internal:pool_urbg",
+    "../random/internal:randen_engine",
+  ]
+}
+
+source_set("distributions") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "bernoulli_distribution.h",
+    "beta_distribution.h",
+    "discrete_distribution.h",
+    "distribution_format_traits.h",
+    "distributions.h",
+    "exponential_distribution.h",
+    "gaussian_distribution.h",
+    "log_uniform_int_distribution.h",
+    "poisson_distribution.h",
+    "uniform_int_distribution.h",
+    "uniform_real_distribution.h",
+    "zipf_distribution.h",
+  ]
+  sources = [
+    "discrete_distribution.cc",
+    "gaussian_distribution.cc",
+  ]
+  deps = [
+    "../base:base_internal",
+    "../base:core_headers",
+    "../meta:type_traits",
+    "../random/internal:distribution_impl",
+    "../random/internal:distributions",
+    "../random/internal:fast_uniform_bits",
+    "../random/internal:fastmath",
+    "../random/internal:iostream_state_saver",
+    "../random/internal:traits",
+    "../random/internal:uniform_helper",
+    "../strings",
+    "../types:span",
+  ]
+}
+
+source_set("seed_gen_exception") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "seed_gen_exception.h",
+  ]
+  sources = [
+    "seed_gen_exception.cc",
+  ]
+  deps = [
+    "../base:config",
+  ]
+}
+
+source_set("seed_sequences") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "seed_sequences.h",
+  ]
+  sources = [
+    "seed_sequences.cc",
+  ]
+  deps = [
+    ":seed_gen_exception",
+    "../container:inlined_vector",
+    "../random/internal:nonsecure_base",
+    "../random/internal:pool_urbg",
+    "../random/internal:salted_seed_seq",
+    "../random/internal:seed_material",
+    "../types:span",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/random/benchmarks.cc b/third_party/abseil-cpp/absl/random/benchmarks.cc
new file mode 100644
index 0000000..8e6d889
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/benchmarks.cc
@@ -0,0 +1,383 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Benchmarks for absl random distributions as well as a selection of the
+// C++ standard library random distributions.
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <initializer_list>
+#include <iterator>
+#include <limits>
+#include <random>
+#include <type_traits>
+#include <vector>
+
+#include "benchmark/benchmark.h"
+#include "absl/base/macros.h"
+#include "absl/meta/type_traits.h"
+#include "absl/random/bernoulli_distribution.h"
+#include "absl/random/beta_distribution.h"
+#include "absl/random/exponential_distribution.h"
+#include "absl/random/gaussian_distribution.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/randen_engine.h"
+#include "absl/random/log_uniform_int_distribution.h"
+#include "absl/random/poisson_distribution.h"
+#include "absl/random/random.h"
+#include "absl/random/uniform_int_distribution.h"
+#include "absl/random/uniform_real_distribution.h"
+#include "absl/random/zipf_distribution.h"
+
+namespace {
+
+// Seed data to avoid reading random_device() for benchmarks.
+uint32_t kSeedData[] = {
+    0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
+    0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6,
+    0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A,
+    0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D,
+    0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A18FF, 0x5664526C, 0xC2B19EE1,
+    0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
+    0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
+    0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9,
+    0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0x13198A2E, 0x03707344,
+};
+
+// PrecompiledSeedSeq provides kSeedData to a conforming
+// random engine to speed initialization in the benchmarks.
+class PrecompiledSeedSeq {
+ public:
+  using result_type = uint32_t;
+
+  PrecompiledSeedSeq() {}
+
+  template <typename Iterator>
+  PrecompiledSeedSeq(Iterator begin, Iterator end) {}
+
+  template <typename T>
+  PrecompiledSeedSeq(std::initializer_list<T> il) {}
+
+  template <typename OutIterator>
+  void generate(OutIterator begin, OutIterator end) {
+    static size_t idx = 0;
+    for (; begin != end; begin++) {
+      *begin = kSeedData[idx++];
+      if (idx >= ABSL_ARRAYSIZE(kSeedData)) {
+        idx = 0;
+      }
+    }
+  }
+
+  size_t size() const { return ABSL_ARRAYSIZE(kSeedData); }
+
+  template <typename OutIterator>
+  void param(OutIterator out) const {
+    std::copy(std::begin(kSeedData), std::end(kSeedData), out);
+  }
+};
+
+// use_default_initialization<T> indicates whether the random engine
+// T must be default initialized, or whether we may initialize it using
+// a seed sequence. This is used because some engines do not accept seed
+// sequence-based initialization.
+template <typename E>
+using use_default_initialization = std::false_type;
+
+// make_engine<T, SSeq> returns a random_engine which is initialized,
+// either via the default constructor, when use_default_initialization<T>
+// is true, or via the indicated seed sequence, SSeq.
+template <typename Engine, typename SSeq = PrecompiledSeedSeq>
+typename absl::enable_if_t<!use_default_initialization<Engine>::value, Engine>
+make_engine() {
+  // Initialize the random engine using the seed sequence SSeq, which
+  // is constructed from the precompiled seed data.
+  SSeq seq(std::begin(kSeedData), std::end(kSeedData));
+  return Engine(seq);
+}
+
+template <typename Engine, typename SSeq = PrecompiledSeedSeq>
+typename absl::enable_if_t<use_default_initialization<Engine>::value, Engine>
+make_engine() {
+  // Initialize the random engine using the default constructor.
+  return Engine();
+}
+
+template <typename Engine, typename SSeq>
+void BM_Construct(benchmark::State& state) {
+  for (auto _ : state) {
+    auto rng = make_engine<Engine, SSeq>();
+    benchmark::DoNotOptimize(rng());
+  }
+}
+
+template <typename Engine>
+void BM_Direct(benchmark::State& state) {
+  using value_type = typename Engine::result_type;
+  // Direct use of the URBG.
+  auto rng = make_engine<Engine>();
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(rng());
+  }
+  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
+}
+
+template <typename Engine>
+void BM_Generate(benchmark::State& state) {
+  // std::generate makes a copy of the RNG; thus this tests the
+  // copy-constructor efficiency.
+  using value_type = typename Engine::result_type;
+  std::vector<value_type> v(64);
+  auto rng = make_engine<Engine>();
+  while (state.KeepRunningBatch(64)) {
+    std::generate(std::begin(v), std::end(v), rng);
+  }
+}
+
+template <typename Engine, size_t elems>
+void BM_Shuffle(benchmark::State& state) {
+  // Direct use of the Engine.
+  std::vector<uint32_t> v(elems);
+  while (state.KeepRunningBatch(elems)) {
+    auto rng = make_engine<Engine>();
+    std::shuffle(std::begin(v), std::end(v), rng);
+  }
+}
+
+template <typename Engine, size_t elems>
+void BM_ShuffleReuse(benchmark::State& state) {
+  // Direct use of the Engine.
+  std::vector<uint32_t> v(elems);
+  auto rng = make_engine<Engine>();
+  while (state.KeepRunningBatch(elems)) {
+    std::shuffle(std::begin(v), std::end(v), rng);
+  }
+}
+
+template <typename Engine, typename Dist, typename... Args>
+void BM_Dist(benchmark::State& state, Args&&... args) {
+  using value_type = typename Dist::result_type;
+  auto rng = make_engine<Engine>();
+  Dist dis{std::forward<Args>(args)...};
+  // Compare the following loop performance:
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(dis(rng));
+  }
+  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
+}
+
+template <typename Engine, typename Dist>
+void BM_Large(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  volatile value_type kMin = 0;
+  volatile value_type kMax = std::numeric_limits<value_type>::max() / 2 + 1;
+  BM_Dist<Engine, Dist>(state, kMin, kMax);
+}
+
+template <typename Engine, typename Dist>
+void BM_Small(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  volatile value_type kMin = 0;
+  volatile value_type kMax = std::numeric_limits<value_type>::max() / 64 + 1;
+  BM_Dist<Engine, Dist>(state, kMin, kMax);
+}
+
+template <typename Engine, typename Dist, int A>
+void BM_Bernoulli(benchmark::State& state) {
+  volatile double a = static_cast<double>(A) / 1000000;
+  BM_Dist<Engine, Dist>(state, a);
+}
+
+template <typename Engine, typename Dist, int A, int B>
+void BM_Beta(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  volatile value_type a = static_cast<value_type>(A) / 100;
+  volatile value_type b = static_cast<value_type>(B) / 100;
+  BM_Dist<Engine, Dist>(state, a, b);
+}
+
+template <typename Engine, typename Dist, int A>
+void BM_Gamma(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  volatile value_type a = static_cast<value_type>(A) / 100;
+  BM_Dist<Engine, Dist>(state, a);
+}
+
+template <typename Engine, typename Dist, int A = 100>
+void BM_Poisson(benchmark::State& state) {
+  volatile double a = static_cast<double>(A) / 100;
+  BM_Dist<Engine, Dist>(state, a);
+}
+
+template <typename Engine, typename Dist, int V = 1, int Q = 2>
+void BM_Zipf(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  volatile double v = V;
+  volatile double q = Q;
+  BM_Dist<Engine, Dist>(state, std::numeric_limits<value_type>::max(), v, q);
+}
+
+template <typename Engine, typename Dist>
+void BM_Thread(benchmark::State& state) {
+  using value_type = typename Dist::result_type;
+  auto rng = make_engine<Engine>();
+  Dist dis{};
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(dis(rng));
+  }
+  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
+}
+
+// NOTES:
+//
+// std::geometric_distribution is similar to the zipf distributions.
+// The algorithm for the geometric_distribution is, basically,
+// floor(log(1-X) / log(1-p))
+
+// Normal benchmark suite
+#define BM_BASIC(Engine)                                                       \
+  BENCHMARK_TEMPLATE(BM_Construct, Engine, PrecompiledSeedSeq);                \
+  BENCHMARK_TEMPLATE(BM_Construct, Engine, std::seed_seq);                     \
+  BENCHMARK_TEMPLATE(BM_Direct, Engine);                                       \
+  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 10);                                  \
+  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 100);                                 \
+  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 1000);                                \
+  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 100);                            \
+  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 1000);                           \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::random_internal::FastUniformBits<uint32_t, 32>);    \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::random_internal::FastUniformBits<uint64_t, 64>);    \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_int_distribution<int32_t>); \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_int_distribution<int64_t>); \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::uniform_int_distribution<int32_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::uniform_int_distribution<int64_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
+                     std::uniform_int_distribution<int32_t>);                  \
+  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
+                     std::uniform_int_distribution<int64_t>);                  \
+  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
+                     absl::uniform_int_distribution<int32_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
+                     absl::uniform_int_distribution<int64_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_real_distribution<float>);  \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_real_distribution<double>); \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::uniform_real_distribution<float>); \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::uniform_real_distribution<double>)
+
+#define BM_COPY(Engine) BENCHMARK_TEMPLATE(BM_Generate, Engine)
+
+#define BM_THREAD(Engine)                                           \
+  BENCHMARK_TEMPLATE(BM_Thread, Engine,                             \
+                     absl::uniform_int_distribution<int64_t>)       \
+      ->ThreadPerCpu();                                             \
+  BENCHMARK_TEMPLATE(BM_Thread, Engine,                             \
+                     absl::uniform_real_distribution<double>)       \
+      ->ThreadPerCpu();                                             \
+  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 100)->ThreadPerCpu();      \
+  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 1000)->ThreadPerCpu();     \
+  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 100)->ThreadPerCpu(); \
+  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 1000)->ThreadPerCpu();
+
+#define BM_EXTENDED(Engine)                                                    \
+  /* -------------- Extended Uniform -----------------------*/                 \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     std::uniform_int_distribution<int32_t>);                  \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     std::uniform_int_distribution<int64_t>);                  \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     absl::uniform_int_distribution<int32_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     absl::uniform_int_distribution<int64_t>);                 \
+  BENCHMARK_TEMPLATE(BM_Small, Engine, std::uniform_real_distribution<float>); \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     std::uniform_real_distribution<double>);                  \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     absl::uniform_real_distribution<float>);                  \
+  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
+                     absl::uniform_real_distribution<double>);                 \
+  /* -------------- Other -----------------------*/                            \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::normal_distribution<double>);       \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::gaussian_distribution<double>);    \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::exponential_distribution<double>);  \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::exponential_distribution<double>); \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
+                     100);                                                     \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
+                     100);                                                     \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
+                     10 * 100);                                                \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
+                     10 * 100);                                                \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
+                     13 * 100);                                                \
+  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
+                     13 * 100);                                                \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::log_uniform_int_distribution<int32_t>);             \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
+                     absl::log_uniform_int_distribution<int64_t>);             \
+  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::geometric_distribution<int64_t>);   \
+  BENCHMARK_TEMPLATE(BM_Zipf, Engine, absl::zipf_distribution<uint64_t>);      \
+  BENCHMARK_TEMPLATE(BM_Zipf, Engine, absl::zipf_distribution<uint64_t>, 3,    \
+                     2);                                                       \
+  BENCHMARK_TEMPLATE(BM_Bernoulli, Engine, std::bernoulli_distribution,        \
+                     257305);                                                  \
+  BENCHMARK_TEMPLATE(BM_Bernoulli, Engine, absl::bernoulli_distribution,       \
+                     257305);                                                  \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 65,     \
+                     41);                                                      \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 99,     \
+                     330);                                                     \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 150,    \
+                     150);                                                     \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 410,    \
+                     580);                                                     \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 65, 41); \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 99,      \
+                     330);                                                     \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 150,     \
+                     150);                                                     \
+  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 410,     \
+                     580);                                                     \
+  BENCHMARK_TEMPLATE(BM_Gamma, Engine, std::gamma_distribution<float>, 199);   \
+  BENCHMARK_TEMPLATE(BM_Gamma, Engine, std::gamma_distribution<double>, 199);
+
+// ABSL Recommended interfaces.
+BM_BASIC(absl::InsecureBitGen);  // === pcg64_2018_engine
+BM_BASIC(absl::BitGen);    // === randen_engine<uint64_t>.
+BM_THREAD(absl::BitGen);
+BM_EXTENDED(absl::BitGen);
+
+// Instantiate benchmarks for multiple engines.
+using randen_engine_64 = absl::random_internal::randen_engine<uint64_t>;
+using randen_engine_32 = absl::random_internal::randen_engine<uint32_t>;
+
+// Comparison interfaces.
+BM_BASIC(std::mt19937_64);
+BM_COPY(std::mt19937_64);
+BM_EXTENDED(std::mt19937_64);
+BM_BASIC(randen_engine_64);
+BM_COPY(randen_engine_64);
+BM_EXTENDED(randen_engine_64);
+
+BM_BASIC(std::mt19937);
+BM_COPY(std::mt19937);
+BM_BASIC(randen_engine_32);
+BM_COPY(randen_engine_32);
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/bernoulli_distribution.h b/third_party/abseil-cpp/absl/random/bernoulli_distribution.h
new file mode 100644
index 0000000..326fcb6
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/bernoulli_distribution.h
@@ -0,0 +1,198 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
+#define ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
+
+#include <cstdint>
+#include <istream>
+#include <limits>
+
+#include "absl/base/optimization.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+
+// absl::bernoulli_distribution is a drop in replacement for
+// std::bernoulli_distribution. It guarantees that (given a perfect
+// UniformRandomBitGenerator) the acceptance probability is *exactly* equal to
+// the given double.
+//
+// The implementation assumes that double is IEEE754
+class bernoulli_distribution {
+ public:
+  using result_type = bool;
+
+  class param_type {
+   public:
+    using distribution_type = bernoulli_distribution;
+
+    explicit param_type(double p = 0.5) : prob_(p) {
+      assert(p >= 0.0 && p <= 1.0);
+    }
+
+    double p() const { return prob_; }
+
+    friend bool operator==(const param_type& p1, const param_type& p2) {
+      return p1.p() == p2.p();
+    }
+    friend bool operator!=(const param_type& p1, const param_type& p2) {
+      return p1.p() != p2.p();
+    }
+
+   private:
+    double prob_;
+  };
+
+  bernoulli_distribution() : bernoulli_distribution(0.5) {}
+
+  explicit bernoulli_distribution(double p) : param_(p) {}
+
+  explicit bernoulli_distribution(param_type p) : param_(p) {}
+
+  // no-op
+  void reset() {}
+
+  template <typename URBG>
+  bool operator()(URBG& g) {  // NOLINT(runtime/references)
+    return Generate(param_.p(), g);
+  }
+
+  template <typename URBG>
+  bool operator()(URBG& g,  // NOLINT(runtime/references)
+                  const param_type& param) {
+    return Generate(param.p(), g);
+  }
+
+  param_type param() const { return param_; }
+  void param(const param_type& param) { param_ = param; }
+
+  double p() const { return param_.p(); }
+
+  result_type(min)() const { return false; }
+  result_type(max)() const { return true; }
+
+  friend bool operator==(const bernoulli_distribution& d1,
+                         const bernoulli_distribution& d2) {
+    return d1.param_ == d2.param_;
+  }
+
+  friend bool operator!=(const bernoulli_distribution& d1,
+                         const bernoulli_distribution& d2) {
+    return d1.param_ != d2.param_;
+  }
+
+ private:
+  static constexpr uint64_t kP32 = static_cast<uint64_t>(1) << 32;
+
+  template <typename URBG>
+  static bool Generate(double p, URBG& g);  // NOLINT(runtime/references)
+
+  param_type param_;
+};
+
+template <typename CharT, typename Traits>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const bernoulli_distribution& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<double>::kPrecision);
+  os << x.p();
+  return os;
+}
+
+template <typename CharT, typename Traits>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    bernoulli_distribution& x) {            // NOLINT(runtime/references)
+  auto saver = random_internal::make_istream_state_saver(is);
+  auto p = random_internal::read_floating_point<double>(is);
+  if (!is.fail()) {
+    x.param(bernoulli_distribution::param_type(p));
+  }
+  return is;
+}
+
+template <typename URBG>
+bool bernoulli_distribution::Generate(double p,
+                                      URBG& g) {  // NOLINT(runtime/references)
+  random_internal::FastUniformBits<uint32_t> fast_u32;
+
+  while (true) {
+    // There are two aspects of the definition of `c` below that are worth
+    // commenting on.  First, because `p` is in the range [0, 1], `c` is in the
+    // range [0, 2^32] which does not fit in a uint32_t and therefore requires
+    // 64 bits.
+    //
+    // Second, `c` is constructed by first casting explicitly to a signed
+    // integer and then converting implicitly to an unsigned integer of the same
+    // size.  This is done because the hardware conversion instructions produce
+    // signed integers from double; if taken as a uint64_t the conversion would
+    // be wrong for doubles greater than 2^63 (not relevant in this use-case).
+    // If converted directly to an unsigned integer, the compiler would end up
+    // emitting code to handle such large values that are not relevant due to
+    // the known bounds on `c`.  To avoid these extra instructions this
+    // implementation converts first to the signed type and then use the
+    // implicit conversion to unsigned (which is a no-op).
+    const uint64_t c = static_cast<int64_t>(p * kP32);
+    const uint32_t v = fast_u32(g);
+    // FAST PATH: this path fails with probability 1/2^32.  Note that simply
+    // returning v <= c would approximate P very well (up to an absolute error
+    // of 1/2^32); the slow path (taken in that range of possible error, in the
+    // case of equality) eliminates the remaining error.
+    if (ABSL_PREDICT_TRUE(v != c)) return v < c;
+
+    // It is guaranteed that `q` is strictly less than 1, because if `q` were
+    // greater than or equal to 1, the same would be true for `p`. Certainly `p`
+    // cannot be greater than 1, and if `p == 1`, then the fast path would
+    // necessary have been taken already.
+    const double q = static_cast<double>(c) / kP32;
+
+    // The probability of acceptance on the fast path is `q` and so the
+    // probability of acceptance here should be `p - q`.
+    //
+    // Note that `q` is obtained from `p` via some shifts and conversions, the
+    // upshot of which is that `q` is simply `p` with some of the
+    // least-significant bits of its mantissa set to zero. This means that the
+    // difference `p - q` will not have any rounding errors. To see why, pretend
+    // that double has 10 bits of resolution and q is obtained from `p` in such
+    // a way that the 4 least-significant bits of its mantissa are set to zero.
+    // For example:
+    //   p   = 1.1100111011 * 2^-1
+    //   q   = 1.1100110000 * 2^-1
+    // p - q = 1.011        * 2^-8
+    // The difference `p - q` has exactly the nonzero mantissa bits that were
+    // "lost" in `q` producing a number which is certainly representable in a
+    // double.
+    const double left = p - q;
+
+    // By construction, the probability of being on this slow path is 1/2^32, so
+    // P(accept in slow path) = P(accept| in slow path) * P(slow path),
+    // which means the probability of acceptance here is `1 / (left * kP32)`:
+    const double here = left * kP32;
+
+    // The simplest way to compute the result of this trial is to repeat the
+    // whole algorithm with the new probability. This terminates because even
+    // given  arbitrarily unfriendly "random" bits, each iteration either
+    // multiplies a tiny probability by 2^32 (if c == 0) or strips off some
+    // number of nonzero mantissa bits. That process is bounded.
+    if (here == 0) return false;
+    p = here;
+  }
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/bernoulli_distribution_test.cc b/third_party/abseil-cpp/absl/random/bernoulli_distribution_test.cc
new file mode 100644
index 0000000..f2c3b99c
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/bernoulli_distribution_test.cc
@@ -0,0 +1,213 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/bernoulli_distribution.h"
+
+#include <cmath>
+#include <cstddef>
+#include <random>
+#include <sstream>
+#include <utility>
+
+#include "gtest/gtest.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+
+namespace {
+
+class BernoulliTest : public testing::TestWithParam<std::pair<double, size_t>> {
+};
+
+TEST_P(BernoulliTest, Serialize) {
+  const double d = GetParam().first;
+  absl::bernoulli_distribution before(d);
+
+  {
+    absl::bernoulli_distribution via_param{
+        absl::bernoulli_distribution::param_type(d)};
+    EXPECT_EQ(via_param, before);
+  }
+
+  std::stringstream ss;
+  ss << before;
+  absl::bernoulli_distribution after(0.6789);
+
+  EXPECT_NE(before.p(), after.p());
+  EXPECT_NE(before.param(), after.param());
+  EXPECT_NE(before, after);
+
+  ss >> after;
+
+  EXPECT_EQ(before.p(), after.p());
+  EXPECT_EQ(before.param(), after.param());
+  EXPECT_EQ(before, after);
+}
+
+TEST_P(BernoulliTest, Accuracy) {
+  // Sadly, the claim to fame for this implementation is precise accuracy, which
+  // is very, very hard to measure, the improvements come as trials approach the
+  // limit of double accuracy; thus the outcome differs from the
+  // std::bernoulli_distribution with a probability of approximately 1 in 2^-53.
+  const std::pair<double, size_t> para = GetParam();
+  size_t trials = para.second;
+  double p = para.first;
+
+  absl::InsecureBitGen rng;
+
+  size_t yes = 0;
+  absl::bernoulli_distribution dist(p);
+  for (size_t i = 0; i < trials; ++i) {
+    if (dist(rng)) yes++;
+  }
+
+  // Compute the distribution parameters for a binomial test, using a normal
+  // approximation for the confidence interval, as there are a sufficiently
+  // large number of trials that the central limit theorem applies.
+  const double stddev_p = std::sqrt((p * (1.0 - p)) / trials);
+  const double expected = trials * p;
+  const double stddev = trials * stddev_p;
+
+  // 5 sigma, approved by Richard Feynman
+  EXPECT_NEAR(yes, expected, 5 * stddev)
+      << "@" << p << ", "
+      << std::abs(static_cast<double>(yes) - expected) / stddev << " stddev";
+}
+
+// There must be many more trials to make the mean approximately normal for `p`
+// closes to 0 or 1.
+INSTANTIATE_TEST_SUITE_P(
+    All, BernoulliTest,
+    ::testing::Values(
+        // Typical values.
+        std::make_pair(0, 30000), std::make_pair(1e-3, 30000000),
+        std::make_pair(0.1, 3000000), std::make_pair(0.5, 3000000),
+        std::make_pair(0.9, 30000000), std::make_pair(0.999, 30000000),
+        std::make_pair(1, 30000),
+        // Boundary cases.
+        std::make_pair(std::nextafter(1.0, 0.0), 1),  // ~1 - epsilon
+        std::make_pair(std::numeric_limits<double>::epsilon(), 1),
+        std::make_pair(std::nextafter(std::numeric_limits<double>::min(),
+                                      1.0),  // min + epsilon
+                       1),
+        std::make_pair(std::numeric_limits<double>::min(),  // smallest normal
+                       1),
+        std::make_pair(
+            std::numeric_limits<double>::denorm_min(),  // smallest denorm
+            1),
+        std::make_pair(std::numeric_limits<double>::min() / 2, 1),  // denorm
+        std::make_pair(std::nextafter(std::numeric_limits<double>::min(),
+                                      0.0),  // denorm_max
+                       1)));
+
+// NOTE: absl::bernoulli_distribution is not guaranteed to be stable.
+TEST(BernoulliTest, StabilityTest) {
+  // absl::bernoulli_distribution stability relies on FastUniformBits and
+  // integer arithmetic.
+  absl::random_internal::sequence_urbg urbg({
+      0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+      0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+      0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+      0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull,
+      0x4864f22c059bf29eull, 0x247856d8b862665cull, 0xe46e86e9a1337e10ull,
+      0xd8c8541f3519b133ull, 0xe75b5162c567b9e4ull, 0xf732e5ded7009c5bull,
+      0xb170b98353121eacull, 0x1ec2e8986d2362caull, 0x814c8e35fe9a961aull,
+      0x0c3cd59c9b638a02ull, 0xcb3bb6478a07715cull, 0x1224e62c978bbc7full,
+      0x671ef2cb04e81f6eull, 0x3c1cbd811eaf1808ull, 0x1bbc23cfa8fac721ull,
+      0xa4c2cda65e596a51ull, 0xb77216fad37adf91ull, 0x836d794457c08849ull,
+      0xe083df03475f49d7ull, 0xbc9feb512e6b0d6cull, 0xb12d74fdd718c8c5ull,
+      0x12ff09653bfbe4caull, 0x8dd03a105bc4ee7eull, 0x5738341045ba0d85ull,
+      0xe3fd722dc65ad09eull, 0x5a14fd21ea2a5705ull, 0x14e6ea4d6edb0c73ull,
+      0x275b0dc7e0a18acfull, 0x36cebe0d2653682eull, 0x0361e9b23861596bull,
+  });
+
+  // Generate a std::string of '0' and '1' for the distribution output.
+  auto generate = [&urbg](absl::bernoulli_distribution& dist) {
+    std::string output;
+    output.reserve(36);
+    urbg.reset();
+    for (int i = 0; i < 35; i++) {
+      output.append(dist(urbg) ? "1" : "0");
+    }
+    return output;
+  };
+
+  const double kP = 0.0331289862362;
+  {
+    absl::bernoulli_distribution dist(kP);
+    auto v = generate(dist);
+    EXPECT_EQ(35, urbg.invocations());
+    EXPECT_EQ(v, "00000000000010000000000010000000000") << dist;
+  }
+  {
+    absl::bernoulli_distribution dist(kP * 10.0);
+    auto v = generate(dist);
+    EXPECT_EQ(35, urbg.invocations());
+    EXPECT_EQ(v, "00000100010010010010000011000011010") << dist;
+  }
+  {
+    absl::bernoulli_distribution dist(kP * 20.0);
+    auto v = generate(dist);
+    EXPECT_EQ(35, urbg.invocations());
+    EXPECT_EQ(v, "00011110010110110011011111110111011") << dist;
+  }
+  {
+    absl::bernoulli_distribution dist(1.0 - kP);
+    auto v = generate(dist);
+    EXPECT_EQ(35, urbg.invocations());
+    EXPECT_EQ(v, "11111111111111111111011111111111111") << dist;
+  }
+}
+
+TEST(BernoulliTest, StabilityTest2) {
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  // Generate a std::string of '0' and '1' for the distribution output.
+  auto generate = [&urbg](absl::bernoulli_distribution& dist) {
+    std::string output;
+    output.reserve(13);
+    urbg.reset();
+    for (int i = 0; i < 12; i++) {
+      output.append(dist(urbg) ? "1" : "0");
+    }
+    return output;
+  };
+
+  constexpr double b0 = 1.0 / 13.0 / 0.2;
+  constexpr double b1 = 2.0 / 13.0 / 0.2;
+  constexpr double b3 = (5.0 / 13.0 / 0.2) - ((1 - b0) + (1 - b1) + (1 - b1));
+  {
+    absl::bernoulli_distribution dist(b0);
+    auto v = generate(dist);
+    EXPECT_EQ(12, urbg.invocations());
+    EXPECT_EQ(v, "000011100101") << dist;
+  }
+  {
+    absl::bernoulli_distribution dist(b1);
+    auto v = generate(dist);
+    EXPECT_EQ(12, urbg.invocations());
+    EXPECT_EQ(v, "001111101101") << dist;
+  }
+  {
+    absl::bernoulli_distribution dist(b3);
+    auto v = generate(dist);
+    EXPECT_EQ(12, urbg.invocations());
+    EXPECT_EQ(v, "001111101111") << dist;
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/beta_distribution.h b/third_party/abseil-cpp/absl/random/beta_distribution.h
new file mode 100644
index 0000000..d7afd61c
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/beta_distribution.h
@@ -0,0 +1,414 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_BETA_DISTRIBUTION_H_
+#define ABSL_RANDOM_BETA_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <ostream>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/fastmath.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+
+// absl::beta_distribution:
+// Generate a floating-point variate conforming to a Beta distribution:
+//   pdf(x) \propto x^(alpha-1) * (1-x)^(beta-1),
+// where the params alpha and beta are both strictly positive real values.
+//
+// The support is the open interval (0, 1), but the return value might be equal
+// to 0 or 1, due to numerical errors when alpha and beta are very different.
+//
+// Usage note: One usage is that alpha and beta are counts of number of
+// successes and failures. When the total number of trials are large, consider
+// approximating a beta distribution with a Gaussian distribution with the same
+// mean and variance. One could use the skewness, which depends only on the
+// smaller of alpha and beta when the number of trials are sufficiently large,
+// to quantify how far a beta distribution is from the normal distribution.
+template <typename RealType = double>
+class beta_distribution {
+ public:
+  using result_type = RealType;
+
+  class param_type {
+   public:
+    using distribution_type = beta_distribution;
+
+    explicit param_type(result_type alpha, result_type beta)
+        : alpha_(alpha), beta_(beta) {
+      assert(alpha >= 0);
+      assert(beta >= 0);
+      assert(alpha <= (std::numeric_limits<result_type>::max)());
+      assert(beta <= (std::numeric_limits<result_type>::max)());
+      if (alpha == 0 || beta == 0) {
+        method_ = DEGENERATE_SMALL;
+        x_ = (alpha >= beta) ? 1 : 0;
+        return;
+      }
+      // a_ = min(beta, alpha), b_ = max(beta, alpha).
+      if (beta < alpha) {
+        inverted_ = true;
+        a_ = beta;
+        b_ = alpha;
+      } else {
+        inverted_ = false;
+        a_ = alpha;
+        b_ = beta;
+      }
+      if (a_ <= 1 && b_ >= ThresholdForLargeA()) {
+        method_ = DEGENERATE_SMALL;
+        x_ = inverted_ ? result_type(1) : result_type(0);
+        return;
+      }
+      // For threshold values, see also:
+      // Evaluation of Beta Generation Algorithms, Ying-Chao Hung, et. al.
+      // February, 2009.
+      if ((b_ < 1.0 && a_ + b_ <= 1.2) || a_ <= ThresholdForSmallA()) {
+        // Choose Joehnk over Cheng when it's faster or when Cheng encounters
+        // numerical issues.
+        method_ = JOEHNK;
+        a_ = result_type(1) / alpha_;
+        b_ = result_type(1) / beta_;
+        if (std::isinf(a_) || std::isinf(b_)) {
+          method_ = DEGENERATE_SMALL;
+          x_ = inverted_ ? result_type(1) : result_type(0);
+        }
+        return;
+      }
+      if (a_ >= ThresholdForLargeA()) {
+        method_ = DEGENERATE_LARGE;
+        // Note: on PPC for long double, evaluating
+        // `std::numeric_limits::max() / ThresholdForLargeA` results in NaN.
+        result_type r = a_ / b_;
+        x_ = (inverted_ ? result_type(1) : r) / (1 + r);
+        return;
+      }
+      x_ = a_ + b_;
+      log_x_ = std::log(x_);
+      if (a_ <= 1) {
+        method_ = CHENG_BA;
+        y_ = result_type(1) / a_;
+        gamma_ = a_ + a_;
+        return;
+      }
+      method_ = CHENG_BB;
+      result_type r = (a_ - 1) / (b_ - 1);
+      y_ = std::sqrt((1 + r) / (b_ * r * 2 - r + 1));
+      gamma_ = a_ + result_type(1) / y_;
+    }
+
+    result_type alpha() const { return alpha_; }
+    result_type beta() const { return beta_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.alpha_ == b.alpha_ && a.beta_ == b.beta_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class beta_distribution;
+
+#ifdef COMPILER_MSVC
+    // MSVC does not have constexpr implementations for std::log and std::exp
+    // so they are computed at runtime.
+#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
+#else
+#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR constexpr
+#endif
+
+    // The threshold for whether std::exp(1/a) is finite.
+    // Note that this value is quite large, and a smaller a_ is NOT abnormal.
+    static ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR result_type
+    ThresholdForSmallA() {
+      return result_type(1) /
+             std::log((std::numeric_limits<result_type>::max)());
+    }
+
+    // The threshold for whether a * std::log(a) is finite.
+    static ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR result_type
+    ThresholdForLargeA() {
+      return std::exp(
+          std::log((std::numeric_limits<result_type>::max)()) -
+          std::log(std::log((std::numeric_limits<result_type>::max)())) -
+          ThresholdPadding());
+    }
+
+#undef ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
+
+    // Pad the threshold for large A for long double on PPC. This is done via a
+    // template specialization below.
+    static constexpr result_type ThresholdPadding() { return 0; }
+
+    enum Method {
+      JOEHNK,    // Uses algorithm Joehnk
+      CHENG_BA,  // Uses algorithm BA in Cheng
+      CHENG_BB,  // Uses algorithm BB in Cheng
+
+      // Note: See also:
+      //   Hung et al. Evaluation of beta generation algorithms. Communications
+      //   in Statistics-Simulation and Computation 38.4 (2009): 750-770.
+      // especially:
+      //   Zechner, Heinz, and Ernst Stadlober. Generating beta variates via
+      //   patchwork rejection. Computing 50.1 (1993): 1-18.
+
+      DEGENERATE_SMALL,  // a_ is abnormally small.
+      DEGENERATE_LARGE,  // a_ is abnormally large.
+    };
+
+    result_type alpha_;
+    result_type beta_;
+
+    result_type a_;  // the smaller of {alpha, beta}, or 1.0/alpha_ in JOEHNK
+    result_type b_;  // the larger of {alpha, beta}, or 1.0/beta_ in JOEHNK
+    result_type x_;  // alpha + beta, or the result in degenerate cases
+    result_type log_x_;  // log(x_)
+    result_type y_;      // "beta" in Cheng
+    result_type gamma_;  // "gamma" in Cheng
+
+    Method method_;
+
+    // Placing this last for optimal alignment.
+    // Whether alpha_ != a_, i.e. true iff alpha_ > beta_.
+    bool inverted_;
+
+    static_assert(std::is_floating_point<RealType>::value,
+                  "Class-template absl::beta_distribution<> must be "
+                  "parameterized using a floating-point type.");
+  };
+
+  beta_distribution() : beta_distribution(1) {}
+
+  explicit beta_distribution(result_type alpha, result_type beta = 1)
+      : param_(alpha, beta) {}
+
+  explicit beta_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  // Generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const { return 0; }
+  result_type(max)() const { return 1; }
+
+  result_type alpha() const { return param_.alpha(); }
+  result_type beta() const { return param_.beta(); }
+
+  friend bool operator==(const beta_distribution& a,
+                         const beta_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const beta_distribution& a,
+                         const beta_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  template <typename URBG>
+  result_type AlgorithmJoehnk(URBG& g,  // NOLINT(runtime/references)
+                              const param_type& p);
+
+  template <typename URBG>
+  result_type AlgorithmCheng(URBG& g,  // NOLINT(runtime/references)
+                             const param_type& p);
+
+  template <typename URBG>
+  result_type DegenerateCase(URBG& g,  // NOLINT(runtime/references)
+                             const param_type& p) {
+    if (p.method_ == param_type::DEGENERATE_SMALL && p.alpha_ == p.beta_) {
+      // Returns 0 or 1 with equal probability.
+      random_internal::FastUniformBits<uint8_t> fast_u8;
+      return static_cast<result_type>((fast_u8(g) & 0x10) !=
+                                      0);  // pick any single bit.
+    }
+    return p.x_;
+  }
+
+  param_type param_;
+  random_internal::FastUniformBits<uint64_t> fast_u64_;
+};
+
+#if defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
+    defined(__ppc__) || defined(__PPC__)
+// PPC needs a more stringent boundary for long double.
+template <>
+constexpr long double
+beta_distribution<long double>::param_type::ThresholdPadding() {
+  return 10;
+}
+#endif
+
+template <typename RealType>
+template <typename URBG>
+typename beta_distribution<RealType>::result_type
+beta_distribution<RealType>::AlgorithmJoehnk(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  // Based on Joehnk, M. D. Erzeugung von betaverteilten und gammaverteilten
+  // Zufallszahlen. Metrika 8.1 (1964): 5-15.
+  // This method is described in Knuth, Vol 2 (Third Edition), pp 134.
+  using RandU64ToReal = typename random_internal::RandU64ToReal<result_type>;
+  using random_internal::PositiveValueT;
+  result_type u, v, x, y, z;
+  for (;;) {
+    u = RandU64ToReal::template Value<PositiveValueT, false>(fast_u64_(g));
+    v = RandU64ToReal::template Value<PositiveValueT, false>(fast_u64_(g));
+
+    // Direct method. std::pow is slow for float, so rely on the optimizer to
+    // remove the std::pow() path for that case.
+    if (!std::is_same<float, result_type>::value) {
+      x = std::pow(u, p.a_);
+      y = std::pow(v, p.b_);
+      z = x + y;
+      if (z > 1) {
+        // Reject if and only if `x + y > 1.0`
+        continue;
+      }
+      if (z > 0) {
+        // When both alpha and beta are small, x and y are both close to 0, so
+        // divide by (x+y) directly may result in nan.
+        return x / z;
+      }
+    }
+
+    // Log transform.
+    // x = log( pow(u, p.a_) ), y = log( pow(v, p.b_) )
+    // since u, v <= 1.0,  x, y < 0.
+    x = std::log(u) * p.a_;
+    y = std::log(v) * p.b_;
+    if (!std::isfinite(x) || !std::isfinite(y)) {
+      continue;
+    }
+    // z = log( pow(u, a) + pow(v, b) )
+    z = x > y ? (x + std::log(1 + std::exp(y - x)))
+              : (y + std::log(1 + std::exp(x - y)));
+    // Reject iff log(x+y) > 0.
+    if (z > 0) {
+      continue;
+    }
+    return std::exp(x - z);
+  }
+}
+
+template <typename RealType>
+template <typename URBG>
+typename beta_distribution<RealType>::result_type
+beta_distribution<RealType>::AlgorithmCheng(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  // Based on Cheng, Russell CH. Generating beta variates with nonintegral
+  // shape parameters. Communications of the ACM 21.4 (1978): 317-322.
+  // (https://dl.acm.org/citation.cfm?id=359482).
+  using RandU64ToReal = typename random_internal::RandU64ToReal<result_type>;
+  using random_internal::PositiveValueT;
+
+  static constexpr result_type kLogFour =
+      result_type(1.3862943611198906188344642429163531361);  // log(4)
+  static constexpr result_type kS =
+      result_type(2.6094379124341003746007593332261876);  // 1+log(5)
+
+  const bool use_algorithm_ba = (p.method_ == param_type::CHENG_BA);
+  result_type u1, u2, v, w, z, r, s, t, bw_inv, lhs;
+  for (;;) {
+    u1 = RandU64ToReal::template Value<PositiveValueT, false>(fast_u64_(g));
+    u2 = RandU64ToReal::template Value<PositiveValueT, false>(fast_u64_(g));
+    v = p.y_ * std::log(u1 / (1 - u1));
+    w = p.a_ * std::exp(v);
+    bw_inv = result_type(1) / (p.b_ + w);
+    r = p.gamma_ * v - kLogFour;
+    s = p.a_ + r - w;
+    z = u1 * u1 * u2;
+    if (!use_algorithm_ba && s + kS >= 5 * z) {
+      break;
+    }
+    t = std::log(z);
+    if (!use_algorithm_ba && s >= t) {
+      break;
+    }
+    lhs = p.x_ * (p.log_x_ + std::log(bw_inv)) + r;
+    if (lhs >= t) {
+      break;
+    }
+  }
+  return p.inverted_ ? (1 - w * bw_inv) : w * bw_inv;
+}
+
+template <typename RealType>
+template <typename URBG>
+typename beta_distribution<RealType>::result_type
+beta_distribution<RealType>::operator()(URBG& g,  // NOLINT(runtime/references)
+                                        const param_type& p) {
+  switch (p.method_) {
+    case param_type::JOEHNK:
+      return AlgorithmJoehnk(g, p);
+    case param_type::CHENG_BA:
+      ABSL_FALLTHROUGH_INTENDED;
+    case param_type::CHENG_BB:
+      return AlgorithmCheng(g, p);
+    default:
+      return DegenerateCase(g, p);
+  }
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const beta_distribution<RealType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
+  os << x.alpha() << os.fill() << x.beta();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    beta_distribution<RealType>& x) {       // NOLINT(runtime/references)
+  using result_type = typename beta_distribution<RealType>::result_type;
+  using param_type = typename beta_distribution<RealType>::param_type;
+  result_type alpha, beta;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  alpha = random_internal::read_floating_point<result_type>(is);
+  if (is.fail()) return is;
+  beta = random_internal::read_floating_point<result_type>(is);
+  if (!is.fail()) {
+    x.param(param_type(alpha, beta));
+  }
+  return is;
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_BETA_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/beta_distribution_test.cc b/third_party/abseil-cpp/absl/random/beta_distribution_test.cc
new file mode 100644
index 0000000..966ad08
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/beta_distribution_test.cc
@@ -0,0 +1,614 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/beta_distribution.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <sstream>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+template <typename IntType>
+class BetaDistributionInterfaceTest : public ::testing::Test {};
+
+using RealTypes = ::testing::Types<float, double, long double>;
+TYPED_TEST_CASE(BetaDistributionInterfaceTest, RealTypes);
+
+TYPED_TEST(BetaDistributionInterfaceTest, SerializeTest) {
+  // The threshold for whether std::exp(1/a) is finite.
+  const TypeParam kSmallA =
+      1.0f / std::log((std::numeric_limits<TypeParam>::max)());
+  // The threshold for whether a * std::log(a) is finite.
+  const TypeParam kLargeA =
+      std::exp(std::log((std::numeric_limits<TypeParam>::max)()) -
+               std::log(std::log((std::numeric_limits<TypeParam>::max)())));
+  const TypeParam kLargeAPPC = std::exp(
+      std::log((std::numeric_limits<TypeParam>::max)()) -
+      std::log(std::log((std::numeric_limits<TypeParam>::max)())) - 10.0f);
+  using param_type = typename absl::beta_distribution<TypeParam>::param_type;
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  const TypeParam kValues[] = {
+      TypeParam(1e-20), TypeParam(1e-12), TypeParam(1e-8), TypeParam(1e-4),
+      TypeParam(1e-3), TypeParam(0.1), TypeParam(0.25),
+      std::nextafter(TypeParam(0.5), TypeParam(0)),  // 0.5 - epsilon
+      std::nextafter(TypeParam(0.5), TypeParam(1)),  // 0.5 + epsilon
+      TypeParam(0.5), TypeParam(1.0),                //
+      std::nextafter(TypeParam(1), TypeParam(0)),    // 1 - epsilon
+      std::nextafter(TypeParam(1), TypeParam(2)),    // 1 + epsilon
+      TypeParam(12.5), TypeParam(1e2), TypeParam(1e8), TypeParam(1e12),
+      TypeParam(1e20),                        //
+      kSmallA,                                //
+      std::nextafter(kSmallA, TypeParam(0)),  //
+      std::nextafter(kSmallA, TypeParam(1)),  //
+      kLargeA,                                //
+      std::nextafter(kLargeA, TypeParam(0)),  //
+      std::nextafter(kLargeA, std::numeric_limits<TypeParam>::max()),
+      kLargeAPPC,  //
+      std::nextafter(kLargeAPPC, TypeParam(0)),
+      std::nextafter(kLargeAPPC, std::numeric_limits<TypeParam>::max()),
+      // Boundary cases.
+      std::numeric_limits<TypeParam>::max(),
+      std::numeric_limits<TypeParam>::epsilon(),
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(1)),                  // min + epsilon
+      std::numeric_limits<TypeParam>::min(),         // smallest normal
+      std::numeric_limits<TypeParam>::denorm_min(),  // smallest denorm
+      std::numeric_limits<TypeParam>::min() / 2,     // denorm
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(0)),  // denorm_max
+  };
+  for (TypeParam alpha : kValues) {
+    for (TypeParam beta : kValues) {
+      ABSL_INTERNAL_LOG(
+          INFO, absl::StrFormat("Smoke test for Beta(%f, %f)", alpha, beta));
+
+      param_type param(alpha, beta);
+      absl::beta_distribution<TypeParam> before(alpha, beta);
+      EXPECT_EQ(before.alpha(), param.alpha());
+      EXPECT_EQ(before.beta(), param.beta());
+
+      {
+        absl::beta_distribution<TypeParam> via_param(param);
+        EXPECT_EQ(via_param, before);
+        EXPECT_EQ(via_param.param(), before.param());
+      }
+
+      // Smoke test.
+      for (int i = 0; i < kCount; ++i) {
+        auto sample = before(gen);
+        EXPECT_TRUE(std::isfinite(sample));
+        EXPECT_GE(sample, before.min());
+        EXPECT_LE(sample, before.max());
+      }
+
+      // Validate stream serialization.
+      std::stringstream ss;
+      ss << before;
+      absl::beta_distribution<TypeParam> after(3.8f, 1.43f);
+      EXPECT_NE(before.alpha(), after.alpha());
+      EXPECT_NE(before.beta(), after.beta());
+      EXPECT_NE(before.param(), after.param());
+      EXPECT_NE(before, after);
+
+      ss >> after;
+
+#if defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
+    defined(__ppc__) || defined(__PPC__)
+      if (std::is_same<TypeParam, long double>::value) {
+        // Roundtripping floating point values requires sufficient precision
+        // to reconstruct the exact value. It turns out that long double
+        // has some errors doing this on ppc.
+        if (alpha <= std::numeric_limits<double>::max() &&
+            alpha >= std::numeric_limits<double>::lowest()) {
+          EXPECT_EQ(static_cast<double>(before.alpha()),
+                    static_cast<double>(after.alpha()))
+              << ss.str();
+        }
+        if (beta <= std::numeric_limits<double>::max() &&
+            beta >= std::numeric_limits<double>::lowest()) {
+          EXPECT_EQ(static_cast<double>(before.beta()),
+                    static_cast<double>(after.beta()))
+              << ss.str();
+        }
+        continue;
+      }
+#endif
+
+      EXPECT_EQ(before.alpha(), after.alpha());
+      EXPECT_EQ(before.beta(), after.beta());
+      EXPECT_EQ(before, after)           //
+          << ss.str() << " "             //
+          << (ss.good() ? "good " : "")  //
+          << (ss.bad() ? "bad " : "")    //
+          << (ss.eof() ? "eof " : "")    //
+          << (ss.fail() ? "fail " : "");
+    }
+  }
+}
+
+TYPED_TEST(BetaDistributionInterfaceTest, DegenerateCases) {
+  // Extreme cases when the params are abnormal.
+  absl::InsecureBitGen gen;
+  constexpr int kCount = 1000;
+  const TypeParam kSmallValues[] = {
+      std::numeric_limits<TypeParam>::min(),
+      std::numeric_limits<TypeParam>::denorm_min(),
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(0)),  // denorm_max
+      std::numeric_limits<TypeParam>::epsilon(),
+  };
+  const TypeParam kLargeValues[] = {
+      std::numeric_limits<TypeParam>::max() * static_cast<TypeParam>(0.9999),
+      std::numeric_limits<TypeParam>::max() - 1,
+      std::numeric_limits<TypeParam>::max(),
+  };
+  {
+    // Small alpha and beta.
+    // Useful WolframAlpha plots:
+    //   * plot InverseBetaRegularized[x, 0.0001, 0.0001] from 0.495 to 0.505
+    //   * Beta[1.0, 0.0000001, 0.0000001]
+    //   * Beta[0.9999, 0.0000001, 0.0000001]
+    for (TypeParam alpha : kSmallValues) {
+      for (TypeParam beta : kSmallValues) {
+        int zeros = 0;
+        int ones = 0;
+        absl::beta_distribution<TypeParam> d(alpha, beta);
+        for (int i = 0; i < kCount; ++i) {
+          TypeParam x = d(gen);
+          if (x == 0.0) {
+            zeros++;
+          } else if (x == 1.0) {
+            ones++;
+          }
+        }
+        EXPECT_EQ(ones + zeros, kCount);
+        if (alpha == beta) {
+          EXPECT_NE(ones, 0);
+          EXPECT_NE(zeros, 0);
+        }
+      }
+    }
+  }
+  {
+    // Small alpha, large beta.
+    // Useful WolframAlpha plots:
+    //   * plot InverseBetaRegularized[x, 0.0001, 10000] from 0.995 to 1
+    //   * Beta[0, 0.0000001, 1000000]
+    //   * Beta[0.001, 0.0000001, 1000000]
+    //   * Beta[1, 0.0000001, 1000000]
+    for (TypeParam alpha : kSmallValues) {
+      for (TypeParam beta : kLargeValues) {
+        absl::beta_distribution<TypeParam> d(alpha, beta);
+        for (int i = 0; i < kCount; ++i) {
+          EXPECT_EQ(d(gen), 0.0);
+        }
+      }
+    }
+  }
+  {
+    // Large alpha, small beta.
+    // Useful WolframAlpha plots:
+    //   * plot InverseBetaRegularized[x, 10000, 0.0001] from 0 to 0.001
+    //   * Beta[0.99, 1000000, 0.0000001]
+    //   * Beta[1, 1000000, 0.0000001]
+    for (TypeParam alpha : kLargeValues) {
+      for (TypeParam beta : kSmallValues) {
+        absl::beta_distribution<TypeParam> d(alpha, beta);
+        for (int i = 0; i < kCount; ++i) {
+          EXPECT_EQ(d(gen), 1.0);
+        }
+      }
+    }
+  }
+  {
+    // Large alpha and beta.
+    absl::beta_distribution<TypeParam> d(std::numeric_limits<TypeParam>::max(),
+                                         std::numeric_limits<TypeParam>::max());
+    for (int i = 0; i < kCount; ++i) {
+      EXPECT_EQ(d(gen), 0.5);
+    }
+  }
+  {
+    // Large alpha and beta but unequal.
+    absl::beta_distribution<TypeParam> d(
+        std::numeric_limits<TypeParam>::max(),
+        std::numeric_limits<TypeParam>::max() * 0.9999);
+    for (int i = 0; i < kCount; ++i) {
+      TypeParam x = d(gen);
+      EXPECT_NE(x, 0.5f);
+      EXPECT_FLOAT_EQ(x, 0.500025f);
+    }
+  }
+}
+
+class BetaDistributionModel {
+ public:
+  explicit BetaDistributionModel(::testing::tuple<double, double> p)
+      : alpha_(::testing::get<0>(p)), beta_(::testing::get<1>(p)) {}
+
+  double Mean() const { return alpha_ / (alpha_ + beta_); }
+
+  double Variance() const {
+    return alpha_ * beta_ / (alpha_ + beta_ + 1) / (alpha_ + beta_) /
+           (alpha_ + beta_);
+  }
+
+  double Kurtosis() const {
+    return 3 + 6 *
+                   ((alpha_ - beta_) * (alpha_ - beta_) * (alpha_ + beta_ + 1) -
+                    alpha_ * beta_ * (2 + alpha_ + beta_)) /
+                   alpha_ / beta_ / (alpha_ + beta_ + 2) / (alpha_ + beta_ + 3);
+  }
+
+ protected:
+  const double alpha_;
+  const double beta_;
+};
+
+class BetaDistributionTest
+    : public ::testing::TestWithParam<::testing::tuple<double, double>>,
+      public BetaDistributionModel {
+ public:
+  BetaDistributionTest() : BetaDistributionModel(GetParam()) {}
+
+ protected:
+  template <class D>
+  bool SingleZTestOnMeanAndVariance(double p, size_t samples);
+
+  template <class D>
+  bool SingleChiSquaredTest(double p, size_t samples, size_t buckets);
+
+  absl::InsecureBitGen rng_;
+};
+
+template <class D>
+bool BetaDistributionTest::SingleZTestOnMeanAndVariance(double p,
+                                                        size_t samples) {
+  D dis(alpha_, beta_);
+
+  std::vector<double> data;
+  data.reserve(samples);
+  for (size_t i = 0; i < samples; i++) {
+    const double variate = dis(rng_);
+    EXPECT_FALSE(std::isnan(variate));
+    // Note that equality is allowed on both sides.
+    EXPECT_GE(variate, 0.0);
+    EXPECT_LE(variate, 1.0);
+    data.push_back(variate);
+  }
+
+  // We validate that the sample mean and sample variance are indeed from a
+  // Beta distribution with the given shape parameters.
+  const auto m = absl::random_internal::ComputeDistributionMoments(data);
+
+  // The variance of the sample mean is variance / n.
+  const double mean_stddev = std::sqrt(Variance() / static_cast<double>(m.n));
+
+  // The variance of the sample variance is (approximately):
+  //   (kurtosis - 1) * variance^2 / n
+  const double variance_stddev = std::sqrt(
+      (Kurtosis() - 1) * Variance() * Variance() / static_cast<double>(m.n));
+  // z score for the sample variance.
+  const double z_variance = (m.variance - Variance()) / variance_stddev;
+
+  const double max_err = absl::random_internal::MaxErrorTolerance(p);
+  const double z_mean = absl::random_internal::ZScore(Mean(), m);
+  const bool pass =
+      absl::random_internal::Near("z", z_mean, 0.0, max_err) &&
+      absl::random_internal::Near("z_variance", z_variance, 0.0, max_err);
+  if (!pass) {
+    ABSL_INTERNAL_LOG(
+        INFO,
+        absl::StrFormat(
+            "Beta(%f, %f), "
+            "mean: sample %f, expect %f, which is %f stddevs away, "
+            "variance: sample %f, expect %f, which is %f stddevs away.",
+            alpha_, beta_, m.mean, Mean(),
+            std::abs(m.mean - Mean()) / mean_stddev, m.variance, Variance(),
+            std::abs(m.variance - Variance()) / variance_stddev));
+  }
+  return pass;
+}
+
+template <class D>
+bool BetaDistributionTest::SingleChiSquaredTest(double p, size_t samples,
+                                                size_t buckets) {
+  constexpr double kErr = 1e-7;
+  std::vector<double> cutoffs, expected;
+  const double bucket_width = 1.0 / static_cast<double>(buckets);
+  int i = 1;
+  int unmerged_buckets = 0;
+  for (; i < buckets; ++i) {
+    const double p = bucket_width * static_cast<double>(i);
+    const double boundary =
+        absl::random_internal::BetaIncompleteInv(alpha_, beta_, p);
+    // The intention is to add `boundary` to the list of `cutoffs`. It becomes
+    // problematic, however, when the boundary values are not monotone, due to
+    // numerical issues when computing the inverse regularized incomplete
+    // Beta function. In these cases, we merge that bucket with its previous
+    // neighbor and merge their expected counts.
+    if ((cutoffs.empty() && boundary < kErr) ||
+        (!cutoffs.empty() && boundary <= cutoffs.back())) {
+      unmerged_buckets++;
+      continue;
+    }
+    if (boundary >= 1.0 - 1e-10) {
+      break;
+    }
+    cutoffs.push_back(boundary);
+    expected.push_back(static_cast<double>(1 + unmerged_buckets) *
+                       bucket_width * static_cast<double>(samples));
+    unmerged_buckets = 0;
+  }
+  cutoffs.push_back(std::numeric_limits<double>::infinity());
+  // Merge all remaining buckets.
+  expected.push_back(static_cast<double>(buckets - i + 1) * bucket_width *
+                     static_cast<double>(samples));
+  // Make sure that we don't merge all the buckets, making this test
+  // meaningless.
+  EXPECT_GE(cutoffs.size(), 3) << alpha_ << ", " << beta_;
+
+  D dis(alpha_, beta_);
+
+  std::vector<int32_t> counts(cutoffs.size(), 0);
+  for (int i = 0; i < samples; i++) {
+    const double x = dis(rng_);
+    auto it = std::upper_bound(cutoffs.begin(), cutoffs.end(), x);
+    counts[std::distance(cutoffs.begin(), it)]++;
+  }
+
+  // Null-hypothesis is that the distribution is beta distributed with the
+  // provided alpha, beta params (not estimated from the data).
+  const int dof = cutoffs.size() - 1;
+
+  const double chi_square = absl::random_internal::ChiSquare(
+      counts.begin(), counts.end(), expected.begin(), expected.end());
+  const bool pass =
+      (absl::random_internal::ChiSquarePValue(chi_square, dof) >= p);
+  if (!pass) {
+    for (int i = 0; i < cutoffs.size(); i++) {
+      ABSL_INTERNAL_LOG(
+          INFO, absl::StrFormat("cutoff[%d] = %f, actual count %d, expected %d",
+                                i, cutoffs[i], counts[i],
+                                static_cast<int>(expected[i])));
+    }
+
+    ABSL_INTERNAL_LOG(
+        INFO, absl::StrFormat(
+                  "Beta(%f, %f) %s %f, p = %f", alpha_, beta_,
+                  absl::random_internal::kChiSquared, chi_square,
+                  absl::random_internal::ChiSquarePValue(chi_square, dof)));
+  }
+  return pass;
+}
+
+TEST_P(BetaDistributionTest, TestSampleStatistics) {
+  static constexpr int kRuns = 20;
+  static constexpr double kPFail = 0.02;
+  const double p =
+      absl::random_internal::RequiredSuccessProbability(kPFail, kRuns);
+  static constexpr int kSampleCount = 10000;
+  static constexpr int kBucketCount = 100;
+  int failed = 0;
+  for (int i = 0; i < kRuns; ++i) {
+    if (!SingleZTestOnMeanAndVariance<absl::beta_distribution<double>>(
+            p, kSampleCount)) {
+      failed++;
+    }
+    if (!SingleChiSquaredTest<absl::beta_distribution<double>>(
+            0.005, kSampleCount, kBucketCount)) {
+      failed++;
+    }
+  }
+  // Set so that the test is not flaky at --runs_per_test=10000
+  EXPECT_LE(failed, 5);
+}
+
+std::string ParamName(
+    const ::testing::TestParamInfo<::testing::tuple<double, double>>& info) {
+  std::string name = absl::StrCat("alpha_", ::testing::get<0>(info.param),
+                                  "__beta_", ::testing::get<1>(info.param));
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_CASE_P(
+    TestSampleStatisticsCombinations, BetaDistributionTest,
+    ::testing::Combine(::testing::Values(0.1, 0.2, 0.9, 1.1, 2.5, 10.0, 123.4),
+                       ::testing::Values(0.1, 0.2, 0.9, 1.1, 2.5, 10.0, 123.4)),
+    ParamName);
+
+INSTANTIATE_TEST_CASE_P(
+    TestSampleStatistics_SelectedPairs, BetaDistributionTest,
+    ::testing::Values(std::make_pair(0.5, 1000), std::make_pair(1000, 0.5),
+                      std::make_pair(900, 1000), std::make_pair(10000, 20000),
+                      std::make_pair(4e5, 2e7), std::make_pair(1e7, 1e5)),
+    ParamName);
+
+// NOTE: absl::beta_distribution is not guaranteed to be stable.
+TEST(BetaDistributionTest, StabilityTest) {
+  // absl::beta_distribution stability relies on the stability of
+  // absl::random_interna::RandU64ToDouble, std::exp, std::log, std::pow,
+  // and std::sqrt.
+  //
+  // This test also depends on the stability of std::frexp.
+  using testing::ElementsAre;
+  absl::random_internal::sequence_urbg urbg({
+      0xffff00000000e6c8ull, 0xffff0000000006c8ull, 0x800003766295CFA9ull,
+      0x11C819684E734A41ull, 0x832603766295CFA9ull, 0x7fbe76c8b4395800ull,
+      0xB3472DCA7B14A94Aull, 0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull,
+      0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull, 0x00035C904C70A239ull,
+      0x00009E0BCBAADE14ull, 0x0000000000622CA7ull, 0x4864f22c059bf29eull,
+      0x247856d8b862665cull, 0xe46e86e9a1337e10ull, 0xd8c8541f3519b133ull,
+      0xffe75b52c567b9e4ull, 0xfffff732e5709c5bull, 0xff1f7f0b983532acull,
+      0x1ec2e8986d2362caull, 0xC332DDEFBE6C5AA5ull, 0x6558218568AB9702ull,
+      0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull, 0xECDD4775619F1510ull,
+      0x814c8e35fe9a961aull, 0x0c3cd59c9b638a02ull, 0xcb3bb6478a07715cull,
+      0x1224e62c978bbc7full, 0x671ef2cb04e81f6eull, 0x3c1cbd811eaf1808ull,
+      0x1bbc23cfa8fac721ull, 0xa4c2cda65e596a51ull, 0xb77216fad37adf91ull,
+      0x836d794457c08849ull, 0xe083df03475f49d7ull, 0xbc9feb512e6b0d6cull,
+      0xb12d74fdd718c8c5ull, 0x12ff09653bfbe4caull, 0x8dd03a105bc4ee7eull,
+      0x5738341045ba0d85ull, 0xf3fd722dc65ad09eull, 0xfa14fd21ea2a5705ull,
+      0xffe6ea4d6edb0c73ull, 0xD07E9EFE2BF11FB4ull, 0x95DBDA4DAE909198ull,
+      0xEAAD8E716B93D5A0ull, 0xD08ED1D0AFC725E0ull, 0x8E3C5B2F8E7594B7ull,
+      0x8FF6E2FBF2122B64ull, 0x8888B812900DF01Cull, 0x4FAD5EA0688FC31Cull,
+      0xD1CFF191B3A8C1ADull, 0x2F2F2218BE0E1777ull, 0xEA752DFE8B021FA1ull,
+  });
+
+  // Convert the real-valued result into a unit64 where we compare
+  // 5 (float) or 10 (double) decimal digits plus the base-2 exponent.
+  auto float_to_u64 = [](float d) {
+    int exp = 0;
+    auto f = std::frexp(d, &exp);
+    return (static_cast<uint64_t>(1e5 * f) * 10000) + std::abs(exp);
+  };
+  auto double_to_u64 = [](double d) {
+    int exp = 0;
+    auto f = std::frexp(d, &exp);
+    return (static_cast<uint64_t>(1e10 * f) * 10000) + std::abs(exp);
+  };
+
+  std::vector<uint64_t> output(20);
+  {
+    // Algorithm Joehnk (float)
+    absl::beta_distribution<float> dist(0.1f, 0.2f);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return float_to_u64(dist(urbg)); });
+    EXPECT_EQ(44, urbg.invocations());
+    EXPECT_THAT(output,  //
+                testing::ElementsAre(
+                    998340000, 619030004, 500000001, 999990000, 996280000,
+                    500000001, 844740004, 847210001, 999970000, 872320000,
+                    585480007, 933280000, 869080042, 647670031, 528240004,
+                    969980004, 626050008, 915930002, 833440033, 878040015));
+  }
+
+  urbg.reset();
+  {
+    // Algorithm Joehnk (double)
+    absl::beta_distribution<double> dist(0.1, 0.2);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return double_to_u64(dist(urbg)); });
+    EXPECT_EQ(44, urbg.invocations());
+    EXPECT_THAT(
+        output,  //
+        testing::ElementsAre(
+            99834713000000, 61903356870004, 50000000000001, 99999721170000,
+            99628374770000, 99999999990000, 84474397860004, 84721276240001,
+            99997407490000, 87232528120000, 58548364780007, 93328932910000,
+            86908237770042, 64767917930031, 52824581970004, 96998544140004,
+            62605946270008, 91593604380002, 83345031740033, 87804397230015));
+  }
+
+  urbg.reset();
+  {
+    // Algorithm Cheng 1
+    absl::beta_distribution<double> dist(0.9, 2.0);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return double_to_u64(dist(urbg)); });
+    EXPECT_EQ(62, urbg.invocations());
+    EXPECT_THAT(
+        output,  //
+        testing::ElementsAre(
+            62069004780001, 64433204450001, 53607416560000, 89644295430008,
+            61434586310019, 55172615890002, 62187161490000, 56433684810003,
+            80454622050005, 86418558710003, 92920514700001, 64645184680001,
+            58549183380000, 84881283650005, 71078728590002, 69949694970000,
+            73157461710001, 68592191300001, 70747623900000, 78584696930005));
+  }
+
+  urbg.reset();
+  {
+    // Algorithm Cheng 2
+    absl::beta_distribution<double> dist(1.5, 2.5);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return double_to_u64(dist(urbg)); });
+    EXPECT_EQ(54, urbg.invocations());
+    EXPECT_THAT(
+        output,  //
+        testing::ElementsAre(
+            75000029250001, 76751482860001, 53264575220000, 69193133650005,
+            78028324470013, 91573587560002, 59167523770000, 60658618560002,
+            80075870540000, 94141320460004, 63196592770003, 78883906300002,
+            96797992590001, 76907587800001, 56645167560000, 65408302280003,
+            53401156320001, 64731238570000, 83065573750001, 79788333820001));
+  }
+}
+
+// This is an implementation-specific test. If any part of the implementation
+// changes, then it is likely that this test will change as well.  Also, if
+// dependencies of the distribution change, such as RandU64ToDouble, then this
+// is also likely to change.
+TEST(BetaDistributionTest, AlgorithmBounds) {
+  {
+    absl::random_internal::sequence_urbg urbg(
+        {0x7fbe76c8b4395800ull, 0x8000000000000000ull});
+    // u=0.499, v=0.5
+    absl::beta_distribution<double> dist(1e-4, 1e-4);
+    double a = dist(urbg);
+    EXPECT_EQ(a, 2.0202860861567108529e-09);
+    EXPECT_EQ(2, urbg.invocations());
+  }
+
+  // Test that both the float & double algorithms appropriately reject the
+  // initial draw.
+  {
+    // 1/alpha = 1/beta = 2.
+    absl::beta_distribution<float> dist(0.5, 0.5);
+
+    // first two outputs are close to 1.0 - epsilon,
+    // thus:  (u ^ 2 + v ^ 2) > 1.0
+    absl::random_internal::sequence_urbg urbg(
+        {0xffff00000006e6c8ull, 0xffff00000007c7c8ull, 0x800003766295CFA9ull,
+         0x11C819684E734A41ull});
+    {
+      double y = absl::beta_distribution<double>(0.5, 0.5)(urbg);
+      EXPECT_EQ(4, urbg.invocations());
+      EXPECT_EQ(y, 0.9810668952633862) << y;
+    }
+
+    // ...and:  log(u) * a ~= log(v) * b ~= -0.02
+    // thus z ~= -0.02 + log(1 + e(~0))
+    //        ~= -0.02 + 0.69
+    // thus z > 0
+    urbg.reset();
+    {
+      float x = absl::beta_distribution<float>(0.5, 0.5)(urbg);
+      EXPECT_EQ(4, urbg.invocations());
+      EXPECT_NEAR(0.98106688261032104, x, 0.0000005) << x << "f";
+    }
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/discrete_distribution.cc b/third_party/abseil-cpp/absl/random/discrete_distribution.cc
new file mode 100644
index 0000000..e6c09c51
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/discrete_distribution.cc
@@ -0,0 +1,96 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/discrete_distribution.h"
+
+namespace absl {
+namespace random_internal {
+
+// Initializes the distribution table for Walker's Aliasing algorithm, described
+// in Knuth, Vol 2. as well as in https://en.wikipedia.org/wiki/Alias_method
+std::vector<std::pair<double, size_t>> InitDiscreteDistribution(
+    std::vector<double>* probabilities) {
+  // The empty-case should already be handled by the constructor.
+  assert(probabilities);
+  assert(!probabilities->empty());
+
+  // Step 1. Normalize the input probabilities to 1.0.
+  double sum = std::accumulate(std::begin(*probabilities),
+                               std::end(*probabilities), 0.0);
+  if (std::fabs(sum - 1.0) > 1e-6) {
+    // Scale `probabilities` only when the sum is too far from 1.0.  Scaling
+    // unconditionally will alter the probabilities slightly.
+    for (double& item : *probabilities) {
+      item = item / sum;
+    }
+  }
+
+  // Step 2. At this point `probabilities` is set to the conditional
+  // probabilities of each element which sum to 1.0, to within reasonable error.
+  // These values are used to construct the proportional probability tables for
+  // the selection phases of Walker's Aliasing algorithm.
+  //
+  // To construct the table, pick an element which is under-full (i.e., an
+  // element for which `(*probabilities)[i] < 1.0/n`), and pair it with an
+  // element which is over-full (i.e., an element for which
+  // `(*probabilities)[i] > 1.0/n`). The smaller value can always be retired.
+  // The larger may still be greater than 1.0/n, or may now be less than 1.0/n,
+  // and put back onto the appropriate collection.
+  const size_t n = probabilities->size();
+  std::vector<std::pair<double, size_t>> q;
+  q.reserve(n);
+
+  std::vector<size_t> over;
+  std::vector<size_t> under;
+  size_t idx = 0;
+  for (const double item : *probabilities) {
+    assert(item >= 0);
+    const double v = item * n;
+    q.emplace_back(v, 0);
+    if (v < 1.0) {
+      under.push_back(idx++);
+    } else {
+      over.push_back(idx++);
+    }
+  }
+  while (!over.empty() && !under.empty()) {
+    auto lo = under.back();
+    under.pop_back();
+    auto hi = over.back();
+    over.pop_back();
+
+    q[lo].second = hi;
+    const double r = q[hi].first - (1.0 - q[lo].first);
+    q[hi].first = r;
+    if (r < 1.0) {
+      under.push_back(hi);
+    } else {
+      over.push_back(hi);
+    }
+  }
+
+  // Due to rounding errors, there may be un-paired elements in either
+  // collection; these should all be values near 1.0.  For these values, set `q`
+  // to 1.0 and set the alternate to the identity.
+  for (auto i : over) {
+    q[i] = {1.0, i};
+  }
+  for (auto i : under) {
+    q[i] = {1.0, i};
+  }
+  return q;
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/discrete_distribution.h b/third_party/abseil-cpp/absl/random/discrete_distribution.h
new file mode 100644
index 0000000..1560f03c
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/discrete_distribution.h
@@ -0,0 +1,245 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_DISCRETE_DISTRIBUTION_H_
+#define ABSL_RANDOM_DISCRETE_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <numeric>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "absl/random/bernoulli_distribution.h"
+#include "absl/random/internal/iostream_state_saver.h"
+#include "absl/random/uniform_int_distribution.h"
+
+namespace absl {
+
+// absl::discrete_distribution
+//
+// A discrete distribution produces random integers i, where 0 <= i < n
+// distributed according to the discrete probability function:
+//
+//     P(i|p0,...,pn−1)=pi
+//
+// This class is an implementation of discrete_distribution (see
+// [rand.dist.samp.discrete]).
+//
+// The algorithm used is Walker's Aliasing algorithm, described in Knuth, Vol 2.
+// absl::discrete_distribution takes O(N) time to precompute the probabilities
+// (where N is the number of possible outcomes in the distribution) at
+// construction, and then takes O(1) time for each variate generation.  Many
+// other implementations also take O(N) time to construct an ordered sequence of
+// partial sums, plus O(log N) time per variate to binary search.
+//
+template <typename IntType = int>
+class discrete_distribution {
+ public:
+  using result_type = IntType;
+
+  class param_type {
+   public:
+    using distribution_type = discrete_distribution;
+
+    param_type() { init(); }
+
+    template <typename InputIterator>
+    explicit param_type(InputIterator begin, InputIterator end)
+        : p_(begin, end) {
+      init();
+    }
+
+    explicit param_type(std::initializer_list<double> weights) : p_(weights) {
+      init();
+    }
+
+    template <class UnaryOperation>
+    explicit param_type(size_t nw, double xmin, double xmax,
+                        UnaryOperation fw) {
+      if (nw > 0) {
+        p_.reserve(nw);
+        double delta = (xmax - xmin) / static_cast<double>(nw);
+        assert(delta > 0);
+        double t = delta * 0.5;
+        for (size_t i = 0; i < nw; ++i) {
+          p_.push_back(fw(xmin + i * delta + t));
+        }
+      }
+      init();
+    }
+
+    const std::vector<double>& probabilities() const { return p_; }
+    size_t n() const { return p_.size() - 1; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.probabilities() == b.probabilities();
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class discrete_distribution;
+
+    void init();
+
+    std::vector<double> p_;                     // normalized probabilities
+    std::vector<std::pair<double, size_t>> q_;  // (acceptance, alternate) pairs
+
+    static_assert(std::is_integral<result_type>::value,
+                  "Class-template absl::discrete_distribution<> must be "
+                  "parameterized using an integral type.");
+  };
+
+  discrete_distribution() : param_() {}
+
+  explicit discrete_distribution(const param_type& p) : param_(p) {}
+
+  template <typename InputIterator>
+  explicit discrete_distribution(InputIterator begin, InputIterator end)
+      : param_(begin, end) {}
+
+  explicit discrete_distribution(std::initializer_list<double> weights)
+      : param_(weights) {}
+
+  template <class UnaryOperation>
+  explicit discrete_distribution(size_t nw, double xmin, double xmax,
+                                 UnaryOperation fw)
+      : param_(nw, xmin, xmax, std::move(fw)) {}
+
+  void reset() {}
+
+  // generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  const param_type& param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const { return 0; }
+  result_type(max)() const {
+    return static_cast<result_type>(param_.n());
+  }  // inclusive
+
+  // NOTE [rand.dist.sample.discrete] returns a std::vector<double> not a
+  // const std::vector<double>&.
+  const std::vector<double>& probabilities() const {
+    return param_.probabilities();
+  }
+
+  friend bool operator==(const discrete_distribution& a,
+                         const discrete_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const discrete_distribution& a,
+                         const discrete_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+};
+
+// --------------------------------------------------------------------------
+// Implementation details only below
+// --------------------------------------------------------------------------
+
+namespace random_internal {
+
+// Using the vector `*probabilities`, whose values are the weights or
+// probabilities of an element being selected, constructs the proportional
+// probabilities used by the discrete distribution.  `*probabilities` will be
+// scaled, if necessary, so that its entries sum to a value sufficiently close
+// to 1.0.
+std::vector<std::pair<double, size_t>> InitDiscreteDistribution(
+    std::vector<double>* probabilities);
+
+}  // namespace random_internal
+
+template <typename IntType>
+void discrete_distribution<IntType>::param_type::init() {
+  if (p_.empty()) {
+    p_.push_back(1.0);
+    q_.emplace_back(1.0, 0);
+  } else {
+    assert(n() <= (std::numeric_limits<IntType>::max)());
+    q_ = random_internal::InitDiscreteDistribution(&p_);
+  }
+}
+
+template <typename IntType>
+template <typename URBG>
+typename discrete_distribution<IntType>::result_type
+discrete_distribution<IntType>::operator()(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  const auto idx = absl::uniform_int_distribution<result_type>(0, p.n())(g);
+  const auto& q = p.q_[idx];
+  const bool selected = absl::bernoulli_distribution(q.first)(g);
+  return selected ? idx : static_cast<result_type>(q.second);
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const discrete_distribution<IntType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  const auto& probabilities = x.param().probabilities();
+  os << probabilities.size();
+
+  os.precision(random_internal::stream_precision_helper<double>::kPrecision);
+  for (const auto& p : probabilities) {
+    os << os.fill() << p;
+  }
+  return os;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    discrete_distribution<IntType>& x) {    // NOLINT(runtime/references)
+  using param_type = typename discrete_distribution<IntType>::param_type;
+  auto saver = random_internal::make_istream_state_saver(is);
+
+  size_t n;
+  std::vector<double> p;
+
+  is >> n;
+  if (is.fail()) return is;
+  if (n > 0) {
+    p.reserve(n);
+    for (IntType i = 0; i < n && !is.fail(); ++i) {
+      auto tmp = random_internal::read_floating_point<double>(is);
+      if (is.fail()) return is;
+      p.push_back(tmp);
+    }
+  }
+  x.param(param_type(p.begin(), p.end()));
+  return is;
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_DISCRETE_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/discrete_distribution_test.cc b/third_party/abseil-cpp/absl/random/discrete_distribution_test.cc
new file mode 100644
index 0000000..7296f0a
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/discrete_distribution_test.cc
@@ -0,0 +1,246 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/discrete_distribution.h"
+
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <numeric>
+#include <random>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+template <typename IntType>
+class DiscreteDistributionTypeTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<int8_t, uint8_t, int16_t, uint16_t, int32_t,
+                                  uint32_t, int64_t, uint64_t>;
+TYPED_TEST_SUITE(DiscreteDistributionTypeTest, IntTypes);
+
+TYPED_TEST(DiscreteDistributionTypeTest, ParamSerializeTest) {
+  using param_type =
+      typename absl::discrete_distribution<TypeParam>::param_type;
+
+  absl::discrete_distribution<TypeParam> empty;
+  EXPECT_THAT(empty.probabilities(), testing::ElementsAre(1.0));
+
+  absl::discrete_distribution<TypeParam> before({1.0, 2.0, 1.0});
+
+  // Validate that the probabilities sum to 1.0. We picked values which
+  // can be represented exactly to avoid floating-point roundoff error.
+  double s = 0;
+  for (const auto& x : before.probabilities()) {
+    s += x;
+  }
+  EXPECT_EQ(s, 1.0);
+  EXPECT_THAT(before.probabilities(), testing::ElementsAre(0.25, 0.5, 0.25));
+
+  // Validate the same data via an initializer list.
+  {
+    std::vector<double> data({1.0, 2.0, 1.0});
+
+    absl::discrete_distribution<TypeParam> via_param{
+        param_type(std::begin(data), std::end(data))};
+
+    EXPECT_EQ(via_param, before);
+  }
+
+  std::stringstream ss;
+  ss << before;
+  absl::discrete_distribution<TypeParam> after;
+
+  EXPECT_NE(before, after);
+
+  ss >> after;
+
+  EXPECT_EQ(before, after);
+}
+
+TYPED_TEST(DiscreteDistributionTypeTest, Constructor) {
+  auto fn = [](double x) { return x; };
+  {
+    absl::discrete_distribution<int> unary(0, 1.0, 9.0, fn);
+    EXPECT_THAT(unary.probabilities(), testing::ElementsAre(1.0));
+  }
+
+  {
+    absl::discrete_distribution<int> unary(2, 1.0, 9.0, fn);
+    // => fn(1.0 + 0 * 4 + 2) => 3
+    // => fn(1.0 + 1 * 4 + 2) => 7
+    EXPECT_THAT(unary.probabilities(), testing::ElementsAre(0.3, 0.7));
+  }
+}
+
+TEST(DiscreteDistributionTest, InitDiscreteDistribution) {
+  using testing::Pair;
+
+  {
+    std::vector<double> p({1.0, 2.0, 3.0});
+    std::vector<std::pair<double, size_t>> q =
+        absl::random_internal::InitDiscreteDistribution(&p);
+
+    EXPECT_THAT(p, testing::ElementsAre(1 / 6.0, 2 / 6.0, 3 / 6.0));
+
+    // Each bucket is p=1/3, so bucket 0 will send half it's traffic
+    // to bucket 2, while the rest will retain all of their traffic.
+    EXPECT_THAT(q, testing::ElementsAre(Pair(0.5, 2),  //
+                                        Pair(1.0, 1),  //
+                                        Pair(1.0, 2)));
+  }
+
+  {
+    std::vector<double> p({1.0, 2.0, 3.0, 5.0, 2.0});
+
+    std::vector<std::pair<double, size_t>> q =
+        absl::random_internal::InitDiscreteDistribution(&p);
+
+    EXPECT_THAT(p, testing::ElementsAre(1 / 13.0, 2 / 13.0, 3 / 13.0, 5 / 13.0,
+                                        2 / 13.0));
+
+    // A more complex bucketing solution: Each bucket has p=0.2
+    // So buckets 0, 1, 4 will send their alternate traffic elsewhere, which
+    // happens to be bucket 3.
+    // However, summing up that alternate traffic gives bucket 3 too much
+    // traffic, so it will send some traffic to bucket 2.
+    constexpr double b0 = 1.0 / 13.0 / 0.2;
+    constexpr double b1 = 2.0 / 13.0 / 0.2;
+    constexpr double b3 = (5.0 / 13.0 / 0.2) - ((1 - b0) + (1 - b1) + (1 - b1));
+
+    EXPECT_THAT(q, testing::ElementsAre(Pair(b0, 3),   //
+                                        Pair(b1, 3),   //
+                                        Pair(1.0, 2),  //
+                                        Pair(b3, 2),   //
+                                        Pair(b1, 3)));
+  }
+}
+
+TEST(DiscreteDistributionTest, ChiSquaredTest50) {
+  using absl::random_internal::kChiSquared;
+
+  constexpr size_t kTrials = 10000;
+  constexpr int kBuckets = 50;  // inclusive, so actally +1
+
+  // 1-in-100000 threshold, but remember, there are about 8 tests
+  // in this file. And the test could fail for other reasons.
+  // Empirically validated with --runs_per_test=10000.
+  const int kThreshold =
+      absl::random_internal::ChiSquareValue(kBuckets, 0.99999);
+
+  std::vector<double> weights(kBuckets, 0);
+  std::iota(std::begin(weights), std::end(weights), 1);
+  absl::discrete_distribution<int> dist(std::begin(weights), std::end(weights));
+
+  absl::InsecureBitGen rng;
+
+  std::vector<int32_t> counts(kBuckets, 0);
+  for (size_t i = 0; i < kTrials; i++) {
+    auto x = dist(rng);
+    counts[x]++;
+  }
+
+  // Scale weights.
+  double sum = 0;
+  for (double x : weights) {
+    sum += x;
+  }
+  for (double& x : weights) {
+    x = kTrials * (x / sum);
+  }
+
+  double chi_square =
+      absl::random_internal::ChiSquare(std::begin(counts), std::end(counts),
+                                       std::begin(weights), std::end(weights));
+
+  if (chi_square > kThreshold) {
+    double p_value =
+        absl::random_internal::ChiSquarePValue(chi_square, kBuckets);
+
+    // Chi-squared test failed. Output does not appear to be uniform.
+    std::string msg;
+    for (size_t i = 0; i < counts.size(); i++) {
+      absl::StrAppend(&msg, i, ": ", counts[i], " vs ", weights[i], "\n");
+    }
+    absl::StrAppend(&msg, kChiSquared, " p-value ", p_value, "\n");
+    absl::StrAppend(&msg, "High ", kChiSquared, " value: ", chi_square, " > ",
+                    kThreshold);
+    ABSL_RAW_LOG(INFO, "%s", msg.c_str());
+    FAIL() << msg;
+  }
+}
+
+TEST(DiscreteDistributionTest, StabilityTest) {
+  // absl::discrete_distribution stabilitiy relies on
+  // absl::uniform_int_distribution and absl::bernoulli_distribution.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(6);
+
+  {
+    absl::discrete_distribution<int32_t> dist({1.0, 2.0, 3.0, 5.0, 2.0});
+    EXPECT_EQ(0, dist.min());
+    EXPECT_EQ(4, dist.max());
+    for (auto& v : output) {
+      v = dist(urbg);
+    }
+    EXPECT_EQ(12, urbg.invocations());
+  }
+
+  // With 12 calls to urbg, each call into discrete_distribution consumes
+  // precisely 2 values: one for the uniform call, and a second for the
+  // bernoulli.
+  //
+  // Given the alt mapping: 0=>3, 1=>3, 2=>2, 3=>2, 4=>3, we can
+  //
+  // uniform:      443210143131
+  // bernoulli: b0 000011100101
+  // bernoulli: b1 001111101101
+  // bernoulli: b2 111111111111
+  // bernoulli: b3 001111101111
+  // bernoulli: b4 001111101101
+  // ...
+  EXPECT_THAT(output, testing::ElementsAre(3, 3, 1, 3, 3, 3));
+
+  {
+    urbg.reset();
+    absl::discrete_distribution<int64_t> dist({1.0, 2.0, 3.0, 5.0, 2.0});
+    EXPECT_EQ(0, dist.min());
+    EXPECT_EQ(4, dist.max());
+    for (auto& v : output) {
+      v = dist(urbg);
+    }
+    EXPECT_EQ(12, urbg.invocations());
+  }
+  EXPECT_THAT(output, testing::ElementsAre(3, 3, 0, 3, 0, 4));
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/distribution_format_traits.h b/third_party/abseil-cpp/absl/random/distribution_format_traits.h
new file mode 100644
index 0000000..3f28c90
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/distribution_format_traits.h
@@ -0,0 +1,249 @@
+//
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef ABSL_RANDOM_DISTRIBUTION_FORMAT_TRAITS_H_
+#define ABSL_RANDOM_DISTRIBUTION_FORMAT_TRAITS_H_
+
+#include <string>
+#include <tuple>
+#include <typeinfo>
+
+#include "absl/meta/type_traits.h"
+#include "absl/random/bernoulli_distribution.h"
+#include "absl/random/beta_distribution.h"
+#include "absl/random/exponential_distribution.h"
+#include "absl/random/gaussian_distribution.h"
+#include "absl/random/log_uniform_int_distribution.h"
+#include "absl/random/poisson_distribution.h"
+#include "absl/random/uniform_int_distribution.h"
+#include "absl/random/uniform_real_distribution.h"
+#include "absl/random/zipf_distribution.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+
+namespace absl {
+namespace random_internal {
+
+// ScalarTypeName defines a preferred hierarchy of preferred type names for
+// scalars, and is evaluated at compile time for the specific type
+// specialization.
+template <typename T>
+constexpr const char* ScalarTypeName() {
+  static_assert(std::is_integral<T>() || std::is_floating_point<T>(), "");
+  // clang-format off
+    return
+        std::is_same<T, float>::value ? "float" :
+        std::is_same<T, double>::value ? "double" :
+        std::is_same<T, long double>::value ? "long double" :
+        std::is_same<T, bool>::value ? "bool" :
+        std::is_signed<T>::value && sizeof(T) == 1 ? "int8_t" :
+        std::is_signed<T>::value && sizeof(T) == 2 ? "int16_t" :
+        std::is_signed<T>::value && sizeof(T) == 4 ? "int32_t" :
+        std::is_signed<T>::value && sizeof(T) == 8 ? "int64_t" :
+        std::is_unsigned<T>::value && sizeof(T) == 1 ? "uint8_t" :
+        std::is_unsigned<T>::value && sizeof(T) == 2 ? "uint16_t" :
+        std::is_unsigned<T>::value && sizeof(T) == 4 ? "uint32_t" :
+        std::is_unsigned<T>::value && sizeof(T) == 8 ? "uint64_t" :
+            "undefined";
+  // clang-format on
+
+  // NOTE: It would be nice to use typeid(T).name(), but that's an
+  // implementation-defined attribute which does not necessarily
+  // correspond to a name. We could potentially demangle it
+  // using, e.g. abi::__cxa_demangle.
+}
+
+// Distribution traits used by DistributionCaller and internal implementation
+// details of the mocking framework.
+/*
+struct DistributionFormatTraits {
+   // Returns the parameterized name of the distribution function.
+   static constexpr const char* FunctionName()
+   // Format DistrT parameters.
+   static std::string FormatArgs(DistrT& dist);
+   // Format DistrT::result_type results.
+   static std::string FormatResults(DistrT& dist);
+};
+*/
+template <typename DistrT>
+struct DistributionFormatTraits;
+
+template <typename R>
+struct DistributionFormatTraits<absl::uniform_int_distribution<R>> {
+  using distribution_t = absl::uniform_int_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Uniform"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat("absl::IntervalClosedClosed, ", (d.min)(), ", ",
+                        (d.max)());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::uniform_real_distribution<R>> {
+  using distribution_t = absl::uniform_real_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Uniform"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat((d.min)(), ", ", (d.max)());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::exponential_distribution<R>> {
+  using distribution_t = absl::exponential_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Exponential"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat(d.lambda());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::poisson_distribution<R>> {
+  using distribution_t = absl::poisson_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Poisson"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat(d.mean());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <>
+struct DistributionFormatTraits<absl::bernoulli_distribution> {
+  using distribution_t = absl::bernoulli_distribution;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Bernoulli"; }
+
+  static constexpr const char* FunctionName() { return Name(); }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat(d.p());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::beta_distribution<R>> {
+  using distribution_t = absl::beta_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Beta"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat(d.alpha(), ", ", d.beta());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::zipf_distribution<R>> {
+  using distribution_t = absl::zipf_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Zipf"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrCat(d.k(), ", ", d.v(), ", ", d.q());
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::gaussian_distribution<R>> {
+  using distribution_t = absl::gaussian_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "Gaussian"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrJoin(std::make_tuple(d.mean(), d.stddev()), ", ");
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+template <typename R>
+struct DistributionFormatTraits<absl::log_uniform_int_distribution<R>> {
+  using distribution_t = absl::log_uniform_int_distribution<R>;
+  using result_t = typename distribution_t::result_type;
+
+  static constexpr const char* Name() { return "LogUniform"; }
+
+  static std::string FunctionName() {
+    return absl::StrCat(Name(), "<", ScalarTypeName<R>(), ">");
+  }
+  static std::string FormatArgs(const distribution_t& d) {
+    return absl::StrJoin(std::make_tuple((d.min)(), (d.max)(), d.base()), ", ");
+  }
+  static std::string FormatResults(absl::Span<const result_t> results) {
+    return absl::StrJoin(results, ", ");
+  }
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_DISTRIBUTION_FORMAT_TRAITS_H_
diff --git a/third_party/abseil-cpp/absl/random/distributions.h b/third_party/abseil-cpp/absl/random/distributions.h
new file mode 100644
index 0000000..c37b734
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/distributions.h
@@ -0,0 +1,442 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: distributions.h
+// -----------------------------------------------------------------------------
+//
+// This header defines functions representing distributions, which you use in
+// combination with an Abseil random bit generator to produce random values
+// according to the rules of that distribution.
+//
+// The Abseil random library defines the following distributions within this
+// file:
+//
+//   * `absl::Uniform` for uniform (constant) distributions having constant
+//     probability
+//   * `absl::Bernoulli` for discrete distributions having exactly two outcomes
+//   * `absl::Beta` for continuous distributions parameterized through two
+//     free parameters
+//   * `absl::Exponential` for discrete distributions of events occurring
+//     continuously and independently at a constant average rate
+//   * `absl::Gaussian` (also known as "normal distributions") for continuous
+//     distributions using an associated quadratic function
+//   * `absl::LogUniform` for continuous uniform distributions where the log
+//     to the given base of all values is uniform
+//   * `absl::Poisson` for discrete probability distributions that express the
+//     probability of a given number of events occurring within a fixed interval
+//   * `absl::Zipf` for discrete probability distributions commonly used for
+//     modelling of rare events
+//
+// Prefer use of these distribution function classes over manual construction of
+// your own distribution classes, as it allows library maintainers greater
+// flexibility to change the underlying implementation in the future.
+
+#ifndef ABSL_RANDOM_DISTRIBUTIONS_H_
+#define ABSL_RANDOM_DISTRIBUTIONS_H_
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+#include <random>
+#include <type_traits>
+
+#include "absl/base/internal/inline_variable.h"
+#include "absl/random/bernoulli_distribution.h"
+#include "absl/random/beta_distribution.h"
+#include "absl/random/distribution_format_traits.h"
+#include "absl/random/exponential_distribution.h"
+#include "absl/random/gaussian_distribution.h"
+#include "absl/random/internal/distributions.h"  // IWYU pragma: export
+#include "absl/random/internal/uniform_helper.h"  // IWYU pragma: export
+#include "absl/random/log_uniform_int_distribution.h"
+#include "absl/random/poisson_distribution.h"
+#include "absl/random/uniform_int_distribution.h"
+#include "absl/random/uniform_real_distribution.h"
+#include "absl/random/zipf_distribution.h"
+
+namespace absl {
+
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalClosedClosedT,
+                               IntervalClosedClosed, {});
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalClosedClosedT,
+                               IntervalClosed, {});
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalClosedOpenT,
+                               IntervalClosedOpen, {});
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalOpenOpenT,
+                               IntervalOpenOpen, {});
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalOpenOpenT,
+                               IntervalOpen, {});
+ABSL_INTERNAL_INLINE_CONSTEXPR(random_internal::IntervalOpenClosedT,
+                               IntervalOpenClosed, {});
+
+// -----------------------------------------------------------------------------
+// absl::Uniform<T>(tag, bitgen, lo, hi)
+// -----------------------------------------------------------------------------
+//
+// `absl::Uniform()` produces random values of type `T` uniformly distributed in
+// a defined interval {lo, hi}. The interval `tag` defines the type of interval
+// which should be one of the following possible values:
+//
+//   * `absl::IntervalOpenOpen`
+//   * `absl::IntervalOpenClosed`
+//   * `absl::IntervalClosedOpen`
+//   * `absl::IntervalClosedClosed`
+//
+// where "open" refers to an exclusive value (excluded) from the output, while
+// "closed" refers to an inclusive value (included) from the output.
+//
+// In the absence of an explicit return type `T`, `absl::Uniform()` will deduce
+// the return type based on the provided endpoint arguments {A lo, B hi}.
+// Given these endpoints, one of {A, B} will be chosen as the return type, if
+// a type can be implicitly converted into the other in a lossless way. The
+// lack of any such implcit conversion between {A, B} will produce a
+// compile-time error
+//
+// See https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//
+//   // Produce a random float value between 0.0 and 1.0, inclusive
+//   auto x = absl::Uniform(absl::IntervalClosedClosed, bitgen, 0.0f, 1.0f);
+//
+//   // The most common interval of `absl::IntervalClosedOpen` is available by
+//   // default:
+//
+//   auto x = absl::Uniform(bitgen, 0.0f, 1.0f);
+//
+//   // Return-types are typically inferred from the arguments, however callers
+//   // can optionally provide an explicit return-type to the template.
+//
+//   auto x = absl::Uniform<float>(bitgen, 0, 1);
+//
+template <typename R = void, typename TagType, typename URBG>
+typename absl::enable_if_t<!std::is_same<R, void>::value, R>  //
+Uniform(TagType tag,
+        URBG&& urbg,  // NOLINT(runtime/references)
+        R lo, R hi) {
+  using gen_t = absl::decay_t<URBG>;
+  return random_internal::UniformImpl<R, TagType, gen_t>(tag, urbg, lo, hi);
+}
+
+// absl::Uniform<T>(bitgen, lo, hi)
+//
+// Overload of `Uniform()` using the default closed-open interval of [lo, hi),
+// and returning values of type `T`
+template <typename R = void, typename URBG>
+typename absl::enable_if_t<!std::is_same<R, void>::value, R>  //
+Uniform(URBG&& urbg,  // NOLINT(runtime/references)
+        R lo, R hi) {
+  constexpr auto tag = absl::IntervalClosedOpen;
+  using tag_t = decltype(tag);
+  using gen_t = absl::decay_t<URBG>;
+
+  return random_internal::UniformImpl<R, tag_t, gen_t>(tag, urbg, lo, hi);
+}
+
+// absl::Uniform(tag, bitgen, lo, hi)
+//
+// Overload of `Uniform()` using different (but compatible) lo, hi types. Note
+// that a compile-error will result if the return type cannot be deduced
+// correctly from the passed types.
+template <typename R = void, typename TagType, typename URBG, typename A,
+          typename B>
+typename absl::enable_if_t<std::is_same<R, void>::value,
+                           random_internal::uniform_inferred_return_t<A, B>>
+Uniform(TagType tag,
+        URBG&& urbg,  // NOLINT(runtime/references)
+        A lo, B hi) {
+  using gen_t = absl::decay_t<URBG>;
+  using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
+
+  return random_internal::UniformImpl<return_t, TagType, gen_t>(tag, urbg, lo,
+                                                                hi);
+}
+
+// absl::Uniform(bitgen, lo, hi)
+//
+// Overload of `Uniform()` using different (but compatible) lo, hi types and the
+// default closed-open interval of [lo, hi). Note that a compile-error will
+// result if the return type cannot be deduced correctly from the passed types.
+template <typename R = void, typename URBG, typename A, typename B>
+typename absl::enable_if_t<std::is_same<R, void>::value,
+                           random_internal::uniform_inferred_return_t<A, B>>
+Uniform(URBG&& urbg,  // NOLINT(runtime/references)
+        A lo, B hi) {
+  constexpr auto tag = absl::IntervalClosedOpen;
+  using tag_t = decltype(tag);
+  using gen_t = absl::decay_t<URBG>;
+  using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
+
+  return random_internal::UniformImpl<return_t, tag_t, gen_t>(tag, urbg, lo,
+                                                              hi);
+}
+
+// absl::Uniform<unsigned T>(bitgen)
+//
+// Overload of Uniform() using the minimum and maximum values of a given type
+// `T` (which must be unsigned), returning a value of type `unsigned T`
+template <typename R, typename URBG>
+typename absl::enable_if_t<!std::is_signed<R>::value, R>  //
+Uniform(URBG&& urbg) {  // NOLINT(runtime/references)
+  constexpr auto tag = absl::IntervalClosedClosed;
+  constexpr auto lo = std::numeric_limits<R>::lowest();
+  constexpr auto hi = (std::numeric_limits<R>::max)();
+  using tag_t = decltype(tag);
+  using gen_t = absl::decay_t<URBG>;
+
+  return random_internal::UniformImpl<R, tag_t, gen_t>(tag, urbg, lo, hi);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Bernoulli(bitgen, p)
+// -----------------------------------------------------------------------------
+//
+// `absl::Bernoulli` produces a random boolean value, with probability `p`
+// (where 0.0 <= p <= 1.0) equaling `true`.
+//
+// Prefer `absl::Bernoulli` to produce boolean values over other alternatives
+// such as comparing an `absl::Uniform()` value to a specific output.
+//
+// See https://en.wikipedia.org/wiki/Bernoulli_distribution
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   if (absl::Bernoulli(bitgen, 1.0/3721.0)) {
+//     std::cout << "Asteroid field navigation successful.";
+//   }
+//
+template <typename URBG>
+bool Bernoulli(URBG&& urbg,  // NOLINT(runtime/references)
+               double p) {
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = absl::bernoulli_distribution;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, p);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Beta<T>(bitgen, alpha, beta)
+// -----------------------------------------------------------------------------
+//
+// `absl::Beta` produces a floating point number distributed in the closed
+// interval [0,1] and parameterized by two values `alpha` and `beta` as per a
+// Beta distribution. `T` must be a floating point type, but may be inferred
+// from the types of `alpha` and `beta`.
+//
+// See https://en.wikipedia.org/wiki/Beta_distribution.
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   double sample = absl::Beta(bitgen, 3.0, 2.0);
+//
+template <typename RealType, typename URBG>
+RealType Beta(URBG&& urbg,  // NOLINT(runtime/references)
+              RealType alpha, RealType beta) {
+  static_assert(
+      std::is_floating_point<RealType>::value,
+      "Template-argument 'RealType' must be a floating-point type, in "
+      "absl::Beta<RealType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::beta_distribution<RealType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, alpha, beta);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Exponential<T>(bitgen, lambda = 1)
+// -----------------------------------------------------------------------------
+//
+// `absl::Exponential` produces a floating point number for discrete
+// distributions of events occurring continuously and independently at a
+// constant average rate. `T` must be a floating point type, but may be inferred
+// from the type of `lambda`.
+//
+// See https://en.wikipedia.org/wiki/Exponential_distribution.
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   double call_length = absl::Exponential(bitgen, 7.0);
+//
+template <typename RealType, typename URBG>
+RealType Exponential(URBG&& urbg,  // NOLINT(runtime/references)
+                     RealType lambda = 1) {
+  static_assert(
+      std::is_floating_point<RealType>::value,
+      "Template-argument 'RealType' must be a floating-point type, in "
+      "absl::Exponential<RealType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::exponential_distribution<RealType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, lambda);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Gaussian<T>(bitgen, mean = 0, stddev = 1)
+// -----------------------------------------------------------------------------
+//
+// `absl::Gaussian` produces a floating point number selected from the Gaussian
+// (ie. "Normal") distribution. `T` must be a floating point type, but may be
+// inferred from the types of `mean` and `stddev`.
+//
+// See https://en.wikipedia.org/wiki/Normal_distribution
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   double giraffe_height = absl::Gaussian(bitgen, 16.3, 3.3);
+//
+template <typename RealType, typename URBG>
+RealType Gaussian(URBG&& urbg,  // NOLINT(runtime/references)
+                  RealType mean = 0, RealType stddev = 1) {
+  static_assert(
+      std::is_floating_point<RealType>::value,
+      "Template-argument 'RealType' must be a floating-point type, in "
+      "absl::Gaussian<RealType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::gaussian_distribution<RealType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, mean, stddev);
+}
+
+// -----------------------------------------------------------------------------
+// absl::LogUniform<T>(bitgen, lo, hi, base = 2)
+// -----------------------------------------------------------------------------
+//
+// `absl::LogUniform` produces random values distributed where the log to a
+// given base of all values is uniform in a closed interval [lo, hi]. `T` must
+// be an integral type, but may be inferred from the types of `lo` and `hi`.
+//
+// I.e., `LogUniform(0, n, b)` is uniformly distributed across buckets
+// [0], [1, b-1], [b, b^2-1] .. [b^(k-1), (b^k)-1] .. [b^floor(log(n, b)), n]
+// and is uniformly distributed within each bucket.
+//
+// The resulting probability density is inversely related to bucket size, though
+// values in the final bucket may be more likely than previous values. (In the
+// extreme case where n = b^i the final value will be tied with zero as the most
+// probable result.
+//
+// If `lo` is nonzero then this distribution is shifted to the desired interval,
+// so LogUniform(lo, hi, b) is equivalent to LogUniform(0, hi-lo, b)+lo.
+//
+// See http://ecolego.facilia.se/ecolego/show/Log-Uniform%20Distribution
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   int v = absl::LogUniform(bitgen, 0, 1000);
+//
+template <typename IntType, typename URBG>
+IntType LogUniform(URBG&& urbg,  // NOLINT(runtime/references)
+                   IntType lo, IntType hi, IntType base = 2) {
+  static_assert(std::is_integral<IntType>::value,
+                "Template-argument 'IntType' must be an integral type, in "
+                "absl::LogUniform<IntType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::log_uniform_int_distribution<IntType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, lo, hi, base);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Poisson<T>(bitgen, mean = 1)
+// -----------------------------------------------------------------------------
+//
+// `absl::Poisson` produces discrete probabilities for a given number of events
+// occurring within a fixed interval within the closed interval [0, max]. `T`
+// must be an integral type.
+//
+// See https://en.wikipedia.org/wiki/Poisson_distribution
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   int requests_per_minute = absl::Poisson<int>(bitgen, 3.2);
+//
+template <typename IntType, typename URBG>
+IntType Poisson(URBG&& urbg,  // NOLINT(runtime/references)
+                double mean = 1.0) {
+  static_assert(std::is_integral<IntType>::value,
+                "Template-argument 'IntType' must be an integral type, in "
+                "absl::Poisson<IntType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::poisson_distribution<IntType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, mean);
+}
+
+// -----------------------------------------------------------------------------
+// absl::Zipf<T>(bitgen, hi = max, q = 2, v = 1)
+// -----------------------------------------------------------------------------
+//
+// `absl::Zipf` produces discrete probabilities commonly used for modelling of
+// rare events over the closed interval [0, hi]. The parameters `v` and `q`
+// determine the skew of the distribution. `T`  must be an integral type, but
+// may be inferred from the type of `hi`.
+//
+// See http://mathworld.wolfram.com/ZipfDistribution.html
+//
+// Example:
+//
+//   absl::BitGen bitgen;
+//   ...
+//   int term_rank = absl::Zipf<int>(bitgen);
+//
+template <typename IntType, typename URBG>
+IntType Zipf(URBG&& urbg,  // NOLINT(runtime/references)
+             IntType hi = (std::numeric_limits<IntType>::max)(), double q = 2.0,
+             double v = 1.0) {
+  static_assert(std::is_integral<IntType>::value,
+                "Template-argument 'IntType' must be an integral type, in "
+                "absl::Zipf<IntType, URBG>(...)");
+
+  using gen_t = absl::decay_t<URBG>;
+  using distribution_t = typename absl::zipf_distribution<IntType>;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  return random_internal::DistributionCaller<gen_t>::template Call<
+      distribution_t, format_t>(&urbg, hi, q, v);
+}
+
+}  // namespace absl.
+
+#endif  // ABSL_RANDOM_DISTRIBUTIONS_H_
diff --git a/third_party/abseil-cpp/absl/random/distributions_test.cc b/third_party/abseil-cpp/absl/random/distributions_test.cc
new file mode 100644
index 0000000..eb82868
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/distributions_test.cc
@@ -0,0 +1,494 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/distributions.h"
+
+#include <cmath>
+#include <cstdint>
+#include <random>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/random.h"
+
+namespace {
+
+constexpr int kSize = 400000;
+
+class RandomDistributionsTest : public testing::Test {};
+
+TEST_F(RandomDistributionsTest, UniformBoundFunctions) {
+  using absl::IntervalClosedClosed;
+  using absl::IntervalClosedOpen;
+  using absl::IntervalOpenClosed;
+  using absl::IntervalOpenOpen;
+  using absl::random_internal::uniform_lower_bound;
+  using absl::random_internal::uniform_upper_bound;
+
+  // absl::uniform_int_distribution natively assumes IntervalClosedClosed
+  // absl::uniform_real_distribution natively assumes IntervalClosedOpen
+
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, 0, 100), 1);
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, 0, 100), 1);
+  EXPECT_GT(uniform_lower_bound<float>(IntervalOpenClosed, 0, 1.0), 0);
+  EXPECT_GT(uniform_lower_bound<float>(IntervalOpenOpen, 0, 1.0), 0);
+  EXPECT_GT(uniform_lower_bound<double>(IntervalOpenClosed, 0, 1.0), 0);
+  EXPECT_GT(uniform_lower_bound<double>(IntervalOpenOpen, 0, 1.0), 0);
+
+  EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 100), 0);
+  EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 100), 0);
+  EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedClosed, 0, 1.0), 0);
+  EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedOpen, 0, 1.0), 0);
+  EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedClosed, 0, 1.0), 0);
+  EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedOpen, 0, 1.0), 0);
+
+  EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 100), 99);
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 100), 99);
+  EXPECT_EQ(uniform_upper_bound<float>(IntervalOpenOpen, 0, 1.0), 1.0);
+  EXPECT_EQ(uniform_upper_bound<float>(IntervalClosedOpen, 0, 1.0), 1.0);
+  EXPECT_EQ(uniform_upper_bound<double>(IntervalOpenOpen, 0, 1.0), 1.0);
+  EXPECT_EQ(uniform_upper_bound<double>(IntervalClosedOpen, 0, 1.0), 1.0);
+
+  EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, 0, 100), 100);
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0, 100), 100);
+  EXPECT_GT(uniform_upper_bound<float>(IntervalOpenClosed, 0, 1.0), 1.0);
+  EXPECT_GT(uniform_upper_bound<float>(IntervalClosedClosed, 0, 1.0), 1.0);
+  EXPECT_GT(uniform_upper_bound<double>(IntervalOpenClosed, 0, 1.0), 1.0);
+  EXPECT_GT(uniform_upper_bound<double>(IntervalClosedClosed, 0, 1.0), 1.0);
+
+  // Negative value tests
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, -100, -1), -99);
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, -100, -1), -99);
+  EXPECT_GT(uniform_lower_bound<float>(IntervalOpenClosed, -2.0, -1.0), -2.0);
+  EXPECT_GT(uniform_lower_bound<float>(IntervalOpenOpen, -2.0, -1.0), -2.0);
+  EXPECT_GT(uniform_lower_bound<double>(IntervalOpenClosed, -2.0, -1.0), -2.0);
+  EXPECT_GT(uniform_lower_bound<double>(IntervalOpenOpen, -2.0, -1.0), -2.0);
+
+  EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -100, -1), -100);
+  EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -100, -1), -100);
+  EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedClosed, -2.0, -1.0), -2.0);
+  EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedOpen, -2.0, -1.0), -2.0);
+  EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedClosed, -2.0, -1.0),
+            -2.0);
+  EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedOpen, -2.0, -1.0), -2.0);
+
+  EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -100, -1), -2);
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -100, -1), -2);
+  EXPECT_EQ(uniform_upper_bound<float>(IntervalOpenOpen, -2.0, -1.0), -1.0);
+  EXPECT_EQ(uniform_upper_bound<float>(IntervalClosedOpen, -2.0, -1.0), -1.0);
+  EXPECT_EQ(uniform_upper_bound<double>(IntervalOpenOpen, -2.0, -1.0), -1.0);
+  EXPECT_EQ(uniform_upper_bound<double>(IntervalClosedOpen, -2.0, -1.0), -1.0);
+
+  EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, -100, -1), -1);
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, -100, -1), -1);
+  EXPECT_GT(uniform_upper_bound<float>(IntervalOpenClosed, -2.0, -1.0), -1.0);
+  EXPECT_GT(uniform_upper_bound<float>(IntervalClosedClosed, -2.0, -1.0), -1.0);
+  EXPECT_GT(uniform_upper_bound<double>(IntervalOpenClosed, -2.0, -1.0), -1.0);
+  EXPECT_GT(uniform_upper_bound<double>(IntervalClosedClosed, -2.0, -1.0),
+            -1.0);
+
+  // Edge cases: the next value toward itself is itself.
+  const double d = 1.0;
+  const float f = 1.0;
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, d, d), d);
+  EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, f, f), f);
+
+  EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 1.0, 2.0), 1.0);
+  EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, +0.0), 1.0);
+  EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -0.0), 1.0);
+  EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -1.0), 1.0);
+
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0.0f,
+                                std::numeric_limits<float>::max()),
+            std::numeric_limits<float>::max());
+  EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0.0,
+                                std::numeric_limits<double>::max()),
+            std::numeric_limits<double>::max());
+}
+
+struct Invalid {};
+
+template <typename A, typename B>
+auto InferredUniformReturnT(int)
+    -> decltype(absl::Uniform(std::declval<absl::InsecureBitGen&>(),
+                              std::declval<A>(), std::declval<B>()));
+
+template <typename, typename>
+Invalid InferredUniformReturnT(...);
+
+template <typename TagType, typename A, typename B>
+auto InferredTaggedUniformReturnT(int)
+    -> decltype(absl::Uniform(std::declval<TagType>(),
+                              std::declval<absl::InsecureBitGen&>(),
+                              std::declval<A>(), std::declval<B>()));
+
+template <typename, typename, typename>
+Invalid InferredTaggedUniformReturnT(...);
+
+// Given types <A, B, Expect>, CheckArgsInferType() verifies that
+//
+//   absl::Uniform(gen, A{}, B{})
+//
+// returns the type "Expect".
+//
+// This interface can also be used to assert that a given absl::Uniform()
+// overload does not exist / will not compile. Given types <A, B>, the
+// expression
+//
+//   decltype(absl::Uniform(..., std::declval<A>(), std::declval<B>()))
+//
+// will not compile, leaving the definition of InferredUniformReturnT<A, B> to
+// resolve (via SFINAE) to the overload which returns type "Invalid". This
+// allows tests to assert that an invocation such as
+//
+//   absl::Uniform(gen, 1.23f, std::numeric_limits<int>::max() - 1)
+//
+// should not compile, since neither type, float nor int, can precisely
+// represent both endpoint-values. Writing:
+//
+//   CheckArgsInferType<float, int, Invalid>()
+//
+// will assert that this overload does not exist.
+template <typename A, typename B, typename Expect>
+void CheckArgsInferType() {
+  static_assert(
+      absl::conjunction<
+          std::is_same<Expect, decltype(InferredUniformReturnT<A, B>(0))>,
+          std::is_same<Expect,
+                       decltype(InferredUniformReturnT<B, A>(0))>>::value,
+      "");
+  static_assert(
+      absl::conjunction<
+          std::is_same<Expect,
+                       decltype(InferredTaggedUniformReturnT<
+                                absl::random_internal::IntervalOpenOpenT, A, B>(
+                           0))>,
+          std::is_same<Expect,
+                       decltype(InferredTaggedUniformReturnT<
+                                absl::random_internal::IntervalOpenOpenT, B, A>(
+                           0))>>::value,
+      "");
+}
+
+template <typename A, typename B, typename ExplicitRet>
+auto ExplicitUniformReturnT(int) -> decltype(
+    absl::Uniform<ExplicitRet>(*std::declval<absl::InsecureBitGen*>(),
+                               std::declval<A>(), std::declval<B>()));
+
+template <typename, typename, typename ExplicitRet>
+Invalid ExplicitUniformReturnT(...);
+
+template <typename TagType, typename A, typename B, typename ExplicitRet>
+auto ExplicitTaggedUniformReturnT(int) -> decltype(absl::Uniform<ExplicitRet>(
+    std::declval<TagType>(), *std::declval<absl::InsecureBitGen*>(),
+    std::declval<A>(), std::declval<B>()));
+
+template <typename, typename, typename, typename ExplicitRet>
+Invalid ExplicitTaggedUniformReturnT(...);
+
+// Given types <A, B, Expect>, CheckArgsReturnExpectedType() verifies that
+//
+//   absl::Uniform<Expect>(gen, A{}, B{})
+//
+// returns the type "Expect", and that the function-overload has the signature
+//
+//   Expect(URBG&, Expect, Expect)
+template <typename A, typename B, typename Expect>
+void CheckArgsReturnExpectedType() {
+  static_assert(
+      absl::conjunction<
+          std::is_same<Expect,
+                       decltype(ExplicitUniformReturnT<A, B, Expect>(0))>,
+          std::is_same<Expect, decltype(ExplicitUniformReturnT<B, A, Expect>(
+                                   0))>>::value,
+      "");
+  static_assert(
+      absl::conjunction<
+          std::is_same<Expect,
+                       decltype(ExplicitTaggedUniformReturnT<
+                                absl::random_internal::IntervalOpenOpenT, A, B,
+                                Expect>(0))>,
+          std::is_same<Expect,
+                       decltype(ExplicitTaggedUniformReturnT<
+                                absl::random_internal::IntervalOpenOpenT, B, A,
+                                Expect>(0))>>::value,
+      "");
+}
+
+TEST_F(RandomDistributionsTest, UniformTypeInference) {
+  // Infers common types.
+  CheckArgsInferType<uint16_t, uint16_t, uint16_t>();
+  CheckArgsInferType<uint32_t, uint32_t, uint32_t>();
+  CheckArgsInferType<uint64_t, uint64_t, uint64_t>();
+  CheckArgsInferType<int16_t, int16_t, int16_t>();
+  CheckArgsInferType<int32_t, int32_t, int32_t>();
+  CheckArgsInferType<int64_t, int64_t, int64_t>();
+  CheckArgsInferType<float, float, float>();
+  CheckArgsInferType<double, double, double>();
+
+  // Explicitly-specified return-values override inferences.
+  CheckArgsReturnExpectedType<int16_t, int16_t, int32_t>();
+  CheckArgsReturnExpectedType<uint16_t, uint16_t, int32_t>();
+  CheckArgsReturnExpectedType<int16_t, int16_t, int64_t>();
+  CheckArgsReturnExpectedType<int16_t, int32_t, int64_t>();
+  CheckArgsReturnExpectedType<int16_t, int32_t, double>();
+  CheckArgsReturnExpectedType<float, float, double>();
+  CheckArgsReturnExpectedType<int, int, int16_t>();
+
+  // Properly promotes uint16_t.
+  CheckArgsInferType<uint16_t, uint32_t, uint32_t>();
+  CheckArgsInferType<uint16_t, uint64_t, uint64_t>();
+  CheckArgsInferType<uint16_t, int32_t, int32_t>();
+  CheckArgsInferType<uint16_t, int64_t, int64_t>();
+  CheckArgsInferType<uint16_t, float, float>();
+  CheckArgsInferType<uint16_t, double, double>();
+
+  // Properly promotes int16_t.
+  CheckArgsInferType<int16_t, int32_t, int32_t>();
+  CheckArgsInferType<int16_t, int64_t, int64_t>();
+  CheckArgsInferType<int16_t, float, float>();
+  CheckArgsInferType<int16_t, double, double>();
+
+  // Invalid (u)int16_t-pairings do not compile.
+  // See "CheckArgsInferType" comments above, for how this is achieved.
+  CheckArgsInferType<uint16_t, int16_t, Invalid>();
+  CheckArgsInferType<int16_t, uint32_t, Invalid>();
+  CheckArgsInferType<int16_t, uint64_t, Invalid>();
+
+  // Properly promotes uint32_t.
+  CheckArgsInferType<uint32_t, uint64_t, uint64_t>();
+  CheckArgsInferType<uint32_t, int64_t, int64_t>();
+  CheckArgsInferType<uint32_t, double, double>();
+
+  // Properly promotes int32_t.
+  CheckArgsInferType<int32_t, int64_t, int64_t>();
+  CheckArgsInferType<int32_t, double, double>();
+
+  // Invalid (u)int32_t-pairings do not compile.
+  CheckArgsInferType<uint32_t, int32_t, Invalid>();
+  CheckArgsInferType<int32_t, uint64_t, Invalid>();
+  CheckArgsInferType<int32_t, float, Invalid>();
+  CheckArgsInferType<uint32_t, float, Invalid>();
+
+  // Invalid (u)int64_t-pairings do not compile.
+  CheckArgsInferType<uint64_t, int64_t, Invalid>();
+  CheckArgsInferType<int64_t, float, Invalid>();
+  CheckArgsInferType<int64_t, double, Invalid>();
+
+  // Properly promotes float.
+  CheckArgsInferType<float, double, double>();
+
+  // Examples.
+  absl::InsecureBitGen gen;
+  EXPECT_NE(1, absl::Uniform(gen, static_cast<uint16_t>(0), 1.0f));
+  EXPECT_NE(1, absl::Uniform(gen, 0, 1.0));
+  EXPECT_NE(1, absl::Uniform(absl::IntervalOpenOpen, gen,
+                             static_cast<uint16_t>(0), 1.0f));
+  EXPECT_NE(1, absl::Uniform(absl::IntervalOpenOpen, gen, 0, 1.0));
+  EXPECT_NE(1, absl::Uniform(absl::IntervalOpenOpen, gen, -1, 1.0));
+  EXPECT_NE(1, absl::Uniform<double>(absl::IntervalOpenOpen, gen, -1, 1));
+  EXPECT_NE(1, absl::Uniform<float>(absl::IntervalOpenOpen, gen, 0, 1));
+  EXPECT_NE(1, absl::Uniform<float>(gen, 0, 1));
+}
+
+TEST_F(RandomDistributionsTest, UniformNoBounds) {
+  absl::InsecureBitGen gen;
+
+  absl::Uniform<uint8_t>(gen);
+  absl::Uniform<uint16_t>(gen);
+  absl::Uniform<uint32_t>(gen);
+  absl::Uniform<uint64_t>(gen);
+}
+
+// TODO(lar): Validate properties of non-default interval-semantics.
+TEST_F(RandomDistributionsTest, UniformReal) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Uniform(gen, 0, 1.0);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(0.5, moments.mean, 0.02);
+  EXPECT_NEAR(1 / 12.0, moments.variance, 0.02);
+  EXPECT_NEAR(0.0, moments.skewness, 0.02);
+  EXPECT_NEAR(9 / 5.0, moments.kurtosis, 0.02);
+}
+
+TEST_F(RandomDistributionsTest, UniformInt) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    const int64_t kMax = 1000000000000ll;
+    int64_t j = absl::Uniform(absl::IntervalClosedClosed, gen, 0, kMax);
+    // convert to double.
+    values[i] = static_cast<double>(j) / static_cast<double>(kMax);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(0.5, moments.mean, 0.02);
+  EXPECT_NEAR(1 / 12.0, moments.variance, 0.02);
+  EXPECT_NEAR(0.0, moments.skewness, 0.02);
+  EXPECT_NEAR(9 / 5.0, moments.kurtosis, 0.02);
+
+  /*
+  // NOTE: These are not supported by absl::Uniform, which is specialized
+  // on integer and real valued types.
+
+  enum E { E0, E1 };    // enum
+  enum S : int { S0, S1 };    // signed enum
+  enum U : unsigned int { U0, U1 };  // unsigned enum
+
+  absl::Uniform(gen, E0, E1);
+  absl::Uniform(gen, S0, S1);
+  absl::Uniform(gen, U0, U1);
+  */
+}
+
+TEST_F(RandomDistributionsTest, Exponential) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Exponential<double>(gen);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(1.0, moments.mean, 0.02);
+  EXPECT_NEAR(1.0, moments.variance, 0.025);
+  EXPECT_NEAR(2.0, moments.skewness, 0.1);
+  EXPECT_LT(5.0, moments.kurtosis);
+}
+
+TEST_F(RandomDistributionsTest, PoissonDefault) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Poisson<int64_t>(gen);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(1.0, moments.mean, 0.02);
+  EXPECT_NEAR(1.0, moments.variance, 0.02);
+  EXPECT_NEAR(1.0, moments.skewness, 0.025);
+  EXPECT_LT(2.0, moments.kurtosis);
+}
+
+TEST_F(RandomDistributionsTest, PoissonLarge) {
+  constexpr double kMean = 100000000.0;
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Poisson<int64_t>(gen, kMean);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(kMean, moments.mean, kMean * 0.015);
+  EXPECT_NEAR(kMean, moments.variance, kMean * 0.015);
+  EXPECT_NEAR(std::sqrt(kMean), moments.skewness, kMean * 0.02);
+  EXPECT_LT(2.0, moments.kurtosis);
+}
+
+TEST_F(RandomDistributionsTest, Bernoulli) {
+  constexpr double kP = 0.5151515151;
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Bernoulli(gen, kP);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(kP, moments.mean, 0.01);
+}
+
+TEST_F(RandomDistributionsTest, Beta) {
+  constexpr double kAlpha = 2.0;
+  constexpr double kBeta = 3.0;
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Beta(gen, kAlpha, kBeta);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(0.4, moments.mean, 0.01);
+}
+
+TEST_F(RandomDistributionsTest, Zipf) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Zipf<int64_t>(gen, 100);
+  }
+
+  // The mean of a zipf distribution is: H(N, s-1) / H(N,s).
+  // Given the parameter v = 1, this gives the following function:
+  // (Hn(100, 1) - Hn(1,1)) / (Hn(100,2) - Hn(1,2)) = 6.5944
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(6.5944, moments.mean, 2000) << moments;
+}
+
+TEST_F(RandomDistributionsTest, Gaussian) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::Gaussian<double>(gen);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(0.0, moments.mean, 0.02);
+  EXPECT_NEAR(1.0, moments.variance, 0.04);
+  EXPECT_NEAR(0, moments.skewness, 0.2);
+  EXPECT_NEAR(3.0, moments.kurtosis, 0.5);
+}
+
+TEST_F(RandomDistributionsTest, LogUniform) {
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen gen;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = absl::LogUniform<int64_t>(gen, 0, (1 << 10) - 1);
+  }
+
+  // The mean is the sum of the fractional means of the uniform distributions:
+  // [0..0][1..1][2..3][4..7][8..15][16..31][32..63]
+  // [64..127][128..255][256..511][512..1023]
+  const double mean = (0 + 1 + 1 + 2 + 3 + 4 + 7 + 8 + 15 + 16 + 31 + 32 + 63 +
+                       64 + 127 + 128 + 255 + 256 + 511 + 512 + 1023) /
+                      (2.0 * 11.0);
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(mean, moments.mean, 2) << moments;
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/examples_test.cc b/third_party/abseil-cpp/absl/random/examples_test.cc
new file mode 100644
index 0000000..1dcb514
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/examples_test.cc
@@ -0,0 +1,99 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cinttypes>
+#include <random>
+#include <sstream>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/random/random.h"
+
+template <typename T>
+void Use(T) {}
+
+TEST(Examples, Basic) {
+  absl::BitGen gen;
+  std::vector<int> objs = {10, 20, 30, 40, 50};
+
+  // Choose an element from a set.
+  auto elem = objs[absl::Uniform(gen, 0u, objs.size())];
+  Use(elem);
+
+  // Generate a uniform value between 1 and 6.
+  auto dice_roll = absl::Uniform<int>(absl::IntervalClosedClosed, gen, 1, 6);
+  Use(dice_roll);
+
+  // Generate a random byte.
+  auto byte = absl::Uniform<uint8_t>(gen);
+  Use(byte);
+
+  // Generate a fractional value from [0f, 1f).
+  auto fraction = absl::Uniform<float>(gen, 0, 1);
+  Use(fraction);
+
+  // Toss a fair coin; 50/50 probability.
+  bool coin_toss = absl::Bernoulli(gen, 0.5);
+  Use(coin_toss);
+
+  // Select a file size between 1k and 10MB, biased towards smaller file sizes.
+  auto file_size = absl::LogUniform<size_t>(gen, 1000, 10 * 1000 * 1000);
+  Use(file_size);
+
+  // Randomize (shuffle) a collection.
+  std::shuffle(std::begin(objs), std::end(objs), gen);
+}
+
+TEST(Examples, CreateingCorrelatedVariateSequences) {
+  // Unexpected PRNG correlation is often a source of bugs,
+  // so when using absl::BitGen it must be an intentional choice.
+  // NOTE: All of these only exhibit process-level stability.
+
+  // Create a correlated sequence from system entropy.
+  {
+    auto my_seed = absl::MakeSeedSeq();
+
+    absl::BitGen gen_1(my_seed);
+    absl::BitGen gen_2(my_seed);  // Produces same variates as gen_1.
+
+    EXPECT_EQ(absl::Bernoulli(gen_1, 0.5), absl::Bernoulli(gen_2, 0.5));
+    EXPECT_EQ(absl::Uniform<uint32_t>(gen_1), absl::Uniform<uint32_t>(gen_2));
+  }
+
+  // Create a correlated sequence from an existing URBG.
+  {
+    absl::BitGen gen;
+
+    auto my_seed = absl::CreateSeedSeqFrom(&gen);
+    absl::BitGen gen_1(my_seed);
+    absl::BitGen gen_2(my_seed);
+
+    EXPECT_EQ(absl::Bernoulli(gen_1, 0.5), absl::Bernoulli(gen_2, 0.5));
+    EXPECT_EQ(absl::Uniform<uint32_t>(gen_1), absl::Uniform<uint32_t>(gen_2));
+  }
+
+  // An alternate construction which uses user-supplied data
+  // instead of a random seed.
+  {
+    const char kData[] = "A simple seed string";
+    std::seed_seq my_seed(std::begin(kData), std::end(kData));
+
+    absl::BitGen gen_1(my_seed);
+    absl::BitGen gen_2(my_seed);
+
+    EXPECT_EQ(absl::Bernoulli(gen_1, 0.5), absl::Bernoulli(gen_2, 0.5));
+    EXPECT_EQ(absl::Uniform<uint32_t>(gen_1), absl::Uniform<uint32_t>(gen_2));
+  }
+}
+
diff --git a/third_party/abseil-cpp/absl/random/exponential_distribution.h b/third_party/abseil-cpp/absl/random/exponential_distribution.h
new file mode 100644
index 0000000..c8af1975
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/exponential_distribution.h
@@ -0,0 +1,157 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_EXPONENTIAL_DISTRIBUTION_H_
+#define ABSL_RANDOM_EXPONENTIAL_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+
+// absl::exponential_distribution:
+// Generates a number conforming to an exponential distribution and is
+// equivalent to the standard [rand.dist.pois.exp] distribution.
+template <typename RealType = double>
+class exponential_distribution {
+ public:
+  using result_type = RealType;
+
+  class param_type {
+   public:
+    using distribution_type = exponential_distribution;
+
+    explicit param_type(result_type lambda = 1) : lambda_(lambda) {
+      assert(lambda > 0);
+      neg_inv_lambda_ = -result_type(1) / lambda_;
+    }
+
+    result_type lambda() const { return lambda_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.lambda_ == b.lambda_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class exponential_distribution;
+
+    result_type lambda_;
+    result_type neg_inv_lambda_;
+
+    static_assert(
+        std::is_floating_point<RealType>::value,
+        "Class-template absl::exponential_distribution<> must be parameterized "
+        "using a floating-point type.");
+  };
+
+  exponential_distribution() : exponential_distribution(1) {}
+
+  explicit exponential_distribution(result_type lambda) : param_(lambda) {}
+
+  explicit exponential_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  // Generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const { return 0; }
+  result_type(max)() const {
+    return std::numeric_limits<result_type>::infinity();
+  }
+
+  result_type lambda() const { return param_.lambda(); }
+
+  friend bool operator==(const exponential_distribution& a,
+                         const exponential_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const exponential_distribution& a,
+                         const exponential_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+  random_internal::FastUniformBits<uint64_t> fast_u64_;
+};
+
+// --------------------------------------------------------------------------
+// Implementation details follow
+// --------------------------------------------------------------------------
+
+template <typename RealType>
+template <typename URBG>
+typename exponential_distribution<RealType>::result_type
+exponential_distribution<RealType>::operator()(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  using random_internal::NegativeValueT;
+  const result_type u = random_internal::RandU64ToReal<
+      result_type>::template Value<NegativeValueT, false>(fast_u64_(g));
+  // log1p(-x) is mathematically equivalent to log(1 - x) but has more
+  // accuracy for x near zero.
+  return p.neg_inv_lambda_ * std::log1p(u);
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const exponential_distribution<RealType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
+  os << x.lambda();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,    // NOLINT(runtime/references)
+    exponential_distribution<RealType>& x) {  // NOLINT(runtime/references)
+  using result_type = typename exponential_distribution<RealType>::result_type;
+  using param_type = typename exponential_distribution<RealType>::param_type;
+  result_type lambda;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  lambda = random_internal::read_floating_point<result_type>(is);
+  if (!is.fail()) {
+    x.param(param_type(lambda));
+  }
+  return is;
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_EXPONENTIAL_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/exponential_distribution_test.cc b/third_party/abseil-cpp/absl/random/exponential_distribution_test.cc
new file mode 100644
index 0000000..6f8865c2
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/exponential_distribution_test.cc
@@ -0,0 +1,422 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/exponential_distribution.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <limits>
+#include <random>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/macros.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+using absl::random_internal::kChiSquared;
+
+template <typename RealType>
+class ExponentialDistributionTypedTest : public ::testing::Test {};
+
+using RealTypes = ::testing::Types<float, double, long double>;
+TYPED_TEST_CASE(ExponentialDistributionTypedTest, RealTypes);
+
+TYPED_TEST(ExponentialDistributionTypedTest, SerializeTest) {
+  using param_type =
+      typename absl::exponential_distribution<TypeParam>::param_type;
+
+  const TypeParam kParams[] = {
+      // Cases around 1.
+      1,                                           //
+      std::nextafter(TypeParam(1), TypeParam(0)),  // 1 - epsilon
+      std::nextafter(TypeParam(1), TypeParam(2)),  // 1 + epsilon
+      // Typical cases.
+      TypeParam(1e-8), TypeParam(1e-4), TypeParam(1), TypeParam(2),
+      TypeParam(1e4), TypeParam(1e8), TypeParam(1e20), TypeParam(2.5),
+      // Boundary cases.
+      std::numeric_limits<TypeParam>::max(),
+      std::numeric_limits<TypeParam>::epsilon(),
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(1)),           // min + epsilon
+      std::numeric_limits<TypeParam>::min(),  // smallest normal
+      // There are some errors dealing with denorms on apple platforms.
+      std::numeric_limits<TypeParam>::denorm_min(),  // smallest denorm
+      std::numeric_limits<TypeParam>::min() / 2,     // denorm
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(0)),  // denorm_max
+  };
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+
+  for (const TypeParam lambda : kParams) {
+    // Some values may be invalid; skip those.
+    if (!std::isfinite(lambda)) continue;
+    ABSL_ASSERT(lambda > 0);
+
+    const param_type param(lambda);
+
+    absl::exponential_distribution<TypeParam> before(lambda);
+    EXPECT_EQ(before.lambda(), param.lambda());
+
+    {
+      absl::exponential_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+      EXPECT_EQ(via_param.param(), before.param());
+    }
+
+    // Smoke test.
+    auto sample_min = before.max();
+    auto sample_max = before.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = before(gen);
+      EXPECT_GE(sample, before.min()) << before;
+      EXPECT_LE(sample, before.max()) << before;
+      if (sample > sample_max) sample_max = sample;
+      if (sample < sample_min) sample_min = sample;
+    }
+    if (!std::is_same<TypeParam, long double>::value) {
+      ABSL_INTERNAL_LOG(INFO,
+                        absl::StrFormat("Range {%f}: %f, %f, lambda=%f", lambda,
+                                        sample_min, sample_max, lambda));
+    }
+
+    std::stringstream ss;
+    ss << before;
+
+    if (!std::isfinite(lambda)) {
+      // Streams do not deserialize inf/nan correctly.
+      continue;
+    }
+    // Validate stream serialization.
+    absl::exponential_distribution<TypeParam> after(34.56f);
+
+    EXPECT_NE(before.lambda(), after.lambda());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+#if defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
+    defined(__ppc__) || defined(__PPC__)
+    if (std::is_same<TypeParam, long double>::value) {
+      // Roundtripping floating point values requires sufficient precision to
+      // reconstruct the exact value. It turns out that long double has some
+      // errors doing this on ppc, particularly for values
+      // near {1.0 +/- epsilon}.
+      if (lambda <= std::numeric_limits<double>::max() &&
+          lambda >= std::numeric_limits<double>::lowest()) {
+        EXPECT_EQ(static_cast<double>(before.lambda()),
+                  static_cast<double>(after.lambda()))
+            << ss.str();
+      }
+      continue;
+    }
+#endif
+
+    EXPECT_EQ(before.lambda(), after.lambda())  //
+        << ss.str() << " "                      //
+        << (ss.good() ? "good " : "")           //
+        << (ss.bad() ? "bad " : "")             //
+        << (ss.eof() ? "eof " : "")             //
+        << (ss.fail() ? "fail " : "");
+  }
+}
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3667.htm
+
+class ExponentialModel {
+ public:
+  explicit ExponentialModel(double lambda)
+      : lambda_(lambda), beta_(1.0 / lambda) {}
+
+  double lambda() const { return lambda_; }
+
+  double mean() const { return beta_; }
+  double variance() const { return beta_ * beta_; }
+  double stddev() const { return std::sqrt(variance()); }
+  double skew() const { return 2; }
+  double kurtosis() const { return 6.0; }
+
+  double CDF(double x) { return 1.0 - std::exp(-lambda_ * x); }
+
+  // The inverse CDF, or PercentPoint function of the distribution
+  double InverseCDF(double p) {
+    ABSL_ASSERT(p >= 0.0);
+    ABSL_ASSERT(p < 1.0);
+    return -beta_ * std::log(1.0 - p);
+  }
+
+ private:
+  const double lambda_;
+  const double beta_;
+};
+
+struct Param {
+  double lambda;
+  double p_fail;
+  int trials;
+};
+
+class ExponentialDistributionTests : public testing::TestWithParam<Param>,
+                                     public ExponentialModel {
+ public:
+  ExponentialDistributionTests() : ExponentialModel(GetParam().lambda) {}
+
+  // SingleZTest provides a basic z-squared test of the mean vs. expected
+  // mean for data generated by the poisson distribution.
+  template <typename D>
+  bool SingleZTest(const double p, const size_t samples);
+
+  // SingleChiSquaredTest provides a basic chi-squared test of the normal
+  // distribution.
+  template <typename D>
+  double SingleChiSquaredTest();
+
+  absl::InsecureBitGen rng_;
+};
+
+template <typename D>
+bool ExponentialDistributionTests::SingleZTest(const double p,
+                                               const size_t samples) {
+  D dis(lambda());
+
+  std::vector<double> data;
+  data.reserve(samples);
+  for (size_t i = 0; i < samples; i++) {
+    const double x = dis(rng_);
+    data.push_back(x);
+  }
+
+  const auto m = absl::random_internal::ComputeDistributionMoments(data);
+  const double max_err = absl::random_internal::MaxErrorTolerance(p);
+  const double z = absl::random_internal::ZScore(mean(), m);
+  const bool pass = absl::random_internal::Near("z", z, 0.0, max_err);
+
+  if (!pass) {
+    ABSL_INTERNAL_LOG(
+        INFO, absl::StrFormat("p=%f max_err=%f\n"
+                              " lambda=%f\n"
+                              " mean=%f vs. %f\n"
+                              " stddev=%f vs. %f\n"
+                              " skewness=%f vs. %f\n"
+                              " kurtosis=%f vs. %f\n"
+                              " z=%f vs. 0",
+                              p, max_err, lambda(), m.mean, mean(),
+                              std::sqrt(m.variance), stddev(), m.skewness,
+                              skew(), m.kurtosis, kurtosis(), z));
+  }
+  return pass;
+}
+
+template <typename D>
+double ExponentialDistributionTests::SingleChiSquaredTest() {
+  const size_t kSamples = 10000;
+  const int kBuckets = 50;
+
+  // The InverseCDF is the percent point function of the distribution, and can
+  // be used to assign buckets roughly uniformly.
+  std::vector<double> cutoffs;
+  const double kInc = 1.0 / static_cast<double>(kBuckets);
+  for (double p = kInc; p < 1.0; p += kInc) {
+    cutoffs.push_back(InverseCDF(p));
+  }
+  if (cutoffs.back() != std::numeric_limits<double>::infinity()) {
+    cutoffs.push_back(std::numeric_limits<double>::infinity());
+  }
+
+  D dis(lambda());
+
+  std::vector<int32_t> counts(cutoffs.size(), 0);
+  for (int j = 0; j < kSamples; j++) {
+    const double x = dis(rng_);
+    auto it = std::upper_bound(cutoffs.begin(), cutoffs.end(), x);
+    counts[std::distance(cutoffs.begin(), it)]++;
+  }
+
+  // Null-hypothesis is that the distribution is exponentially distributed
+  // with the provided lambda (not estimated from the data).
+  const int dof = static_cast<int>(counts.size()) - 1;
+
+  // Our threshold for logging is 1-in-50.
+  const double threshold = absl::random_internal::ChiSquareValue(dof, 0.98);
+
+  const double expected =
+      static_cast<double>(kSamples) / static_cast<double>(counts.size());
+
+  double chi_square = absl::random_internal::ChiSquareWithExpected(
+      std::begin(counts), std::end(counts), expected);
+  double p = absl::random_internal::ChiSquarePValue(chi_square, dof);
+
+  if (chi_square > threshold) {
+    for (int i = 0; i < cutoffs.size(); i++) {
+      ABSL_INTERNAL_LOG(
+          INFO, absl::StrFormat("%d : (%f) = %d", i, cutoffs[i], counts[i]));
+    }
+
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrCat("lambda ", lambda(), "\n",     //
+                                   " expected ", expected, "\n",  //
+                                   kChiSquared, " ", chi_square, " (", p, ")\n",
+                                   kChiSquared, " @ 0.98 = ", threshold));
+  }
+  return p;
+}
+
+TEST_P(ExponentialDistributionTests, ZTest) {
+  const size_t kSamples = 10000;
+  const auto& param = GetParam();
+  const int expected_failures =
+      std::max(1, static_cast<int>(std::ceil(param.trials * param.p_fail)));
+  const double p = absl::random_internal::RequiredSuccessProbability(
+      param.p_fail, param.trials);
+
+  int failures = 0;
+  for (int i = 0; i < param.trials; i++) {
+    failures += SingleZTest<absl::exponential_distribution<double>>(p, kSamples)
+                    ? 0
+                    : 1;
+  }
+  EXPECT_LE(failures, expected_failures);
+}
+
+TEST_P(ExponentialDistributionTests, ChiSquaredTest) {
+  const int kTrials = 20;
+  int failures = 0;
+
+  for (int i = 0; i < kTrials; i++) {
+    double p_value =
+        SingleChiSquaredTest<absl::exponential_distribution<double>>();
+    if (p_value < 0.005) {  // 1/200
+      failures++;
+    }
+  }
+
+  // There is a 0.10% chance of producing at least one failure, so raise the
+  // failure threshold high enough to allow for a flake rate < 10,000.
+  EXPECT_LE(failures, 4);
+}
+
+std::vector<Param> GenParams() {
+  return {
+      Param{1.0, 0.02, 100},
+      Param{2.5, 0.02, 100},
+      Param{10, 0.02, 100},
+      // large
+      Param{1e4, 0.02, 100},
+      Param{1e9, 0.02, 100},
+      // small
+      Param{0.1, 0.02, 100},
+      Param{1e-3, 0.02, 100},
+      Param{1e-5, 0.02, 100},
+  };
+}
+
+std::string ParamName(const ::testing::TestParamInfo<Param>& info) {
+  const auto& p = info.param;
+  std::string name = absl::StrCat("lambda_", absl::SixDigits(p.lambda));
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_CASE_P(, ExponentialDistributionTests,
+                        ::testing::ValuesIn(GenParams()), ParamName);
+
+// NOTE: absl::exponential_distribution is not guaranteed to be stable.
+TEST(ExponentialDistributionTest, StabilityTest) {
+  // absl::exponential_distribution stability relies on std::log1p and
+  // absl::uniform_real_distribution.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(14);
+
+  {
+    absl::exponential_distribution<double> dist;
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return static_cast<int>(10000.0 * dist(urbg)); });
+
+    EXPECT_EQ(14, urbg.invocations());
+    EXPECT_THAT(output,
+                testing::ElementsAre(0, 71913, 14375, 5039, 1835, 861, 25936,
+                                     804, 126, 12337, 17984, 27002, 0, 71913));
+  }
+
+  urbg.reset();
+  {
+    absl::exponential_distribution<float> dist;
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return static_cast<int>(10000.0f * dist(urbg)); });
+
+    EXPECT_EQ(14, urbg.invocations());
+    EXPECT_THAT(output,
+                testing::ElementsAre(0, 71913, 14375, 5039, 1835, 861, 25936,
+                                     804, 126, 12337, 17984, 27002, 0, 71913));
+  }
+}
+
+TEST(ExponentialDistributionTest, AlgorithmBounds) {
+  // Relies on absl::uniform_real_distribution, so some of these comments
+  // reference that.
+  absl::exponential_distribution<double> dist;
+
+  {
+    // This returns the smallest value >0 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0x0000000000000001ull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 5.42101086242752217004e-20);
+  }
+
+  {
+    // This returns a value very near 0.5 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0x7fffffffffffffefull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 0.693147180559945175204);
+  }
+
+  {
+    // This returns the largest value <1 from absl::uniform_real_distribution.
+    // WolframAlpha: ~39.1439465808987766283058547296341915292187253
+    absl::random_internal::sequence_urbg urbg({0xFFFFFFFFFFFFFFeFull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 36.7368005696771007251);
+  }
+  {
+    // This *ALSO* returns the largest value <1.
+    absl::random_internal::sequence_urbg urbg({0xFFFFFFFFFFFFFFFFull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 36.7368005696771007251);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/gaussian_distribution.cc b/third_party/abseil-cpp/absl/random/gaussian_distribution.cc
new file mode 100644
index 0000000..5dd8461
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/gaussian_distribution.cc
@@ -0,0 +1,102 @@
+// BEGIN GENERATED CODE; DO NOT EDIT
+// clang-format off
+
+#include "absl/random/gaussian_distribution.h"
+
+namespace absl {
+namespace random_internal {
+
+const gaussian_distribution_base::Tables
+    gaussian_distribution_base::zg_ = {
+    {3.7130862467425505, 3.442619855899000214, 3.223084984581141565,
+     3.083228858216868318, 2.978696252647779819, 2.894344007021528942,
+     2.82312535054891045, 2.761169372387176857, 2.706113573121819549,
+     2.656406411261359679, 2.610972248431847387, 2.56903362592493778,
+     2.530009672388827457, 2.493454522095372106, 2.459018177411830486,
+     2.426420645533749809, 2.395434278011062457, 2.365871370117638595,
+     2.337575241339236776, 2.310413683698762988, 2.284274059677471769,
+     2.25905957386919809, 2.234686395590979036, 2.21108140887870297,
+     2.188180432076048731, 2.165926793748921497, 2.144270182360394905,
+     2.123165708673976138, 2.102573135189237608, 2.082456237992015957,
+     2.062782274508307978, 2.043521536655067194, 2.02464697337738464,
+     2.006133869963471206, 1.987959574127619033, 1.970103260854325633,
+     1.952545729553555764, 1.935269228296621957, 1.918257300864508963,
+     1.901494653105150423, 1.884967035707758143, 1.868661140994487768,
+     1.852564511728090002, 1.836665460258444904, 1.820952996596124418,
+     1.805416764219227366, 1.790046982599857506, 1.77483439558606837,
+     1.759770224899592339, 1.744846128113799244, 1.730054160563729182,
+     1.71538674071366648, 1.700836618569915748, 1.686396846779167014,
+     1.6720607540975998, 1.657821920954023254, 1.643674156862867441,
+     1.629611479470633562, 1.615628095043159629, 1.601718380221376581,
+     1.587876864890574558, 1.574098216022999264, 1.560377222366167382,
+     1.546708779859908844, 1.533087877674041755, 1.519509584765938559,
+     1.505969036863201937, 1.492461423781352714, 1.478981976989922842,
+     1.465525957342709296, 1.452088642889222792, 1.438665316684561546,
+     1.425251254514058319, 1.411841712447055919, 1.398431914131003539,
+     1.385017037732650058, 1.371592202427340812, 1.358152454330141534,
+     1.34469275175354519, 1.331207949665625279, 1.317692783209412299,
+     1.304141850128615054, 1.290549591926194894, 1.27691027356015363,
+     1.263217961454619287, 1.249466499573066436, 1.23564948326336066,
+     1.221760230539994385, 1.207791750415947662, 1.193736707833126465,
+     1.17958738466398616, 1.165335636164750222, 1.150972842148865416,
+     1.136489852013158774, 1.121876922582540237, 1.107123647534034028,
+     1.092218876907275371, 1.077150624892893482, 1.061905963694822042,
+     1.046470900764042922, 1.030830236068192907, 1.014967395251327842,
+     0.9988642334929808131, 0.9825008035154263464, 0.9658550794011470098,
+     0.9489026255113034436, 0.9316161966151479401, 0.9139652510230292792,
+     0.8959153525809346874, 0.8774274291129204872, 0.8584568431938099931,
+     0.8389522142975741614, 0.8188539067003538507, 0.7980920606440534693,
+     0.7765839878947563557, 0.7542306644540520688, 0.7309119106424850631,
+     0.7064796113354325779, 0.6807479186691505202, 0.6534786387399710295,
+     0.6243585973360461505, 0.5929629424714434327, 0.5586921784081798625,
+     0.5206560387620546848, 0.4774378372966830431, 0.4265479863554152429,
+     0.3628714310970211909, 0.2723208648139477384, 0},
+    {0.001014352564120377413, 0.002669629083880922793, 0.005548995220771345792,
+     0.008624484412859888607, 0.01183947865788486861, 0.01516729801054656976,
+     0.01859210273701129151, 0.02210330461592709475, 0.02569329193593428151,
+     0.02935631744000685023, 0.03308788614622575758, 0.03688438878665621645,
+     0.04074286807444417458, 0.04466086220049143157, 0.04863629585986780496,
+     0.05266740190305100461, 0.05675266348104984759, 0.06089077034804041277,
+     0.06508058521306804567, 0.06932111739357792179, 0.07361150188411341722,
+     0.07795098251397346301, 0.08233889824223575293, 0.08677467189478028919,
+     0.09125780082683036809, 0.095787849121731522, 0.1003644410286559929,
+     0.1049872554094214289, 0.1096560210148404546, 0.1143705124488661323,
+     0.1191305467076509556, 0.1239359802028679736, 0.1287867061959434012,
+     0.1336826525834396151, 0.1386237799845948804, 0.1436100800906280339,
+     0.1486415742423425057, 0.1537183122081819397, 0.1588403711394795748,
+     0.1640078546834206341, 0.1692208922373653057, 0.1744796383307898324,
+     0.1797842721232958407, 0.1851349970089926078, 0.1905320403191375633,
+     0.1959756531162781534, 0.2014661100743140865, 0.2070037094399269362,
+     0.2125887730717307134, 0.2182216465543058426, 0.2239026993850088965,
+     0.229632325232116602, 0.2354109422634795556, 0.2412389935454402889,
+     0.2471169475123218551, 0.2530452985073261551, 0.2590245673962052742,
+     0.2650553022555897087, 0.271138079138385224, 0.2772735029191887857,
+     0.2834622082232336471, 0.2897048604429605656, 0.2960021568469337061,
+     0.3023548277864842593, 0.3087636380061818397, 0.3152293880650116065,
+     0.3217529158759855901, 0.3283350983728509642, 0.3349768533135899506,
+     0.3416791412315512977, 0.3484429675463274756, 0.355269384847918035,
+     0.3621594953693184626, 0.3691144536644731522, 0.376135469510563536,
+     0.3832238110559021416, 0.3903808082373155797, 0.3976078564938743676,
+     0.404906420807223999, 0.4122780401026620578, 0.4197243320495753771,
+     0.4272469983049970721, 0.4348478302499918513, 0.4425287152754694975,
+     0.4502916436820402768, 0.458138716267873114, 0.4660721526894572309,
+     0.4740943006930180559, 0.4822076463294863724, 0.4904148252838453348,
+     0.4987186354709807201, 0.5071220510755701794, 0.5156282382440030565,
+     0.5242405726729852944, 0.5329626593838373561, 0.5417983550254266145,
+     0.5507517931146057588, 0.5598274127040882009, 0.5690299910679523787,
+     0.5783646811197646898, 0.5878370544347081283, 0.5974531509445183408,
+     0.6072195366251219584, 0.6171433708188825973, 0.6272324852499290282,
+     0.6374954773350440806, 0.6479418211102242475, 0.6585820000500898219,
+     0.6694276673488921414, 0.6804918409973358395, 0.6917891434366769676,
+     0.7033360990161600101, 0.7151515074105005976, 0.7272569183441868201,
+     0.7396772436726493094, 0.7524415591746134169, 0.7655841738977066102,
+     0.7791460859296898134, 0.7931770117713072832, 0.8077382946829627652,
+     0.8229072113814113187, 0.8387836052959920519, 0.8555006078694531446,
+     0.873243048910072206, 0.8922816507840289901, 0.9130436479717434217,
+     0.9362826816850632339, 0.9635996931270905952, 1}};
+
+}  // namespace random_internal
+}  // namespace absl
+
+// clang-format on
+// END GENERATED CODE
diff --git a/third_party/abseil-cpp/absl/random/gaussian_distribution.h b/third_party/abseil-cpp/absl/random/gaussian_distribution.h
new file mode 100644
index 0000000..1d1347bc
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/gaussian_distribution.h
@@ -0,0 +1,260 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_GAUSSIAN_DISTRIBUTION_H_
+#define ABSL_RANDOM_GAUSSIAN_DISTRIBUTION_H_
+
+// absl::gaussian_distribution implements the Ziggurat algorithm
+// for generating random gaussian numbers.
+//
+// Implementation based on "The Ziggurat Method for Generating Random Variables"
+// by George Marsaglia and Wai Wan Tsang: http://www.jstatsoft.org/v05/i08/
+//
+
+#include <cmath>
+#include <cstdint>
+#include <istream>
+#include <limits>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+namespace random_internal {
+
+// absl::gaussian_distribution_base implements the underlying ziggurat algorithm
+// using the ziggurat tables generated by the gaussian_distribution_gentables
+// binary.
+//
+// The specific algorithm has some of the improvements suggested by the
+// 2005 paper, "An Improved Ziggurat Method to Generate Normal Random Samples",
+// Jurgen A Doornik.  (https://www.doornik.com/research/ziggurat.pdf)
+class gaussian_distribution_base {
+ public:
+  template <typename URBG>
+  inline double zignor(URBG& g);  // NOLINT(runtime/references)
+
+ private:
+  friend class TableGenerator;
+
+  template <typename URBG>
+  inline double zignor_fallback(URBG& g,  // NOLINT(runtime/references)
+                                bool neg);
+
+  // Constants used for the gaussian distribution.
+  static constexpr double kR = 3.442619855899;  // Start of the tail.
+  static constexpr double kRInv = 0.29047645161474317;  // ~= (1.0 / kR) .
+  static constexpr double kV = 9.91256303526217e-3;
+  static constexpr uint64_t kMask = 0x07f;
+
+  // The ziggurat tables store the pdf(f) and inverse-pdf(x) for equal-area
+  // points on one-half of the normal distribution, where the pdf function,
+  // pdf = e ^ (-1/2 *x^2), assumes that the mean = 0 & stddev = 1.
+  //
+  // These tables are just over 2kb in size; larger tables might improve the
+  // distributions, but also lead to more cache pollution.
+  //
+  // x = {3.71308, 3.44261, 3.22308, ..., 0}
+  // f = {0.00101, 0.00266, 0.00554, ..., 1}
+  struct Tables {
+    double x[kMask + 2];
+    double f[kMask + 2];
+  };
+  static const Tables zg_;
+  random_internal::FastUniformBits<uint64_t> fast_u64_;
+};
+
+}  // namespace random_internal
+
+// absl::gaussian_distribution:
+// Generates a number conforming to a Gaussian distribution.
+template <typename RealType = double>
+class gaussian_distribution : random_internal::gaussian_distribution_base {
+ public:
+  using result_type = RealType;
+
+  class param_type {
+   public:
+    using distribution_type = gaussian_distribution;
+
+    explicit param_type(result_type mean = 0, result_type stddev = 1)
+        : mean_(mean), stddev_(stddev) {}
+
+    // Returns the mean distribution parameter.  The mean specifies the location
+    // of the peak.  The default value is 0.0.
+    result_type mean() const { return mean_; }
+
+    // Returns the deviation distribution parameter.  The default value is 1.0.
+    result_type stddev() const { return stddev_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.mean_ == b.mean_ && a.stddev_ == b.stddev_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    result_type mean_;
+    result_type stddev_;
+
+    static_assert(
+        std::is_floating_point<RealType>::value,
+        "Class-template absl::gaussian_distribution<> must be parameterized "
+        "using a floating-point type.");
+  };
+
+  gaussian_distribution() : gaussian_distribution(0) {}
+
+  explicit gaussian_distribution(result_type mean, result_type stddev = 1)
+      : param_(mean, stddev) {}
+
+  explicit gaussian_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  // Generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const {
+    return -std::numeric_limits<result_type>::infinity();
+  }
+  result_type(max)() const {
+    return std::numeric_limits<result_type>::infinity();
+  }
+
+  result_type mean() const { return param_.mean(); }
+  result_type stddev() const { return param_.stddev(); }
+
+  friend bool operator==(const gaussian_distribution& a,
+                         const gaussian_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const gaussian_distribution& a,
+                         const gaussian_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+};
+
+// --------------------------------------------------------------------------
+// Implementation details only below
+// --------------------------------------------------------------------------
+
+template <typename RealType>
+template <typename URBG>
+typename gaussian_distribution<RealType>::result_type
+gaussian_distribution<RealType>::operator()(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  return p.mean() + p.stddev() * static_cast<result_type>(zignor(g));
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const gaussian_distribution<RealType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
+  os << x.mean() << os.fill() << x.stddev();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    gaussian_distribution<RealType>& x) {   // NOLINT(runtime/references)
+  using result_type = typename gaussian_distribution<RealType>::result_type;
+  using param_type = typename gaussian_distribution<RealType>::param_type;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  auto mean = random_internal::read_floating_point<result_type>(is);
+  if (is.fail()) return is;
+  auto stddev = random_internal::read_floating_point<result_type>(is);
+  if (!is.fail()) {
+    x.param(param_type(mean, stddev));
+  }
+  return is;
+}
+
+namespace random_internal {
+
+template <typename URBG>
+inline double gaussian_distribution_base::zignor_fallback(URBG& g, bool neg) {
+  // This fallback path happens approximately 0.05% of the time.
+  double x, y;
+  do {
+    // kRInv = 1/r, U(0, 1)
+    x = kRInv * std::log(RandU64ToDouble<PositiveValueT, false>(fast_u64_(g)));
+    y = -std::log(RandU64ToDouble<PositiveValueT, false>(fast_u64_(g)));
+  } while ((y + y) < (x * x));
+  return neg ? (x - kR) : (kR - x);
+}
+
+template <typename URBG>
+inline double gaussian_distribution_base::zignor(
+    URBG& g) {  // NOLINT(runtime/references)
+  while (true) {
+    // We use a single uint64_t to generate both a double and a strip.
+    // These bits are unused when the generated double is > 1/2^5.
+    // This may introduce some bias from the duplicated low bits of small
+    // values (those smaller than 1/2^5, which all end up on the left tail).
+    uint64_t bits = fast_u64_(g);
+    int i = static_cast<int>(bits & kMask);  // pick a random strip
+    double j = RandU64ToDouble<SignedValueT, false>(bits);  // U(-1, 1)
+    const double x = j * zg_.x[i];
+
+    // Retangular box. Handles >97% of all cases.
+    // For any given box, this handles between 75% and 99% of values.
+    // Equivalent to U(01) < (x[i+1] / x[i]), and when i == 0, ~93.5%
+    if (std::abs(x) < zg_.x[i + 1]) {
+      return x;
+    }
+
+    // i == 0: Base box. Sample using a ratio of uniforms.
+    if (i == 0) {
+      // This path happens about 0.05% of the time.
+      return zignor_fallback(g, j < 0);
+    }
+
+    // i > 0: Wedge samples using precomputed values.
+    double v = RandU64ToDouble<PositiveValueT, false>(fast_u64_(g));  // U(0, 1)
+    if ((zg_.f[i + 1] + v * (zg_.f[i] - zg_.f[i + 1])) <
+        std::exp(-0.5 * x * x)) {
+      return x;
+    }
+
+    // The wedge was missed; reject the value and try again.
+  }
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_GAUSSIAN_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/gaussian_distribution_test.cc b/third_party/abseil-cpp/absl/random/gaussian_distribution_test.cc
new file mode 100644
index 0000000..47c2989
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/gaussian_distribution_test.cc
@@ -0,0 +1,573 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/gaussian_distribution.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstddef>
+#include <ios>
+#include <iterator>
+#include <random>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/macros.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+using absl::random_internal::kChiSquared;
+
+template <typename RealType>
+class GaussianDistributionInterfaceTest : public ::testing::Test {};
+
+using RealTypes = ::testing::Types<float, double, long double>;
+TYPED_TEST_CASE(GaussianDistributionInterfaceTest, RealTypes);
+
+TYPED_TEST(GaussianDistributionInterfaceTest, SerializeTest) {
+  using param_type =
+      typename absl::gaussian_distribution<TypeParam>::param_type;
+
+  const TypeParam kParams[] = {
+      // Cases around 1.
+      1,                                           //
+      std::nextafter(TypeParam(1), TypeParam(0)),  // 1 - epsilon
+      std::nextafter(TypeParam(1), TypeParam(2)),  // 1 + epsilon
+      // Arbitrary values.
+      TypeParam(1e-8), TypeParam(1e-4), TypeParam(2), TypeParam(1e4),
+      TypeParam(1e8), TypeParam(1e20), TypeParam(2.5),
+      // Boundary cases.
+      std::numeric_limits<TypeParam>::infinity(),
+      std::numeric_limits<TypeParam>::max(),
+      std::numeric_limits<TypeParam>::epsilon(),
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(1)),           // min + epsilon
+      std::numeric_limits<TypeParam>::min(),  // smallest normal
+      // There are some errors dealing with denorms on apple platforms.
+      std::numeric_limits<TypeParam>::denorm_min(),  // smallest denorm
+      std::numeric_limits<TypeParam>::min() / 2,
+      std::nextafter(std::numeric_limits<TypeParam>::min(),
+                     TypeParam(0)),  // denorm_max
+  };
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+
+  // Use a loop to generate the combinations of {+/-x, +/-y}, and assign x, y to
+  // all values in kParams,
+  for (const auto mod : {0, 1, 2, 3}) {
+    for (const auto x : kParams) {
+      if (!std::isfinite(x)) continue;
+      for (const auto y : kParams) {
+        const TypeParam mean = (mod & 0x1) ? -x : x;
+        const TypeParam stddev = (mod & 0x2) ? -y : y;
+        const param_type param(mean, stddev);
+
+        absl::gaussian_distribution<TypeParam> before(mean, stddev);
+        EXPECT_EQ(before.mean(), param.mean());
+        EXPECT_EQ(before.stddev(), param.stddev());
+
+        {
+          absl::gaussian_distribution<TypeParam> via_param(param);
+          EXPECT_EQ(via_param, before);
+          EXPECT_EQ(via_param.param(), before.param());
+        }
+
+        // Smoke test.
+        auto sample_min = before.max();
+        auto sample_max = before.min();
+        for (int i = 0; i < kCount; i++) {
+          auto sample = before(gen);
+          if (sample > sample_max) sample_max = sample;
+          if (sample < sample_min) sample_min = sample;
+          EXPECT_GE(sample, before.min()) << before;
+          EXPECT_LE(sample, before.max()) << before;
+        }
+        if (!std::is_same<TypeParam, long double>::value) {
+          ABSL_INTERNAL_LOG(
+              INFO, absl::StrFormat("Range{%f, %f}: %f, %f", mean, stddev,
+                                    sample_min, sample_max));
+        }
+
+        std::stringstream ss;
+        ss << before;
+
+        if (!std::isfinite(mean) || !std::isfinite(stddev)) {
+          // Streams do not parse inf/nan.
+          continue;
+        }
+
+        // Validate stream serialization.
+        absl::gaussian_distribution<TypeParam> after(-0.53f, 2.3456f);
+
+        EXPECT_NE(before.mean(), after.mean());
+        EXPECT_NE(before.stddev(), after.stddev());
+        EXPECT_NE(before.param(), after.param());
+        EXPECT_NE(before, after);
+
+        ss >> after;
+
+#if defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
+    defined(__ppc__) || defined(__PPC__)
+        if (std::is_same<TypeParam, long double>::value) {
+          // Roundtripping floating point values requires sufficient precision
+          // to reconstruct the exact value.  It turns out that long double
+          // has some errors doing this on ppc, particularly for values
+          // near {1.0 +/- epsilon}.
+          if (mean <= std::numeric_limits<double>::max() &&
+              mean >= std::numeric_limits<double>::lowest()) {
+            EXPECT_EQ(static_cast<double>(before.mean()),
+                      static_cast<double>(after.mean()))
+                << ss.str();
+          }
+          if (stddev <= std::numeric_limits<double>::max() &&
+              stddev >= std::numeric_limits<double>::lowest()) {
+            EXPECT_EQ(static_cast<double>(before.stddev()),
+                      static_cast<double>(after.stddev()))
+                << ss.str();
+          }
+          continue;
+        }
+#endif
+
+        EXPECT_EQ(before.mean(), after.mean());
+        EXPECT_EQ(before.stddev(), after.stddev())  //
+            << ss.str() << " "                      //
+            << (ss.good() ? "good " : "")           //
+            << (ss.bad() ? "bad " : "")             //
+            << (ss.eof() ? "eof " : "")             //
+            << (ss.fail() ? "fail " : "");
+      }
+    }
+  }
+}
+
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm
+
+class GaussianModel {
+ public:
+  GaussianModel(double mean, double stddev) : mean_(mean), stddev_(stddev) {}
+
+  double mean() const { return mean_; }
+  double variance() const { return stddev() * stddev(); }
+  double stddev() const { return stddev_; }
+  double skew() const { return 0; }
+  double kurtosis() const { return 3.0; }
+
+  // The inverse CDF, or PercentPoint function.
+  double InverseCDF(double p) {
+    ABSL_ASSERT(p >= 0.0);
+    ABSL_ASSERT(p < 1.0);
+    return mean() + stddev() * -absl::random_internal::InverseNormalSurvival(p);
+  }
+
+ private:
+  const double mean_;
+  const double stddev_;
+};
+
+struct Param {
+  double mean;
+  double stddev;
+  double p_fail;  // Z-Test probability of failure.
+  int trials;     // Z-Test trials.
+};
+
+// GaussianDistributionTests implements a z-test for the gaussian
+// distribution.
+class GaussianDistributionTests : public testing::TestWithParam<Param>,
+                                  public GaussianModel {
+ public:
+  GaussianDistributionTests()
+      : GaussianModel(GetParam().mean, GetParam().stddev) {}
+
+  // SingleZTest provides a basic z-squared test of the mean vs. expected
+  // mean for data generated by the poisson distribution.
+  template <typename D>
+  bool SingleZTest(const double p, const size_t samples);
+
+  // SingleChiSquaredTest provides a basic chi-squared test of the normal
+  // distribution.
+  template <typename D>
+  double SingleChiSquaredTest();
+
+  absl::InsecureBitGen rng_;
+};
+
+template <typename D>
+bool GaussianDistributionTests::SingleZTest(const double p,
+                                            const size_t samples) {
+  D dis(mean(), stddev());
+
+  std::vector<double> data;
+  data.reserve(samples);
+  for (size_t i = 0; i < samples; i++) {
+    const double x = dis(rng_);
+    data.push_back(x);
+  }
+
+  const double max_err = absl::random_internal::MaxErrorTolerance(p);
+  const auto m = absl::random_internal::ComputeDistributionMoments(data);
+  const double z = absl::random_internal::ZScore(mean(), m);
+  const bool pass = absl::random_internal::Near("z", z, 0.0, max_err);
+
+  // NOTE: Informational statistical test:
+  //
+  // Compute the Jarque-Bera test statistic given the excess skewness
+  // and kurtosis. The statistic is drawn from a chi-square(2) distribution.
+  // https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test
+  //
+  // The null-hypothesis (normal distribution) is rejected when
+  // (p = 0.05 => jb > 5.99)
+  // (p = 0.01 => jb > 9.21)
+  // NOTE: JB has a large type-I error rate, so it will reject the
+  // null-hypothesis even when it is true more often than the z-test.
+  //
+  const double jb =
+      static_cast<double>(m.n) / 6.0 *
+      (std::pow(m.skewness, 2.0) + std::pow(m.kurtosis - 3.0, 2.0) / 4.0);
+
+  if (!pass || jb > 9.21) {
+    ABSL_INTERNAL_LOG(
+        INFO, absl::StrFormat("p=%f max_err=%f\n"
+                              " mean=%f vs. %f\n"
+                              " stddev=%f vs. %f\n"
+                              " skewness=%f vs. %f\n"
+                              " kurtosis=%f vs. %f\n"
+                              " z=%f vs. 0\n"
+                              " jb=%f vs. 9.21",
+                              p, max_err, m.mean, mean(), std::sqrt(m.variance),
+                              stddev(), m.skewness, skew(), m.kurtosis,
+                              kurtosis(), z, jb));
+  }
+  return pass;
+}
+
+template <typename D>
+double GaussianDistributionTests::SingleChiSquaredTest() {
+  const size_t kSamples = 10000;
+  const int kBuckets = 50;
+
+  // The InverseCDF is the percent point function of the
+  // distribution, and can be used to assign buckets
+  // roughly uniformly.
+  std::vector<double> cutoffs;
+  const double kInc = 1.0 / static_cast<double>(kBuckets);
+  for (double p = kInc; p < 1.0; p += kInc) {
+    cutoffs.push_back(InverseCDF(p));
+  }
+  if (cutoffs.back() != std::numeric_limits<double>::infinity()) {
+    cutoffs.push_back(std::numeric_limits<double>::infinity());
+  }
+
+  D dis(mean(), stddev());
+
+  std::vector<int32_t> counts(cutoffs.size(), 0);
+  for (int j = 0; j < kSamples; j++) {
+    const double x = dis(rng_);
+    auto it = std::upper_bound(cutoffs.begin(), cutoffs.end(), x);
+    counts[std::distance(cutoffs.begin(), it)]++;
+  }
+
+  // Null-hypothesis is that the distribution is a gaussian distribution
+  // with the provided mean and stddev (not estimated from the data).
+  const int dof = static_cast<int>(counts.size()) - 1;
+
+  // Our threshold for logging is 1-in-50.
+  const double threshold = absl::random_internal::ChiSquareValue(dof, 0.98);
+
+  const double expected =
+      static_cast<double>(kSamples) / static_cast<double>(counts.size());
+
+  double chi_square = absl::random_internal::ChiSquareWithExpected(
+      std::begin(counts), std::end(counts), expected);
+  double p = absl::random_internal::ChiSquarePValue(chi_square, dof);
+
+  // Log if the chi_square value is above the threshold.
+  if (chi_square > threshold) {
+    for (int i = 0; i < cutoffs.size(); i++) {
+      ABSL_INTERNAL_LOG(
+          INFO, absl::StrFormat("%d : (%f) = %d", i, cutoffs[i], counts[i]));
+    }
+
+    ABSL_INTERNAL_LOG(
+        INFO, absl::StrCat("mean=", mean(), " stddev=", stddev(), "\n",   //
+                           " expected ", expected, "\n",                  //
+                           kChiSquared, " ", chi_square, " (", p, ")\n",  //
+                           kChiSquared, " @ 0.98 = ", threshold));
+  }
+  return p;
+}
+
+TEST_P(GaussianDistributionTests, ZTest) {
+  // TODO(absl-team): Run these tests against std::normal_distribution<double>
+  // to validate outcomes are similar.
+  const size_t kSamples = 10000;
+  const auto& param = GetParam();
+  const int expected_failures =
+      std::max(1, static_cast<int>(std::ceil(param.trials * param.p_fail)));
+  const double p = absl::random_internal::RequiredSuccessProbability(
+      param.p_fail, param.trials);
+
+  int failures = 0;
+  for (int i = 0; i < param.trials; i++) {
+    failures +=
+        SingleZTest<absl::gaussian_distribution<double>>(p, kSamples) ? 0 : 1;
+  }
+  EXPECT_LE(failures, expected_failures);
+}
+
+TEST_P(GaussianDistributionTests, ChiSquaredTest) {
+  const int kTrials = 20;
+  int failures = 0;
+
+  for (int i = 0; i < kTrials; i++) {
+    double p_value =
+        SingleChiSquaredTest<absl::gaussian_distribution<double>>();
+    if (p_value < 0.0025) {  // 1/400
+      failures++;
+    }
+  }
+  // There is a 0.05% chance of producing at least one failure, so raise the
+  // failure threshold high enough to allow for a flake rate of less than one in
+  // 10,000.
+  EXPECT_LE(failures, 4);
+}
+
+std::vector<Param> GenParams() {
+  return {
+      // Mean around 0.
+      Param{0.0, 1.0, 0.01, 100},
+      Param{0.0, 1e2, 0.01, 100},
+      Param{0.0, 1e4, 0.01, 100},
+      Param{0.0, 1e8, 0.01, 100},
+      Param{0.0, 1e16, 0.01, 100},
+      Param{0.0, 1e-3, 0.01, 100},
+      Param{0.0, 1e-5, 0.01, 100},
+      Param{0.0, 1e-9, 0.01, 100},
+      Param{0.0, 1e-17, 0.01, 100},
+
+      // Mean around 1.
+      Param{1.0, 1.0, 0.01, 100},
+      Param{1.0, 1e2, 0.01, 100},
+      Param{1.0, 1e-2, 0.01, 100},
+
+      // Mean around 100 / -100
+      Param{1e2, 1.0, 0.01, 100},
+      Param{-1e2, 1.0, 0.01, 100},
+      Param{1e2, 1e6, 0.01, 100},
+      Param{-1e2, 1e6, 0.01, 100},
+
+      // More extreme
+      Param{1e4, 1e4, 0.01, 100},
+      Param{1e8, 1e4, 0.01, 100},
+      Param{1e12, 1e4, 0.01, 100},
+  };
+}
+
+std::string ParamName(const ::testing::TestParamInfo<Param>& info) {
+  const auto& p = info.param;
+  std::string name = absl::StrCat("mean_", absl::SixDigits(p.mean), "__stddev_",
+                                  absl::SixDigits(p.stddev));
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_SUITE_P(, GaussianDistributionTests,
+                         ::testing::ValuesIn(GenParams()), ParamName);
+
+// NOTE: absl::gaussian_distribution is not guaranteed to be stable.
+TEST(GaussianDistributionTest, StabilityTest) {
+  // absl::gaussian_distribution stability relies on the underlying zignor
+  // data, absl::random_interna::RandU64ToDouble, std::exp, std::log, and
+  // std::abs.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(11);
+
+  {
+    absl::gaussian_distribution<double> dist;
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return static_cast<int>(10000000.0 * dist(urbg)); });
+
+    EXPECT_EQ(13, urbg.invocations());
+    EXPECT_THAT(output,  //
+                testing::ElementsAre(1494, 25518841, 9991550, 1351856,
+                                     -20373238, 3456682, 333530, -6804981,
+                                     -15279580, -16459654, 1494));
+  }
+
+  urbg.reset();
+  {
+    absl::gaussian_distribution<float> dist;
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return static_cast<int>(1000000.0f * dist(urbg)); });
+
+    EXPECT_EQ(13, urbg.invocations());
+    EXPECT_THAT(
+        output,  //
+        testing::ElementsAre(149, 2551884, 999155, 135185, -2037323, 345668,
+                             33353, -680498, -1527958, -1645965, 149));
+  }
+}
+
+// This is an implementation-specific test. If any part of the implementation
+// changes, then it is likely that this test will change as well.
+// Also, if dependencies of the distribution change, such as RandU64ToDouble,
+// then this is also likely to change.
+TEST(GaussianDistributionTest, AlgorithmBounds) {
+  absl::gaussian_distribution<double> dist;
+
+  // In ~95% of cases, a single value is used to generate the output.
+  // for all inputs where |x| < 0.750461021389 this should be the case.
+  //
+  // The exact constraints are based on the ziggurat tables, and any
+  // changes to the ziggurat tables may require adjusting these bounds.
+  //
+  // for i in range(0, len(X)-1):
+  //   print i, X[i+1]/X[i], (X[i+1]/X[i] > 0.984375)
+  //
+  // 0.125 <= |values| <= 0.75
+  const uint64_t kValues[] = {
+      0x1000000000000100ull, 0x2000000000000100ull, 0x3000000000000100ull,
+      0x4000000000000100ull, 0x5000000000000100ull, 0x6000000000000100ull,
+      // negative values
+      0x9000000000000100ull, 0xa000000000000100ull, 0xb000000000000100ull,
+      0xc000000000000100ull, 0xd000000000000100ull, 0xe000000000000100ull};
+
+  // 0.875 <= |values| <= 0.984375
+  const uint64_t kExtraValues[] = {
+      0x7000000000000100ull, 0x7800000000000100ull,  //
+      0x7c00000000000100ull, 0x7e00000000000100ull,  //
+      // negative values
+      0xf000000000000100ull, 0xf800000000000100ull,  //
+      0xfc00000000000100ull, 0xfe00000000000100ull};
+
+  auto make_box = [](uint64_t v, uint64_t box) {
+    return (v & 0xffffffffffffff80ull) | box;
+  };
+
+  // The box is the lower 7 bits of the value. When the box == 0, then
+  // the algorithm uses an escape hatch to select the result for large
+  // outputs.
+  for (uint64_t box = 0; box < 0x7f; box++) {
+    for (const uint64_t v : kValues) {
+      // Extra values are added to the sequence to attempt to avoid
+      // infinite loops from rejection sampling on bugs/errors.
+      absl::random_internal::sequence_urbg urbg(
+          {make_box(v, box), 0x0003eb76f6f7f755ull, 0x5FCEA50FDB2F953Bull});
+
+      auto a = dist(urbg);
+      EXPECT_EQ(1, urbg.invocations()) << box << " " << std::hex << v;
+      if (v & 0x8000000000000000ull) {
+        EXPECT_LT(a, 0.0) << box << " " << std::hex << v;
+      } else {
+        EXPECT_GT(a, 0.0) << box << " " << std::hex << v;
+      }
+    }
+    if (box > 10 && box < 100) {
+      // The center boxes use the fast algorithm for more
+      // than 98.4375% of values.
+      for (const uint64_t v : kExtraValues) {
+        absl::random_internal::sequence_urbg urbg(
+            {make_box(v, box), 0x0003eb76f6f7f755ull, 0x5FCEA50FDB2F953Bull});
+
+        auto a = dist(urbg);
+        EXPECT_EQ(1, urbg.invocations()) << box << " " << std::hex << v;
+        if (v & 0x8000000000000000ull) {
+          EXPECT_LT(a, 0.0) << box << " " << std::hex << v;
+        } else {
+          EXPECT_GT(a, 0.0) << box << " " << std::hex << v;
+        }
+      }
+    }
+  }
+
+  // When the box == 0, the fallback algorithm uses a ratio of uniforms,
+  // which consumes 2 additional values from the urbg.
+  // Fallback also requires that the initial value be > 0.9271586026096681.
+  auto make_fallback = [](uint64_t v) { return (v & 0xffffffffffffff80ull); };
+
+  double tail[2];
+  {
+    // 0.9375
+    absl::random_internal::sequence_urbg urbg(
+        {make_fallback(0x7800000000000000ull), 0x13CCA830EB61BD96ull,
+         0x00000076f6f7f755ull});
+    tail[0] = dist(urbg);
+    EXPECT_EQ(3, urbg.invocations());
+    EXPECT_GT(tail[0], 0);
+  }
+  {
+    // -0.9375
+    absl::random_internal::sequence_urbg urbg(
+        {make_fallback(0xf800000000000000ull), 0x13CCA830EB61BD96ull,
+         0x00000076f6f7f755ull});
+    tail[1] = dist(urbg);
+    EXPECT_EQ(3, urbg.invocations());
+    EXPECT_LT(tail[1], 0);
+  }
+  EXPECT_EQ(tail[0], -tail[1]);
+  EXPECT_EQ(418610, static_cast<int64_t>(tail[0] * 100000.0));
+
+  // When the box != 0, the fallback algorithm computes a wedge function.
+  // Depending on the box, the threshold for varies as high as
+  // 0.991522480228.
+  {
+    // 0.9921875, 0.875
+    absl::random_internal::sequence_urbg urbg(
+        {make_box(0x7f00000000000000ull, 120), 0xe000000000000001ull,
+         0x13CCA830EB61BD96ull});
+    tail[0] = dist(urbg);
+    EXPECT_EQ(2, urbg.invocations());
+    EXPECT_GT(tail[0], 0);
+  }
+  {
+    // -0.9921875, 0.875
+    absl::random_internal::sequence_urbg urbg(
+        {make_box(0xff00000000000000ull, 120), 0xe000000000000001ull,
+         0x13CCA830EB61BD96ull});
+    tail[1] = dist(urbg);
+    EXPECT_EQ(2, urbg.invocations());
+    EXPECT_LT(tail[1], 0);
+  }
+  EXPECT_EQ(tail[0], -tail[1]);
+  EXPECT_EQ(61948, static_cast<int64_t>(tail[0] * 100000.0));
+
+  // Fallback rejected, try again.
+  {
+    // -0.9921875, 0.0625
+    absl::random_internal::sequence_urbg urbg(
+        {make_box(0xff00000000000000ull, 120), 0x1000000000000001,
+         make_box(0x1000000000000100ull, 50), 0x13CCA830EB61BD96ull});
+    dist(urbg);
+    EXPECT_EQ(3, urbg.invocations());
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/generators_test.cc b/third_party/abseil-cpp/absl/random/generators_test.cc
new file mode 100644
index 0000000..41725f13
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/generators_test.cc
@@ -0,0 +1,179 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+#include <random>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/random/distributions.h"
+#include "absl/random/random.h"
+
+namespace {
+
+template <typename URBG>
+void TestUniform(URBG* gen) {
+  // [a, b) default-semantics, inferred types.
+  absl::Uniform(*gen, 0, 100);     // int
+  absl::Uniform(*gen, 0, 1.0);     // Promoted to double
+  absl::Uniform(*gen, 0.0f, 1.0);  // Promoted to double
+  absl::Uniform(*gen, 0.0, 1.0);   // double
+  absl::Uniform(*gen, -1, 1L);     // Promoted to long
+
+  // Roll a die.
+  absl::Uniform(absl::IntervalClosedClosed, *gen, 1, 6);
+
+  // Get a fraction.
+  absl::Uniform(absl::IntervalOpenOpen, *gen, 0.0, 1.0);
+
+  // Assign a value to a random element.
+  std::vector<int> elems = {10, 20, 30, 40, 50};
+  elems[absl::Uniform(*gen, 0u, elems.size())] = 5;
+  elems[absl::Uniform<size_t>(*gen, 0, elems.size())] = 3;
+
+  // Choose some epsilon around zero.
+  absl::Uniform(absl::IntervalOpenOpen, *gen, -1.0, 1.0);
+
+  // (a, b) semantics, inferred types.
+  absl::Uniform(absl::IntervalOpenOpen, *gen, 0, 1.0);  // Promoted to double
+
+  // Explict overriding of types.
+  absl::Uniform<int>(*gen, 0, 100);
+  absl::Uniform<int8_t>(*gen, 0, 100);
+  absl::Uniform<int16_t>(*gen, 0, 100);
+  absl::Uniform<uint16_t>(*gen, 0, 100);
+  absl::Uniform<int32_t>(*gen, 0, 1 << 10);
+  absl::Uniform<uint32_t>(*gen, 0, 1 << 10);
+  absl::Uniform<int64_t>(*gen, 0, 1 << 10);
+  absl::Uniform<uint64_t>(*gen, 0, 1 << 10);
+
+  absl::Uniform<float>(*gen, 0.0, 1.0);
+  absl::Uniform<float>(*gen, 0, 1);
+  absl::Uniform<float>(*gen, -1, 1);
+  absl::Uniform<double>(*gen, 0.0, 1.0);
+
+  absl::Uniform<float>(*gen, -1.0, 0);
+  absl::Uniform<double>(*gen, -1.0, 0);
+
+  // Tagged
+  absl::Uniform<double>(absl::IntervalClosedClosed, *gen, 0, 1);
+  absl::Uniform<double>(absl::IntervalClosedOpen, *gen, 0, 1);
+  absl::Uniform<double>(absl::IntervalOpenOpen, *gen, 0, 1);
+  absl::Uniform<double>(absl::IntervalOpenClosed, *gen, 0, 1);
+  absl::Uniform<double>(absl::IntervalClosedClosed, *gen, 0, 1);
+  absl::Uniform<double>(absl::IntervalOpenOpen, *gen, 0, 1);
+
+  absl::Uniform<int>(absl::IntervalClosedClosed, *gen, 0, 100);
+  absl::Uniform<int>(absl::IntervalClosedOpen, *gen, 0, 100);
+  absl::Uniform<int>(absl::IntervalOpenOpen, *gen, 0, 100);
+  absl::Uniform<int>(absl::IntervalOpenClosed, *gen, 0, 100);
+  absl::Uniform<int>(absl::IntervalClosedClosed, *gen, 0, 100);
+  absl::Uniform<int>(absl::IntervalOpenOpen, *gen, 0, 100);
+
+  // With *generator as an R-value reference.
+  absl::Uniform<int>(URBG(), 0, 100);
+  absl::Uniform<double>(URBG(), 0.0, 1.0);
+}
+
+template <typename URBG>
+void TestExponential(URBG* gen) {
+  absl::Exponential<float>(*gen);
+  absl::Exponential<double>(*gen);
+  absl::Exponential<double>(URBG());
+}
+
+template <typename URBG>
+void TestPoisson(URBG* gen) {
+  // [rand.dist.pois] Indicates that the std::poisson_distribution
+  // is parameterized by IntType, however MSVC does not allow 8-bit
+  // types.
+  absl::Poisson<int>(*gen);
+  absl::Poisson<int16_t>(*gen);
+  absl::Poisson<uint16_t>(*gen);
+  absl::Poisson<int32_t>(*gen);
+  absl::Poisson<uint32_t>(*gen);
+  absl::Poisson<int64_t>(*gen);
+  absl::Poisson<uint64_t>(*gen);
+  absl::Poisson<uint64_t>(URBG());
+}
+
+template <typename URBG>
+void TestBernoulli(URBG* gen) {
+  absl::Bernoulli(*gen, 0.5);
+  absl::Bernoulli(*gen, 0.5);
+}
+
+template <typename URBG>
+void TestZipf(URBG* gen) {
+  absl::Zipf<int>(*gen, 100);
+  absl::Zipf<int8_t>(*gen, 100);
+  absl::Zipf<int16_t>(*gen, 100);
+  absl::Zipf<uint16_t>(*gen, 100);
+  absl::Zipf<int32_t>(*gen, 1 << 10);
+  absl::Zipf<uint32_t>(*gen, 1 << 10);
+  absl::Zipf<int64_t>(*gen, 1 << 10);
+  absl::Zipf<uint64_t>(*gen, 1 << 10);
+  absl::Zipf<uint64_t>(URBG(), 1 << 10);
+}
+
+template <typename URBG>
+void TestGaussian(URBG* gen) {
+  absl::Gaussian<float>(*gen, 1.0, 1.0);
+  absl::Gaussian<double>(*gen, 1.0, 1.0);
+  absl::Gaussian<double>(URBG(), 1.0, 1.0);
+}
+
+template <typename URBG>
+void TestLogNormal(URBG* gen) {
+  absl::LogUniform<int>(*gen, 0, 100);
+  absl::LogUniform<int8_t>(*gen, 0, 100);
+  absl::LogUniform<int16_t>(*gen, 0, 100);
+  absl::LogUniform<uint16_t>(*gen, 0, 100);
+  absl::LogUniform<int32_t>(*gen, 0, 1 << 10);
+  absl::LogUniform<uint32_t>(*gen, 0, 1 << 10);
+  absl::LogUniform<int64_t>(*gen, 0, 1 << 10);
+  absl::LogUniform<uint64_t>(*gen, 0, 1 << 10);
+  absl::LogUniform<uint64_t>(URBG(), 0, 1 << 10);
+}
+
+template <typename URBG>
+void CompatibilityTest() {
+  URBG gen;
+
+  TestUniform(&gen);
+  TestExponential(&gen);
+  TestPoisson(&gen);
+  TestBernoulli(&gen);
+  TestZipf(&gen);
+  TestGaussian(&gen);
+  TestLogNormal(&gen);
+}
+
+TEST(std_mt19937_64, Compatibility) {
+  // Validate with std::mt19937_64
+  CompatibilityTest<std::mt19937_64>();
+}
+
+TEST(BitGen, Compatibility) {
+  // Validate with absl::BitGen
+  CompatibilityTest<absl::BitGen>();
+}
+
+TEST(InsecureBitGen, Compatibility) {
+  // Validate with absl::InsecureBitGen
+  CompatibilityTest<absl::InsecureBitGen>();
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.bazel b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
new file mode 100644
index 0000000..50360ac
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
@@ -0,0 +1,656 @@
+# Internal-only implementation classes for Abseil Random
+load(
+    "//absl:copts/configure_copts.bzl",
+    "ABSL_DEFAULT_COPTS",
+    "ABSL_DEFAULT_LINKOPTS",
+    "ABSL_RANDOM_RANDEN_COPTS",
+    "ABSL_TEST_COPTS",
+    "absl_random_randen_copts_init",
+)
+
+package(default_visibility = ["//absl/random:__pkg__"])
+
+licenses(["notice"])  # Apache 2.0
+
+cc_library(
+    name = "traits",
+    hdrs = ["traits.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = [
+        "//absl/random:__pkg__",
+    ],
+    deps = ["//absl/base:config"],
+)
+
+cc_library(
+    name = "distribution_caller",
+    hdrs = ["distribution_caller.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = [
+        "//absl/random:__pkg__",
+    ],
+)
+
+cc_library(
+    name = "distributions",
+    hdrs = [
+        "distributions.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distribution_caller",
+        ":fast_uniform_bits",
+        ":fastmath",
+        ":traits",
+        ":uniform_helper",
+        "//absl/meta:type_traits",
+        "//absl/strings",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "fast_uniform_bits",
+    hdrs = [
+        "fast_uniform_bits.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = [
+        "//absl/random:__pkg__",
+    ],
+)
+
+cc_library(
+    name = "seed_material",
+    srcs = [
+        "seed_material.cc",
+    ],
+    hdrs = [
+        "seed_material.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":fast_uniform_bits",
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/strings",
+        "//absl/types:optional",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "pool_urbg",
+    srcs = [
+        "pool_urbg.cc",
+    ],
+    hdrs = [
+        "pool_urbg.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = select({
+        "//absl:windows": [],
+        "//conditions:default": ["-pthread"],
+    }) + ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":randen",
+        ":seed_material",
+        ":traits",
+        "//absl/base",
+        "//absl/base:config",
+        "//absl/base:core_headers",
+        "//absl/base:endian",
+        "//absl/random:seed_gen_exception",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "explicit_seed_seq",
+    testonly = 1,
+    hdrs = [
+        "explicit_seed_seq.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+)
+
+cc_library(
+    name = "sequence_urbg",
+    testonly = 1,
+    hdrs = [
+        "sequence_urbg.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+)
+
+cc_library(
+    name = "salted_seed_seq",
+    hdrs = [
+        "salted_seed_seq.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":seed_material",
+        "//absl/container:inlined_vector",
+        "//absl/meta:type_traits",
+        "//absl/types:optional",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "iostream_state_saver",
+    hdrs = ["iostream_state_saver.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/meta:type_traits",
+        "//absl/numeric:int128",
+    ],
+)
+
+cc_library(
+    name = "distribution_impl",
+    hdrs = [
+        "distribution_impl.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":fastmath",
+        ":traits",
+        "//absl/base:bits",
+        "//absl/base:config",
+        "//absl/numeric:int128",
+    ],
+)
+
+cc_library(
+    name = "fastmath",
+    hdrs = [
+        "fastmath.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = ["//absl/base:bits"],
+)
+
+cc_library(
+    name = "nonsecure_base",
+    hdrs = ["nonsecure_base.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":pool_urbg",
+        ":salted_seed_seq",
+        ":seed_material",
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/strings",
+        "//absl/types:optional",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "pcg_engine",
+    hdrs = ["pcg_engine.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":fastmath",
+        ":iostream_state_saver",
+        "//absl/base:config",
+        "//absl/meta:type_traits",
+        "//absl/numeric:int128",
+    ],
+)
+
+cc_library(
+    name = "randen_engine",
+    hdrs = ["randen_engine.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":iostream_state_saver",
+        ":randen",
+        "//absl/meta:type_traits",
+    ],
+)
+
+cc_library(
+    name = "platform",
+    hdrs = [
+        "randen_traits.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    textual_hdrs = [
+        "randen-keys.inc",
+        "platform.h",
+    ],
+)
+
+cc_library(
+    name = "randen",
+    srcs = [
+        "randen.cc",
+    ],
+    hdrs = [
+        "randen.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":platform",
+        ":randen_hwaes",
+        ":randen_slow",
+        "//absl/base",
+    ],
+)
+
+cc_library(
+    name = "randen_slow",
+    srcs = ["randen_slow.cc"],
+    hdrs = ["randen_slow.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":platform",
+    ],
+)
+
+absl_random_randen_copts_init()
+
+cc_library(
+    name = "randen_hwaes",
+    srcs = [
+        "randen_detect.cc",
+    ],
+    hdrs = [
+        "randen_detect.h",
+        "randen_hwaes.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":platform",
+        ":randen_hwaes_impl",
+    ],
+)
+
+# build with --save_temps to see assembly language output.
+cc_library(
+    name = "randen_hwaes_impl",
+    srcs = [
+        "randen_hwaes.cc",
+        "randen_hwaes.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS + ABSL_RANDOM_RANDEN_COPTS + select({
+        "//absl:windows": [],
+        "//conditions:default": ["-Wno-pass-failed"],
+    }),
+    # copts in RANDEN_HWAES_COPTS can make this target unusable as a module
+    # leading to a Clang diagnostic. Furthermore, it only has a private header
+    # anyway and thus there wouldn't be any gain from using it as a module.
+    features = ["-header_modules"],
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [":platform"],
+)
+
+cc_binary(
+    name = "gaussian_distribution_gentables",
+    srcs = [
+        "gaussian_distribution_gentables.cc",
+    ],
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/base:core_headers",
+        "//absl/random:distributions",
+    ],
+)
+
+cc_library(
+    name = "distribution_test_util",
+    testonly = 1,
+    srcs = [
+        "chi_square.cc",
+        "distribution_test_util.cc",
+    ],
+    hdrs = [
+        "chi_square.h",
+        "distribution_test_util.h",
+    ],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/base",
+        "//absl/base:core_headers",
+        "//absl/strings",
+        "//absl/strings:str_format",
+        "//absl/types:span",
+    ],
+)
+
+# Common tags for tests, etc.
+ABSL_RANDOM_NONPORTABLE_TAGS = [
+    "no_test_android_arm",
+    "no_test_android_arm64",
+    "no_test_android_x86",
+    "no_test_darwin_x86_64",
+    "no_test_ios_x86_64",
+    "no_test_loonix",
+    "no_test_msvc_x64",
+    "no_test_wasm",
+]
+
+cc_test(
+    name = "traits_test",
+    size = "small",
+    srcs = ["traits_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":traits",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "distribution_impl_test",
+    size = "small",
+    srcs = ["distribution_impl_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distribution_impl",
+        "//absl/base:bits",
+        "//absl/flags:flag",
+        "//absl/numeric:int128",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "distribution_test_util_test",
+    size = "small",
+    srcs = ["distribution_test_util_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distribution_test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "fastmath_test",
+    size = "small",
+    srcs = ["fastmath_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":fastmath",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "explicit_seed_seq_test",
+    size = "small",
+    srcs = ["explicit_seed_seq_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":explicit_seed_seq",
+        "//absl/random:seed_sequences",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "salted_seed_seq_test",
+    size = "small",
+    srcs = ["salted_seed_seq_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":salted_seed_seq",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "chi_square_test",
+    size = "small",
+    srcs = [
+        "chi_square_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":distribution_test_util",
+        "//absl/base:core_headers",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "fast_uniform_bits_test",
+    size = "small",
+    srcs = [
+        "fast_uniform_bits_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":fast_uniform_bits",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "nonsecure_base_test",
+    size = "small",
+    srcs = [
+        "nonsecure_base_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":nonsecure_base",
+        "//absl/random",
+        "//absl/random:distributions",
+        "//absl/random:seed_sequences",
+        "//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "seed_material_test",
+    size = "small",
+    srcs = ["seed_material_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":seed_material",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "pool_urbg_test",
+    size = "small",
+    srcs = [
+        "pool_urbg_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":pool_urbg",
+        "//absl/meta:type_traits",
+        "//absl/types:span",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "pcg_engine_test",
+    size = "medium",  # Trying to measure accuracy.
+    srcs = ["pcg_engine_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    flaky = 1,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":explicit_seed_seq",
+        ":pcg_engine",
+        "//absl/time",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "randen_engine_test",
+    size = "small",
+    srcs = [
+        "randen_engine_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":explicit_seed_seq",
+        ":randen_engine",
+        "//absl/base",
+        "//absl/strings",
+        "//absl/time",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "randen_test",
+    size = "small",
+    srcs = ["randen_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":randen",
+        "//absl/meta:type_traits",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "randen_slow_test",
+    size = "small",
+    srcs = ["randen_slow_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":randen_slow",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "randen_hwaes_test",
+    size = "small",
+    srcs = ["randen_hwaes_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ABSL_RANDOM_NONPORTABLE_TAGS,
+    deps = [
+        ":platform",
+        ":randen_hwaes",
+        ":randen_hwaes_impl",  # build_cleaner: keep
+        "//absl/base",
+        "//absl/strings:str_format",
+        "@com_google_googletest//:gtest",
+    ],
+)
+
+cc_library(
+    name = "nanobenchmark",
+    srcs = ["nanobenchmark.cc"],
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    textual_hdrs = ["nanobenchmark.h"],
+    deps = [
+        ":platform",
+        ":randen_engine",
+        "//absl/base",
+    ],
+)
+
+cc_library(
+    name = "uniform_helper",
+    hdrs = ["uniform_helper.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/random/internal:distribution_impl",
+        "//absl/random/internal:fast_uniform_bits",
+        "//absl/random/internal:iostream_state_saver",
+        "//absl/random/internal:traits",
+    ],
+)
+
+cc_test(
+    name = "nanobenchmark_test",
+    size = "small",
+    srcs = ["nanobenchmark_test.cc"],
+    flaky = 1,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = [
+        "benchmark",
+        "no_test_ios_x86_64",
+        "no_test_loonix",  # Crashing.
+    ],
+    deps = [
+        ":nanobenchmark",
+        "//absl/base",
+        "//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "randen_benchmarks",
+    size = "medium",
+    srcs = ["randen_benchmarks.cc"],
+    copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS,
+    flaky = 1,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ABSL_RANDOM_NONPORTABLE_TAGS + ["benchmark"],
+    deps = [
+        ":nanobenchmark",
+        ":platform",
+        ":randen",
+        ":randen_engine",
+        ":randen_hwaes",
+        ":randen_hwaes_impl",
+        ":randen_slow",
+        "//absl/base",
+        "//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "iostream_state_saver_test",
+    size = "small",
+    srcs = ["iostream_state_saver_test.cc"],
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":iostream_state_saver",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.gn b/third_party/abseil-cpp/absl/random/internal/BUILD.gn
new file mode 100644
index 0000000..ab88349
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/BUILD.gn
@@ -0,0 +1,459 @@
+# 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.
+
+import("//build_overrides/build.gni")
+
+# Usage of Abseil in Chromium is guarded by an explicit opt-in list, before
+# adding projects to this list please reach out to cxx@chromium.org and CC:
+# - https://cs.chromium.org/chromium/src/third_party/abseil-cpp/OWNERS
+#
+# More information can be found at:
+# https://docs.google.com/document/d/1DgS1-A3rzboTLjpf4m1sqkJgWjnY_Ru2dokk1X1vBDU
+if (build_with_chromium) {
+  visibility = [
+    "//libassistant/*",
+    "//third_party/webrtc/*",
+    "//third_party/abseil-cpp/*",
+    "//third_party/googletest:gtest",
+    "//third_party/openscreen/*",
+  ]
+} else {
+  visibility = [ "*" ]
+}
+
+source_set("traits") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "traits.h",
+  ]
+  visibility = []
+  visibility += [ "../../random/*" ]
+  deps = [
+    "../../base:config",
+  ]
+}
+
+source_set("distribution_caller") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "distribution_caller.h",
+  ]
+  visibility = []
+  visibility += [ "../../random/*" ]
+}
+
+source_set("distributions") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "distributions.h",
+  ]
+  deps = [
+    ":distribution_caller",
+    ":fast_uniform_bits",
+    ":fastmath",
+    ":traits",
+    ":uniform_helper",
+    "../../meta:type_traits",
+    "../../strings",
+    "../../types:span",
+  ]
+}
+
+source_set("fast_uniform_bits") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "fast_uniform_bits.h",
+  ]
+  visibility = []
+  visibility += [ "../../random/*" ]
+}
+
+source_set("seed_material") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "seed_material.h",
+  ]
+  sources = [
+    "seed_material.cc",
+  ]
+  deps = [
+    ":fast_uniform_bits",
+    "../../base",
+    "../../base:core_headers",
+    "../../strings",
+    "../../types:optional",
+    "../../types:span",
+  ]
+}
+
+source_set("pool_urbg") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "pool_urbg.h",
+  ]
+  sources = [
+    "pool_urbg.cc",
+  ]
+  deps = [
+    ":randen",
+    ":seed_material",
+    ":traits",
+    "../../base",
+    "../../base:config",
+    "../../base:core_headers",
+    "../../base:endian",
+    "../../random:seed_gen_exception",
+    "../../types:span",
+  ]
+}
+
+source_set("explicit_seed_seq") {
+  testonly = true
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "explicit_seed_seq.h",
+  ]
+}
+
+source_set("sequence_urbg") {
+  testonly = true
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "sequence_urbg.h",
+  ]
+}
+
+source_set("salted_seed_seq") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "salted_seed_seq.h",
+  ]
+  deps = [
+    ":seed_material",
+    "../../container:inlined_vector",
+    "../../meta:type_traits",
+    "../../types:optional",
+    "../../types:span",
+  ]
+}
+
+source_set("iostream_state_saver") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "iostream_state_saver.h",
+  ]
+  deps = [
+    "../../meta:type_traits",
+    "../../numeric:int128",
+  ]
+}
+
+source_set("distribution_impl") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "distribution_impl.h",
+  ]
+  deps = [
+    ":fastmath",
+    ":traits",
+    "../../base:bits",
+    "../../base:config",
+    "../../numeric:int128",
+  ]
+}
+
+source_set("fastmath") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "fastmath.h",
+  ]
+  deps = [
+    "../../base:bits",
+  ]
+}
+
+source_set("nonsecure_base") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "nonsecure_base.h",
+  ]
+  deps = [
+    ":pool_urbg",
+    ":salted_seed_seq",
+    ":seed_material",
+    "../../base:core_headers",
+    "../../meta:type_traits",
+    "../../strings",
+    "../../types:optional",
+    "../../types:span",
+  ]
+}
+
+source_set("pcg_engine") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "pcg_engine.h",
+  ]
+  deps = [
+    ":fastmath",
+    ":iostream_state_saver",
+    "../../base:config",
+    "../../meta:type_traits",
+    "../../numeric:int128",
+  ]
+}
+
+source_set("randen_engine") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "randen_engine.h",
+  ]
+  deps = [
+    ":iostream_state_saver",
+    ":randen",
+    "../../meta:type_traits",
+  ]
+}
+
+source_set("platform") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "platform.h",
+    "randen-keys.inc",
+    "randen_traits.h",
+  ]
+}
+
+source_set("randen") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "randen.h",
+  ]
+  sources = [
+    "randen.cc",
+  ]
+  deps = [
+    ":platform",
+    ":randen_hwaes",
+    ":randen_slow",
+    "../../base",
+  ]
+}
+
+source_set("randen_slow") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "randen_slow.h",
+  ]
+  sources = [
+    "randen_slow.cc",
+  ]
+  deps = [
+    ":platform",
+  ]
+}
+
+source_set("randen_hwaes") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "randen_detect.h",
+    "randen_hwaes.h",
+  ]
+  sources = [
+    "randen_detect.cc",
+  ]
+  deps = [
+    ":platform",
+    ":randen_hwaes_impl",
+  ]
+}
+
+source_set("randen_hwaes_impl") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  sources = [
+    "randen_hwaes.cc",
+    "randen_hwaes.h",
+  ]
+  deps = [
+    ":platform",
+  ]
+}
+
+executable("gaussian_distribution_gentables") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  sources = [
+    "gaussian_distribution_gentables.cc",
+  ]
+  deps = [
+    "../../base:core_headers",
+    "../../random:distributions",
+  ]
+}
+
+source_set("distribution_test_util") {
+  testonly = true
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "chi_square.h",
+    "distribution_test_util.h",
+  ]
+  sources = [
+    "chi_square.cc",
+    "distribution_test_util.cc",
+  ]
+  deps = [
+    "../../base",
+    "../../base:core_headers",
+    "../../strings",
+    "../../strings:str_format",
+    "../../types:span",
+  ]
+}
+
+source_set("nanobenchmark") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  sources = [
+    "nanobenchmark.cc",
+  ]
+  deps = [
+    ":platform",
+    ":randen_engine",
+    "../../base",
+  ]
+}
+
+source_set("uniform_helper") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "uniform_helper.h",
+  ]
+  deps = [
+    "../../base:core_headers",
+    "../../meta:type_traits",
+    "../../random/internal:distribution_impl",
+    "../../random/internal:fast_uniform_bits",
+    "../../random/internal:iostream_state_saver",
+    "../../random/internal:traits",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/chi_square.cc b/third_party/abseil-cpp/absl/random/internal/chi_square.cc
new file mode 100644
index 0000000..c0acc94
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/chi_square.cc
@@ -0,0 +1,230 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/chi_square.h"
+
+#include <cmath>
+
+#include "absl/random/internal/distribution_test_util.h"
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+#if defined(__EMSCRIPTEN__)
+// Workaround __EMSCRIPTEN__ error: llvm_fma_f64 not found.
+inline double fma(double x, double y, double z) {
+  return (x * y) + z;
+}
+#endif
+
+// Use Horner's method to evaluate a polynomial.
+template <typename T, unsigned N>
+inline T EvaluatePolynomial(T x, const T (&poly)[N]) {
+#if !defined(__EMSCRIPTEN__)
+  using std::fma;
+#endif
+  T p = poly[N - 1];
+  for (unsigned i = 2; i <= N; i++) {
+    p = fma(p, x, poly[N - i]);
+  }
+  return p;
+}
+
+static constexpr int kLargeDOF = 150;
+
+// Returns the probability of a normal z-value.
+//
+// Adapted from the POZ function in:
+//     Ibbetson D, Algorithm 209
+//     Collected Algorithms of the CACM 1963 p. 616
+//
+double POZ(double z) {
+  static constexpr double kP1[] = {
+      0.797884560593,  -0.531923007300, 0.319152932694,
+      -0.151968751364, 0.059054035642,  -0.019198292004,
+      0.005198775019,  -0.001075204047, 0.000124818987,
+  };
+  static constexpr double kP2[] = {
+      0.999936657524,  0.000535310849,  -0.002141268741, 0.005353579108,
+      -0.009279453341, 0.011630447319,  -0.010557625006, 0.006549791214,
+      -0.002034254874, -0.000794620820, 0.001390604284,  -0.000676904986,
+      -0.000019538132, 0.000152529290,  -0.000045255659,
+  };
+
+  const double kZMax = 6.0;  // Maximum meaningful z-value.
+  if (z == 0.0) {
+    return 0.5;
+  }
+  double x;
+  double y = 0.5 * std::fabs(z);
+  if (y >= (kZMax * 0.5)) {
+    x = 1.0;
+  } else if (y < 1.0) {
+    double w = y * y;
+    x = EvaluatePolynomial(w, kP1) * y * 2.0;
+  } else {
+    y -= 2.0;
+    x = EvaluatePolynomial(y, kP2);
+  }
+  return z > 0.0 ? ((x + 1.0) * 0.5) : ((1.0 - x) * 0.5);
+}
+
+// Approximates the survival function of the normal distribution.
+//
+// Algorithm 26.2.18, from:
+// [Abramowitz and Stegun, Handbook of Mathematical Functions,p.932]
+// http://people.math.sfu.ca/~cbm/aands/abramowitz_and_stegun.pdf
+//
+double normal_survival(double z) {
+  // Maybe replace with the alternate formulation.
+  // 0.5 * erfc((x - mean)/(sqrt(2) * sigma))
+  static constexpr double kR[] = {
+      1.0, 0.196854, 0.115194, 0.000344, 0.019527,
+  };
+  double r = EvaluatePolynomial(z, kR);
+  r *= r;
+  return 0.5 / (r * r);
+}
+
+}  // namespace
+
+// Calculates the critical chi-square value given degrees-of-freedom and a
+// p-value, usually using bisection. Also known by the name CRITCHI.
+double ChiSquareValue(int dof, double p) {
+  static constexpr double kChiEpsilon =
+      0.000001;  // Accuracy of the approximation.
+  static constexpr double kChiMax =
+      99999.0;  // Maximum chi-squared value.
+
+  const double p_value = 1.0 - p;
+  if (dof < 1 || p_value > 1.0) {
+    return 0.0;
+  }
+
+  if (dof > kLargeDOF) {
+    // For large degrees of freedom, use the normal approximation by
+    //     Wilson, E. B. and Hilferty, M. M. (1931)
+    //                     chi^2 - mean
+    //                Z = --------------
+    //                        stddev
+    const double z = InverseNormalSurvival(p_value);
+    const double mean = 1 - 2.0 / (9 * dof);
+    const double variance = 2.0 / (9 * dof);
+    // Cannot use this method if the variance is 0.
+    if (variance != 0) {
+      return std::pow(z * std::sqrt(variance) + mean, 3.0) * dof;
+    }
+  }
+
+  if (p_value <= 0.0) return kChiMax;
+
+  // Otherwise search for the p value by bisection
+  double min_chisq = 0.0;
+  double max_chisq = kChiMax;
+  double current = dof / std::sqrt(p_value);
+  while ((max_chisq - min_chisq) > kChiEpsilon) {
+    if (ChiSquarePValue(current, dof) < p_value) {
+      max_chisq = current;
+    } else {
+      min_chisq = current;
+    }
+    current = (max_chisq + min_chisq) * 0.5;
+  }
+  return current;
+}
+
+// Calculates the p-value (probability) of a given chi-square value
+// and degrees of freedom.
+//
+// Adapted from the POCHISQ function from:
+//     Hill, I. D. and Pike, M. C.  Algorithm 299
+//     Collected Algorithms of the CACM 1963 p. 243
+//
+double ChiSquarePValue(double chi_square, int dof) {
+  static constexpr double kLogSqrtPi =
+      0.5723649429247000870717135;  // Log[Sqrt[Pi]]
+  static constexpr double kInverseSqrtPi =
+      0.5641895835477562869480795;  // 1/(Sqrt[Pi])
+
+  // For large degrees of freedom, use the normal approximation by
+  //     Wilson, E. B. and Hilferty, M. M. (1931)
+  // Via Wikipedia:
+  //   By the Central Limit Theorem, because the chi-square distribution is the
+  //   sum of k independent random variables with finite mean and variance, it
+  //   converges to a normal distribution for large k.
+  if (dof > kLargeDOF) {
+    // Re-scale everything.
+    const double chi_square_scaled = std::pow(chi_square / dof, 1.0 / 3);
+    const double mean = 1 - 2.0 / (9 * dof);
+    const double variance = 2.0 / (9 * dof);
+    // If variance is 0, this method cannot be used.
+    if (variance != 0) {
+      const double z = (chi_square_scaled - mean) / std::sqrt(variance);
+      if (z > 0) {
+        return normal_survival(z);
+      } else if (z < 0) {
+        return 1.0 - normal_survival(-z);
+      } else {
+        return 0.5;
+      }
+    }
+  }
+
+  // The chi square function is >= 0 for any degrees of freedom.
+  // In other words, probability that the chi square function >= 0 is 1.
+  if (chi_square <= 0.0) return 1.0;
+
+  // If the degrees of freedom is zero, the chi square function is always 0 by
+  // definition. In other words, the probability that the chi square function
+  // is > 0 is zero (chi square values <= 0 have been filtered above).
+  if (dof < 1) return 0;
+
+  auto capped_exp = [](double x) { return x < -20 ? 0.0 : std::exp(x); };
+  static constexpr double kBigX = 20;
+
+  double a = 0.5 * chi_square;
+  const bool even = !(dof & 1);  // True if dof is an even number.
+  const double y = capped_exp(-a);
+  double s = even ? y : (2.0 * POZ(-std::sqrt(chi_square)));
+
+  if (dof <= 2) {
+    return s;
+  }
+
+  chi_square = 0.5 * (dof - 1.0);
+  double z = (even ? 1.0 : 0.5);
+  if (a > kBigX) {
+    double e = (even ? 0.0 : kLogSqrtPi);
+    double c = std::log(a);
+    while (z <= chi_square) {
+      e = std::log(z) + e;
+      s += capped_exp(c * z - a - e);
+      z += 1.0;
+    }
+    return s;
+  }
+
+  double e = (even ? 1.0 : (kInverseSqrtPi / std::sqrt(a)));
+  double c = 0.0;
+  while (z <= chi_square) {
+    e = e * (a / z);
+    c = c + e;
+    z += 1.0;
+  }
+  return c * y + s;
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/chi_square.h b/third_party/abseil-cpp/absl/random/internal/chi_square.h
new file mode 100644
index 0000000..fa8646f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/chi_square.h
@@ -0,0 +1,85 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
+#define ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
+
+// The chi-square statistic.
+//
+// Useful for evaluating if `D` independent random variables are behaving as
+// expected, or if two distributions are similar.  (`D` is the degrees of
+// freedom).
+//
+// Each bucket should have an expected count of 10 or more for the chi square to
+// be meaningful.
+
+#include <cassert>
+
+namespace absl {
+namespace random_internal {
+
+constexpr const char kChiSquared[] = "chi-squared";
+
+// Returns the measured chi square value, using a single expected value.  This
+// assumes that the values in [begin, end) are uniformly distributed.
+template <typename Iterator>
+double ChiSquareWithExpected(Iterator begin, Iterator end, double expected) {
+  // Compute the sum and the number of buckets.
+  assert(expected >= 10);  // require at least 10 samples per bucket.
+  double chi_square = 0;
+  for (auto it = begin; it != end; it++) {
+    double d = static_cast<double>(*it) - expected;
+    chi_square += d * d;
+  }
+  chi_square = chi_square / expected;
+  return chi_square;
+}
+
+// Returns the measured chi square value, taking the actual value of each bucket
+// from the first set of iterators, and the expected value of each bucket from
+// the second set of iterators.
+template <typename Iterator, typename Expected>
+double ChiSquare(Iterator it, Iterator end, Expected eit, Expected eend) {
+  double chi_square = 0;
+  for (; it != end && eit != eend; ++it, ++eit) {
+    if (*it > 0) {
+      assert(*eit > 0);
+    }
+    double e = static_cast<double>(*eit);
+    double d = static_cast<double>(*it - *eit);
+    if (d != 0) {
+      assert(e > 0);
+      chi_square += (d * d) / e;
+    }
+  }
+  assert(it == end && eit == eend);
+  return chi_square;
+}
+
+// ======================================================================
+// The following methods can be used for an arbitrary significance level.
+//
+
+// Calculates critical chi-square values to produce the given p-value using a
+// bisection search for a value within epsilon, relying on the monotonicity of
+// ChiSquarePValue().
+double ChiSquareValue(int dof, double p);
+
+// Calculates the p-value (probability) of a given chi-square value.
+double ChiSquarePValue(double chi_square, int dof);
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/chi_square_test.cc b/third_party/abseil-cpp/absl/random/internal/chi_square_test.cc
new file mode 100644
index 0000000..5025def
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/chi_square_test.cc
@@ -0,0 +1,365 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/chi_square.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <numeric>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/base/macros.h"
+
+using absl::random_internal::ChiSquare;
+using absl::random_internal::ChiSquarePValue;
+using absl::random_internal::ChiSquareValue;
+using absl::random_internal::ChiSquareWithExpected;
+
+namespace {
+
+TEST(ChiSquare, Value) {
+  struct {
+    int line;
+    double chi_square;
+    int df;
+    double confidence;
+  } const specs[] = {
+      // Testing lookup at 1% confidence
+      {__LINE__, 0, 0, 0.01},
+      {__LINE__, 0.00016, 1, 0.01},
+      {__LINE__, 1.64650, 8, 0.01},
+      {__LINE__, 5.81221, 16, 0.01},
+      {__LINE__, 156.4319, 200, 0.01},
+      {__LINE__, 1121.3784, 1234, 0.01},
+      {__LINE__, 53557.1629, 54321, 0.01},
+      {__LINE__, 651662.6647, 654321, 0.01},
+
+      // Testing lookup at 99% confidence
+      {__LINE__, 0, 0, 0.99},
+      {__LINE__, 6.635, 1, 0.99},
+      {__LINE__, 20.090, 8, 0.99},
+      {__LINE__, 32.000, 16, 0.99},
+      {__LINE__, 249.4456, 200, 0.99},
+      {__LINE__, 1131.1573, 1023, 0.99},
+      {__LINE__, 1352.5038, 1234, 0.99},
+      {__LINE__, 55090.7356, 54321, 0.99},
+      {__LINE__, 656985.1514, 654321, 0.99},
+
+      // Testing lookup at 99.9% confidence
+      {__LINE__, 16.2659, 3, 0.999},
+      {__LINE__, 22.4580, 6, 0.999},
+      {__LINE__, 267.5409, 200, 0.999},
+      {__LINE__, 1168.5033, 1023, 0.999},
+      {__LINE__, 55345.1741, 54321, 0.999},
+      {__LINE__, 657861.7284, 654321, 0.999},
+      {__LINE__, 51.1772, 24, 0.999},
+      {__LINE__, 59.7003, 30, 0.999},
+      {__LINE__, 37.6984, 15, 0.999},
+      {__LINE__, 29.5898, 10, 0.999},
+      {__LINE__, 27.8776, 9, 0.999},
+
+      // Testing lookup at random confidences
+      {__LINE__, 0.000157088, 1, 0.01},
+      {__LINE__, 5.31852, 2, 0.93},
+      {__LINE__, 1.92256, 4, 0.25},
+      {__LINE__, 10.7709, 13, 0.37},
+      {__LINE__, 26.2514, 17, 0.93},
+      {__LINE__, 36.4799, 29, 0.84},
+      {__LINE__, 25.818, 31, 0.27},
+      {__LINE__, 63.3346, 64, 0.50},
+      {__LINE__, 196.211, 128, 0.9999},
+      {__LINE__, 215.21, 243, 0.10},
+      {__LINE__, 285.393, 256, 0.90},
+      {__LINE__, 984.504, 1024, 0.1923},
+      {__LINE__, 2043.85, 2048, 0.4783},
+      {__LINE__, 48004.6, 48273, 0.194},
+  };
+  for (const auto& spec : specs) {
+    SCOPED_TRACE(spec.line);
+    // Verify all values are have at most a 1% relative error.
+    const double val = ChiSquareValue(spec.df, spec.confidence);
+    const double err = std::max(5e-6, spec.chi_square / 5e3);  // 1 part in 5000
+    EXPECT_NEAR(spec.chi_square, val, err) << spec.line;
+  }
+
+  // Relaxed test for extreme values, from
+  //  http://www.ciphersbyritter.com/JAVASCRP/NORMCHIK.HTM#ChiSquare
+  EXPECT_NEAR(49.2680, ChiSquareValue(100, 1e-6), 5);  // 0.000'005 mark
+  EXPECT_NEAR(123.499, ChiSquareValue(200, 1e-6), 5);  // 0.000'005 mark
+
+  EXPECT_NEAR(149.449, ChiSquareValue(100, 0.999), 0.01);
+  EXPECT_NEAR(161.318, ChiSquareValue(100, 0.9999), 0.01);
+  EXPECT_NEAR(172.098, ChiSquareValue(100, 0.99999), 0.01);
+
+  EXPECT_NEAR(381.426, ChiSquareValue(300, 0.999), 0.05);
+  EXPECT_NEAR(399.756, ChiSquareValue(300, 0.9999), 0.1);
+  EXPECT_NEAR(416.126, ChiSquareValue(300, 0.99999), 0.2);
+}
+
+TEST(ChiSquareTest, PValue) {
+  struct {
+    int line;
+    double pval;
+    double chi_square;
+    int df;
+  } static const specs[] = {
+      {__LINE__, 1, 0, 0},
+      {__LINE__, 0, 0.001, 0},
+      {__LINE__, 1.000, 0, 453},
+      {__LINE__, 0.134471, 7972.52, 7834},
+      {__LINE__, 0.203922, 28.32, 23},
+      {__LINE__, 0.737171, 48274, 48472},
+      {__LINE__, 0.444146, 583.1234, 579},
+      {__LINE__, 0.294814, 138.2, 130},
+      {__LINE__, 0.0816532, 12.63, 7},
+      {__LINE__, 0, 682.32, 67},
+      {__LINE__, 0.49405, 999, 999},
+      {__LINE__, 1.000, 0, 9999},
+      {__LINE__, 0.997477, 0.00001, 1},
+      {__LINE__, 0, 5823.21, 5040},
+  };
+  for (const auto& spec : specs) {
+    SCOPED_TRACE(spec.line);
+    const double pval = ChiSquarePValue(spec.chi_square, spec.df);
+    EXPECT_NEAR(spec.pval, pval, 1e-3);
+  }
+}
+
+TEST(ChiSquareTest, CalcChiSquare) {
+  struct {
+    int line;
+    std::vector<int> expected;
+    std::vector<int> actual;
+  } const specs[] = {
+      {__LINE__,
+       {56, 234, 76, 1, 546, 1, 87, 345, 1, 234},
+       {2, 132, 4, 43, 234, 8, 345, 8, 236, 56}},
+      {__LINE__,
+       {123, 36, 234, 367, 345, 2, 456, 567, 234, 567},
+       {123, 56, 2345, 8, 345, 8, 2345, 23, 48, 267}},
+      {__LINE__,
+       {123, 234, 345, 456, 567, 678, 789, 890, 98, 76},
+       {123, 234, 345, 456, 567, 678, 789, 890, 98, 76}},
+      {__LINE__, {3, 675, 23, 86, 2, 8, 2}, {456, 675, 23, 86, 23, 65, 2}},
+      {__LINE__, {1}, {23}},
+  };
+  for (const auto& spec : specs) {
+    SCOPED_TRACE(spec.line);
+    double chi_square = 0;
+    for (int i = 0; i < spec.expected.size(); ++i) {
+      const double diff = spec.actual[i] - spec.expected[i];
+      chi_square += (diff * diff) / spec.expected[i];
+    }
+    EXPECT_NEAR(chi_square,
+                ChiSquare(std::begin(spec.actual), std::end(spec.actual),
+                          std::begin(spec.expected), std::end(spec.expected)),
+                1e-5);
+  }
+}
+
+TEST(ChiSquareTest, CalcChiSquareInt64) {
+  const int64_t data[3] = {910293487, 910292491, 910216780};
+  // $ python -c "import scipy.stats
+  // > print scipy.stats.chisquare([910293487, 910292491, 910216780])[0]"
+  // 4.25410123524
+  double sum = std::accumulate(std::begin(data), std::end(data), double{0});
+  size_t n = std::distance(std::begin(data), std::end(data));
+  double a = ChiSquareWithExpected(std::begin(data), std::end(data), sum / n);
+  EXPECT_NEAR(4.254101, a, 1e-6);
+
+  // ... Or with known values.
+  double b =
+      ChiSquareWithExpected(std::begin(data), std::end(data), 910267586.0);
+  EXPECT_NEAR(4.254101, b, 1e-6);
+}
+
+TEST(ChiSquareTest, TableData) {
+  // Test data from
+  // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm
+  //    0.90      0.95     0.975      0.99     0.999
+  const double data[100][5] = {
+      /* 1*/ {2.706, 3.841, 5.024, 6.635, 10.828},
+      /* 2*/ {4.605, 5.991, 7.378, 9.210, 13.816},
+      /* 3*/ {6.251, 7.815, 9.348, 11.345, 16.266},
+      /* 4*/ {7.779, 9.488, 11.143, 13.277, 18.467},
+      /* 5*/ {9.236, 11.070, 12.833, 15.086, 20.515},
+      /* 6*/ {10.645, 12.592, 14.449, 16.812, 22.458},
+      /* 7*/ {12.017, 14.067, 16.013, 18.475, 24.322},
+      /* 8*/ {13.362, 15.507, 17.535, 20.090, 26.125},
+      /* 9*/ {14.684, 16.919, 19.023, 21.666, 27.877},
+      /*10*/ {15.987, 18.307, 20.483, 23.209, 29.588},
+      /*11*/ {17.275, 19.675, 21.920, 24.725, 31.264},
+      /*12*/ {18.549, 21.026, 23.337, 26.217, 32.910},
+      /*13*/ {19.812, 22.362, 24.736, 27.688, 34.528},
+      /*14*/ {21.064, 23.685, 26.119, 29.141, 36.123},
+      /*15*/ {22.307, 24.996, 27.488, 30.578, 37.697},
+      /*16*/ {23.542, 26.296, 28.845, 32.000, 39.252},
+      /*17*/ {24.769, 27.587, 30.191, 33.409, 40.790},
+      /*18*/ {25.989, 28.869, 31.526, 34.805, 42.312},
+      /*19*/ {27.204, 30.144, 32.852, 36.191, 43.820},
+      /*20*/ {28.412, 31.410, 34.170, 37.566, 45.315},
+      /*21*/ {29.615, 32.671, 35.479, 38.932, 46.797},
+      /*22*/ {30.813, 33.924, 36.781, 40.289, 48.268},
+      /*23*/ {32.007, 35.172, 38.076, 41.638, 49.728},
+      /*24*/ {33.196, 36.415, 39.364, 42.980, 51.179},
+      /*25*/ {34.382, 37.652, 40.646, 44.314, 52.620},
+      /*26*/ {35.563, 38.885, 41.923, 45.642, 54.052},
+      /*27*/ {36.741, 40.113, 43.195, 46.963, 55.476},
+      /*28*/ {37.916, 41.337, 44.461, 48.278, 56.892},
+      /*29*/ {39.087, 42.557, 45.722, 49.588, 58.301},
+      /*30*/ {40.256, 43.773, 46.979, 50.892, 59.703},
+      /*31*/ {41.422, 44.985, 48.232, 52.191, 61.098},
+      /*32*/ {42.585, 46.194, 49.480, 53.486, 62.487},
+      /*33*/ {43.745, 47.400, 50.725, 54.776, 63.870},
+      /*34*/ {44.903, 48.602, 51.966, 56.061, 65.247},
+      /*35*/ {46.059, 49.802, 53.203, 57.342, 66.619},
+      /*36*/ {47.212, 50.998, 54.437, 58.619, 67.985},
+      /*37*/ {48.363, 52.192, 55.668, 59.893, 69.347},
+      /*38*/ {49.513, 53.384, 56.896, 61.162, 70.703},
+      /*39*/ {50.660, 54.572, 58.120, 62.428, 72.055},
+      /*40*/ {51.805, 55.758, 59.342, 63.691, 73.402},
+      /*41*/ {52.949, 56.942, 60.561, 64.950, 74.745},
+      /*42*/ {54.090, 58.124, 61.777, 66.206, 76.084},
+      /*43*/ {55.230, 59.304, 62.990, 67.459, 77.419},
+      /*44*/ {56.369, 60.481, 64.201, 68.710, 78.750},
+      /*45*/ {57.505, 61.656, 65.410, 69.957, 80.077},
+      /*46*/ {58.641, 62.830, 66.617, 71.201, 81.400},
+      /*47*/ {59.774, 64.001, 67.821, 72.443, 82.720},
+      /*48*/ {60.907, 65.171, 69.023, 73.683, 84.037},
+      /*49*/ {62.038, 66.339, 70.222, 74.919, 85.351},
+      /*50*/ {63.167, 67.505, 71.420, 76.154, 86.661},
+      /*51*/ {64.295, 68.669, 72.616, 77.386, 87.968},
+      /*52*/ {65.422, 69.832, 73.810, 78.616, 89.272},
+      /*53*/ {66.548, 70.993, 75.002, 79.843, 90.573},
+      /*54*/ {67.673, 72.153, 76.192, 81.069, 91.872},
+      /*55*/ {68.796, 73.311, 77.380, 82.292, 93.168},
+      /*56*/ {69.919, 74.468, 78.567, 83.513, 94.461},
+      /*57*/ {71.040, 75.624, 79.752, 84.733, 95.751},
+      /*58*/ {72.160, 76.778, 80.936, 85.950, 97.039},
+      /*59*/ {73.279, 77.931, 82.117, 87.166, 98.324},
+      /*60*/ {74.397, 79.082, 83.298, 88.379, 99.607},
+      /*61*/ {75.514, 80.232, 84.476, 89.591, 100.888},
+      /*62*/ {76.630, 81.381, 85.654, 90.802, 102.166},
+      /*63*/ {77.745, 82.529, 86.830, 92.010, 103.442},
+      /*64*/ {78.860, 83.675, 88.004, 93.217, 104.716},
+      /*65*/ {79.973, 84.821, 89.177, 94.422, 105.988},
+      /*66*/ {81.085, 85.965, 90.349, 95.626, 107.258},
+      /*67*/ {82.197, 87.108, 91.519, 96.828, 108.526},
+      /*68*/ {83.308, 88.250, 92.689, 98.028, 109.791},
+      /*69*/ {84.418, 89.391, 93.856, 99.228, 111.055},
+      /*70*/ {85.527, 90.531, 95.023, 100.425, 112.317},
+      /*71*/ {86.635, 91.670, 96.189, 101.621, 113.577},
+      /*72*/ {87.743, 92.808, 97.353, 102.816, 114.835},
+      /*73*/ {88.850, 93.945, 98.516, 104.010, 116.092},
+      /*74*/ {89.956, 95.081, 99.678, 105.202, 117.346},
+      /*75*/ {91.061, 96.217, 100.839, 106.393, 118.599},
+      /*76*/ {92.166, 97.351, 101.999, 107.583, 119.850},
+      /*77*/ {93.270, 98.484, 103.158, 108.771, 121.100},
+      /*78*/ {94.374, 99.617, 104.316, 109.958, 122.348},
+      /*79*/ {95.476, 100.749, 105.473, 111.144, 123.594},
+      /*80*/ {96.578, 101.879, 106.629, 112.329, 124.839},
+      /*81*/ {97.680, 103.010, 107.783, 113.512, 126.083},
+      /*82*/ {98.780, 104.139, 108.937, 114.695, 127.324},
+      /*83*/ {99.880, 105.267, 110.090, 115.876, 128.565},
+      /*84*/ {100.980, 106.395, 111.242, 117.057, 129.804},
+      /*85*/ {102.079, 107.522, 112.393, 118.236, 131.041},
+      /*86*/ {103.177, 108.648, 113.544, 119.414, 132.277},
+      /*87*/ {104.275, 109.773, 114.693, 120.591, 133.512},
+      /*88*/ {105.372, 110.898, 115.841, 121.767, 134.746},
+      /*89*/ {106.469, 112.022, 116.989, 122.942, 135.978},
+      /*90*/ {107.565, 113.145, 118.136, 124.116, 137.208},
+      /*91*/ {108.661, 114.268, 119.282, 125.289, 138.438},
+      /*92*/ {109.756, 115.390, 120.427, 126.462, 139.666},
+      /*93*/ {110.850, 116.511, 121.571, 127.633, 140.893},
+      /*94*/ {111.944, 117.632, 122.715, 128.803, 142.119},
+      /*95*/ {113.038, 118.752, 123.858, 129.973, 143.344},
+      /*96*/ {114.131, 119.871, 125.000, 131.141, 144.567},
+      /*97*/ {115.223, 120.990, 126.141, 132.309, 145.789},
+      /*98*/ {116.315, 122.108, 127.282, 133.476, 147.010},
+      /*99*/ {117.407, 123.225, 128.422, 134.642, 148.230},
+      /*100*/ {118.498, 124.342, 129.561, 135.807, 149.449}
+      /**/};
+
+  //    0.90      0.95     0.975      0.99     0.999
+  for (int i = 0; i < ABSL_ARRAYSIZE(data); i++) {
+    const double E = 0.0001;
+    EXPECT_NEAR(ChiSquarePValue(data[i][0], i + 1), 0.10, E)
+        << i << " " << data[i][0];
+    EXPECT_NEAR(ChiSquarePValue(data[i][1], i + 1), 0.05, E)
+        << i << " " << data[i][1];
+    EXPECT_NEAR(ChiSquarePValue(data[i][2], i + 1), 0.025, E)
+        << i << " " << data[i][2];
+    EXPECT_NEAR(ChiSquarePValue(data[i][3], i + 1), 0.01, E)
+        << i << " " << data[i][3];
+    EXPECT_NEAR(ChiSquarePValue(data[i][4], i + 1), 0.001, E)
+        << i << " " << data[i][4];
+
+    const double F = 0.1;
+    EXPECT_NEAR(ChiSquareValue(i + 1, 0.90), data[i][0], F) << i;
+    EXPECT_NEAR(ChiSquareValue(i + 1, 0.95), data[i][1], F) << i;
+    EXPECT_NEAR(ChiSquareValue(i + 1, 0.975), data[i][2], F) << i;
+    EXPECT_NEAR(ChiSquareValue(i + 1, 0.99), data[i][3], F) << i;
+    EXPECT_NEAR(ChiSquareValue(i + 1, 0.999), data[i][4], F) << i;
+  }
+}
+
+TEST(ChiSquareTest, ChiSquareTwoIterator) {
+  // Test data from http://www.stat.yale.edu/Courses/1997-98/101/chigf.htm
+  // Null-hypothesis: This data is normally distributed.
+  const int counts[10] = {6, 6, 18, 33, 38, 38, 28, 21, 9, 3};
+  const double expected[10] = {4.6,  8.8,  18.4, 30.0, 38.2,
+                               38.2, 30.0, 18.4, 8.8,  4.6};
+  double chi_square = ChiSquare(std::begin(counts), std::end(counts),
+                                std::begin(expected), std::end(expected));
+  EXPECT_NEAR(chi_square, 2.69, 0.001);
+
+  // Degrees of freedom: 10 bins. two estimated parameters. = 10 - 2 - 1.
+  const int dof = 7;
+  // The critical value of 7, 95% => 14.067 (see above test)
+  double p_value_05 = ChiSquarePValue(14.067, dof);
+  EXPECT_NEAR(p_value_05, 0.05, 0.001);  // 95%-ile p-value
+
+  double p_actual = ChiSquarePValue(chi_square, dof);
+  EXPECT_GT(p_actual, 0.05);  // Accept the null hypothesis.
+}
+
+TEST(ChiSquareTest, DiceRolls) {
+  // Assume we are testing 102 fair dice rolls.
+  // Null-hypothesis: This data is fairly distributed.
+  //
+  // The dof value of 4, @95% = 9.488 (see above test)
+  // The dof value of 5, @95% = 11.070
+  const int rolls[6] = {22, 11, 17, 14, 20, 18};
+  double sum = std::accumulate(std::begin(rolls), std::end(rolls), double{0});
+  size_t n = std::distance(std::begin(rolls), std::end(rolls));
+
+  double a = ChiSquareWithExpected(std::begin(rolls), std::end(rolls), sum / n);
+  EXPECT_NEAR(a, 4.70588, 1e-5);
+  EXPECT_LT(a, ChiSquareValue(4, 0.95));
+
+  double p_a = ChiSquarePValue(a, 4);
+  EXPECT_NEAR(p_a, 0.318828, 1e-5);  // Accept the null hypothesis.
+
+  double b = ChiSquareWithExpected(std::begin(rolls), std::end(rolls), 17.0);
+  EXPECT_NEAR(b, 4.70588, 1e-5);
+  EXPECT_LT(b, ChiSquareValue(5, 0.95));
+
+  double p_b = ChiSquarePValue(b, 5);
+  EXPECT_NEAR(p_b, 0.4528180, 1e-5);  // Accept the null hypothesis.
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_caller.h b/third_party/abseil-cpp/absl/random/internal/distribution_caller.h
new file mode 100644
index 0000000..0318e1f8
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_caller.h
@@ -0,0 +1,56 @@
+//
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
+#define ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
+
+#include <utility>
+
+namespace absl {
+namespace random_internal {
+
+// DistributionCaller provides an opportunity to overload the general
+// mechanism for calling a distribution, allowing for mock-RNG classes
+// to intercept such calls.
+template <typename URBG>
+struct DistributionCaller {
+  // Call the provided distribution type. The parameters are expected
+  // to be explicitly specified.
+  // DistrT is the distribution type.
+  // FormatT is the formatter type:
+  //
+  // struct FormatT {
+  //   using result_type = distribution_t::result_type;
+  //   static std::string FormatCall(
+  //       const distribution_t& distr,
+  //       absl::Span<const result_type>);
+  //
+  //   static std::string FormatExpectation(
+  //       absl::string_view match_args,
+  //       absl::Span<const result_t> results);
+  // }
+  //
+  template <typename DistrT, typename FormatT, typename... Args>
+  static typename DistrT::result_type Call(URBG* urbg, Args&&... args) {
+    DistrT dist(std::forward<Args>(args)...);
+    return dist(*urbg);
+  }
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_impl.h b/third_party/abseil-cpp/absl/random/internal/distribution_impl.h
new file mode 100644
index 0000000..9b6ffb0
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_impl.h
@@ -0,0 +1,260 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_DISTRIBUTION_IMPL_H_
+#define ABSL_RANDOM_INTERNAL_DISTRIBUTION_IMPL_H_
+
+// This file contains some implementation details which are used by one or more
+// of the absl random number distributions.
+
+#include <cfloat>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+#include <limits>
+#include <type_traits>
+
+#if (defined(_WIN32) || defined(_WIN64)) && defined(_M_IA64)
+#include <intrin.h>  // NOLINT(build/include_order)
+#pragma intrinsic(_umul128)
+#define ABSL_INTERNAL_USE_UMUL128 1
+#endif
+
+#include "absl/base/config.h"
+#include "absl/base/internal/bits.h"
+#include "absl/numeric/int128.h"
+#include "absl/random/internal/fastmath.h"
+#include "absl/random/internal/traits.h"
+
+namespace absl {
+namespace random_internal {
+
+// Creates a double from `bits`, with the template fields controlling the
+// output.
+//
+// RandU64To is both more efficient and generates more unique values in the
+// result interval than known implementations of std::generate_canonical().
+//
+// The `Signed` parameter controls whether positive, negative, or both are
+// returned (thus affecting the output interval).
+//   When Signed == SignedValueT, range is U(-1, 1)
+//   When Signed == NegativeValueT, range is U(-1, 0)
+//   When Signed == PositiveValueT, range is U(0, 1)
+//
+// When the `IncludeZero` parameter is true, the function may return 0 for some
+// inputs, otherwise it never returns 0.
+//
+// The `ExponentBias` parameter determines the scale of the output range by
+// adjusting the exponent.
+//
+// When a value in U(0,1) is required, use:
+//   RandU64ToDouble<PositiveValueT, true, 0>();
+//
+// When a value in U(-1,1) is required, use:
+//   RandU64ToDouble<SignedValueT, false, 0>() => U(-1, 1)
+// This generates more distinct values than the mathematically equivalent
+// expression `U(0, 1) * 2.0 - 1.0`, and is preferable.
+//
+// Scaling the result by powers of 2 (and avoiding a multiply) is also possible:
+//   RandU64ToDouble<PositiveValueT, false, 1>();  => U(0, 2)
+//   RandU64ToDouble<PositiveValueT, false, -1>();  => U(0, 0.5)
+//
+
+// Tristate types controlling the output.
+struct PositiveValueT {};
+struct NegativeValueT {};
+struct SignedValueT {};
+
+// RandU64ToDouble is the double-result variant of RandU64To, described above.
+template <typename Signed, bool IncludeZero, int ExponentBias = 0>
+inline double RandU64ToDouble(uint64_t bits) {
+  static_assert(std::is_same<Signed, PositiveValueT>::value ||
+                    std::is_same<Signed, NegativeValueT>::value ||
+                    std::is_same<Signed, SignedValueT>::value,
+                "");
+
+  // Maybe use the left-most bit for a sign bit.
+  uint64_t sign = std::is_same<Signed, NegativeValueT>::value
+                      ? 0x8000000000000000ull
+                      : 0;  // Sign bits.
+
+  if (std::is_same<Signed, SignedValueT>::value) {
+    sign = bits & 0x8000000000000000ull;
+    bits = bits & 0x7FFFFFFFFFFFFFFFull;
+  }
+  if (IncludeZero) {
+    if (bits == 0u) return 0;
+  }
+
+  // Number of leading zeros is mapped to the exponent: 2^-clz
+  int clz = base_internal::CountLeadingZeros64(bits);
+  // Shift number left to erase leading zeros.
+  bits <<= IncludeZero ? clz : (clz & 63);
+
+  // Shift number right to remove bits that overflow double mantissa.  The
+  // direction of the shift depends on `clz`.
+  bits >>= (64 - DBL_MANT_DIG);
+
+  // Compute IEEE 754 double exponent.
+  // In the Signed case, bits is a 63-bit number with a 0 msb.  Adjust the
+  // exponent to account for that.
+  const uint64_t exp =
+      (std::is_same<Signed, SignedValueT>::value ? 1023U : 1022U) +
+      static_cast<uint64_t>(ExponentBias - clz);
+  constexpr int kExp = DBL_MANT_DIG - 1;
+  // Construct IEEE 754 double from exponent and mantissa.
+  const uint64_t val = sign | (exp << kExp) | (bits & ((1ULL << kExp) - 1U));
+
+  double res;
+  static_assert(sizeof(res) == sizeof(val), "double is not 64 bit");
+  // Memcpy value from "val" to "res" to avoid aliasing problems.  Assumes that
+  // endian-ness is same for double and uint64_t.
+  std::memcpy(&res, &val, sizeof(res));
+
+  return res;
+}
+
+// RandU64ToFloat is the float-result variant of RandU64To, described above.
+template <typename Signed, bool IncludeZero, int ExponentBias = 0>
+inline float RandU64ToFloat(uint64_t bits) {
+  static_assert(std::is_same<Signed, PositiveValueT>::value ||
+                    std::is_same<Signed, NegativeValueT>::value ||
+                    std::is_same<Signed, SignedValueT>::value,
+                "");
+
+  // Maybe use the left-most bit for a sign bit.
+  uint64_t sign = std::is_same<Signed, NegativeValueT>::value
+                      ? 0x80000000ul
+                      : 0;  // Sign bits.
+
+  if (std::is_same<Signed, SignedValueT>::value) {
+    uint64_t a = bits & 0x8000000000000000ull;
+    sign = static_cast<uint32_t>(a >> 32);
+    bits = bits & 0x7FFFFFFFFFFFFFFFull;
+  }
+  if (IncludeZero) {
+    if (bits == 0u) return 0;
+  }
+
+  // Number of leading zeros is mapped to the exponent: 2^-clz
+  int clz = base_internal::CountLeadingZeros64(bits);
+  // Shift number left to erase leading zeros.
+  bits <<= IncludeZero ? clz : (clz & 63);
+  // Shift number right to remove bits that overflow double mantissa.  The
+  // direction of the shift depends on `clz`.
+  bits >>= (64 - FLT_MANT_DIG);
+
+  // Construct IEEE 754 float exponent.
+  // In the Signed case, bits is a 63-bit number with a 0 msb.  Adjust the
+  // exponent to account for that.
+  const uint32_t exp =
+      (std::is_same<Signed, SignedValueT>::value ? 127U : 126U) +
+      static_cast<uint32_t>(ExponentBias - clz);
+  constexpr int kExp = FLT_MANT_DIG - 1;
+  const uint32_t val = sign | (exp << kExp) | (bits & ((1U << kExp) - 1U));
+
+  float res;
+  static_assert(sizeof(res) == sizeof(val), "float is not 32 bit");
+  // Assumes that endian-ness is same for float and uint32_t.
+  std::memcpy(&res, &val, sizeof(res));
+
+  return res;
+}
+
+template <typename Result>
+struct RandU64ToReal {
+  template <typename Signed, bool IncludeZero, int ExponentBias = 0>
+  static inline Result Value(uint64_t bits) {
+    return RandU64ToDouble<Signed, IncludeZero, ExponentBias>(bits);
+  }
+};
+
+template <>
+struct RandU64ToReal<float> {
+  template <typename Signed, bool IncludeZero, int ExponentBias = 0>
+  static inline float Value(uint64_t bits) {
+    return RandU64ToFloat<Signed, IncludeZero, ExponentBias>(bits);
+  }
+};
+
+inline uint128 MultiplyU64ToU128(uint64_t a, uint64_t b) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return uint128(static_cast<__uint128_t>(a) * b);
+#elif defined(ABSL_INTERNAL_USE_UMUL128)
+  // uint64_t * uint64_t => uint128 multiply using imul intrinsic on MSVC.
+  uint64_t high = 0;
+  const uint64_t low = _umul128(a, b, &high);
+  return absl::MakeUint128(high, low);
+#else
+  // uint128(a) * uint128(b) in emulated mode computes a full 128-bit x 128-bit
+  // multiply.  However there are many cases where that is not necessary, and it
+  // is only necessary to support a 64-bit x 64-bit = 128-bit multiply.  This is
+  // for those cases.
+  const uint64_t a00 = static_cast<uint32_t>(a);
+  const uint64_t a32 = a >> 32;
+  const uint64_t b00 = static_cast<uint32_t>(b);
+  const uint64_t b32 = b >> 32;
+
+  const uint64_t c00 = a00 * b00;
+  const uint64_t c32a = a00 * b32;
+  const uint64_t c32b = a32 * b00;
+  const uint64_t c64 = a32 * b32;
+
+  const uint32_t carry =
+      static_cast<uint32_t>(((c00 >> 32) + static_cast<uint32_t>(c32a) +
+                             static_cast<uint32_t>(c32b)) >>
+                            32);
+
+  return absl::MakeUint128(c64 + (c32a >> 32) + (c32b >> 32) + carry,
+                           c00 + (c32a << 32) + (c32b << 32));
+#endif
+}
+
+// wide_multiply<T> multiplies two N-bit values to a 2N-bit result.
+template <typename UIntType>
+struct wide_multiply {
+  static constexpr size_t kN = std::numeric_limits<UIntType>::digits;
+  using input_type = UIntType;
+  using result_type = typename random_internal::unsigned_bits<kN * 2>::type;
+
+  static result_type multiply(input_type a, input_type b) {
+    return static_cast<result_type>(a) * b;
+  }
+
+  static input_type hi(result_type r) { return r >> kN; }
+  static input_type lo(result_type r) { return r; }
+
+  static_assert(std::is_unsigned<UIntType>::value,
+                "Class-template wide_multiply<> argument must be unsigned.");
+};
+
+#ifndef ABSL_HAVE_INTRINSIC_INT128
+template <>
+struct wide_multiply<uint64_t> {
+  using input_type = uint64_t;
+  using result_type = uint128;
+
+  static result_type multiply(uint64_t a, uint64_t b) {
+    return MultiplyU64ToU128(a, b);
+  }
+
+  static uint64_t hi(result_type r) { return Uint128High64(r); }
+  static uint64_t lo(result_type r) { return Uint128Low64(r); }
+};
+#endif
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_DISTRIBUTION_IMPL_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_impl_test.cc b/third_party/abseil-cpp/absl/random/internal/distribution_impl_test.cc
new file mode 100644
index 0000000..09e7a31
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_impl_test.cc
@@ -0,0 +1,506 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/distribution_impl.h"
+
+#include "gtest/gtest.h"
+#include "absl/base/internal/bits.h"
+#include "absl/flags/flag.h"
+#include "absl/numeric/int128.h"
+
+ABSL_FLAG(int64_t, absl_random_test_trials, 50000,
+          "Number of trials for the probability tests.");
+
+using absl::random_internal::NegativeValueT;
+using absl::random_internal::PositiveValueT;
+using absl::random_internal::RandU64ToDouble;
+using absl::random_internal::RandU64ToFloat;
+using absl::random_internal::SignedValueT;
+
+namespace {
+
+TEST(DistributionImplTest, U64ToFloat_Positive_NoZero_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<PositiveValueT, false>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), 2.710505431e-20f);
+  EXPECT_EQ(ToFloat(0x0000000000000001), 5.421010862e-20f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), 0.5);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloat_Positive_Zero_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<PositiveValueT, true>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), 0.0);
+  EXPECT_EQ(ToFloat(0x0000000000000001), 5.421010862e-20f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), 0.5);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloat_Negative_NoZero_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<NegativeValueT, false>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), -2.710505431e-20f);
+  EXPECT_EQ(ToFloat(0x0000000000000001), -5.421010862e-20f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), -0.5);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloat_Signed_NoZero_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<SignedValueT, false>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), 5.421010862e-20f);
+  EXPECT_EQ(ToFloat(0x0000000000000001), 1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 0.9999999404f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), -5.421010862e-20f);
+  EXPECT_EQ(ToFloat(0x8000000000000001), -1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloat_Signed_Zero_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<SignedValueT, true>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), 0);
+  EXPECT_EQ(ToFloat(0x0000000000000001), 1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 0.9999999404f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), 0);
+  EXPECT_EQ(ToFloat(0x8000000000000001), -1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloat_Signed_Bias_Test) {
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<SignedValueT, true, 1>(a);
+  };
+  EXPECT_EQ(ToFloat(0x0000000000000000), 0);
+  EXPECT_EQ(ToFloat(0x0000000000000001), 2 * 1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 2 * 0.9999999404f);
+  EXPECT_EQ(ToFloat(0x8000000000000000), 0);
+  EXPECT_EQ(ToFloat(0x8000000000000001), 2 * -1.084202172e-19f);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 2 * -0.9999999404f);
+}
+
+TEST(DistributionImplTest, U64ToFloatTest) {
+  auto ToFloat = [](uint64_t a) -> float {
+    return RandU64ToFloat<PositiveValueT, true>(a);
+  };
+
+  EXPECT_EQ(ToFloat(0x0000000000000000), 0.0f);
+
+  EXPECT_EQ(ToFloat(0x8000000000000000), 0.5f);
+  EXPECT_EQ(ToFloat(0x8000000000000001), 0.5f);
+  EXPECT_EQ(ToFloat(0x800000FFFFFFFFFF), 0.5f);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404f);
+
+  EXPECT_GT(ToFloat(0x0000000000000001), 0.0f);
+
+  EXPECT_NE(ToFloat(0x7FFFFF0000000000), ToFloat(0x7FFFFEFFFFFFFFFF));
+
+  EXPECT_LT(ToFloat(0xFFFFFFFFFFFFFFFF), 1.0f);
+  int32_t two_to_24 = 1 << 24;
+  EXPECT_EQ(static_cast<int32_t>(ToFloat(0xFFFFFFFFFFFFFFFF) * two_to_24),
+            two_to_24 - 1);
+  EXPECT_NE(static_cast<int32_t>(ToFloat(0xFFFFFFFFFFFFFFFF) * two_to_24 * 2),
+            two_to_24 * 2 - 1);
+  EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), ToFloat(0xFFFFFF0000000000));
+  EXPECT_NE(ToFloat(0xFFFFFFFFFFFFFFFF), ToFloat(0xFFFFFEFFFFFFFFFF));
+  EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), ToFloat(0x7FFFFF8000000000));
+  EXPECT_NE(ToFloat(0x7FFFFFFFFFFFFFFF), ToFloat(0x7FFFFF7FFFFFFFFF));
+  EXPECT_EQ(ToFloat(0x3FFFFFFFFFFFFFFF), ToFloat(0x3FFFFFC000000000));
+  EXPECT_NE(ToFloat(0x3FFFFFFFFFFFFFFF), ToFloat(0x3FFFFFBFFFFFFFFF));
+
+  // For values where every bit counts, the values scale as multiples of the
+  // input.
+  for (int i = 0; i < 100; ++i) {
+    EXPECT_EQ(i * ToFloat(0x0000000000000001), ToFloat(i));
+  }
+
+  // For each i: value generated from (1 << i).
+  float exp_values[64];
+  exp_values[63] = 0.5f;
+  for (int i = 62; i >= 0; --i) exp_values[i] = 0.5f * exp_values[i + 1];
+  constexpr uint64_t one = 1;
+  for (int i = 0; i < 64; ++i) {
+    EXPECT_EQ(ToFloat(one << i), exp_values[i]);
+    for (int j = 1; j < FLT_MANT_DIG && i - j >= 0; ++j) {
+      EXPECT_NE(exp_values[i] + exp_values[i - j], exp_values[i]);
+      EXPECT_EQ(ToFloat((one << i) + (one << (i - j))),
+                exp_values[i] + exp_values[i - j]);
+    }
+    for (int j = FLT_MANT_DIG; i - j >= 0; ++j) {
+      EXPECT_EQ(exp_values[i] + exp_values[i - j], exp_values[i]);
+      EXPECT_EQ(ToFloat((one << i) + (one << (i - j))), exp_values[i]);
+    }
+  }
+}
+
+TEST(DistributionImplTest, U64ToDouble_Positive_NoZero_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<PositiveValueT, false>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), 2.710505431213761085e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000002), 1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
+}
+
+TEST(DistributionImplTest, U64ToDouble_Positive_Zero_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<PositiveValueT, true>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
+}
+
+TEST(DistributionImplTest, U64ToDouble_Negative_NoZero_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<NegativeValueT, false>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), -2.710505431213761085e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000001), -5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000002), -1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0x8000000000000000), -0.5);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
+}
+
+TEST(DistributionImplTest, U64ToDouble_Signed_NoZero_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<SignedValueT, false>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), 5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978);
+  EXPECT_EQ(ToDouble(0x8000000000000000), -5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
+}
+
+TEST(DistributionImplTest, U64ToDouble_Signed_Zero_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<SignedValueT, true>(a);
+  };
+  EXPECT_EQ(ToDouble(0x0000000000000000), 0);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978);
+  EXPECT_EQ(ToDouble(0x8000000000000000), 0);
+  EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
+}
+
+TEST(DistributionImplTest, U64ToDouble_Signed_Bias_Test) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<SignedValueT, true, -1>(a);
+  };
+  EXPECT_EQ(ToDouble(0x0000000000000000), 0);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19 / 2);
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978 / 2);
+  EXPECT_EQ(ToDouble(0x8000000000000000), 0);
+  EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19 / 2);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978 / 2);
+}
+
+TEST(DistributionImplTest, U64ToDoubleTest) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<PositiveValueT, true>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
+  EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
+
+  EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x7fffffffffffffef), 0.499999999999999944489);
+  EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
+
+  // For values > 0.5, RandU64ToDouble discards up to 11 bits. (64-53).
+  EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
+  EXPECT_EQ(ToDouble(0x80000000000007FF), 0.5);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
+  EXPECT_NE(ToDouble(0x7FFFFFFFFFFFF800), ToDouble(0x7FFFFFFFFFFFF7FF));
+
+  EXPECT_LT(ToDouble(0xFFFFFFFFFFFFFFFF), 1.0);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), ToDouble(0xFFFFFFFFFFFFF800));
+  EXPECT_NE(ToDouble(0xFFFFFFFFFFFFFFFF), ToDouble(0xFFFFFFFFFFFFF7FF));
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFC00));
+  EXPECT_NE(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFBFF));
+  EXPECT_EQ(ToDouble(0x3FFFFFFFFFFFFFFF), ToDouble(0x3FFFFFFFFFFFFE00));
+  EXPECT_NE(ToDouble(0x3FFFFFFFFFFFFFFF), ToDouble(0x3FFFFFFFFFFFFDFF));
+
+  EXPECT_EQ(ToDouble(0x1000000000000001), 0.0625);
+  EXPECT_EQ(ToDouble(0x2000000000000001), 0.125);
+  EXPECT_EQ(ToDouble(0x3000000000000001), 0.1875);
+  EXPECT_EQ(ToDouble(0x4000000000000001), 0.25);
+  EXPECT_EQ(ToDouble(0x5000000000000001), 0.3125);
+  EXPECT_EQ(ToDouble(0x6000000000000001), 0.375);
+  EXPECT_EQ(ToDouble(0x7000000000000001), 0.4375);
+  EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
+  EXPECT_EQ(ToDouble(0x9000000000000001), 0.5625);
+  EXPECT_EQ(ToDouble(0xa000000000000001), 0.625);
+  EXPECT_EQ(ToDouble(0xb000000000000001), 0.6875);
+  EXPECT_EQ(ToDouble(0xc000000000000001), 0.75);
+  EXPECT_EQ(ToDouble(0xd000000000000001), 0.8125);
+  EXPECT_EQ(ToDouble(0xe000000000000001), 0.875);
+  EXPECT_EQ(ToDouble(0xf000000000000001), 0.9375);
+
+  // Large powers of 2.
+  int64_t two_to_53 = int64_t{1} << 53;
+  EXPECT_EQ(static_cast<int64_t>(ToDouble(0xFFFFFFFFFFFFFFFF) * two_to_53),
+            two_to_53 - 1);
+  EXPECT_NE(static_cast<int64_t>(ToDouble(0xFFFFFFFFFFFFFFFF) * two_to_53 * 2),
+            two_to_53 * 2 - 1);
+
+  // For values where every bit counts, the values scale as multiples of the
+  // input.
+  for (int i = 0; i < 100; ++i) {
+    EXPECT_EQ(i * ToDouble(0x0000000000000001), ToDouble(i));
+  }
+
+  // For each i: value generated from (1 << i).
+  double exp_values[64];
+  exp_values[63] = 0.5;
+  for (int i = 62; i >= 0; --i) exp_values[i] = 0.5 * exp_values[i + 1];
+  constexpr uint64_t one = 1;
+  for (int i = 0; i < 64; ++i) {
+    EXPECT_EQ(ToDouble(one << i), exp_values[i]);
+    for (int j = 1; j < DBL_MANT_DIG && i - j >= 0; ++j) {
+      EXPECT_NE(exp_values[i] + exp_values[i - j], exp_values[i]);
+      EXPECT_EQ(ToDouble((one << i) + (one << (i - j))),
+                exp_values[i] + exp_values[i - j]);
+    }
+    for (int j = DBL_MANT_DIG; i - j >= 0; ++j) {
+      EXPECT_EQ(exp_values[i] + exp_values[i - j], exp_values[i]);
+      EXPECT_EQ(ToDouble((one << i) + (one << (i - j))), exp_values[i]);
+    }
+  }
+}
+
+TEST(DistributionImplTest, U64ToDoubleSignedTest) {
+  auto ToDouble = [](uint64_t a) {
+    return RandU64ToDouble<SignedValueT, false>(a);
+  };
+
+  EXPECT_EQ(ToDouble(0x0000000000000000), 5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
+
+  EXPECT_EQ(ToDouble(0x8000000000000000), -5.42101086242752217004e-20);
+  EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
+
+  const double e_plus = ToDouble(0x0000000000000001);
+  const double e_minus = ToDouble(0x8000000000000001);
+  EXPECT_EQ(e_plus, 1.084202172485504434e-19);
+  EXPECT_EQ(e_minus, -1.084202172485504434e-19);
+
+  EXPECT_EQ(ToDouble(0x3fffffffffffffef), 0.499999999999999944489);
+  EXPECT_EQ(ToDouble(0xbfffffffffffffef), -0.499999999999999944489);
+
+  // For values > 0.5, RandU64ToDouble discards up to 10 bits. (63-53).
+  EXPECT_EQ(ToDouble(0x4000000000000000), 0.5);
+  EXPECT_EQ(ToDouble(0x4000000000000001), 0.5);
+  EXPECT_EQ(ToDouble(0x40000000000003FF), 0.5);
+
+  EXPECT_EQ(ToDouble(0xC000000000000000), -0.5);
+  EXPECT_EQ(ToDouble(0xC000000000000001), -0.5);
+  EXPECT_EQ(ToDouble(0xC0000000000003FF), -0.5);
+
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFe), 0.999999999999999888978);
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFe), -0.999999999999999888978);
+
+  EXPECT_NE(ToDouble(0x7FFFFFFFFFFFF800), ToDouble(0x7FFFFFFFFFFFF7FF));
+
+  EXPECT_LT(ToDouble(0x7FFFFFFFFFFFFFFF), 1.0);
+  EXPECT_GT(ToDouble(0x7FFFFFFFFFFFFFFF), 0.9999999999);
+
+  EXPECT_GT(ToDouble(0xFFFFFFFFFFFFFFFe), -1.0);
+  EXPECT_LT(ToDouble(0xFFFFFFFFFFFFFFFe), -0.999999999);
+
+  EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFe), ToDouble(0xFFFFFFFFFFFFFC00));
+  EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFC00));
+  EXPECT_NE(ToDouble(0xFFFFFFFFFFFFFFFe), ToDouble(0xFFFFFFFFFFFFF3FF));
+  EXPECT_NE(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFF3FF));
+
+  EXPECT_EQ(ToDouble(0x1000000000000001), 0.125);
+  EXPECT_EQ(ToDouble(0x2000000000000001), 0.25);
+  EXPECT_EQ(ToDouble(0x3000000000000001), 0.375);
+  EXPECT_EQ(ToDouble(0x4000000000000001), 0.5);
+  EXPECT_EQ(ToDouble(0x5000000000000001), 0.625);
+  EXPECT_EQ(ToDouble(0x6000000000000001), 0.75);
+  EXPECT_EQ(ToDouble(0x7000000000000001), 0.875);
+  EXPECT_EQ(ToDouble(0x7800000000000001), 0.9375);
+  EXPECT_EQ(ToDouble(0x7c00000000000001), 0.96875);
+  EXPECT_EQ(ToDouble(0x7e00000000000001), 0.984375);
+  EXPECT_EQ(ToDouble(0x7f00000000000001), 0.9921875);
+
+  // 0x8000000000000000 ~= 0
+  EXPECT_EQ(ToDouble(0x9000000000000001), -0.125);
+  EXPECT_EQ(ToDouble(0xa000000000000001), -0.25);
+  EXPECT_EQ(ToDouble(0xb000000000000001), -0.375);
+  EXPECT_EQ(ToDouble(0xc000000000000001), -0.5);
+  EXPECT_EQ(ToDouble(0xd000000000000001), -0.625);
+  EXPECT_EQ(ToDouble(0xe000000000000001), -0.75);
+  EXPECT_EQ(ToDouble(0xf000000000000001), -0.875);
+
+  // Large powers of 2.
+  int64_t two_to_53 = int64_t{1} << 53;
+  EXPECT_EQ(static_cast<int64_t>(ToDouble(0x7FFFFFFFFFFFFFFF) * two_to_53),
+            two_to_53 - 1);
+  EXPECT_EQ(static_cast<int64_t>(ToDouble(0xFFFFFFFFFFFFFFFF) * two_to_53),
+            -(two_to_53 - 1));
+
+  EXPECT_NE(static_cast<int64_t>(ToDouble(0x7FFFFFFFFFFFFFFF) * two_to_53 * 2),
+            two_to_53 * 2 - 1);
+
+  // For values where every bit counts, the values scale as multiples of the
+  // input.
+  for (int i = 1; i < 100; ++i) {
+    EXPECT_EQ(i * e_plus, ToDouble(i)) << i;
+    EXPECT_EQ(i * e_minus, ToDouble(0x8000000000000000 | i)) << i;
+  }
+}
+
+TEST(DistributionImplTest, ExhaustiveFloat) {
+  using absl::base_internal::CountLeadingZeros64;
+  auto ToFloat = [](uint64_t a) {
+    return RandU64ToFloat<PositiveValueT, true>(a);
+  };
+
+  // Rely on RandU64ToFloat generating values from greatest to least when
+  // supplied with uint64_t values from greatest (0xfff...) to least (0x0).  Thus,
+  // this algorithm stores the previous value, and if the new value is at
+  // greater than or equal to the previous value, then there is a collision in
+  // the generation algorithm.
+  //
+  // Use the computation below to convert the random value into a result:
+  //   double res = a() * (1.0f - sample) + b() * sample;
+  float last_f = 1.0, last_g = 2.0;
+  uint64_t f_collisions = 0, g_collisions = 0;
+  uint64_t f_unique = 0, g_unique = 0;
+  uint64_t total = 0;
+  auto count = [&](const float r) {
+    total++;
+    // `f` is mapped to the range [0, 1) (default)
+    const float f = 0.0f * (1.0f - r) + 1.0f * r;
+    if (f >= last_f) {
+      f_collisions++;
+    } else {
+      f_unique++;
+      last_f = f;
+    }
+    // `g` is mapped to the range [1, 2)
+    const float g = 1.0f * (1.0f - r) + 2.0f * r;
+    if (g >= last_g) {
+      g_collisions++;
+    } else {
+      g_unique++;
+      last_g = g;
+    }
+  };
+
+  size_t limit = absl::GetFlag(FLAGS_absl_random_test_trials);
+
+  // Generate all uint64_t which have unique floating point values.
+  // Counting down from 0xFFFFFFFFFFFFFFFFu ... 0x0u
+  uint64_t x = ~uint64_t(0);
+  for (; x != 0 && limit > 0;) {
+    constexpr int kDig = (64 - FLT_MANT_DIG);
+    // Set a decrement value & the next point at which to change
+    // the decrement value. By default these are 1, 0.
+    uint64_t dec = 1;
+    uint64_t chk = 0;
+
+    // Adjust decrement and check value based on how many leading 0
+    // bits are set in the current value.
+    const int clz = CountLeadingZeros64(x);
+    if (clz < kDig) {
+      dec <<= (kDig - clz);
+      chk = (~uint64_t(0)) >> (clz + 1);
+    }
+    for (; x > chk && limit > 0; x -= dec) {
+      count(ToFloat(x));
+      --limit;
+    }
+  }
+
+  static_assert(FLT_MANT_DIG == 24,
+                "The float type is expected to have a 24 bit mantissa.");
+
+  if (limit != 0) {
+    // There are between 2^28 and 2^29 unique values in the range [0, 1).  For
+    // the low values of x, there are 2^24 -1 unique values.  Once x > 2^24,
+    // there are 40 * 2^24 unique values. Thus:
+    // (2 + 4 + 8 ... + 2^23) + 40 * 2^23
+    EXPECT_LT(1 << 28, f_unique);
+    EXPECT_EQ((1 << 24) + 40 * (1 << 23) - 1, f_unique);
+    EXPECT_EQ(total, f_unique);
+    EXPECT_EQ(0, f_collisions);
+
+    // Expect at least 2^23 unique values for the range [1, 2)
+    EXPECT_LE(1 << 23, g_unique);
+    EXPECT_EQ(total - g_unique, g_collisions);
+  }
+}
+
+TEST(DistributionImplTest, MultiplyU64ToU128Test) {
+  using absl::random_internal::MultiplyU64ToU128;
+  constexpr uint64_t k1 = 1;
+  constexpr uint64_t kMax = ~static_cast<uint64_t>(0);
+
+  EXPECT_EQ(absl::uint128(0), MultiplyU64ToU128(0, 0));
+
+  // Max uint64
+  EXPECT_EQ(MultiplyU64ToU128(kMax, kMax),
+            absl::MakeUint128(0xfffffffffffffffe, 0x0000000000000001));
+  EXPECT_EQ(absl::MakeUint128(0, kMax), MultiplyU64ToU128(kMax, 1));
+  EXPECT_EQ(absl::MakeUint128(0, kMax), MultiplyU64ToU128(1, kMax));
+  for (int i = 0; i < 64; ++i) {
+    EXPECT_EQ(absl::MakeUint128(0, kMax) << i,
+              MultiplyU64ToU128(kMax, k1 << i));
+    EXPECT_EQ(absl::MakeUint128(0, kMax) << i,
+              MultiplyU64ToU128(k1 << i, kMax));
+  }
+
+  // 1-bit x 1-bit.
+  for (int i = 0; i < 64; ++i) {
+    for (int j = 0; j < 64; ++j) {
+      EXPECT_EQ(absl::MakeUint128(0, 1) << (i + j),
+                MultiplyU64ToU128(k1 << i, k1 << j));
+      EXPECT_EQ(absl::MakeUint128(0, 1) << (i + j),
+                MultiplyU64ToU128(k1 << i, k1 << j));
+    }
+  }
+
+  // Verified multiplies
+  EXPECT_EQ(MultiplyU64ToU128(0xffffeeeeddddcccc, 0xbbbbaaaa99998888),
+            absl::MakeUint128(0xbbbb9e2692c5dddc, 0xc28f7531048d2c60));
+  EXPECT_EQ(MultiplyU64ToU128(0x0123456789abcdef, 0xfedcba9876543210),
+            absl::MakeUint128(0x0121fa00ad77d742, 0x2236d88fe5618cf0));
+  EXPECT_EQ(MultiplyU64ToU128(0x0123456789abcdef, 0xfdb97531eca86420),
+            absl::MakeUint128(0x0120ae99d26725fc, 0xce197f0ecac319e0));
+  EXPECT_EQ(MultiplyU64ToU128(0x97a87f4f261ba3f2, 0xfedcba9876543210),
+            absl::MakeUint128(0x96fbf1a8ae78d0ba, 0x5a6dd4b71f278320));
+  EXPECT_EQ(MultiplyU64ToU128(0xfedcba9876543210, 0xfdb97531eca86420),
+            absl::MakeUint128(0xfc98c6981a413e22, 0x342d0bbf48948200));
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_test_util.cc b/third_party/abseil-cpp/absl/random/internal/distribution_test_util.cc
new file mode 100644
index 0000000..85c8d596
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_test_util.cc
@@ -0,0 +1,416 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/distribution_test_util.h"
+
+#include <cassert>
+#include <cmath>
+#include <string>
+#include <vector>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/macros.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+#if defined(__EMSCRIPTEN__)
+// Workaround __EMSCRIPTEN__ error: llvm_fma_f64 not found.
+inline double fma(double x, double y, double z) { return (x * y) + z; }
+#endif
+
+}  // namespace
+
+DistributionMoments ComputeDistributionMoments(
+    absl::Span<const double> data_points) {
+  DistributionMoments result;
+
+  // Compute m1
+  for (double x : data_points) {
+    result.n++;
+    result.mean += x;
+  }
+  result.mean /= static_cast<double>(result.n);
+
+  // Compute m2, m3, m4
+  for (double x : data_points) {
+    double v = x - result.mean;
+    result.variance += v * v;
+    result.skewness += v * v * v;
+    result.kurtosis += v * v * v * v;
+  }
+  result.variance /= static_cast<double>(result.n - 1);
+
+  result.skewness /= static_cast<double>(result.n);
+  result.skewness /= std::pow(result.variance, 1.5);
+
+  result.kurtosis /= static_cast<double>(result.n);
+  result.kurtosis /= std::pow(result.variance, 2.0);
+  return result;
+
+  // When validating the min/max count, the following confidence intervals may
+  // be of use:
+  // 3.291 * stddev = 99.9% CI
+  // 2.576 * stddev = 99% CI
+  // 1.96 * stddev  = 95% CI
+  // 1.65 * stddev  = 90% CI
+}
+
+std::ostream& operator<<(std::ostream& os, const DistributionMoments& moments) {
+  return os << absl::StrFormat("mean=%f, stddev=%f, skewness=%f, kurtosis=%f",
+                               moments.mean, std::sqrt(moments.variance),
+                               moments.skewness, moments.kurtosis);
+}
+
+double InverseNormalSurvival(double x) {
+  // inv_sf(u) = -sqrt(2) * erfinv(2u-1)
+  static constexpr double kSqrt2 = 1.4142135623730950488;
+  return -kSqrt2 * absl::random_internal::erfinv(2 * x - 1.0);
+}
+
+bool Near(absl::string_view msg, double actual, double expected, double bound) {
+  assert(bound > 0.0);
+  double delta = fabs(expected - actual);
+  if (delta < bound) {
+    return true;
+  }
+
+  std::string formatted = absl::StrCat(
+      msg, " actual=", actual, " expected=", expected, " err=", delta / bound);
+  ABSL_RAW_LOG(INFO, "%s", formatted.c_str());
+  return false;
+}
+
+// TODO(absl-team): Replace with an "ABSL_HAVE_SPECIAL_MATH" and try
+// to use std::beta().  As of this writing P0226R1 is not implemented
+// in libc++: http://libcxx.llvm.org/cxx1z_status.html
+double beta(double p, double q) {
+  // Beta(x, y) = Gamma(x) * Gamma(y) / Gamma(x+y)
+  double lbeta = std::lgamma(p) + std::lgamma(q) - std::lgamma(p + q);
+  return std::exp(lbeta);
+}
+
+// Approximation to inverse of the Error Function in double precision.
+// (http://people.maths.ox.ac.uk/gilesm/files/gems_erfinv.pdf)
+double erfinv(double x) {
+#if !defined(__EMSCRIPTEN__)
+  using std::fma;
+#endif
+
+  double w = 0.0;
+  double p = 0.0;
+  w = -std::log((1.0 - x) * (1.0 + x));
+  if (w < 6.250000) {
+    w = w - 3.125000;
+    p = -3.6444120640178196996e-21;
+    p = fma(p, w, -1.685059138182016589e-19);
+    p = fma(p, w, 1.2858480715256400167e-18);
+    p = fma(p, w, 1.115787767802518096e-17);
+    p = fma(p, w, -1.333171662854620906e-16);
+    p = fma(p, w, 2.0972767875968561637e-17);
+    p = fma(p, w, 6.6376381343583238325e-15);
+    p = fma(p, w, -4.0545662729752068639e-14);
+    p = fma(p, w, -8.1519341976054721522e-14);
+    p = fma(p, w, 2.6335093153082322977e-12);
+    p = fma(p, w, -1.2975133253453532498e-11);
+    p = fma(p, w, -5.4154120542946279317e-11);
+    p = fma(p, w, 1.051212273321532285e-09);
+    p = fma(p, w, -4.1126339803469836976e-09);
+    p = fma(p, w, -2.9070369957882005086e-08);
+    p = fma(p, w, 4.2347877827932403518e-07);
+    p = fma(p, w, -1.3654692000834678645e-06);
+    p = fma(p, w, -1.3882523362786468719e-05);
+    p = fma(p, w, 0.0001867342080340571352);
+    p = fma(p, w, -0.00074070253416626697512);
+    p = fma(p, w, -0.0060336708714301490533);
+    p = fma(p, w, 0.24015818242558961693);
+    p = fma(p, w, 1.6536545626831027356);
+  } else if (w < 16.000000) {
+    w = std::sqrt(w) - 3.250000;
+    p = 2.2137376921775787049e-09;
+    p = fma(p, w, 9.0756561938885390979e-08);
+    p = fma(p, w, -2.7517406297064545428e-07);
+    p = fma(p, w, 1.8239629214389227755e-08);
+    p = fma(p, w, 1.5027403968909827627e-06);
+    p = fma(p, w, -4.013867526981545969e-06);
+    p = fma(p, w, 2.9234449089955446044e-06);
+    p = fma(p, w, 1.2475304481671778723e-05);
+    p = fma(p, w, -4.7318229009055733981e-05);
+    p = fma(p, w, 6.8284851459573175448e-05);
+    p = fma(p, w, 2.4031110387097893999e-05);
+    p = fma(p, w, -0.0003550375203628474796);
+    p = fma(p, w, 0.00095328937973738049703);
+    p = fma(p, w, -0.0016882755560235047313);
+    p = fma(p, w, 0.0024914420961078508066);
+    p = fma(p, w, -0.0037512085075692412107);
+    p = fma(p, w, 0.005370914553590063617);
+    p = fma(p, w, 1.0052589676941592334);
+    p = fma(p, w, 3.0838856104922207635);
+  } else {
+    w = std::sqrt(w) - 5.000000;
+    p = -2.7109920616438573243e-11;
+    p = fma(p, w, -2.5556418169965252055e-10);
+    p = fma(p, w, 1.5076572693500548083e-09);
+    p = fma(p, w, -3.7894654401267369937e-09);
+    p = fma(p, w, 7.6157012080783393804e-09);
+    p = fma(p, w, -1.4960026627149240478e-08);
+    p = fma(p, w, 2.9147953450901080826e-08);
+    p = fma(p, w, -6.7711997758452339498e-08);
+    p = fma(p, w, 2.2900482228026654717e-07);
+    p = fma(p, w, -9.9298272942317002539e-07);
+    p = fma(p, w, 4.5260625972231537039e-06);
+    p = fma(p, w, -1.9681778105531670567e-05);
+    p = fma(p, w, 7.5995277030017761139e-05);
+    p = fma(p, w, -0.00021503011930044477347);
+    p = fma(p, w, -0.00013871931833623122026);
+    p = fma(p, w, 1.0103004648645343977);
+    p = fma(p, w, 4.8499064014085844221);
+  }
+  return p * x;
+}
+
+namespace {
+
+// Direct implementation of AS63, BETAIN()
+// https://www.jstor.org/stable/2346797?seq=3#page_scan_tab_contents.
+//
+// BETAIN(x, p, q, beta)
+//  x:     the value of the upper limit x.
+//  p:     the value of the parameter p.
+//  q:     the value of the parameter q.
+//  beta:  the value of ln B(p, q)
+//
+double BetaIncompleteImpl(const double x, const double p, const double q,
+                          const double beta) {
+  if (p < (p + q) * x) {
+    // Incomplete beta function is symmetrical, so return the complement.
+    return 1. - BetaIncompleteImpl(1.0 - x, q, p, beta);
+  }
+
+  double psq = p + q;
+  const double kErr = 1e-14;
+  const double xc = 1. - x;
+  const double pre =
+      std::exp(p * std::log(x) + (q - 1.) * std::log(xc) - beta) / p;
+
+  double term = 1.;
+  double ai = 1.;
+  double result = 1.;
+  int ns = static_cast<int>(q + xc * psq);
+
+  // Use the soper reduction forumla.
+  double rx = (ns == 0) ? x : x / xc;
+  double temp = q - ai;
+  for (;;) {
+    term = term * temp * rx / (p + ai);
+    result = result + term;
+    temp = std::fabs(term);
+    if (temp < kErr && temp < kErr * result) {
+      return result * pre;
+    }
+    ai = ai + 1.;
+    --ns;
+    if (ns >= 0) {
+      temp = q - ai;
+      if (ns == 0) {
+        rx = x;
+      }
+    } else {
+      temp = psq;
+      psq = psq + 1.;
+    }
+  }
+
+  // NOTE: See also TOMS Alogrithm 708.
+  // http://www.netlib.org/toms/index.html
+  //
+  // NOTE: The NWSC library also includes BRATIO / ISUBX (p87)
+  // https://archive.org/details/DTIC_ADA261511/page/n75
+}
+
+// Direct implementation of AS109, XINBTA(p, q, beta, alpha)
+// https://www.jstor.org/stable/2346798?read-now=1&seq=4#page_scan_tab_contents
+// https://www.jstor.org/stable/2346887?seq=1#page_scan_tab_contents
+//
+// XINBTA(p, q, beta, alhpa)
+//  p:     the value of the parameter p.
+//  q:     the value of the parameter q.
+//  beta:  the value of ln B(p, q)
+//  alpha: the value of the lower tail area.
+//
+double BetaIncompleteInvImpl(const double p, const double q, const double beta,
+                             const double alpha) {
+  if (alpha < 0.5) {
+    // Inverse Incomplete beta function is symmetrical, return the complement.
+    return 1. - BetaIncompleteInvImpl(q, p, beta, 1. - alpha);
+  }
+  const double kErr = 1e-14;
+  double value = kErr;
+
+  // Compute the initial estimate.
+  {
+    double r = std::sqrt(-std::log(alpha * alpha));
+    double y =
+        r - fma(r, 0.27061, 2.30753) / fma(r, fma(r, 0.04481, 0.99229), 1.0);
+    if (p > 1. && q > 1.) {
+      r = (y * y - 3.) / 6.;
+      double s = 1. / (p + p - 1.);
+      double t = 1. / (q + q - 1.);
+      double h = 2. / s + t;
+      double w =
+          y * std::sqrt(h + r) / h - (t - s) * (r + 5. / 6. - t / (3. * h));
+      value = p / (p + q * std::exp(w + w));
+    } else {
+      r = q + q;
+      double t = 1.0 / (9. * q);
+      double u = 1.0 - t + y * std::sqrt(t);
+      t = r * (u * u * u);
+      if (t <= 0) {
+        value = 1.0 - std::exp((std::log((1.0 - alpha) * q) + beta) / q);
+      } else {
+        t = (4.0 * p + r - 2.0) / t;
+        if (t <= 1) {
+          value = std::exp((std::log(alpha * p) + beta) / p);
+        } else {
+          value = 1.0 - 2.0 / (t + 1.0);
+        }
+      }
+    }
+  }
+
+  // Solve for x using a modified newton-raphson method using the function
+  // BetaIncomplete.
+  {
+    value = std::max(value, kErr);
+    value = std::min(value, 1.0 - kErr);
+
+    const double r = 1.0 - p;
+    const double t = 1.0 - q;
+    double y;
+    double yprev = 0;
+    double sq = 1;
+    double prev = 1;
+    for (;;) {
+      if (value < 0 || value > 1.0) {
+        // Error case; value went infinite.
+        return std::numeric_limits<double>::infinity();
+      } else if (value == 0 || value == 1) {
+        y = value;
+      } else {
+        y = BetaIncompleteImpl(value, p, q, beta);
+        if (!std::isfinite(y)) {
+          return y;
+        }
+      }
+      y = (y - alpha) *
+          std::exp(beta + r * std::log(value) + t * std::log(1.0 - value));
+      if (y * yprev <= 0) {
+        prev = std::max(sq, std::numeric_limits<double>::min());
+      }
+      double g = 1.0;
+      for (;;) {
+        const double adj = g * y;
+        const double adj_sq = adj * adj;
+        if (adj_sq >= prev) {
+          g = g / 3.0;
+          continue;
+        }
+        const double tx = value - adj;
+        if (tx < 0 || tx > 1) {
+          g = g / 3.0;
+          continue;
+        }
+        if (prev < kErr) {
+          return value;
+        }
+        if (y * y < kErr) {
+          return value;
+        }
+        if (tx == value) {
+          return value;
+        }
+        if (tx == 0 || tx == 1) {
+          g = g / 3.0;
+          continue;
+        }
+        value = tx;
+        yprev = y;
+        break;
+      }
+    }
+  }
+
+  // NOTES: See also: Asymptotic inversion of the incomplete beta function.
+  // https://core.ac.uk/download/pdf/82140723.pdf
+  //
+  // NOTE: See the Boost library documentation as well:
+  // https://www.boost.org/doc/libs/1_52_0/libs/math/doc/sf_and_dist/html/math_toolkit/special/sf_beta/ibeta_function.html
+}
+
+}  // namespace
+
+double BetaIncomplete(const double x, const double p, const double q) {
+  // Error cases.
+  if (p < 0 || q < 0 || x < 0 || x > 1.0) {
+    return std::numeric_limits<double>::infinity();
+  }
+  if (x == 0 || x == 1) {
+    return x;
+  }
+  // ln(Beta(p, q))
+  double beta = std::lgamma(p) + std::lgamma(q) - std::lgamma(p + q);
+  return BetaIncompleteImpl(x, p, q, beta);
+}
+
+double BetaIncompleteInv(const double p, const double q, const double alpha) {
+  // Error cases.
+  if (p < 0 || q < 0 || alpha < 0 || alpha > 1.0) {
+    return std::numeric_limits<double>::infinity();
+  }
+  if (alpha == 0 || alpha == 1) {
+    return alpha;
+  }
+  // ln(Beta(p, q))
+  double beta = std::lgamma(p) + std::lgamma(q) - std::lgamma(p + q);
+  return BetaIncompleteInvImpl(p, q, beta, alpha);
+}
+
+// Given `num_trials` trials each with probability `p` of success, the
+// probability of no failures is `p^k`. To ensure the probability of a failure
+// is no more than `p_fail`, it must be that `p^k == 1 - p_fail`. This function
+// computes `p` from that equation.
+double RequiredSuccessProbability(const double p_fail, const int num_trials) {
+  double p = std::exp(std::log(1.0 - p_fail) / static_cast<double>(num_trials));
+  ABSL_ASSERT(p > 0);
+  return p;
+}
+
+double ZScore(double expected_mean, const DistributionMoments& moments) {
+  return (moments.mean - expected_mean) /
+         (std::sqrt(moments.variance) /
+          std::sqrt(static_cast<double>(moments.n)));
+}
+
+double MaxErrorTolerance(double acceptance_probability) {
+  double one_sided_pvalue = 0.5 * (1.0 - acceptance_probability);
+  const double max_err = InverseNormalSurvival(one_sided_pvalue);
+  ABSL_ASSERT(max_err > 0);
+  return max_err;
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_test_util.h b/third_party/abseil-cpp/absl/random/internal/distribution_test_util.h
new file mode 100644
index 0000000..b5ba49f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_test_util.h
@@ -0,0 +1,111 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_DISTRIBUTION_TEST_UTIL_H_
+#define ABSL_RANDOM_INTERNAL_DISTRIBUTION_TEST_UTIL_H_
+
+#include <cstddef>
+#include <iostream>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+
+// NOTE: The functions in this file are test only, and are should not be used in
+// non-test code.
+
+namespace absl {
+namespace random_internal {
+
+// http://webspace.ship.edu/pgmarr/Geo441/Lectures/Lec%205%20-%20Normality%20Testing.pdf
+
+// Compute the 1st to 4th standard moments:
+// mean, variance, skewness, and kurtosis.
+// http://www.itl.nist.gov/div898/handbook/eda/section3/eda35b.htm
+struct DistributionMoments {
+  size_t n = 0;
+  double mean = 0.0;
+  double variance = 0.0;
+  double skewness = 0.0;
+  double kurtosis = 0.0;
+};
+DistributionMoments ComputeDistributionMoments(
+    absl::Span<const double> data_points);
+
+std::ostream& operator<<(std::ostream& os, const DistributionMoments& moments);
+
+// Computes the Z-score for a set of data with the given distribution moments
+// compared against `expected_mean`.
+double ZScore(double expected_mean, const DistributionMoments& moments);
+
+// Returns the probability of success required for a single trial to ensure that
+// after `num_trials` trials, the probability of at least one failure is no more
+// than `p_fail`.
+double RequiredSuccessProbability(double p_fail, int num_trials);
+
+// Computes the maximum distance from the mean tolerable, for Z-Tests that are
+// expected to pass with `acceptance_probability`. Will terminate if the
+// resulting tolerance is zero (due to passing in 0.0 for
+// `acceptance_probability` or rounding errors).
+//
+// For example,
+// MaxErrorTolerance(0.001) = 0.0
+// MaxErrorTolerance(0.5) = ~0.47
+// MaxErrorTolerance(1.0) = inf
+double MaxErrorTolerance(double acceptance_probability);
+
+// Approximation to inverse of the Error Function in double precision.
+// (http://people.maths.ox.ac.uk/gilesm/files/gems_erfinv.pdf)
+double erfinv(double x);
+
+// Beta(p, q) = Gamma(p) * Gamma(q) / Gamma(p+q)
+double beta(double p, double q);
+
+// The inverse of the normal survival function.
+double InverseNormalSurvival(double x);
+
+// Returns whether actual is "near" expected, based on the bound.
+bool Near(absl::string_view msg, double actual, double expected, double bound);
+
+// Implements the incomplete regularized beta function, AS63, BETAIN.
+//    https://www.jstor.org/stable/2346797
+//
+// BetaIncomplete(x, p, q), where
+//   `x` is the value of the upper limit
+//   `p` is beta parameter p, `q` is beta parameter q.
+//
+// NOTE: This is a test-only function which is only accurate to within, at most,
+// 1e-13 of the actual value.
+//
+double BetaIncomplete(double x, double p, double q);
+
+// Implements the inverse of the incomplete regularized beta function, AS109,
+// XINBTA.
+//   https://www.jstor.org/stable/2346798
+//   https://www.jstor.org/stable/2346887
+//
+// BetaIncompleteInv(p, q, beta, alhpa)
+//   `p` is beta parameter p, `q` is beta parameter q.
+//   `alpha` is the value of the lower tail area.
+//
+// NOTE: This is a test-only function and, when successful, is only accurate to
+// within ~1e-6 of the actual value; there are some cases where it diverges from
+// the actual value by much more than that.  The function uses Newton's method,
+// and thus the runtime is highly variable.
+double BetaIncompleteInv(double p, double q, double alpha);
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_DISTRIBUTION_TEST_UTIL_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/distribution_test_util_test.cc b/third_party/abseil-cpp/absl/random/internal/distribution_test_util_test.cc
new file mode 100644
index 0000000..c49d44f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distribution_test_util_test.cc
@@ -0,0 +1,193 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/distribution_test_util.h"
+
+#include "gtest/gtest.h"
+
+namespace {
+
+TEST(TestUtil, InverseErf) {
+  const struct {
+    const double z;
+    const double value;
+  } kErfInvTable[] = {
+      {0.0000001, 8.86227e-8},
+      {0.00001, 8.86227e-6},
+      {0.5, 0.4769362762044},
+      {0.6, 0.5951160814499},
+      {0.99999, 3.1234132743},
+      {0.9999999, 3.7665625816},
+      {0.999999944, 3.8403850690566985},  // = log((1-x) * (1+x)) =~ 16.004
+      {0.999999999, 4.3200053849134452},
+  };
+
+  for (const auto& data : kErfInvTable) {
+    auto value = absl::random_internal::erfinv(data.z);
+
+    // Log using the Wolfram-alpha function name & parameters.
+    EXPECT_NEAR(value, data.value, 1e-8)
+        << " InverseErf[" << data.z << "]  (expected=" << data.value << ")  -> "
+        << value;
+  }
+}
+
+const struct {
+  const double p;
+  const double q;
+  const double x;
+  const double alpha;
+} kBetaTable[] = {
+    {0.5, 0.5, 0.01, 0.06376856085851985},
+    {0.5, 0.5, 0.1, 0.2048327646991335},
+    {0.5, 0.5, 1, 1},
+    {1, 0.5, 0, 0},
+    {1, 0.5, 0.01, 0.005012562893380045},
+    {1, 0.5, 0.1, 0.0513167019494862},
+    {1, 0.5, 0.5, 0.2928932188134525},
+    {1, 1, 0.5, 0.5},
+    {2, 2, 0.1, 0.028},
+    {2, 2, 0.2, 0.104},
+    {2, 2, 0.3, 0.216},
+    {2, 2, 0.4, 0.352},
+    {2, 2, 0.5, 0.5},
+    {2, 2, 0.6, 0.648},
+    {2, 2, 0.7, 0.784},
+    {2, 2, 0.8, 0.896},
+    {2, 2, 0.9, 0.972},
+    {5.5, 5, 0.5, 0.4361908850559777},
+    {10, 0.5, 0.9, 0.1516409096346979},
+    {10, 5, 0.5, 0.08978271484375},
+    {10, 5, 1, 1},
+    {10, 10, 0.5, 0.5},
+    {20, 5, 0.8, 0.4598773297575791},
+    {20, 10, 0.6, 0.2146816102371739},
+    {20, 10, 0.8, 0.9507364826957875},
+    {20, 20, 0.5, 0.5},
+    {20, 20, 0.6, 0.8979413687105918},
+    {30, 10, 0.7, 0.2241297491808366},
+    {30, 10, 0.8, 0.7586405487192086},
+    {40, 20, 0.7, 0.7001783247477069},
+    {1, 0.5, 0.1, 0.0513167019494862},
+    {1, 0.5, 0.2, 0.1055728090000841},
+    {1, 0.5, 0.3, 0.1633399734659245},
+    {1, 0.5, 0.4, 0.2254033307585166},
+    {1, 2, 0.2, 0.36},
+    {1, 3, 0.2, 0.488},
+    {1, 4, 0.2, 0.5904},
+    {1, 5, 0.2, 0.67232},
+    {2, 2, 0.3, 0.216},
+    {3, 2, 0.3, 0.0837},
+    {4, 2, 0.3, 0.03078},
+    {5, 2, 0.3, 0.010935},
+
+    // These values test small & large points along the range of the Beta
+    // function.
+    //
+    // When selecting test points, remember that if BetaIncomplete(x, p, q)
+    // returns the same value to within the limits of precision over a large
+    // domain of the input, x, then BetaIncompleteInv(alpha, p, q) may return an
+    // essentially arbitrary value where BetaIncomplete(x, p, q) =~ alpha.
+
+    // BetaRegularized[x, 0.00001, 0.00001],
+    // For x in {~0.001 ... ~0.999}, => ~0.5
+    {1e-5, 1e-5, 1e-5, 0.4999424388184638311},
+    {1e-5, 1e-5, (1.0 - 1e-8), 0.5000920948389232964},
+
+    // BetaRegularized[x, 0.00001, 10000].
+    // For x in {~epsilon ... 1.0}, => ~1
+    {1e-5, 1e5, 1e-6, 0.9999817708130066936},
+    {1e-5, 1e5, (1.0 - 1e-7), 1.0},
+
+    // BetaRegularized[x, 10000, 0.00001].
+    // For x in {0 .. 1-epsilon}, => ~0
+    {1e5, 1e-5, 1e-6, 0},
+    {1e5, 1e-5, (1.0 - 1e-6), 1.8229186993306369e-5},
+};
+
+TEST(BetaTest, BetaIncomplete) {
+  for (const auto& data : kBetaTable) {
+    auto value = absl::random_internal::BetaIncomplete(data.x, data.p, data.q);
+
+    // Log using the Wolfram-alpha function name & parameters.
+    EXPECT_NEAR(value, data.alpha, 1e-12)
+        << " BetaRegularized[" << data.x << ", " << data.p << ", " << data.q
+        << "]  (expected=" << data.alpha << ")  -> " << value;
+  }
+}
+
+TEST(BetaTest, BetaIncompleteInv) {
+  for (const auto& data : kBetaTable) {
+    auto value =
+        absl::random_internal::BetaIncompleteInv(data.p, data.q, data.alpha);
+
+    // Log using the Wolfram-alpha function name & parameters.
+    EXPECT_NEAR(value, data.x, 1e-6)
+        << " InverseBetaRegularized[" << data.alpha << ", " << data.p << ", "
+        << data.q << "]  (expected=" << data.x << ")  -> " << value;
+  }
+}
+
+TEST(MaxErrorTolerance, MaxErrorTolerance) {
+  std::vector<std::pair<double, double>> cases = {
+      {0.0000001, 8.86227e-8 * 1.41421356237},
+      {0.00001, 8.86227e-6 * 1.41421356237},
+      {0.5, 0.4769362762044 * 1.41421356237},
+      {0.6, 0.5951160814499 * 1.41421356237},
+      {0.99999, 3.1234132743 * 1.41421356237},
+      {0.9999999, 3.7665625816 * 1.41421356237},
+      {0.999999944, 3.8403850690566985 * 1.41421356237},
+      {0.999999999, 4.3200053849134452 * 1.41421356237}};
+  for (auto entry : cases) {
+    EXPECT_NEAR(absl::random_internal::MaxErrorTolerance(entry.first),
+                entry.second, 1e-8);
+  }
+}
+
+TEST(ZScore, WithSameMean) {
+  absl::random_internal::DistributionMoments m;
+  m.n = 100;
+  m.mean = 5;
+  m.variance = 1;
+  EXPECT_NEAR(absl::random_internal::ZScore(5, m), 0, 1e-12);
+
+  m.n = 1;
+  m.mean = 0;
+  m.variance = 1;
+  EXPECT_NEAR(absl::random_internal::ZScore(0, m), 0, 1e-12);
+
+  m.n = 10000;
+  m.mean = -5;
+  m.variance = 100;
+  EXPECT_NEAR(absl::random_internal::ZScore(-5, m), 0, 1e-12);
+}
+
+TEST(ZScore, DifferentMean) {
+  absl::random_internal::DistributionMoments m;
+  m.n = 100;
+  m.mean = 5;
+  m.variance = 1;
+  EXPECT_NEAR(absl::random_internal::ZScore(4, m), 10, 1e-12);
+
+  m.n = 1;
+  m.mean = 0;
+  m.variance = 1;
+  EXPECT_NEAR(absl::random_internal::ZScore(-1, m), 1, 1e-12);
+
+  m.n = 10000;
+  m.mean = -5;
+  m.variance = 100;
+  EXPECT_NEAR(absl::random_internal::ZScore(-4, m), -10, 1e-12);
+}
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/distributions.h b/third_party/abseil-cpp/absl/random/internal/distributions.h
new file mode 100644
index 0000000..34db3b3
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/distributions.h
@@ -0,0 +1,82 @@
+// Copyright 2019 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_DISTRIBUTIONS_H_
+#define ABSL_RANDOM_INTERNAL_DISTRIBUTIONS_H_
+
+#include <type_traits>
+
+#include "absl/meta/type_traits.h"
+#include "absl/random/internal/distribution_caller.h"
+#include "absl/random/internal/traits.h"
+#include "absl/random/internal/uniform_helper.h"
+
+namespace absl {
+namespace random_internal {
+template <typename D>
+struct DistributionFormatTraits;
+
+// UniformImpl implements the core logic of the Uniform<T> call, which is to
+// select the correct distribution type, compute the bounds based on the
+// interval tag, and then generate a value.
+template <typename NumType, typename TagType, typename URBG>
+NumType UniformImpl(TagType tag,
+                    URBG& urbg,  // NOLINT(runtime/references)
+                    NumType lo, NumType hi) {
+  static_assert(
+      std::is_arithmetic<NumType>::value,
+      "absl::Uniform<T>() must use an integer or real parameter type.");
+
+  using distribution_t =
+      typename std::conditional<std::is_integral<NumType>::value,
+                                absl::uniform_int_distribution<NumType>,
+                                absl::uniform_real_distribution<NumType>>::type;
+  using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+
+  auto a = random_internal::uniform_lower_bound<NumType>(tag, lo, hi);
+  auto b = random_internal::uniform_upper_bound<NumType>(tag, lo, hi);
+  // TODO(lar): it doesn't make a lot of sense to ask for a random number in an
+  // empty range.  Right now we just return a boundary--even though that
+  // boundary is not an acceptable value!  Is there something better we can do
+  // here?
+
+  using gen_t = absl::decay_t<URBG>;
+  if (a > b) return a;
+  return DistributionCaller<gen_t>::template Call<distribution_t, format_t>(
+      &urbg, a, b);
+}
+
+// In the absence of an explicitly provided return-type, the template
+// "uniform_inferred_return_t<A, B>" is used to derive a suitable type, based on
+// the data-types of the endpoint-arguments {A lo, B hi}.
+//
+// Given endpoints {A lo, B hi}, one of {A, B} will be chosen as the
+// return-type, if one type can be implicitly converted into the other, in a
+// lossless way. The template "is_widening_convertible" implements the
+// compile-time logic for deciding if such a conversion is possible.
+//
+// If no such conversion between {A, B} exists, then the overload for
+// absl::Uniform() will be discarded, and the call will be ill-formed.
+// Return-type for absl::Uniform() when the return-type is inferred.
+template <typename A, typename B>
+using uniform_inferred_return_t =
+    absl::enable_if_t<absl::disjunction<is_widening_convertible<A, B>,
+                                        is_widening_convertible<B, A>>::value,
+                      typename std::conditional<
+                          is_widening_convertible<A, B>::value, B, A>::type>;
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_DISTRIBUTIONS_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h
new file mode 100644
index 0000000..b660ece
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h
@@ -0,0 +1,87 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_EXPLICIT_SEED_SEQ_H_
+#define ABSL_RANDOM_INTERNAL_EXPLICIT_SEED_SEQ_H_
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <initializer_list>
+#include <iterator>
+#include <vector>
+
+namespace absl {
+namespace random_internal {
+
+// This class conforms to the C++ Standard "Seed Sequence" concept
+// [rand.req.seedseq].
+//
+// An "ExplicitSeedSeq" is meant to provide a conformant interface for
+// forwarding pre-computed seed material to the constructor of a class
+// conforming to the "Uniform Random Bit Generator" concept. This class makes no
+// attempt to mutate the state provided by its constructor, and returns it
+// directly via ExplicitSeedSeq::generate().
+//
+// If this class is asked to generate more seed material than was provided to
+// the constructor, then the remaining bytes will be filled with deterministic,
+// nonrandom data.
+class ExplicitSeedSeq {
+ public:
+  using result_type = uint32_t;
+
+  ExplicitSeedSeq() : state_() {}
+
+  // Copy and move both allowed.
+  ExplicitSeedSeq(const ExplicitSeedSeq& other) = default;
+  ExplicitSeedSeq& operator=(const ExplicitSeedSeq& other) = default;
+  ExplicitSeedSeq(ExplicitSeedSeq&& other) = default;
+  ExplicitSeedSeq& operator=(ExplicitSeedSeq&& other) = default;
+
+  template <typename Iterator>
+  ExplicitSeedSeq(Iterator begin, Iterator end) {
+    for (auto it = begin; it != end; it++) {
+      state_.push_back(*it & 0xffffffff);
+    }
+  }
+
+  template <typename T>
+  ExplicitSeedSeq(std::initializer_list<T> il)
+      : ExplicitSeedSeq(il.begin(), il.end()) {}
+
+  size_t size() const { return state_.size(); }
+
+  template <typename OutIterator>
+  void param(OutIterator out) const {
+    std::copy(std::begin(state_), std::end(state_), out);
+  }
+
+  template <typename OutIterator>
+  void generate(OutIterator begin, OutIterator end) {
+    for (size_t index = 0; begin != end; begin++) {
+      *begin = state_.empty() ? 0 : state_[index++];
+      if (index >= state_.size()) {
+        index = 0;
+      }
+    }
+  }
+
+ protected:
+  std::vector<uint32_t> state_;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_EXPLICIT_SEED_SEQ_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc
new file mode 100644
index 0000000..a55ad73
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc
@@ -0,0 +1,204 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/explicit_seed_seq.h"
+
+#include <iterator>
+#include <random>
+#include <utility>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/random/seed_sequences.h"
+
+namespace {
+
+template <typename Sseq>
+bool ConformsToInterface() {
+  // Check that the SeedSequence can be default-constructed.
+  { Sseq default_constructed_seq; }
+  // Check that the SeedSequence can be constructed with two iterators.
+  {
+    uint32_t init_array[] = {1, 3, 5, 7, 9};
+    Sseq iterator_constructed_seq(init_array, &init_array[5]);
+  }
+  // Check that the SeedSequence can be std::initializer_list-constructed.
+  { Sseq list_constructed_seq = {1, 3, 5, 7, 9, 11, 13}; }
+  // Check that param() and size() return state provided to constructor.
+  {
+    uint32_t init_array[] = {1, 2, 3, 4, 5};
+    Sseq seq(init_array, &init_array[ABSL_ARRAYSIZE(init_array)]);
+    EXPECT_EQ(seq.size(), ABSL_ARRAYSIZE(init_array));
+
+    uint32_t state_array[ABSL_ARRAYSIZE(init_array)];
+    seq.param(state_array);
+
+    for (int i = 0; i < ABSL_ARRAYSIZE(state_array); i++) {
+      EXPECT_EQ(state_array[i], i + 1);
+    }
+  }
+  // Check for presence of generate() method.
+  {
+    Sseq seq;
+    uint32_t seeds[5];
+
+    seq.generate(seeds, &seeds[ABSL_ARRAYSIZE(seeds)]);
+  }
+  return true;
+}
+}  // namespace
+
+TEST(SeedSequences, CheckInterfaces) {
+  // Control case
+  EXPECT_TRUE(ConformsToInterface<std::seed_seq>());
+
+  // Abseil classes
+  EXPECT_TRUE(ConformsToInterface<absl::random_internal::ExplicitSeedSeq>());
+}
+
+TEST(ExplicitSeedSeq, DefaultConstructorGeneratesZeros) {
+  const size_t kNumBlocks = 128;
+
+  uint32_t outputs[kNumBlocks];
+  absl::random_internal::ExplicitSeedSeq seq;
+  seq.generate(outputs, &outputs[kNumBlocks]);
+
+  for (uint32_t& seed : outputs) {
+    EXPECT_EQ(seed, 0);
+  }
+}
+
+TEST(ExplicitSeeqSeq, SeedMaterialIsForwardedIdentically) {
+  const size_t kNumBlocks = 128;
+
+  uint32_t seed_material[kNumBlocks];
+  std::random_device urandom{"/dev/urandom"};
+  for (uint32_t& seed : seed_material) {
+    seed = urandom();
+  }
+  absl::random_internal::ExplicitSeedSeq seq(seed_material,
+                                             &seed_material[kNumBlocks]);
+
+  // Check that output is same as seed-material provided to constructor.
+  {
+    const size_t kNumGenerated = kNumBlocks / 2;
+    uint32_t outputs[kNumGenerated];
+    seq.generate(outputs, &outputs[kNumGenerated]);
+    for (size_t i = 0; i < kNumGenerated; i++) {
+      EXPECT_EQ(outputs[i], seed_material[i]);
+    }
+  }
+  // Check that SeedSequence is stateless between invocations: Despite the last
+  // invocation of generate() only consuming half of the input-entropy, the same
+  // entropy will be recycled for the next invocation.
+  {
+    const size_t kNumGenerated = kNumBlocks;
+    uint32_t outputs[kNumGenerated];
+    seq.generate(outputs, &outputs[kNumGenerated]);
+    for (size_t i = 0; i < kNumGenerated; i++) {
+      EXPECT_EQ(outputs[i], seed_material[i]);
+    }
+  }
+  // Check that when more seed-material is asked for than is provided, nonzero
+  // values are still written.
+  {
+    const size_t kNumGenerated = kNumBlocks * 2;
+    uint32_t outputs[kNumGenerated];
+    seq.generate(outputs, &outputs[kNumGenerated]);
+    for (size_t i = 0; i < kNumGenerated; i++) {
+      EXPECT_EQ(outputs[i], seed_material[i % kNumBlocks]);
+    }
+  }
+}
+
+TEST(ExplicitSeedSeq, CopyAndMoveConstructors) {
+  using testing::Each;
+  using testing::Eq;
+  using testing::Not;
+  using testing::Pointwise;
+
+  uint32_t entropy[4];
+  std::random_device urandom("/dev/urandom");
+  for (uint32_t& entry : entropy) {
+    entry = urandom();
+  }
+  absl::random_internal::ExplicitSeedSeq seq_from_entropy(std::begin(entropy),
+                                                          std::end(entropy));
+  // Copy constructor.
+  {
+    absl::random_internal::ExplicitSeedSeq seq_copy(seq_from_entropy);
+    EXPECT_EQ(seq_copy.size(), seq_from_entropy.size());
+
+    std::vector<uint32_t> seeds_1;
+    seeds_1.resize(1000, 0);
+    std::vector<uint32_t> seeds_2;
+    seeds_2.resize(1000, 1);
+
+    seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
+    seq_copy.generate(seeds_2.begin(), seeds_2.end());
+
+    EXPECT_THAT(seeds_1, Pointwise(Eq(), seeds_2));
+  }
+  // Assignment operator.
+  {
+    for (uint32_t& entry : entropy) {
+      entry = urandom();
+    }
+    absl::random_internal::ExplicitSeedSeq another_seq(std::begin(entropy),
+                                                       std::end(entropy));
+
+    std::vector<uint32_t> seeds_1;
+    seeds_1.resize(1000, 0);
+    std::vector<uint32_t> seeds_2;
+    seeds_2.resize(1000, 0);
+
+    seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
+    another_seq.generate(seeds_2.begin(), seeds_2.end());
+
+    // Assert precondition: Sequences generated by seed-sequences are not equal.
+    EXPECT_THAT(seeds_1, Not(Pointwise(Eq(), seeds_2)));
+
+    // Apply the assignment-operator.
+    another_seq = seq_from_entropy;
+
+    // Re-generate seeds.
+    seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
+    another_seq.generate(seeds_2.begin(), seeds_2.end());
+
+    // Seeds generated by seed-sequences should now be equal.
+    EXPECT_THAT(seeds_1, Pointwise(Eq(), seeds_2));
+  }
+  // Move constructor.
+  {
+    // Get seeds from seed-sequence constructed from entropy.
+    std::vector<uint32_t> seeds_1;
+    seeds_1.resize(1000, 0);
+    seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
+
+    // Apply move-constructor move the sequence to another instance.
+    absl::random_internal::ExplicitSeedSeq moved_seq(
+        std::move(seq_from_entropy));
+    std::vector<uint32_t> seeds_2;
+    seeds_2.resize(1000, 1);
+    moved_seq.generate(seeds_2.begin(), seeds_2.end());
+    // Verify that seeds produced by moved-instance are the same as original.
+    EXPECT_THAT(seeds_1, Pointwise(Eq(), seeds_2));
+
+    // Verify that the moved-from instance now behaves like a
+    // default-constructed instance.
+    EXPECT_EQ(seq_from_entropy.size(), 0);
+    seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
+    EXPECT_THAT(seeds_1, Each(Eq(0)));
+  }
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h b/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h
new file mode 100644
index 0000000..23eabbc
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h
@@ -0,0 +1,299 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_FAST_UNIFORM_BITS_H_
+#define ABSL_RANDOM_INTERNAL_FAST_UNIFORM_BITS_H_
+
+#include <cstddef>
+#include <cstdint>
+#include <limits>
+#include <type_traits>
+
+namespace absl {
+namespace random_internal {
+// Computes the length of the range of values producible by the URBG, or returns
+// zero if that would encompass the entire range of representable values in
+// URBG::result_type.
+template <typename URBG>
+constexpr typename URBG::result_type constexpr_range() {
+  using result_type = typename URBG::result_type;
+  return ((URBG::max)() == (std::numeric_limits<result_type>::max)() &&
+          (URBG::min)() == std::numeric_limits<result_type>::lowest())
+             ? result_type{0}
+             : (URBG::max)() - (URBG::min)() + result_type{1};
+}
+
+// FastUniformBits implements a fast path to acquire uniform independent bits
+// from a type which conforms to the [rand.req.urbg] concept.
+// Parameterized by:
+//  `UIntType`: the result (output) type
+//  `Width`: binary output width
+//
+// The std::independent_bits_engine [rand.adapt.ibits] adaptor can be
+// instantiated from an existing generator through a copy or a move. It does
+// not, however, facilitate the production of pseudorandom bits from an un-owned
+// generator that will outlive the std::independent_bits_engine instance.
+template <typename UIntType = uint64_t,
+          size_t Width = std::numeric_limits<UIntType>::digits>
+class FastUniformBits {
+  static_assert(std::is_unsigned<UIntType>::value,
+                "Class-template FastUniformBits<> must be parameterized using "
+                "an unsigned type.");
+
+  // `kWidth` is the width, in binary digits, of the output. By default it is
+  // the number of binary digits in the `result_type`.
+  static constexpr size_t kWidth = Width;
+  static_assert(kWidth > 0,
+                "Class-template FastUniformBits<> Width argument must be > 0");
+
+  static_assert(kWidth <= std::numeric_limits<UIntType>::digits,
+                "Class-template FastUniformBits<> Width argument must be <= "
+                "width of UIntType.");
+
+  static constexpr bool kIsMaxWidth =
+      (kWidth >= std::numeric_limits<UIntType>::digits);
+
+  // Computes a mask of `n` bits for the `UIntType`.
+  static constexpr UIntType constexpr_mask(size_t n) {
+    return (UIntType(1) << n) - 1;
+  }
+
+ public:
+  using result_type = UIntType;
+
+  static constexpr result_type(min)() { return 0; }
+  static constexpr result_type(max)() {
+    return kIsMaxWidth ? (std::numeric_limits<result_type>::max)()
+                       : constexpr_mask(kWidth);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g);  // NOLINT(runtime/references)
+
+ private:
+  // Variate() generates a single random variate, always returning a value
+  // in the closed interval [0 ... FastUniformBitsURBGConstants::kRangeMask]
+  // (kRangeMask+1 is a power of 2).
+  template <typename URBG>
+  typename URBG::result_type Variate(URBG& g);  // NOLINT(runtime/references)
+
+  // generate() generates a random value, dispatched on whether
+  // the underlying URNG must loop over multiple calls or not.
+  template <typename URBG>
+  result_type Generate(URBG& g,  // NOLINT(runtime/references)
+                       std::true_type /* avoid_looping */);
+
+  template <typename URBG>
+  result_type Generate(URBG& g,  // NOLINT(runtime/references)
+                       std::false_type /* avoid_looping */);
+};
+
+// FastUniformBitsURBGConstants computes the URBG-derived constants used
+// by FastUniformBits::Generate and FastUniformBits::Variate.
+// Parameterized by the FastUniformBits parameter:
+//   `URBG`: The underlying UniformRandomNumberGenerator.
+//
+// The values here indicate the URBG range as well as providing an indicator
+// whether the URBG output is a power of 2, and kRangeMask, which allows masking
+// the generated output to kRangeBits.
+template <typename URBG>
+class FastUniformBitsURBGConstants {
+  // Computes the floor of the log. (i.e., std::floor(std::log2(N));
+  static constexpr size_t constexpr_log2(size_t n) {
+    return (n <= 1) ? 0 : 1 + constexpr_log2(n / 2);
+  }
+
+  // Computes a mask of n bits for the URBG::result_type.
+  static constexpr typename URBG::result_type constexpr_mask(size_t n) {
+    return (typename URBG::result_type(1) << n) - 1;
+  }
+
+ public:
+  using result_type = typename URBG::result_type;
+
+  // The range of the URNG, max - min + 1, or zero if that result would cause
+  // overflow.
+  static constexpr result_type kRange = constexpr_range<URBG>();
+
+  static constexpr bool kPowerOfTwo =
+      (kRange == 0) || ((kRange & (kRange - 1)) == 0);
+
+  // kRangeBits describes the number number of bits suitable to mask off of URNG
+  // variate, which is:
+  // kRangeBits = floor(log2(kRange))
+  static constexpr size_t kRangeBits =
+      kRange == 0 ? std::numeric_limits<result_type>::digits
+                  : constexpr_log2(kRange);
+
+  // kRangeMask is the mask used when sampling variates from the URNG when the
+  // width of the URNG range is not a power of 2.
+  // Y = (2 ^ kRange) - 1
+  static constexpr result_type kRangeMask =
+      kRange == 0 ? (std::numeric_limits<result_type>::max)()
+                  : constexpr_mask(kRangeBits);
+
+  static_assert((URBG::max)() != (URBG::min)(),
+                "Class-template FastUniformBitsURBGConstants<> "
+                "URBG::max and URBG::min may not be equal.");
+
+  static_assert(std::is_unsigned<result_type>::value,
+                "Class-template FastUniformBitsURBGConstants<> "
+                "URBG::result_type must be unsigned.");
+
+  static_assert(kRangeMask > 0,
+                "Class-template FastUniformBitsURBGConstants<> "
+                "URBG does not generate sufficient random bits.");
+
+  static_assert(kRange == 0 ||
+                    kRangeBits < std::numeric_limits<result_type>::digits,
+                "Class-template FastUniformBitsURBGConstants<> "
+                "URBG range computation error.");
+};
+
+// FastUniformBitsLoopingConstants computes the looping constants used
+// by FastUniformBits::Generate. These constants indicate how multiple
+// URBG::result_type values are combined into an output_value.
+// Parameterized by the FastUniformBits parameters:
+//  `UIntType`: output type.
+//  `Width`: binary output width,
+//  `URNG`: The underlying UniformRandomNumberGenerator.
+//
+// The looping constants describe the sets of loop counters and mask values
+// which control how individual variates are combined the final output.  The
+// algorithm ensures that the number of bits used by any individual call differs
+// by at-most one bit from any other call. This is simplified into constants
+// which describe two loops, with the second loop parameters providing one extra
+// bit per variate.
+//
+// See [rand.adapt.ibits] for more details on the use of these constants.
+template <typename UIntType, size_t Width, typename URBG>
+class FastUniformBitsLoopingConstants {
+ private:
+  static constexpr size_t kWidth = Width;
+  using urbg_result_type = typename URBG::result_type;
+  using uint_result_type = UIntType;
+
+ public:
+  using result_type =
+      typename std::conditional<(sizeof(urbg_result_type) <=
+                                 sizeof(uint_result_type)),
+                                uint_result_type, urbg_result_type>::type;
+
+ private:
+  // Estimate N as ceil(width / urng width), and W0 as (width / N).
+  static constexpr size_t kRangeBits =
+      FastUniformBitsURBGConstants<URBG>::kRangeBits;
+
+  // The range of the URNG, max - min + 1, or zero if that result would cause
+  // overflow.
+  static constexpr result_type kRange = constexpr_range<URBG>();
+  static constexpr size_t kEstimateN =
+      kWidth / kRangeBits + (kWidth % kRangeBits != 0);
+  static constexpr size_t kEstimateW0 = kWidth / kEstimateN;
+  static constexpr result_type kEstimateY0 = (kRange >> kEstimateW0)
+                                             << kEstimateW0;
+
+ public:
+  // Parameters for the two loops:
+  // kN0, kN1 are the number of underlying calls required for each loop.
+  // KW0, kW1 are shift widths for each loop.
+  //
+  static constexpr size_t kN1 = (kRange - kEstimateY0) >
+                                        (kEstimateY0 / kEstimateN)
+                                    ? kEstimateN + 1
+                                    : kEstimateN;
+  static constexpr size_t kN0 = kN1 - (kWidth % kN1);
+  static constexpr size_t kW0 = kWidth / kN1;
+  static constexpr size_t kW1 = kW0 + 1;
+
+  static constexpr result_type kM0 = (result_type(1) << kW0) - 1;
+  static constexpr result_type kM1 = (result_type(1) << kW1) - 1;
+
+  static_assert(
+      kW0 <= kRangeBits,
+      "Class-template FastUniformBitsLoopingConstants::kW0 too large.");
+
+  static_assert(
+      kW0 > 0,
+      "Class-template FastUniformBitsLoopingConstants::kW0 too small.");
+};
+
+template <typename UIntType, size_t Width>
+template <typename URBG>
+typename FastUniformBits<UIntType, Width>::result_type
+FastUniformBits<UIntType, Width>::operator()(
+    URBG& g) {  // NOLINT(runtime/references)
+  using constants = FastUniformBitsURBGConstants<URBG>;
+  return Generate(
+      g, std::integral_constant<bool, constants::kRangeMask >= (max)()>{});
+}
+
+template <typename UIntType, size_t Width>
+template <typename URBG>
+typename URBG::result_type FastUniformBits<UIntType, Width>::Variate(
+    URBG& g) {  // NOLINT(runtime/references)
+  using constants = FastUniformBitsURBGConstants<URBG>;
+  if (constants::kPowerOfTwo) {
+    return g() - (URBG::min)();
+  }
+
+  // Use rejection sampling to ensure uniformity across the range.
+  typename URBG::result_type u;
+  do {
+    u = g() - (URBG::min)();
+  } while (u > constants::kRangeMask);
+  return u;
+}
+
+template <typename UIntType, size_t Width>
+template <typename URBG>
+typename FastUniformBits<UIntType, Width>::result_type
+FastUniformBits<UIntType, Width>::Generate(
+    URBG& g,  // NOLINT(runtime/references)
+    std::true_type /* avoid_looping */) {
+  // The width of the result_type is less than than the width of the random bits
+  // provided by URNG.  Thus, generate a single value and then simply mask off
+  // the required bits.
+  return Variate(g) & (max)();
+}
+
+template <typename UIntType, size_t Width>
+template <typename URBG>
+typename FastUniformBits<UIntType, Width>::result_type
+FastUniformBits<UIntType, Width>::Generate(
+    URBG& g,  // NOLINT(runtime/references)
+    std::false_type /* avoid_looping */) {
+  // The width of the result_type is wider than the number of random bits
+  // provided by URNG. Thus we merge several variates of URNG into the result
+  // using a shift and mask.  The constants type generates the parameters used
+  // ensure that the bits are distributed across all the invocations of the
+  // underlying URNG.
+  using constants = FastUniformBitsLoopingConstants<UIntType, Width, URBG>;
+
+  result_type s = 0;
+  for (size_t n = 0; n < constants::kN0; ++n) {
+    auto u = Variate(g);
+    s = (s << constants::kW0) + (u & constants::kM0);
+  }
+  for (size_t n = constants::kN0; n < constants::kN1; ++n) {
+    auto u = Variate(g);
+    s = (s << constants::kW1) + (u & constants::kM1);
+  }
+  return s;
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_FAST_UNIFORM_BITS_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits_test.cc b/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits_test.cc
new file mode 100644
index 0000000..f4b9cd5f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits_test.cc
@@ -0,0 +1,290 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/fast_uniform_bits.h"
+
+#include <random>
+
+#include "gtest/gtest.h"
+
+namespace {
+
+template <typename IntType>
+class FastUniformBitsTypedTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<uint8_t, uint16_t, uint32_t, uint64_t>;
+
+TYPED_TEST_SUITE(FastUniformBitsTypedTest, IntTypes);
+
+TYPED_TEST(FastUniformBitsTypedTest, BasicTest) {
+  using Limits = std::numeric_limits<TypeParam>;
+  using FastBits = absl::random_internal::FastUniformBits<TypeParam>;
+
+  EXPECT_EQ(0, FastBits::min());
+  EXPECT_EQ(Limits::max(), FastBits::max());
+
+  constexpr int kIters = 10000;
+  std::random_device rd;
+  std::mt19937 gen(rd());
+  FastBits fast;
+  for (int i = 0; i < kIters; i++) {
+    const auto v = fast(gen);
+    EXPECT_LE(v, FastBits::max());
+    EXPECT_GE(v, FastBits::min());
+  }
+}
+
+TEST(FastUniformBitsTest, TypeBoundaries32) {
+  // Tests that FastUniformBits can adapt to 32-bit boundaries.
+  absl::random_internal::FastUniformBits<uint32_t, 1> a;
+  absl::random_internal::FastUniformBits<uint32_t, 31> b;
+  absl::random_internal::FastUniformBits<uint32_t, 32> c;
+
+  {
+    std::mt19937 gen;  // 32-bit
+    a(gen);
+    b(gen);
+    c(gen);
+  }
+
+  {
+    std::mt19937_64 gen;  // 64-bit
+    a(gen);
+    b(gen);
+    c(gen);
+  }
+}
+
+TEST(FastUniformBitsTest, TypeBoundaries64) {
+  // Tests that FastUniformBits can adapt to 64-bit boundaries.
+  absl::random_internal::FastUniformBits<uint64_t, 1> a;
+  absl::random_internal::FastUniformBits<uint64_t, 31> b;
+  absl::random_internal::FastUniformBits<uint64_t, 32> c;
+  absl::random_internal::FastUniformBits<uint64_t, 33> d;
+  absl::random_internal::FastUniformBits<uint64_t, 63> e;
+  absl::random_internal::FastUniformBits<uint64_t, 64> f;
+
+  {
+    std::mt19937 gen;  // 32-bit
+    a(gen);
+    b(gen);
+    c(gen);
+    d(gen);
+    e(gen);
+    f(gen);
+  }
+
+  {
+    std::mt19937_64 gen;  // 64-bit
+    a(gen);
+    b(gen);
+    c(gen);
+    d(gen);
+    e(gen);
+    f(gen);
+  }
+}
+
+class UrngOddbits {
+ public:
+  using result_type = uint8_t;
+  static constexpr result_type min() { return 1; }
+  static constexpr result_type max() { return 0xfe; }
+  result_type operator()() { return 2; }
+};
+
+class Urng4bits {
+ public:
+  using result_type = uint8_t;
+  static constexpr result_type min() { return 1; }
+  static constexpr result_type max() { return 0xf + 1; }
+  result_type operator()() { return 2; }
+};
+
+class Urng32bits {
+ public:
+  using result_type = uint32_t;
+  static constexpr result_type min() { return 0; }
+  static constexpr result_type max() { return 0xffffffff; }
+  result_type operator()() { return 1; }
+};
+
+// Compile-time test to validate the helper classes used by FastUniformBits
+TEST(FastUniformBitsTest, FastUniformBitsDetails) {
+  using absl::random_internal::FastUniformBitsLoopingConstants;
+  using absl::random_internal::FastUniformBitsURBGConstants;
+
+  // 4-bit URBG
+  {
+    using constants = FastUniformBitsURBGConstants<Urng4bits>;
+    static_assert(constants::kPowerOfTwo == true,
+                  "constants::kPowerOfTwo == false");
+    static_assert(constants::kRange == 16, "constants::kRange == false");
+    static_assert(constants::kRangeBits == 4, "constants::kRangeBits == false");
+    static_assert(constants::kRangeMask == 0x0f,
+                  "constants::kRangeMask == false");
+  }
+  {
+    using looping = FastUniformBitsLoopingConstants<uint32_t, 31, Urng4bits>;
+    // To get 31 bits from a 4-bit generator, issue 8 calls and extract 4 bits
+    // per call on all except the first.
+    static_assert(looping::kN0 == 1, "looping::kN0");
+    static_assert(looping::kW0 == 3, "looping::kW0");
+    static_assert(looping::kM0 == 0x7, "looping::kM0");
+    // (The second set of calls, kN1, will not do anything.)
+    static_assert(looping::kN1 == 8, "looping::kN1");
+    static_assert(looping::kW1 == 4, "looping::kW1");
+    static_assert(looping::kM1 == 0xf, "looping::kM1");
+  }
+
+  // ~7-bit URBG
+  {
+    using constants = FastUniformBitsURBGConstants<UrngOddbits>;
+    static_assert(constants::kPowerOfTwo == false,
+                  "constants::kPowerOfTwo == false");
+    static_assert(constants::kRange == 0xfe, "constants::kRange == 0xfe");
+    static_assert(constants::kRangeBits == 7, "constants::kRangeBits == 7");
+    static_assert(constants::kRangeMask == 0x7f,
+                  "constants::kRangeMask == 0x7f");
+  }
+  {
+    using looping = FastUniformBitsLoopingConstants<uint64_t, 60, UrngOddbits>;
+    // To get 60 bits from a 7-bit generator, issue 10 calls and extract 6 bits
+    // per call, discarding the excess entropy.
+    static_assert(looping::kN0 == 10, "looping::kN0");
+    static_assert(looping::kW0 == 6, "looping::kW0");
+    static_assert(looping::kM0 == 0x3f, "looping::kM0");
+    // (The second set of calls, kN1, will not do anything.)
+    static_assert(looping::kN1 == 10, "looping::kN1");
+    static_assert(looping::kW1 == 7, "looping::kW1");
+    static_assert(looping::kM1 == 0x7f, "looping::kM1");
+  }
+  {
+    using looping = FastUniformBitsLoopingConstants<uint64_t, 63, UrngOddbits>;
+    // To get 63 bits from a 7-bit generator, issue 10 calls--the same as we
+    // would issue for 60 bits--however this time we use two groups.  The first
+    // group (kN0) will issue 7 calls, extracting 6 bits per call.
+    static_assert(looping::kN0 == 7, "looping::kN0");
+    static_assert(looping::kW0 == 6, "looping::kW0");
+    static_assert(looping::kM0 == 0x3f, "looping::kM0");
+    // The second group (kN1) will issue 3 calls, extracting 7 bits per call.
+    static_assert(looping::kN1 == 10, "looping::kN1");
+    static_assert(looping::kW1 == 7, "looping::kW1");
+    static_assert(looping::kM1 == 0x7f, "looping::kM1");
+  }
+}
+
+TEST(FastUniformBitsTest, Urng4_VariousOutputs) {
+  // Tests that how values are composed; the single-bit deltas should be spread
+  // across each invocation.
+  Urng4bits urng4;
+  Urng32bits urng32;
+
+  // 8-bit types
+  {
+    absl::random_internal::FastUniformBits<uint8_t, 1> fast1;
+    EXPECT_EQ(0x1, fast1(urng4));
+    EXPECT_EQ(0x1, fast1(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint8_t, 2> fast2;
+    EXPECT_EQ(0x1, fast2(urng4));
+    EXPECT_EQ(0x1, fast2(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint8_t, 4> fast4;
+    EXPECT_EQ(0x1, fast4(urng4));
+    EXPECT_EQ(0x1, fast4(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint8_t, 6> fast6;
+    EXPECT_EQ(0x9, fast6(urng4));  // b001001 (2x3)
+    EXPECT_EQ(0x1, fast6(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint8_t, 6> fast7;
+    EXPECT_EQ(0x9, fast7(urng4));  // b00001001 (1x4 + 1x3)
+    EXPECT_EQ(0x1, fast7(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint8_t> fast8;
+    EXPECT_EQ(0x11, fast8(urng4));
+    EXPECT_EQ(0x1, fast8(urng32));
+  }
+
+  // 16-bit types
+  {
+    absl::random_internal::FastUniformBits<uint16_t, 10> fast10;
+    EXPECT_EQ(0x91, fast10(urng4));  // b 0010010001 (2x3 + 1x4)
+    EXPECT_EQ(0x1, fast10(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint16_t, 11> fast11;
+    EXPECT_EQ(0x111, fast11(urng4));
+    EXPECT_EQ(0x1, fast11(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint16_t, 12> fast12;
+    EXPECT_EQ(0x111, fast12(urng4));
+    EXPECT_EQ(0x1, fast12(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint16_t> fast16;
+    EXPECT_EQ(0x1111, fast16(urng4));
+    EXPECT_EQ(0x1, fast16(urng32));
+  }
+
+  // 32-bit types
+  {
+    absl::random_internal::FastUniformBits<uint32_t, 21> fast21;
+    EXPECT_EQ(0x49111, fast21(urng4));  // b 001001001 000100010001 (3x3 + 3x4)
+    EXPECT_EQ(0x1, fast21(urng32));
+  }
+  {
+    absl::random_internal::FastUniformBits<uint32_t, 24> fast24;
+    EXPECT_EQ(0x111111, fast24(urng4));
+    EXPECT_EQ(0x1, fast24(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint32_t> fast32;
+    EXPECT_EQ(0x11111111, fast32(urng4));
+    EXPECT_EQ(0x1, fast32(urng32));
+  }
+
+  // 64-bit types
+  {
+    absl::random_internal::FastUniformBits<uint64_t, 5> fast5;
+    EXPECT_EQ(0x9, fast5(urng4));
+    EXPECT_EQ(0x1, fast5(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint64_t, 48> fast48;
+    EXPECT_EQ(0x111111111111, fast48(urng4));
+    // computes in 2 steps, should be 24 << 24
+    EXPECT_EQ(0x000001000001, fast48(urng32));
+  }
+
+  {
+    absl::random_internal::FastUniformBits<uint64_t> fast64;
+    EXPECT_EQ(0x1111111111111111, fast64(urng4));
+    EXPECT_EQ(0x0000000100000001, fast64(urng32));
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/fastmath.h b/third_party/abseil-cpp/absl/random/internal/fastmath.h
new file mode 100644
index 0000000..4bd18410
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/fastmath.h
@@ -0,0 +1,72 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_FASTMATH_H_
+#define ABSL_RANDOM_INTERNAL_FASTMATH_H_
+
+// This file contains fast math functions (bitwise ops as well as some others)
+// which are implementation details of various absl random number distributions.
+
+#include <cassert>
+#include <cmath>
+#include <cstdint>
+
+#include "absl/base/internal/bits.h"
+
+namespace absl {
+namespace random_internal {
+
+// Returns the position of the first bit set.
+inline int LeadingSetBit(uint64_t n) {
+  return 64 - base_internal::CountLeadingZeros64(n);
+}
+
+// Compute log2(n) using integer operations.
+// While std::log2 is more accurate than std::log(n) / std::log(2), for
+// very large numbers--those close to std::numeric_limits<uint64_t>::max() - 2,
+// for instance--std::log2 rounds up rather than down, which introduces
+// definite skew in the results.
+inline int IntLog2Floor(uint64_t n) {
+  return (n <= 1) ? 0 : (63 - base_internal::CountLeadingZeros64(n));
+}
+inline int IntLog2Ceil(uint64_t n) {
+  return (n <= 1) ? 0 : (64 - base_internal::CountLeadingZeros64(n - 1));
+}
+
+inline double StirlingLogFactorial(double n) {
+  assert(n >= 1);
+  // Using Stirling's approximation.
+  constexpr double kLog2PI = 1.83787706640934548356;
+  const double logn = std::log(n);
+  const double ninv = 1.0 / static_cast<double>(n);
+  return n * logn - n + 0.5 * (kLog2PI + logn) + (1.0 / 12.0) * ninv -
+         (1.0 / 360.0) * ninv * ninv * ninv;
+}
+
+// Rotate value right.
+//
+// We only implement the uint32_t / uint64_t versions because
+// 1) those are the only ones we use, and
+// 2) those are the only ones where clang detects the rotate idiom correctly.
+inline constexpr uint32_t rotr(uint32_t value, uint8_t bits) {
+  return (value >> (bits & 31)) | (value << ((-bits) & 31));
+}
+inline constexpr uint64_t rotr(uint64_t value, uint8_t bits) {
+  return (value >> (bits & 63)) | (value << ((-bits) & 63));
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_FASTMATH_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/fastmath_test.cc b/third_party/abseil-cpp/absl/random/internal/fastmath_test.cc
new file mode 100644
index 0000000..65859c2
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/fastmath_test.cc
@@ -0,0 +1,110 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/fastmath.h"
+
+#include "gtest/gtest.h"
+
+#if defined(__native_client__) || defined(__EMSCRIPTEN__)
+// NACL has a less accurate implementation of std::log2 than most of
+// the other platforms. For some values which should have integral results,
+// sometimes NACL returns slightly larger values.
+//
+// The MUSL libc used by emscripten also has a similar bug.
+#define ABSL_RANDOM_INACCURATE_LOG2
+#endif
+
+namespace {
+
+TEST(DistributionImplTest, LeadingSetBit) {
+  using absl::random_internal::LeadingSetBit;
+  constexpr uint64_t kZero = 0;
+  EXPECT_EQ(0, LeadingSetBit(kZero));
+  EXPECT_EQ(64, LeadingSetBit(~kZero));
+
+  for (int index = 0; index < 64; index++) {
+    uint64_t x = static_cast<uint64_t>(1) << index;
+    EXPECT_EQ(index + 1, LeadingSetBit(x)) << index;
+    EXPECT_EQ(index + 1, LeadingSetBit(x + x - 1)) << index;
+  }
+}
+
+TEST(FastMathTest, IntLog2FloorTest) {
+  using absl::random_internal::IntLog2Floor;
+  constexpr uint64_t kZero = 0;
+  EXPECT_EQ(0, IntLog2Floor(0));  // boundary. return 0.
+  EXPECT_EQ(0, IntLog2Floor(1));
+  EXPECT_EQ(1, IntLog2Floor(2));
+  EXPECT_EQ(63, IntLog2Floor(~kZero));
+
+  // A boundary case: Converting 0xffffffffffffffff requires > 53
+  // bits of precision, so the conversion to double rounds up,
+  // and the result of std::log2(x) > IntLog2Floor(x).
+  EXPECT_LT(IntLog2Floor(~kZero), static_cast<int>(std::log2(~kZero)));
+
+  for (int i = 0; i < 64; i++) {
+    const uint64_t i_pow_2 = static_cast<uint64_t>(1) << i;
+    EXPECT_EQ(i, IntLog2Floor(i_pow_2));
+    EXPECT_EQ(i, static_cast<int>(std::log2(i_pow_2)));
+
+    uint64_t y = i_pow_2;
+    for (int j = i - 1; j > 0; --j) {
+      y = y | (i_pow_2 >> j);
+      EXPECT_EQ(i, IntLog2Floor(y));
+    }
+  }
+}
+
+TEST(FastMathTest, IntLog2CeilTest) {
+  using absl::random_internal::IntLog2Ceil;
+  constexpr uint64_t kZero = 0;
+  EXPECT_EQ(0, IntLog2Ceil(0));  // boundary. return 0.
+  EXPECT_EQ(0, IntLog2Ceil(1));
+  EXPECT_EQ(1, IntLog2Ceil(2));
+  EXPECT_EQ(64, IntLog2Ceil(~kZero));
+
+  // A boundary case: Converting 0xffffffffffffffff requires > 53
+  // bits of precision, so the conversion to double rounds up,
+  // and the result of std::log2(x) > IntLog2Floor(x).
+  EXPECT_LE(IntLog2Ceil(~kZero), static_cast<int>(std::log2(~kZero)));
+
+  for (int i = 0; i < 64; i++) {
+    const uint64_t i_pow_2 = static_cast<uint64_t>(1) << i;
+    EXPECT_EQ(i, IntLog2Ceil(i_pow_2));
+#ifndef ABSL_RANDOM_INACCURATE_LOG2
+    EXPECT_EQ(i, static_cast<int>(std::ceil(std::log2(i_pow_2))));
+#endif
+
+    uint64_t y = i_pow_2;
+    for (int j = i - 1; j > 0; --j) {
+      y = y | (i_pow_2 >> j);
+      EXPECT_EQ(i + 1, IntLog2Ceil(y));
+    }
+  }
+}
+
+TEST(FastMathTest, StirlingLogFactorial) {
+  using absl::random_internal::StirlingLogFactorial;
+
+  EXPECT_NEAR(StirlingLogFactorial(1.0), 0, 1e-3);
+  EXPECT_NEAR(StirlingLogFactorial(1.50), 0.284683, 1e-3);
+  EXPECT_NEAR(StirlingLogFactorial(2.0), 0.69314718056, 1e-4);
+
+  for (int i = 2; i < 50; i++) {
+    double d = static_cast<double>(i);
+    EXPECT_NEAR(StirlingLogFactorial(d), std::lgamma(d + 1), 3e-5);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/gaussian_distribution_gentables.cc b/third_party/abseil-cpp/absl/random/internal/gaussian_distribution_gentables.cc
new file mode 100644
index 0000000..85247966
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/gaussian_distribution_gentables.cc
@@ -0,0 +1,139 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Generates gaussian_distribution.cc
+//
+// $ blaze run :gaussian_distribution_gentables > gaussian_distribution.cc
+//
+#include "absl/random/gaussian_distribution.h"
+
+#include <cmath>
+#include <cstddef>
+#include <iostream>
+#include <limits>
+#include <string>
+
+#include "absl/base/macros.h"
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+template <typename T, size_t N>
+void FormatArrayContents(std::ostream* os, T (&data)[N]) {
+  if (!std::numeric_limits<T>::is_exact) {
+    // Note: T is either an integer or a float.
+    // float requires higher precision to ensure that values are
+    // reproduced exactly.
+    // Trivia: C99 has hexadecimal floating point literals, but C++11 does not.
+    // Using them would remove all concern of precision loss.
+    os->precision(std::numeric_limits<T>::max_digits10 + 2);
+  }
+  *os << "    {";
+  std::string separator = "";
+  for (size_t i = 0; i < N; ++i) {
+    *os << separator << data[i];
+    if ((i + 1) % 3 != 0) {
+      separator = ", ";
+    } else {
+      separator = ",\n     ";
+    }
+  }
+  *os << "}";
+}
+
+}  // namespace
+
+class TableGenerator : public gaussian_distribution_base {
+ public:
+  TableGenerator();
+  void Print(std::ostream* os);
+
+  using gaussian_distribution_base::kMask;
+  using gaussian_distribution_base::kR;
+  using gaussian_distribution_base::kV;
+
+ private:
+  Tables tables_;
+};
+
+// Ziggurat gaussian initialization.  For an explanation of the algorithm, see
+// the Marsaglia paper, "The Ziggurat Method for Generating Random Variables".
+//   http://www.jstatsoft.org/v05/i08/
+//
+// Further details are available in the Doornik paper
+//   https://www.doornik.com/research/ziggurat.pdf
+//
+TableGenerator::TableGenerator() {
+  // The constants here should match the values in gaussian_distribution.h
+  static constexpr int kC = kMask + 1;
+
+  static_assert((ABSL_ARRAYSIZE(tables_.x) == kC + 1),
+                "xArray must be length kMask + 2");
+
+  static_assert((ABSL_ARRAYSIZE(tables_.x) == ABSL_ARRAYSIZE(tables_.f)),
+                "fx and x arrays must be identical length");
+
+  auto f = [](double x) { return std::exp(-0.5 * x * x); };
+  auto f_inv = [](double x) { return std::sqrt(-2.0 * std::log(x)); };
+
+  tables_.x[0] = kV / f(kR);
+  tables_.f[0] = f(tables_.x[0]);
+
+  tables_.x[1] = kR;
+  tables_.f[1] = f(tables_.x[1]);
+
+  tables_.x[kC] = 0.0;
+  tables_.f[kC] = f(tables_.x[kC]);  // 1.0
+
+  for (int i = 2; i < kC; i++) {
+    double v = (kV / tables_.x[i - 1]) + tables_.f[i - 1];
+    tables_.x[i] = f_inv(v);
+    tables_.f[i] = v;
+  }
+}
+
+void TableGenerator::Print(std::ostream* os) {
+  *os << "// BEGIN GENERATED CODE; DO NOT EDIT\n"
+         "// clang-format off\n"
+         "\n"
+         "#include \"absl/random/gaussian_distribution.h\"\n"
+         "\n"
+         "namespace absl {\n"
+         "namespace random_internal {\n"
+         "\n"
+         "const gaussian_distribution_base::Tables\n"
+         "    gaussian_distribution_base::zg_ = {\n";
+  FormatArrayContents(os, tables_.x);
+  *os << ",\n";
+  FormatArrayContents(os, tables_.f);
+  *os << "};\n"
+         "\n"
+         "}  // namespace random_internal\n"
+         "}  // namespace absl\n"
+         "\n"
+         "// clang-format on\n"
+         "// END GENERATED CODE";
+  *os << std::endl;
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+int main(int, char**) {
+  std::cerr << "\nCopy the output to gaussian_distribution.cc" << std::endl;
+  absl::random_internal::TableGenerator generator;
+  generator.Print(&std::cout);
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h b/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h
new file mode 100644
index 0000000..df88fa7
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h
@@ -0,0 +1,243 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_IOSTREAM_STATE_SAVER_H_
+#define ABSL_RANDOM_INTERNAL_IOSTREAM_STATE_SAVER_H_
+
+#include <cmath>
+#include <iostream>
+#include <limits>
+#include <type_traits>
+
+#include "absl/meta/type_traits.h"
+#include "absl/numeric/int128.h"
+
+namespace absl {
+namespace random_internal {
+
+// The null_state_saver does nothing.
+template <typename T>
+class null_state_saver {
+ public:
+  using stream_type = T;
+  using flags_type = std::ios_base::fmtflags;
+
+  null_state_saver(T&, flags_type) {}
+  ~null_state_saver() {}
+};
+
+// ostream_state_saver is a RAII object to save and restore the common
+// basic_ostream flags used when implementing `operator <<()` on any of
+// the absl random distributions.
+template <typename OStream>
+class ostream_state_saver {
+ public:
+  using ostream_type = OStream;
+  using flags_type = std::ios_base::fmtflags;
+  using fill_type = typename ostream_type::char_type;
+  using precision_type = std::streamsize;
+
+  ostream_state_saver(ostream_type& os,  // NOLINT(runtime/references)
+                      flags_type flags, fill_type fill)
+      : os_(os),
+        flags_(os.flags(flags)),
+        fill_(os.fill(fill)),
+        precision_(os.precision()) {
+    // Save state in initialized variables.
+  }
+
+  ~ostream_state_saver() {
+    // Restore saved state.
+    os_.precision(precision_);
+    os_.fill(fill_);
+    os_.flags(flags_);
+  }
+
+ private:
+  ostream_type& os_;
+  const flags_type flags_;
+  const fill_type fill_;
+  const precision_type precision_;
+};
+
+#if defined(__NDK_MAJOR__) && __NDK_MAJOR__ < 16
+#define ABSL_RANDOM_INTERNAL_IOSTREAM_HEXFLOAT 1
+#else
+#define ABSL_RANDOM_INTERNAL_IOSTREAM_HEXFLOAT 0
+#endif
+
+template <typename CharT, typename Traits>
+ostream_state_saver<std::basic_ostream<CharT, Traits>> make_ostream_state_saver(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    std::ios_base::fmtflags flags = std::ios_base::dec | std::ios_base::left |
+#if ABSL_RANDOM_INTERNAL_IOSTREAM_HEXFLOAT
+                                    std::ios_base::fixed |
+#endif
+                                    std::ios_base::scientific) {
+  using result_type = ostream_state_saver<std::basic_ostream<CharT, Traits>>;
+  return result_type(os, flags, os.widen(' '));
+}
+
+template <typename T>
+typename absl::enable_if_t<!std::is_base_of<std::ios_base, T>::value,
+                           null_state_saver<T>>
+make_ostream_state_saver(T& is,  // NOLINT(runtime/references)
+                         std::ios_base::fmtflags flags = std::ios_base::dec) {
+  std::cerr << "null_state_saver";
+  using result_type = null_state_saver<T>;
+  return result_type(is, flags);
+}
+
+// stream_precision_helper<type>::kPrecision returns the base 10 precision
+// required to stream and reconstruct a real type exact binary value through
+// a binary->decimal->binary transition.
+template <typename T>
+struct stream_precision_helper {
+  // max_digits10 may be 0 on MSVC; if so, use digits10 + 3.
+  static constexpr int kPrecision =
+      (std::numeric_limits<T>::max_digits10 > std::numeric_limits<T>::digits10)
+          ? std::numeric_limits<T>::max_digits10
+          : (std::numeric_limits<T>::digits10 + 3);
+};
+
+template <>
+struct stream_precision_helper<float> {
+  static constexpr int kPrecision = 9;
+};
+template <>
+struct stream_precision_helper<double> {
+  static constexpr int kPrecision = 17;
+};
+template <>
+struct stream_precision_helper<long double> {
+  static constexpr int kPrecision = 36;  // assuming fp128
+};
+
+// istream_state_saver is a RAII object to save and restore the common
+// std::basic_istream<> flags used when implementing `operator >>()` on any of
+// the absl random distributions.
+template <typename IStream>
+class istream_state_saver {
+ public:
+  using istream_type = IStream;
+  using flags_type = std::ios_base::fmtflags;
+
+  istream_state_saver(istream_type& is,  // NOLINT(runtime/references)
+                      flags_type flags)
+      : is_(is), flags_(is.flags(flags)) {}
+
+  ~istream_state_saver() { is_.flags(flags_); }
+
+ private:
+  istream_type& is_;
+  flags_type flags_;
+};
+
+template <typename CharT, typename Traits>
+istream_state_saver<std::basic_istream<CharT, Traits>> make_istream_state_saver(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    std::ios_base::fmtflags flags = std::ios_base::dec |
+                                    std::ios_base::scientific |
+                                    std::ios_base::skipws) {
+  using result_type = istream_state_saver<std::basic_istream<CharT, Traits>>;
+  return result_type(is, flags);
+}
+
+template <typename T>
+typename absl::enable_if_t<!std::is_base_of<std::ios_base, T>::value,
+                           null_state_saver<T>>
+make_istream_state_saver(T& is,  // NOLINT(runtime/references)
+                         std::ios_base::fmtflags flags = std::ios_base::dec) {
+  using result_type = null_state_saver<T>;
+  return result_type(is, flags);
+}
+
+// stream_format_type<T> is a helper struct to convert types which
+// basic_iostream cannot output as decimal numbers into types which
+// basic_iostream can output as decimal numbers. Specifically:
+// * signed/unsigned char-width types are converted to int.
+// * TODO(lar): __int128 => uint128, except there is no operator << yet.
+//
+template <typename T>
+struct stream_format_type
+    : public std::conditional<(sizeof(T) == sizeof(char)), int, T> {};
+
+// stream_u128_helper allows us to write out either absl::uint128 or
+// __uint128_t types in the same way, which enables their use as internal
+// state of PRNG engines.
+template <typename T>
+struct stream_u128_helper;
+
+template <>
+struct stream_u128_helper<absl::uint128> {
+  template <typename IStream>
+  inline absl::uint128 read(IStream& in) {
+    uint64_t h = 0;
+    uint64_t l = 0;
+    in >> h >> l;
+    return absl::MakeUint128(h, l);
+  }
+
+  template <typename OStream>
+  inline void write(absl::uint128 val, OStream& out) {
+    uint64_t h = Uint128High64(val);
+    uint64_t l = Uint128Low64(val);
+    out << h << out.fill() << l;
+  }
+};
+
+#ifdef ABSL_HAVE_INTRINSIC_INT128
+template <>
+struct stream_u128_helper<__uint128_t> {
+  template <typename IStream>
+  inline __uint128_t read(IStream& in) {
+    uint64_t h = 0;
+    uint64_t l = 0;
+    in >> h >> l;
+    return (static_cast<__uint128_t>(h) << 64) | l;
+  }
+
+  template <typename OStream>
+  inline void write(__uint128_t val, OStream& out) {
+    uint64_t h = static_cast<uint64_t>(val >> 64u);
+    uint64_t l = static_cast<uint64_t>(val);
+    out << h << out.fill() << l;
+  }
+};
+#endif
+
+template <typename FloatType, typename IStream>
+inline FloatType read_floating_point(IStream& is) {
+  static_assert(std::is_floating_point<FloatType>::value, "");
+  FloatType dest;
+  is >> dest;
+  // Parsing a double value may report a subnormal value as an error
+  // despite being able to represent it.
+  // See https://stackoverflow.com/q/52410931/3286653
+  // It may also report an underflow when parsing DOUBLE_MIN as an
+  // ERANGE error, as the parsed value may be smaller than DOUBLE_MIN
+  // and rounded up.
+  // See: https://stackoverflow.com/q/42005462
+  if (is.fail() &&
+      (std::fabs(dest) == (std::numeric_limits<FloatType>::min)() ||
+       std::fpclassify(dest) == FP_SUBNORMAL)) {
+    is.clear(is.rdstate() & (~std::ios_base::failbit));
+  }
+  return dest;
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_IOSTREAM_STATE_SAVER_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc b/third_party/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc
new file mode 100644
index 0000000..2ecbaac
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc
@@ -0,0 +1,369 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/iostream_state_saver.h"
+
+#include <sstream>
+#include <string>
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using absl::random_internal::make_istream_state_saver;
+using absl::random_internal::make_ostream_state_saver;
+using absl::random_internal::stream_precision_helper;
+
+template <typename T>
+typename absl::enable_if_t<std::is_integral<T>::value, T>  //
+StreamRoundTrip(T t) {
+  std::stringstream ss;
+  {
+    auto saver = make_ostream_state_saver(ss);
+    ss.precision(stream_precision_helper<T>::kPrecision);
+    ss << t;
+  }
+  T result = 0;
+  {
+    auto saver = make_istream_state_saver(ss);
+    ss >> result;
+  }
+  EXPECT_FALSE(ss.fail())            //
+      << ss.str() << " "             //
+      << (ss.good() ? "good " : "")  //
+      << (ss.bad() ? "bad " : "")    //
+      << (ss.eof() ? "eof " : "")    //
+      << (ss.fail() ? "fail " : "");
+
+  return result;
+}
+
+template <typename T>
+typename absl::enable_if_t<std::is_floating_point<T>::value, T>  //
+StreamRoundTrip(T t) {
+  std::stringstream ss;
+  {
+    auto saver = make_ostream_state_saver(ss);
+    ss.precision(stream_precision_helper<T>::kPrecision);
+    ss << t;
+  }
+  T result = 0;
+  {
+    auto saver = make_istream_state_saver(ss);
+    result = absl::random_internal::read_floating_point<T>(ss);
+  }
+  EXPECT_FALSE(ss.fail())            //
+      << ss.str() << " "             //
+      << (ss.good() ? "good " : "")  //
+      << (ss.bad() ? "bad " : "")    //
+      << (ss.eof() ? "eof " : "")    //
+      << (ss.fail() ? "fail " : "");
+
+  return result;
+}
+
+TEST(IOStreamStateSaver, BasicSaverState) {
+  std::stringstream ss;
+  ss.precision(2);
+  ss.fill('x');
+  ss.flags(std::ios_base::dec | std::ios_base::right);
+
+  {
+    auto saver = make_ostream_state_saver(ss);
+    ss.precision(10);
+    EXPECT_NE('x', ss.fill());
+    EXPECT_EQ(10, ss.precision());
+    EXPECT_NE(std::ios_base::dec | std::ios_base::right, ss.flags());
+
+    ss << 1.23;
+  }
+
+  EXPECT_EQ('x', ss.fill());
+  EXPECT_EQ(2, ss.precision());
+  EXPECT_EQ(std::ios_base::dec | std::ios_base::right, ss.flags());
+}
+
+TEST(IOStreamStateSaver, RoundTripInts) {
+  const uint64_t kUintValues[] = {
+      0,
+      1,
+      static_cast<uint64_t>(-1),
+      2,
+      static_cast<uint64_t>(-2),
+
+      1 << 7,
+      1 << 8,
+      1 << 16,
+      1ull << 32,
+      1ull << 50,
+      1ull << 62,
+      1ull << 63,
+
+      (1 << 7) - 1,
+      (1 << 8) - 1,
+      (1 << 16) - 1,
+      (1ull << 32) - 1,
+      (1ull << 50) - 1,
+      (1ull << 62) - 1,
+      (1ull << 63) - 1,
+
+      static_cast<uint64_t>(-(1 << 8)),
+      static_cast<uint64_t>(-(1 << 16)),
+      static_cast<uint64_t>(-(1ll << 32)),
+      static_cast<uint64_t>(-(1ll << 50)),
+      static_cast<uint64_t>(-(1ll << 62)),
+
+      static_cast<uint64_t>(-(1 << 8) - 1),
+      static_cast<uint64_t>(-(1 << 16) - 1),
+      static_cast<uint64_t>(-(1ll << 32) - 1),
+      static_cast<uint64_t>(-(1ll << 50) - 1),
+      static_cast<uint64_t>(-(1ll << 62) - 1),
+  };
+
+  for (const uint64_t u : kUintValues) {
+    EXPECT_EQ(u, StreamRoundTrip<uint64_t>(u));
+
+    int64_t x = static_cast<int64_t>(u);
+    EXPECT_EQ(x, StreamRoundTrip<int64_t>(x));
+
+    double d = static_cast<double>(x);
+    EXPECT_EQ(d, StreamRoundTrip<double>(d));
+
+    float f = d;
+    EXPECT_EQ(f, StreamRoundTrip<float>(f));
+  }
+}
+
+TEST(IOStreamStateSaver, RoundTripFloats) {
+  static_assert(
+      stream_precision_helper<float>::kPrecision >= 9,
+      "stream_precision_helper<float>::kPrecision should be at least 9");
+
+  const float kValues[] = {
+      1,
+      std::nextafter(1.0f, 0.0f),  // 1 - epsilon
+      std::nextafter(1.0f, 2.0f),  // 1 + epsilon
+
+      1.0e+1f,
+      1.0e-1f,
+      1.0e+2f,
+      1.0e-2f,
+      1.0e+10f,
+      1.0e-10f,
+
+      0.00000051110000111311111111f,
+      -0.00000051110000111211111111f,
+
+      1.234678912345678912345e+6f,
+      1.234678912345678912345e-6f,
+      1.234678912345678912345e+30f,
+      1.234678912345678912345e-30f,
+      1.234678912345678912345e+38f,
+      1.0234678912345678912345e-38f,
+
+      // Boundary cases.
+      std::numeric_limits<float>::max(),
+      std::numeric_limits<float>::lowest(),
+      std::numeric_limits<float>::epsilon(),
+      std::nextafter(std::numeric_limits<float>::min(),
+                     1.0f),               // min + epsilon
+      std::numeric_limits<float>::min(),  // smallest normal
+      // There are some errors dealing with denorms on apple platforms.
+      std::numeric_limits<float>::denorm_min(),  // smallest denorm
+      std::numeric_limits<float>::min() / 2,
+      std::nextafter(std::numeric_limits<float>::min(),
+                     0.0f),  // denorm_max
+      std::nextafter(std::numeric_limits<float>::denorm_min(), 1.0f),
+  };
+
+  for (const float f : kValues) {
+    EXPECT_EQ(f, StreamRoundTrip<float>(f));
+    EXPECT_EQ(-f, StreamRoundTrip<float>(-f));
+
+    double d = f;
+    EXPECT_EQ(d, StreamRoundTrip<double>(d));
+    EXPECT_EQ(-d, StreamRoundTrip<double>(-d));
+
+    // Avoid undefined behavior (overflow/underflow).
+    if (d <= std::numeric_limits<int64_t>::max() &&
+        d >= std::numeric_limits<int64_t>::lowest()) {
+      int64_t x = static_cast<int64_t>(f);
+      EXPECT_EQ(x, StreamRoundTrip<int64_t>(x));
+    }
+  }
+}
+
+TEST(IOStreamStateSaver, RoundTripDoubles) {
+  static_assert(
+      stream_precision_helper<double>::kPrecision >= 17,
+      "stream_precision_helper<double>::kPrecision should be at least 17");
+
+  const double kValues[] = {
+      1,
+      std::nextafter(1.0, 0.0),  // 1 - epsilon
+      std::nextafter(1.0, 2.0),  // 1 + epsilon
+
+      1.0e+1,
+      1.0e-1,
+      1.0e+2,
+      1.0e-2,
+      1.0e+10,
+      1.0e-10,
+
+      0.00000051110000111311111111,
+      -0.00000051110000111211111111,
+
+      1.234678912345678912345e+6,
+      1.234678912345678912345e-6,
+      1.234678912345678912345e+30,
+      1.234678912345678912345e-30,
+      1.234678912345678912345e+38,
+      1.0234678912345678912345e-38,
+
+      1.0e+100,
+      1.0e-100,
+      1.234678912345678912345e+308,
+      1.0234678912345678912345e-308,
+      2.22507385850720138e-308,
+
+      // Boundary cases.
+      std::numeric_limits<double>::max(),
+      std::numeric_limits<double>::lowest(),
+      std::numeric_limits<double>::epsilon(),
+      std::nextafter(std::numeric_limits<double>::min(),
+                     1.0),                 // min + epsilon
+      std::numeric_limits<double>::min(),  // smallest normal
+      // There are some errors dealing with denorms on apple platforms.
+      std::numeric_limits<double>::denorm_min(),  // smallest denorm
+      std::numeric_limits<double>::min() / 2,
+      std::nextafter(std::numeric_limits<double>::min(),
+                     0.0),  // denorm_max
+      std::nextafter(std::numeric_limits<double>::denorm_min(), 1.0f),
+  };
+
+  for (const double d : kValues) {
+    EXPECT_EQ(d, StreamRoundTrip<double>(d));
+    EXPECT_EQ(-d, StreamRoundTrip<double>(-d));
+
+    // Avoid undefined behavior (overflow/underflow).
+    if (d <= std::numeric_limits<float>::max() &&
+        d >= std::numeric_limits<float>::lowest()) {
+      float f = static_cast<float>(d);
+      EXPECT_EQ(f, StreamRoundTrip<float>(f));
+    }
+
+    // Avoid undefined behavior (overflow/underflow).
+    if (d <= std::numeric_limits<int64_t>::max() &&
+        d >= std::numeric_limits<int64_t>::lowest()) {
+      int64_t x = static_cast<int64_t>(d);
+      EXPECT_EQ(x, StreamRoundTrip<int64_t>(x));
+    }
+  }
+}
+
+TEST(IOStreamStateSaver, RoundTripLongDoubles) {
+  // Technically, C++ only guarantees that long double is at least as large as a
+  // double.  Practically it varies from 64-bits to 128-bits.
+  //
+  // So it is best to consider long double a best-effort extended precision
+  // type.
+
+  static_assert(
+      stream_precision_helper<long double>::kPrecision >= 36,
+      "stream_precision_helper<long double>::kPrecision should be at least 36");
+
+  using real_type = long double;
+  const real_type kValues[] = {
+      1,
+      std::nextafter(1.0, 0.0),  // 1 - epsilon
+      std::nextafter(1.0, 2.0),  // 1 + epsilon
+
+      1.0e+1,
+      1.0e-1,
+      1.0e+2,
+      1.0e-2,
+      1.0e+10,
+      1.0e-10,
+
+      0.00000051110000111311111111,
+      -0.00000051110000111211111111,
+
+      1.2346789123456789123456789123456789e+6,
+      1.2346789123456789123456789123456789e-6,
+      1.2346789123456789123456789123456789e+30,
+      1.2346789123456789123456789123456789e-30,
+      1.2346789123456789123456789123456789e+38,
+      1.2346789123456789123456789123456789e-38,
+      1.2346789123456789123456789123456789e+308,
+      1.2346789123456789123456789123456789e-308,
+
+      1.0e+100,
+      1.0e-100,
+      1.234678912345678912345e+308,
+      1.0234678912345678912345e-308,
+
+      // Boundary cases.
+      std::numeric_limits<real_type>::max(),
+      std::numeric_limits<real_type>::lowest(),
+      std::numeric_limits<real_type>::epsilon(),
+      std::nextafter(std::numeric_limits<real_type>::min(),
+                     real_type(1)),           // min + epsilon
+      std::numeric_limits<real_type>::min(),  // smallest normal
+      // There are some errors dealing with denorms on apple platforms.
+      std::numeric_limits<real_type>::denorm_min(),  // smallest denorm
+      std::numeric_limits<real_type>::min() / 2,
+      std::nextafter(std::numeric_limits<real_type>::min(),
+                     0.0),  // denorm_max
+      std::nextafter(std::numeric_limits<real_type>::denorm_min(), 1.0f),
+  };
+
+  int index = -1;
+  for (const long double dd : kValues) {
+    index++;
+    EXPECT_EQ(dd, StreamRoundTrip<real_type>(dd)) << index;
+    EXPECT_EQ(-dd, StreamRoundTrip<real_type>(-dd)) << index;
+
+    // Avoid undefined behavior (overflow/underflow).
+    if (dd <= std::numeric_limits<double>::max() &&
+        dd >= std::numeric_limits<double>::lowest()) {
+      double d = static_cast<double>(dd);
+      EXPECT_EQ(d, StreamRoundTrip<double>(d));
+    }
+
+    // Avoid undefined behavior (overflow/underflow).
+    if (dd <= std::numeric_limits<int64_t>::max() &&
+        dd >= std::numeric_limits<int64_t>::lowest()) {
+      int64_t x = static_cast<int64_t>(dd);
+      EXPECT_EQ(x, StreamRoundTrip<int64_t>(x));
+    }
+  }
+}
+
+TEST(StrToDTest, DoubleMin) {
+  const char kV[] = "2.22507385850720138e-308";
+  char* end;
+  double x = std::strtod(kV, &end);
+  EXPECT_EQ(std::numeric_limits<double>::min(), x);
+  // errno may equal ERANGE.
+}
+
+TEST(StrToDTest, DoubleDenormMin) {
+  const char kV[] = "4.94065645841246544e-324";
+  char* end;
+  double x = std::strtod(kV, &end);
+  EXPECT_EQ(std::numeric_limits<double>::denorm_min(), x);
+  // errno may equal ERANGE.
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/named_generator.cc b/third_party/abseil-cpp/absl/random/internal/named_generator.cc
new file mode 100644
index 0000000..b168a25
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/named_generator.cc
@@ -0,0 +1,30 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <iostream>
+
+#include "absl/random/random.h"
+
+// This program is used in integration tests.
+
+int main() {
+  auto seed_seq = absl::MakeTaggedSeedSeq("TEST_GENERATOR", std::cerr);
+  absl::BitGen rng(seed_seq);
+  constexpr size_t kSequenceLength = 8;
+  for (size_t i = 0; i < kSequenceLength; i++) {
+    std::cout << rng() << "\n";
+  }
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/nanobenchmark.cc b/third_party/abseil-cpp/absl/random/internal/nanobenchmark.cc
new file mode 100644
index 0000000..5a8b1ed
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/nanobenchmark.cc
@@ -0,0 +1,792 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/nanobenchmark.h"
+
+#include <sys/types.h>
+
+#include <algorithm>  // sort
+#include <atomic>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <cstring>  // memcpy
+#include <limits>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/platform.h"
+#include "absl/random/internal/randen_engine.h"
+
+// OS
+#if defined(_WIN32) || defined(_WIN64)
+#define ABSL_OS_WIN
+#include <windows.h>  // NOLINT
+
+#elif defined(__ANDROID__)
+#define ABSL_OS_ANDROID
+
+#elif defined(__linux__)
+#define ABSL_OS_LINUX
+#include <sched.h>        // NOLINT
+#include <sys/syscall.h>  // NOLINT
+#endif
+
+#if defined(ABSL_ARCH_X86_64) && !defined(ABSL_OS_WIN)
+#include <cpuid.h>  // NOLINT
+#endif
+
+// __ppc_get_timebase_freq
+#if defined(ABSL_ARCH_PPC)
+#include <sys/platform/ppc.h>  // NOLINT
+#endif
+
+// clock_gettime
+#if defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
+#include <time.h>  // NOLINT
+#endif
+
+namespace absl {
+namespace random_internal_nanobenchmark {
+namespace {
+
+// For code folding.
+namespace platform {
+#if defined(ABSL_ARCH_X86_64)
+
+// TODO(janwas): Merge with the one in randen_hwaes.cc?
+void Cpuid(const uint32_t level, const uint32_t count,
+           uint32_t* ABSL_RANDOM_INTERNAL_RESTRICT abcd) {
+#if defined(ABSL_OS_WIN)
+  int regs[4];
+  __cpuidex(regs, level, count);
+  for (int i = 0; i < 4; ++i) {
+    abcd[i] = regs[i];
+  }
+#else
+  uint32_t a, b, c, d;
+  __cpuid_count(level, count, a, b, c, d);
+  abcd[0] = a;
+  abcd[1] = b;
+  abcd[2] = c;
+  abcd[3] = d;
+#endif
+}
+
+std::string BrandString() {
+  char brand_string[49];
+  uint32_t abcd[4];
+
+  // Check if brand std::string is supported (it is on all reasonable Intel/AMD)
+  Cpuid(0x80000000U, 0, abcd);
+  if (abcd[0] < 0x80000004U) {
+    return std::string();
+  }
+
+  for (int i = 0; i < 3; ++i) {
+    Cpuid(0x80000002U + i, 0, abcd);
+    memcpy(brand_string + i * 16, &abcd, sizeof(abcd));
+  }
+  brand_string[48] = 0;
+  return brand_string;
+}
+
+// Returns the frequency quoted inside the brand string. This does not
+// account for throttling nor Turbo Boost.
+double NominalClockRate() {
+  const std::string& brand_string = BrandString();
+  // Brand strings include the maximum configured frequency. These prefixes are
+  // defined by Intel CPUID documentation.
+  const char* prefixes[3] = {"MHz", "GHz", "THz"};
+  const double multipliers[3] = {1E6, 1E9, 1E12};
+  for (size_t i = 0; i < 3; ++i) {
+    const size_t pos_prefix = brand_string.find(prefixes[i]);
+    if (pos_prefix != std::string::npos) {
+      const size_t pos_space = brand_string.rfind(' ', pos_prefix - 1);
+      if (pos_space != std::string::npos) {
+        const std::string digits =
+            brand_string.substr(pos_space + 1, pos_prefix - pos_space - 1);
+        return std::stod(digits) * multipliers[i];
+      }
+    }
+  }
+
+  return 0.0;
+}
+
+#endif  // ABSL_ARCH_X86_64
+}  // namespace platform
+
+// Prevents the compiler from eliding the computations that led to "output".
+template <class T>
+inline void PreventElision(T&& output) {
+#ifndef ABSL_OS_WIN
+  // Works by indicating to the compiler that "output" is being read and
+  // modified. The +r constraint avoids unnecessary writes to memory, but only
+  // works for built-in types (typically FuncOutput).
+  asm volatile("" : "+r"(output) : : "memory");
+#else
+  // MSVC does not support inline assembly anymore (and never supported GCC's
+  // RTL constraints). Self-assignment with #pragma optimize("off") might be
+  // expected to prevent elision, but it does not with MSVC 2015. Type-punning
+  // with volatile pointers generates inefficient code on MSVC 2017.
+  static std::atomic<T> dummy(T{});
+  dummy.store(output, std::memory_order_relaxed);
+#endif
+}
+
+namespace timer {
+
+// Start/Stop return absolute timestamps and must be placed immediately before
+// and after the region to measure. We provide separate Start/Stop functions
+// because they use different fences.
+//
+// Background: RDTSC is not 'serializing'; earlier instructions may complete
+// after it, and/or later instructions may complete before it. 'Fences' ensure
+// regions' elapsed times are independent of such reordering. The only
+// documented unprivileged serializing instruction is CPUID, which acts as a
+// full fence (no reordering across it in either direction). Unfortunately
+// the latency of CPUID varies wildly (perhaps made worse by not initializing
+// its EAX input). Because it cannot reliably be deducted from the region's
+// elapsed time, it must not be included in the region to measure (i.e.
+// between the two RDTSC).
+//
+// The newer RDTSCP is sometimes described as serializing, but it actually
+// only serves as a half-fence with release semantics. Although all
+// instructions in the region will complete before the final timestamp is
+// captured, subsequent instructions may leak into the region and increase the
+// elapsed time. Inserting another fence after the final RDTSCP would prevent
+// such reordering without affecting the measured region.
+//
+// Fortunately, such a fence exists. The LFENCE instruction is only documented
+// to delay later loads until earlier loads are visible. However, Intel's
+// reference manual says it acts as a full fence (waiting until all earlier
+// instructions have completed, and delaying later instructions until it
+// completes). AMD assigns the same behavior to MFENCE.
+//
+// We need a fence before the initial RDTSC to prevent earlier instructions
+// from leaking into the region, and arguably another after RDTSC to avoid
+// region instructions from completing before the timestamp is recorded.
+// When surrounded by fences, the additional RDTSCP half-fence provides no
+// benefit, so the initial timestamp can be recorded via RDTSC, which has
+// lower overhead than RDTSCP because it does not read TSC_AUX. In summary,
+// we define Start = LFENCE/RDTSC/LFENCE; Stop = RDTSCP/LFENCE.
+//
+// Using Start+Start leads to higher variance and overhead than Stop+Stop.
+// However, Stop+Stop includes an LFENCE in the region measurements, which
+// adds a delay dependent on earlier loads. The combination of Start+Stop
+// is faster than Start+Start and more consistent than Stop+Stop because
+// the first LFENCE already delayed subsequent loads before the measured
+// region. This combination seems not to have been considered in prior work:
+// http://akaros.cs.berkeley.edu/lxr/akaros/kern/arch/x86/rdtsc_test.c
+//
+// Note: performance counters can measure 'exact' instructions-retired or
+// (unhalted) cycle counts. The RDPMC instruction is not serializing and also
+// requires fences. Unfortunately, it is not accessible on all OSes and we
+// prefer to avoid kernel-mode drivers. Performance counters are also affected
+// by several under/over-count errata, so we use the TSC instead.
+
+// Returns a 64-bit timestamp in unit of 'ticks'; to convert to seconds,
+// divide by InvariantTicksPerSecond.
+inline uint64_t Start64() {
+  uint64_t t;
+#if defined(ABSL_ARCH_PPC)
+  asm volatile("mfspr %0, %1" : "=r"(t) : "i"(268));
+#elif defined(ABSL_ARCH_X86_64)
+#if defined(ABSL_OS_WIN)
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+  t = __rdtsc();
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+#else
+  asm volatile(
+      "lfence\n\t"
+      "rdtsc\n\t"
+      "shl $32, %%rdx\n\t"
+      "or %%rdx, %0\n\t"
+      "lfence"
+      : "=a"(t)
+      :
+      // "memory" avoids reordering. rdx = TSC >> 32.
+      // "cc" = flags modified by SHL.
+      : "rdx", "memory", "cc");
+#endif
+#else
+  // Fall back to OS - unsure how to reliably query cntvct_el0 frequency.
+  timespec ts;
+  clock_gettime(CLOCK_REALTIME, &ts);
+  t = ts.tv_sec * 1000000000LL + ts.tv_nsec;
+#endif
+  return t;
+}
+
+inline uint64_t Stop64() {
+  uint64_t t;
+#if defined(ABSL_ARCH_X86_64)
+#if defined(ABSL_OS_WIN)
+  _ReadWriteBarrier();
+  unsigned aux;
+  t = __rdtscp(&aux);
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+#else
+  // Use inline asm because __rdtscp generates code to store TSC_AUX (ecx).
+  asm volatile(
+      "rdtscp\n\t"
+      "shl $32, %%rdx\n\t"
+      "or %%rdx, %0\n\t"
+      "lfence"
+      : "=a"(t)
+      :
+      // "memory" avoids reordering. rcx = TSC_AUX. rdx = TSC >> 32.
+      // "cc" = flags modified by SHL.
+      : "rcx", "rdx", "memory", "cc");
+#endif
+#else
+  t = Start64();
+#endif
+  return t;
+}
+
+// Returns a 32-bit timestamp with about 4 cycles less overhead than
+// Start64. Only suitable for measuring very short regions because the
+// timestamp overflows about once a second.
+inline uint32_t Start32() {
+  uint32_t t;
+#if defined(ABSL_ARCH_X86_64)
+#if defined(ABSL_OS_WIN)
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+  t = static_cast<uint32_t>(__rdtsc());
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+#else
+  asm volatile(
+      "lfence\n\t"
+      "rdtsc\n\t"
+      "lfence"
+      : "=a"(t)
+      :
+      // "memory" avoids reordering. rdx = TSC >> 32.
+      : "rdx", "memory");
+#endif
+#else
+  t = static_cast<uint32_t>(Start64());
+#endif
+  return t;
+}
+
+inline uint32_t Stop32() {
+  uint32_t t;
+#if defined(ABSL_ARCH_X86_64)
+#if defined(ABSL_OS_WIN)
+  _ReadWriteBarrier();
+  unsigned aux;
+  t = static_cast<uint32_t>(__rdtscp(&aux));
+  _ReadWriteBarrier();
+  _mm_lfence();
+  _ReadWriteBarrier();
+#else
+  // Use inline asm because __rdtscp generates code to store TSC_AUX (ecx).
+  asm volatile(
+      "rdtscp\n\t"
+      "lfence"
+      : "=a"(t)
+      :
+      // "memory" avoids reordering. rcx = TSC_AUX. rdx = TSC >> 32.
+      : "rcx", "rdx", "memory");
+#endif
+#else
+  t = static_cast<uint32_t>(Stop64());
+#endif
+  return t;
+}
+
+}  // namespace timer
+
+namespace robust_statistics {
+
+// Sorts integral values in ascending order (e.g. for Mode). About 3x faster
+// than std::sort for input distributions with very few unique values.
+template <class T>
+void CountingSort(T* values, size_t num_values) {
+  // Unique values and their frequency (similar to flat_map).
+  using Unique = std::pair<T, int>;
+  std::vector<Unique> unique;
+  for (size_t i = 0; i < num_values; ++i) {
+    const T value = values[i];
+    const auto pos =
+        std::find_if(unique.begin(), unique.end(),
+                     [value](const Unique u) { return u.first == value; });
+    if (pos == unique.end()) {
+      unique.push_back(std::make_pair(value, 1));
+    } else {
+      ++pos->second;
+    }
+  }
+
+  // Sort in ascending order of value (pair.first).
+  std::sort(unique.begin(), unique.end());
+
+  // Write that many copies of each unique value to the array.
+  T* ABSL_RANDOM_INTERNAL_RESTRICT p = values;
+  for (const auto& value_count : unique) {
+    std::fill(p, p + value_count.second, value_count.first);
+    p += value_count.second;
+  }
+  ABSL_RAW_CHECK(p == values + num_values, "Did not produce enough output");
+}
+
+// @return i in [idx_begin, idx_begin + half_count) that minimizes
+// sorted[i + half_count] - sorted[i].
+template <typename T>
+size_t MinRange(const T* const ABSL_RANDOM_INTERNAL_RESTRICT sorted,
+                const size_t idx_begin, const size_t half_count) {
+  T min_range = (std::numeric_limits<T>::max)();
+  size_t min_idx = 0;
+
+  for (size_t idx = idx_begin; idx < idx_begin + half_count; ++idx) {
+    ABSL_RAW_CHECK(sorted[idx] <= sorted[idx + half_count], "Not sorted");
+    const T range = sorted[idx + half_count] - sorted[idx];
+    if (range < min_range) {
+      min_range = range;
+      min_idx = idx;
+    }
+  }
+
+  return min_idx;
+}
+
+// Returns an estimate of the mode by calling MinRange on successively
+// halved intervals. "sorted" must be in ascending order. This is the
+// Half Sample Mode estimator proposed by Bickel in "On a fast, robust
+// estimator of the mode", with complexity O(N log N). The mode is less
+// affected by outliers in highly-skewed distributions than the median.
+// The averaging operation below assumes "T" is an unsigned integer type.
+template <typename T>
+T ModeOfSorted(const T* const ABSL_RANDOM_INTERNAL_RESTRICT sorted,
+               const size_t num_values) {
+  size_t idx_begin = 0;
+  size_t half_count = num_values / 2;
+  while (half_count > 1) {
+    idx_begin = MinRange(sorted, idx_begin, half_count);
+    half_count >>= 1;
+  }
+
+  const T x = sorted[idx_begin + 0];
+  if (half_count == 0) {
+    return x;
+  }
+  ABSL_RAW_CHECK(half_count == 1, "Should stop at half_count=1");
+  const T average = (x + sorted[idx_begin + 1] + 1) / 2;
+  return average;
+}
+
+// Returns the mode. Side effect: sorts "values".
+template <typename T>
+T Mode(T* values, const size_t num_values) {
+  CountingSort(values, num_values);
+  return ModeOfSorted(values, num_values);
+}
+
+template <typename T, size_t N>
+T Mode(T (&values)[N]) {
+  return Mode(&values[0], N);
+}
+
+// Returns the median value. Side effect: sorts "values".
+template <typename T>
+T Median(T* values, const size_t num_values) {
+  ABSL_RAW_CHECK(num_values != 0, "Empty input");
+  std::sort(values, values + num_values);
+  const size_t half = num_values / 2;
+  // Odd count: return middle
+  if (num_values % 2) {
+    return values[half];
+  }
+  // Even count: return average of middle two.
+  return (values[half] + values[half - 1] + 1) / 2;
+}
+
+// Returns a robust measure of variability.
+template <typename T>
+T MedianAbsoluteDeviation(const T* values, const size_t num_values,
+                          const T median) {
+  ABSL_RAW_CHECK(num_values != 0, "Empty input");
+  std::vector<T> abs_deviations;
+  abs_deviations.reserve(num_values);
+  for (size_t i = 0; i < num_values; ++i) {
+    const int64_t abs = std::abs(int64_t(values[i]) - int64_t(median));
+    abs_deviations.push_back(static_cast<T>(abs));
+  }
+  return Median(abs_deviations.data(), num_values);
+}
+
+}  // namespace robust_statistics
+
+// Ticks := platform-specific timer values (CPU cycles on x86). Must be
+// unsigned to guarantee wraparound on overflow. 32 bit timers are faster to
+// read than 64 bit.
+using Ticks = uint32_t;
+
+// Returns timer overhead / minimum measurable difference.
+Ticks TimerResolution() {
+  // Nested loop avoids exceeding stack/L1 capacity.
+  Ticks repetitions[Params::kTimerSamples];
+  for (size_t rep = 0; rep < Params::kTimerSamples; ++rep) {
+    Ticks samples[Params::kTimerSamples];
+    for (size_t i = 0; i < Params::kTimerSamples; ++i) {
+      const Ticks t0 = timer::Start32();
+      const Ticks t1 = timer::Stop32();
+      samples[i] = t1 - t0;
+    }
+    repetitions[rep] = robust_statistics::Mode(samples);
+  }
+  return robust_statistics::Mode(repetitions);
+}
+
+static const Ticks timer_resolution = TimerResolution();
+
+// Estimates the expected value of "lambda" values with a variable number of
+// samples until the variability "rel_mad" is less than "max_rel_mad".
+template <class Lambda>
+Ticks SampleUntilStable(const double max_rel_mad, double* rel_mad,
+                        const Params& p, const Lambda& lambda) {
+  auto measure_duration = [&lambda]() -> Ticks {
+    const Ticks t0 = timer::Start32();
+    lambda();
+    const Ticks t1 = timer::Stop32();
+    return t1 - t0;
+  };
+
+  // Choose initial samples_per_eval based on a single estimated duration.
+  Ticks est = measure_duration();
+  static const double ticks_per_second = InvariantTicksPerSecond();
+  const size_t ticks_per_eval = ticks_per_second * p.seconds_per_eval;
+  size_t samples_per_eval = ticks_per_eval / est;
+  samples_per_eval = (std::max)(samples_per_eval, p.min_samples_per_eval);
+
+  std::vector<Ticks> samples;
+  samples.reserve(1 + samples_per_eval);
+  samples.push_back(est);
+
+  // Percentage is too strict for tiny differences, so also allow a small
+  // absolute "median absolute deviation".
+  const Ticks max_abs_mad = (timer_resolution + 99) / 100;
+  *rel_mad = 0.0;  // ensure initialized
+
+  for (size_t eval = 0; eval < p.max_evals; ++eval, samples_per_eval *= 2) {
+    samples.reserve(samples.size() + samples_per_eval);
+    for (size_t i = 0; i < samples_per_eval; ++i) {
+      const Ticks r = measure_duration();
+      samples.push_back(r);
+    }
+
+    if (samples.size() >= p.min_mode_samples) {
+      est = robust_statistics::Mode(samples.data(), samples.size());
+    } else {
+      // For "few" (depends also on the variance) samples, Median is safer.
+      est = robust_statistics::Median(samples.data(), samples.size());
+    }
+    ABSL_RAW_CHECK(est != 0, "Estimator returned zero duration");
+
+    // Median absolute deviation (mad) is a robust measure of 'variability'.
+    const Ticks abs_mad = robust_statistics::MedianAbsoluteDeviation(
+        samples.data(), samples.size(), est);
+    *rel_mad = static_cast<double>(static_cast<int>(abs_mad)) / est;
+
+    if (*rel_mad <= max_rel_mad || abs_mad <= max_abs_mad) {
+      if (p.verbose) {
+        ABSL_RAW_LOG(INFO,
+                     "%6zu samples => %5u (abs_mad=%4u, rel_mad=%4.2f%%)\n",
+                     samples.size(), est, abs_mad, *rel_mad * 100.0);
+      }
+      return est;
+    }
+  }
+
+  if (p.verbose) {
+    ABSL_RAW_LOG(WARNING,
+                 "rel_mad=%4.2f%% still exceeds %4.2f%% after %6zu samples.\n",
+                 *rel_mad * 100.0, max_rel_mad * 100.0, samples.size());
+  }
+  return est;
+}
+
+using InputVec = std::vector<FuncInput>;
+
+// Returns vector of unique input values.
+InputVec UniqueInputs(const FuncInput* inputs, const size_t num_inputs) {
+  InputVec unique(inputs, inputs + num_inputs);
+  std::sort(unique.begin(), unique.end());
+  unique.erase(std::unique(unique.begin(), unique.end()), unique.end());
+  return unique;
+}
+
+// Returns how often we need to call func for sufficient precision, or zero
+// on failure (e.g. the elapsed time is too long for a 32-bit tick count).
+size_t NumSkip(const Func func, const void* arg, const InputVec& unique,
+               const Params& p) {
+  // Min elapsed ticks for any input.
+  Ticks min_duration = ~0u;
+
+  for (const FuncInput input : unique) {
+    // Make sure a 32-bit timer is sufficient.
+    const uint64_t t0 = timer::Start64();
+    PreventElision(func(arg, input));
+    const uint64_t t1 = timer::Stop64();
+    const uint64_t elapsed = t1 - t0;
+    if (elapsed >= (1ULL << 30)) {
+      ABSL_RAW_LOG(WARNING,
+                   "Measurement failed: need 64-bit timer for input=%zu\n",
+                   static_cast<size_t>(input));
+      return 0;
+    }
+
+    double rel_mad;
+    const Ticks total = SampleUntilStable(
+        p.target_rel_mad, &rel_mad, p,
+        [func, arg, input]() { PreventElision(func(arg, input)); });
+    min_duration = (std::min)(min_duration, total - timer_resolution);
+  }
+
+  // Number of repetitions required to reach the target resolution.
+  const size_t max_skip = p.precision_divisor;
+  // Number of repetitions given the estimated duration.
+  const size_t num_skip =
+      min_duration == 0 ? 0 : (max_skip + min_duration - 1) / min_duration;
+  if (p.verbose) {
+    ABSL_RAW_LOG(INFO, "res=%u max_skip=%zu min_dur=%u num_skip=%zu\n",
+                 timer_resolution, max_skip, min_duration, num_skip);
+  }
+  return num_skip;
+}
+
+// Replicates inputs until we can omit "num_skip" occurrences of an input.
+InputVec ReplicateInputs(const FuncInput* inputs, const size_t num_inputs,
+                         const size_t num_unique, const size_t num_skip,
+                         const Params& p) {
+  InputVec full;
+  if (num_unique == 1) {
+    full.assign(p.subset_ratio * num_skip, inputs[0]);
+    return full;
+  }
+
+  full.reserve(p.subset_ratio * num_skip * num_inputs);
+  for (size_t i = 0; i < p.subset_ratio * num_skip; ++i) {
+    full.insert(full.end(), inputs, inputs + num_inputs);
+  }
+  absl::random_internal::randen_engine<uint32_t> rng;
+  std::shuffle(full.begin(), full.end(), rng);
+  return full;
+}
+
+// Copies the "full" to "subset" in the same order, but with "num_skip"
+// randomly selected occurrences of "input_to_skip" removed.
+void FillSubset(const InputVec& full, const FuncInput input_to_skip,
+                const size_t num_skip, InputVec* subset) {
+  const size_t count = std::count(full.begin(), full.end(), input_to_skip);
+  // Generate num_skip random indices: which occurrence to skip.
+  std::vector<uint32_t> omit;
+  // Replacement for std::iota, not yet available in MSVC builds.
+  omit.reserve(count);
+  for (size_t i = 0; i < count; ++i) {
+    omit.push_back(i);
+  }
+  // omit[] is the same on every call, but that's OK because they identify the
+  // Nth instance of input_to_skip, so the position within full[] differs.
+  absl::random_internal::randen_engine<uint32_t> rng;
+  std::shuffle(omit.begin(), omit.end(), rng);
+  omit.resize(num_skip);
+  std::sort(omit.begin(), omit.end());
+
+  uint32_t occurrence = ~0u;  // 0 after preincrement
+  size_t idx_omit = 0;        // cursor within omit[]
+  size_t idx_subset = 0;      // cursor within *subset
+  for (const FuncInput next : full) {
+    if (next == input_to_skip) {
+      ++occurrence;
+      // Haven't removed enough already
+      if (idx_omit < num_skip) {
+        // This one is up for removal
+        if (occurrence == omit[idx_omit]) {
+          ++idx_omit;
+          continue;
+        }
+      }
+    }
+    if (idx_subset < subset->size()) {
+      (*subset)[idx_subset++] = next;
+    }
+  }
+  ABSL_RAW_CHECK(idx_subset == subset->size(), "idx_subset not at end");
+  ABSL_RAW_CHECK(idx_omit == omit.size(), "idx_omit not at end");
+  ABSL_RAW_CHECK(occurrence == count - 1, "occurrence not at end");
+}
+
+// Returns total ticks elapsed for all inputs.
+Ticks TotalDuration(const Func func, const void* arg, const InputVec* inputs,
+                    const Params& p, double* max_rel_mad) {
+  double rel_mad;
+  const Ticks duration =
+      SampleUntilStable(p.target_rel_mad, &rel_mad, p, [func, arg, inputs]() {
+        for (const FuncInput input : *inputs) {
+          PreventElision(func(arg, input));
+        }
+      });
+  *max_rel_mad = (std::max)(*max_rel_mad, rel_mad);
+  return duration;
+}
+
+// (Nearly) empty Func for measuring timer overhead/resolution.
+ABSL_ATTRIBUTE_NEVER_INLINE FuncOutput EmptyFunc(const void* arg,
+                                                 const FuncInput input) {
+  return input;
+}
+
+// Returns overhead of accessing inputs[] and calling a function; this will
+// be deducted from future TotalDuration return values.
+Ticks Overhead(const void* arg, const InputVec* inputs, const Params& p) {
+  double rel_mad;
+  // Zero tolerance because repeatability is crucial and EmptyFunc is fast.
+  return SampleUntilStable(0.0, &rel_mad, p, [arg, inputs]() {
+    for (const FuncInput input : *inputs) {
+      PreventElision(EmptyFunc(arg, input));
+    }
+  });
+}
+
+}  // namespace
+
+void PinThreadToCPU(int cpu) {
+  // We might migrate to another CPU before pinning below, but at least cpu
+  // will be one of the CPUs on which this thread ran.
+#if defined(ABSL_OS_WIN)
+  if (cpu < 0) {
+    cpu = static_cast<int>(GetCurrentProcessorNumber());
+    ABSL_RAW_CHECK(cpu >= 0, "PinThreadToCPU detect failed");
+    if (cpu >= 64) {
+      // NOTE: On wine, at least, GetCurrentProcessorNumber() sometimes returns
+      // a value > 64, which is out of range. When this happens, log a message
+      // and don't set a cpu affinity.
+      ABSL_RAW_LOG(ERROR, "Invalid CPU number: %d", cpu);
+      return;
+    }
+  } else if (cpu >= 64) {
+    // User specified an explicit CPU affinity > the valid range.
+    ABSL_RAW_LOG(FATAL, "Invalid CPU number: %d", cpu);
+  }
+  const DWORD_PTR prev = SetThreadAffinityMask(GetCurrentThread(), 1ULL << cpu);
+  ABSL_RAW_CHECK(prev != 0, "SetAffinity failed");
+#elif defined(ABSL_OS_LINUX) && !defined(ABSL_OS_ANDROID)
+  if (cpu < 0) {
+    cpu = sched_getcpu();
+    ABSL_RAW_CHECK(cpu >= 0, "PinThreadToCPU detect failed");
+  }
+  const pid_t pid = 0;  // current thread
+  cpu_set_t set;
+  CPU_ZERO(&set);
+  CPU_SET(cpu, &set);
+  const int err = sched_setaffinity(pid, sizeof(set), &set);
+  ABSL_RAW_CHECK(err == 0, "SetAffinity failed");
+#endif
+}
+
+// Returns tick rate. Invariant means the tick counter frequency is independent
+// of CPU throttling or sleep. May be expensive, caller should cache the result.
+double InvariantTicksPerSecond() {
+#if defined(ABSL_ARCH_PPC)
+  return __ppc_get_timebase_freq();
+#elif defined(ABSL_ARCH_X86_64)
+  // We assume the TSC is invariant; it is on all recent Intel/AMD CPUs.
+  return platform::NominalClockRate();
+#else
+  // Fall back to clock_gettime nanoseconds.
+  return 1E9;
+#endif
+}
+
+size_t MeasureImpl(const Func func, const void* arg, const size_t num_skip,
+                   const InputVec& unique, const InputVec& full,
+                   const Params& p, Result* results) {
+  const float mul = 1.0f / static_cast<int>(num_skip);
+
+  InputVec subset(full.size() - num_skip);
+  const Ticks overhead = Overhead(arg, &full, p);
+  const Ticks overhead_skip = Overhead(arg, &subset, p);
+  if (overhead < overhead_skip) {
+    ABSL_RAW_LOG(WARNING, "Measurement failed: overhead %u < %u\n", overhead,
+                 overhead_skip);
+    return 0;
+  }
+
+  if (p.verbose) {
+    ABSL_RAW_LOG(INFO, "#inputs=%5zu,%5zu overhead=%5u,%5u\n", full.size(),
+                 subset.size(), overhead, overhead_skip);
+  }
+
+  double max_rel_mad = 0.0;
+  const Ticks total = TotalDuration(func, arg, &full, p, &max_rel_mad);
+
+  for (size_t i = 0; i < unique.size(); ++i) {
+    FillSubset(full, unique[i], num_skip, &subset);
+    const Ticks total_skip = TotalDuration(func, arg, &subset, p, &max_rel_mad);
+
+    if (total < total_skip) {
+      ABSL_RAW_LOG(WARNING, "Measurement failed: total %u < %u\n", total,
+                   total_skip);
+      return 0;
+    }
+
+    const Ticks duration = (total - overhead) - (total_skip - overhead_skip);
+    results[i].input = unique[i];
+    results[i].ticks = duration * mul;
+    results[i].variability = max_rel_mad;
+  }
+
+  return unique.size();
+}
+
+size_t Measure(const Func func, const void* arg, const FuncInput* inputs,
+               const size_t num_inputs, Result* results, const Params& p) {
+  ABSL_RAW_CHECK(num_inputs != 0, "No inputs");
+
+  const InputVec unique = UniqueInputs(inputs, num_inputs);
+  const size_t num_skip = NumSkip(func, arg, unique, p);  // never 0
+  if (num_skip == 0) return 0;  // NumSkip already printed error message
+
+  const InputVec full =
+      ReplicateInputs(inputs, num_inputs, unique.size(), num_skip, p);
+
+  // MeasureImpl may fail up to p.max_measure_retries times.
+  for (size_t i = 0; i < p.max_measure_retries; i++) {
+    auto result = MeasureImpl(func, arg, num_skip, unique, full, p, results);
+    if (result != 0) {
+      return result;
+    }
+  }
+  // All retries failed. (Unusual)
+  return 0;
+}
+
+}  // namespace random_internal_nanobenchmark
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/nanobenchmark.h b/third_party/abseil-cpp/absl/random/internal/nanobenchmark.h
new file mode 100644
index 0000000..c2b650d
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/nanobenchmark.h
@@ -0,0 +1,168 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_NANOBENCHMARK_H_
+#define ABSL_RANDOM_INTERNAL_NANOBENCHMARK_H_
+
+// Benchmarks functions of a single integer argument with realistic branch
+// prediction hit rates. Uses a robust estimator to summarize the measurements.
+// The precision is about 0.2%.
+//
+// Examples: see nanobenchmark_test.cc.
+//
+// Background: Microbenchmarks such as http://github.com/google/benchmark
+// can measure elapsed times on the order of a microsecond. Shorter functions
+// are typically measured by repeating them thousands of times and dividing
+// the total elapsed time by this count. Unfortunately, repetition (especially
+// with the same input parameter!) influences the runtime. In time-critical
+// code, it is reasonable to expect warm instruction/data caches and TLBs,
+// but a perfect record of which branches will be taken is unrealistic.
+// Unless the application also repeatedly invokes the measured function with
+// the same parameter, the benchmark is measuring something very different -
+// a best-case result, almost as if the parameter were made a compile-time
+// constant. This may lead to erroneous conclusions about branch-heavy
+// algorithms outperforming branch-free alternatives.
+//
+// Our approach differs in three ways. Adding fences to the timer functions
+// reduces variability due to instruction reordering, improving the timer
+// resolution to about 40 CPU cycles. However, shorter functions must still
+// be invoked repeatedly. For more realistic branch prediction performance,
+// we vary the input parameter according to a user-specified distribution.
+// Thus, instead of VaryInputs(Measure(Repeat(func))), we change the
+// loop nesting to Measure(Repeat(VaryInputs(func))). We also estimate the
+// central tendency of the measurement samples with the "half sample mode",
+// which is more robust to outliers and skewed data than the mean or median.
+
+// NOTE: for compatibility with multiple translation units compiled with
+// distinct flags, avoid #including headers that define functions.
+
+#include <stddef.h>
+#include <stdint.h>
+
+namespace absl {
+namespace random_internal_nanobenchmark {
+
+// Input influencing the function being measured (e.g. number of bytes to copy).
+using FuncInput = size_t;
+
+// "Proof of work" returned by Func to ensure the compiler does not elide it.
+using FuncOutput = uint64_t;
+
+// Function to measure: either 1) a captureless lambda or function with two
+// arguments or 2) a lambda with capture, in which case the first argument
+// is reserved for use by MeasureClosure.
+using Func = FuncOutput (*)(const void*, FuncInput);
+
+// Internal parameters that determine precision/resolution/measuring time.
+struct Params {
+  // For measuring timer overhead/resolution. Used in a nested loop =>
+  // quadratic time, acceptable because we know timer overhead is "low".
+  // constexpr because this is used to define array bounds.
+  static constexpr size_t kTimerSamples = 256;
+
+  // Best-case precision, expressed as a divisor of the timer resolution.
+  // Larger => more calls to Func and higher precision.
+  size_t precision_divisor = 1024;
+
+  // Ratio between full and subset input distribution sizes. Cannot be less
+  // than 2; larger values increase measurement time but more faithfully
+  // model the given input distribution.
+  size_t subset_ratio = 2;
+
+  // Together with the estimated Func duration, determines how many times to
+  // call Func before checking the sample variability. Larger values increase
+  // measurement time, memory/cache use and precision.
+  double seconds_per_eval = 4E-3;
+
+  // The minimum number of samples before estimating the central tendency.
+  size_t min_samples_per_eval = 7;
+
+  // The mode is better than median for estimating the central tendency of
+  // skewed/fat-tailed distributions, but it requires sufficient samples
+  // relative to the width of half-ranges.
+  size_t min_mode_samples = 64;
+
+  // Maximum permissible variability (= median absolute deviation / center).
+  double target_rel_mad = 0.002;
+
+  // Abort after this many evals without reaching target_rel_mad. This
+  // prevents infinite loops.
+  size_t max_evals = 9;
+
+  // Retry the measure loop up to this many times.
+  size_t max_measure_retries = 2;
+
+  // Whether to print additional statistics to stdout.
+  bool verbose = true;
+};
+
+// Measurement result for each unique input.
+struct Result {
+  FuncInput input;
+
+  // Robust estimate (mode or median) of duration.
+  float ticks;
+
+  // Measure of variability (median absolute deviation relative to "ticks").
+  float variability;
+};
+
+// Ensures the thread is running on the specified cpu, and no others.
+// Reduces noise due to desynchronized socket RDTSC and context switches.
+// If "cpu" is negative, pin to the currently running core.
+void PinThreadToCPU(const int cpu = -1);
+
+// Returns tick rate, useful for converting measurements to seconds. Invariant
+// means the tick counter frequency is independent of CPU throttling or sleep.
+// This call may be expensive, callers should cache the result.
+double InvariantTicksPerSecond();
+
+// Precisely measures the number of ticks elapsed when calling "func" with the
+// given inputs, shuffled to ensure realistic branch prediction hit rates.
+//
+// "func" returns a 'proof of work' to ensure its computations are not elided.
+// "arg" is passed to Func, or reserved for internal use by MeasureClosure.
+// "inputs" is an array of "num_inputs" (not necessarily unique) arguments to
+//   "func". The values should be chosen to maximize coverage of "func". This
+//   represents a distribution, so a value's frequency should reflect its
+//   probability in the real application. Order does not matter; for example, a
+//   uniform distribution over [0, 4) could be represented as {3,0,2,1}.
+// Returns how many Result were written to "results": one per unique input, or
+//   zero if the measurement failed (an error message goes to stderr).
+size_t Measure(const Func func, const void* arg, const FuncInput* inputs,
+               const size_t num_inputs, Result* results,
+               const Params& p = Params());
+
+// Calls operator() of the given closure (lambda function).
+template <class Closure>
+static FuncOutput CallClosure(const void* f, const FuncInput input) {
+  return (*reinterpret_cast<const Closure*>(f))(input);
+}
+
+// Same as Measure, except "closure" is typically a lambda function of
+// FuncInput -> FuncOutput with a capture list.
+template <class Closure>
+static inline size_t MeasureClosure(const Closure& closure,
+                                    const FuncInput* inputs,
+                                    const size_t num_inputs, Result* results,
+                                    const Params& p = Params()) {
+  return Measure(reinterpret_cast<Func>(&CallClosure<Closure>),
+                 reinterpret_cast<const void*>(&closure), inputs, num_inputs,
+                 results, p);
+}
+
+}  // namespace random_internal_nanobenchmark
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_NANOBENCHMARK_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/nanobenchmark_test.cc b/third_party/abseil-cpp/absl/random/internal/nanobenchmark_test.cc
new file mode 100644
index 0000000..383345a
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/nanobenchmark_test.cc
@@ -0,0 +1,75 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/nanobenchmark.h"
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/numbers.h"
+
+namespace absl {
+namespace random_internal_nanobenchmark {
+namespace {
+
+uint64_t Div(const void*, FuncInput in) {
+  // Here we're measuring the throughput because benchmark invocations are
+  // independent.
+  const int64_t d1 = 0xFFFFFFFFFFll / int64_t(in);  // IDIV
+  return d1;
+}
+
+template <size_t N>
+void MeasureDiv(const FuncInput (&inputs)[N]) {
+  Result results[N];
+  Params params;
+  params.max_evals = 6;  // avoid test timeout
+  const size_t num_results = Measure(&Div, nullptr, inputs, N, results, params);
+  if (num_results == 0) {
+    ABSL_RAW_LOG(
+        WARNING,
+        "WARNING: Measurement failed, should not happen when using "
+        "PinThreadToCPU unless the region to measure takes > 1 second.\n");
+    return;
+  }
+  for (size_t i = 0; i < num_results; ++i) {
+    ABSL_RAW_LOG(INFO, "%5zu: %6.2f ticks; MAD=%4.2f%%\n", results[i].input,
+                 results[i].ticks, results[i].variability * 100.0);
+    ABSL_RAW_CHECK(results[i].ticks != 0.0f, "Zero duration");
+  }
+}
+
+void RunAll(const int argc, char* argv[]) {
+  // Avoid migrating between cores - important on multi-socket systems.
+  int cpu = -1;
+  if (argc == 2) {
+    if (!SimpleAtoi(argv[1], &cpu)) {
+      ABSL_RAW_LOG(FATAL, "The optional argument must be a CPU number >= 0.\n");
+    }
+  }
+  PinThreadToCPU(cpu);
+
+  // unpredictable == 1 but the compiler doesn't know that.
+  const FuncInput unpredictable = argc != 999;
+  static const FuncInput inputs[] = {unpredictable * 10, unpredictable * 100};
+
+  MeasureDiv(inputs);
+}
+
+}  // namespace
+}  // namespace random_internal_nanobenchmark
+}  // namespace absl
+
+int main(int argc, char* argv[]) {
+  absl::random_internal_nanobenchmark::RunAll(argc, argv);
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h b/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h
new file mode 100644
index 0000000..8847e74
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h
@@ -0,0 +1,148 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_NONSECURE_BASE_H_
+#define ABSL_RANDOM_INTERNAL_NONSECURE_BASE_H_
+
+#include <algorithm>
+#include <cstdint>
+#include <iostream>
+#include <iterator>
+#include <random>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/base/macros.h"
+#include "absl/meta/type_traits.h"
+#include "absl/random/internal/pool_urbg.h"
+#include "absl/random/internal/salted_seed_seq.h"
+#include "absl/random/internal/seed_material.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+
+namespace absl {
+namespace random_internal {
+
+// Each instance of NonsecureURBGBase<URBG> will be seeded by variates produced
+// by a thread-unique URBG-instance.
+template <typename URBG>
+class NonsecureURBGBase {
+ public:
+  using result_type = typename URBG::result_type;
+
+  // Default constructor
+  NonsecureURBGBase() : urbg_(ConstructURBG()) {}
+
+  // Copy disallowed, move allowed.
+  NonsecureURBGBase(const NonsecureURBGBase&) = delete;
+  NonsecureURBGBase& operator=(const NonsecureURBGBase&) = delete;
+  NonsecureURBGBase(NonsecureURBGBase&&) = default;
+  NonsecureURBGBase& operator=(NonsecureURBGBase&&) = default;
+
+  // Constructor using a seed
+  template <class SSeq, typename = typename absl::enable_if_t<
+                            !std::is_same<SSeq, NonsecureURBGBase>::value>>
+  explicit NonsecureURBGBase(SSeq&& seq)
+      : urbg_(ConstructURBG(std::forward<SSeq>(seq))) {}
+
+  // Note: on MSVC, min() or max() can be interpreted as MIN() or MAX(), so we
+  // enclose min() or max() in parens as (min)() and (max)().
+  // Additionally, clang-format requires no space before this construction.
+
+  // NonsecureURBGBase::min()
+  static constexpr result_type(min)() { return (URBG::min)(); }
+
+  // NonsecureURBGBase::max()
+  static constexpr result_type(max)() { return (URBG::max)(); }
+
+  // NonsecureURBGBase::operator()()
+  result_type operator()() { return urbg_(); }
+
+  // NonsecureURBGBase::discard()
+  void discard(unsigned long long values) {  // NOLINT(runtime/int)
+    urbg_.discard(values);
+  }
+
+  bool operator==(const NonsecureURBGBase& other) const {
+    return urbg_ == other.urbg_;
+  }
+
+  bool operator!=(const NonsecureURBGBase& other) const {
+    return !(urbg_ == other.urbg_);
+  }
+
+ private:
+  // Seeder is a custom seed sequence type where generate() fills the provided
+  // buffer via the RandenPool entropy source.
+  struct Seeder {
+    using result_type = uint32_t;
+
+    size_t size() { return 0; }
+
+    template <typename OutIterator>
+    void param(OutIterator) const {}
+
+    template <typename RandomAccessIterator>
+    void generate(RandomAccessIterator begin, RandomAccessIterator end) {
+      if (begin != end) {
+        // begin, end must be random access iterators assignable from uint32_t.
+        generate_impl(
+            std::integral_constant<bool, sizeof(*begin) == sizeof(uint32_t)>{},
+            begin, end);
+      }
+    }
+
+    // Commonly, generate is invoked with a pointer to a buffer which
+    // can be cast to a uint32_t.
+    template <typename RandomAccessIterator>
+    void generate_impl(std::integral_constant<bool, true>,
+                       RandomAccessIterator begin, RandomAccessIterator end) {
+      auto buffer = absl::MakeSpan(begin, end);
+      auto target = absl::MakeSpan(reinterpret_cast<uint32_t*>(buffer.data()),
+                                   buffer.size());
+      RandenPool<uint32_t>::Fill(target);
+    }
+
+    // The non-uint32_t case should be uncommon, and involves an extra copy,
+    // filling the uint32_t buffer and then mixing into the output.
+    template <typename RandomAccessIterator>
+    void generate_impl(std::integral_constant<bool, false>,
+                       RandomAccessIterator begin, RandomAccessIterator end) {
+      const size_t n = std::distance(begin, end);
+      absl::InlinedVector<uint32_t, 8> data(n, 0);
+      RandenPool<uint32_t>::Fill(absl::MakeSpan(data.begin(), data.end()));
+      std::copy(std::begin(data), std::end(data), begin);
+    }
+  };
+
+  static URBG ConstructURBG() {
+    Seeder seeder;
+    return URBG(seeder);
+  }
+
+  template <typename SSeq>
+  static URBG ConstructURBG(SSeq&& seq) {  // NOLINT(runtime/references)
+    auto salted_seq =
+        random_internal::MakeSaltedSeedSeq(std::forward<SSeq>(seq));
+    return URBG(salted_seq);
+  }
+
+  URBG urbg_;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_NONSECURE_BASE_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/nonsecure_base_test.cc b/third_party/abseil-cpp/absl/random/internal/nonsecure_base_test.cc
new file mode 100644
index 0000000..d9de990
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/nonsecure_base_test.cc
@@ -0,0 +1,244 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/nonsecure_base.h"
+
+#include <algorithm>
+#include <iostream>
+#include <memory>
+#include <random>
+#include <sstream>
+
+#include "gtest/gtest.h"
+#include "absl/random/distributions.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+
+namespace {
+
+using ExampleNonsecureURBG =
+    absl::random_internal::NonsecureURBGBase<std::mt19937>;
+
+template <typename T>
+void Use(const T&) {}
+
+}  // namespace
+
+TEST(NonsecureURBGBase, DefaultConstructorIsValid) {
+  ExampleNonsecureURBG urbg;
+}
+
+// Ensure that the recommended template-instantiations are valid.
+TEST(RecommendedTemplates, CanBeConstructed) {
+  absl::BitGen default_generator;
+  absl::InsecureBitGen insecure_generator;
+}
+
+TEST(RecommendedTemplates, CanDiscardValues) {
+  absl::BitGen default_generator;
+  absl::InsecureBitGen insecure_generator;
+
+  default_generator.discard(5);
+  insecure_generator.discard(5);
+}
+
+TEST(NonsecureURBGBase, StandardInterface) {
+  // Names after definition of [rand.req.urbg] in C++ standard.
+  // e us a value of E
+  // v is a lvalue of E
+  // x, y are possibly const values of E
+  // s is a value of T
+  // q is a value satisfying requirements of seed_sequence
+  // z is a value of type unsigned long long
+  // os is a some specialization of basic_ostream
+  // is is a some specialization of basic_istream
+
+  using E = absl::random_internal::NonsecureURBGBase<std::minstd_rand>;
+
+  using T = typename E::result_type;
+
+  static_assert(!std::is_copy_constructible<E>::value,
+                "NonsecureURBGBase should not be copy constructible");
+
+  static_assert(!absl::is_copy_assignable<E>::value,
+                "NonsecureURBGBase should not be copy assignable");
+
+  static_assert(std::is_move_constructible<E>::value,
+                "NonsecureURBGBase should be move constructible");
+
+  static_assert(absl::is_move_assignable<E>::value,
+                "NonsecureURBGBase should be move assignable");
+
+  static_assert(std::is_same<decltype(std::declval<E>()()), T>::value,
+                "return type of operator() must be result_type");
+
+  {
+    const E x, y;
+    Use(x);
+    Use(y);
+
+    static_assert(std::is_same<decltype(x == y), bool>::value,
+                  "return type of operator== must be bool");
+
+    static_assert(std::is_same<decltype(x != y), bool>::value,
+                  "return type of operator== must be bool");
+  }
+
+  E e;
+  std::seed_seq q{1, 2, 3};
+
+  E{};
+  E{q};
+
+  // Copy constructor not supported.
+  // E{x};
+
+  // result_type seed constructor not supported.
+  // E{T{1}};
+
+  // Move constructors are supported.
+  {
+    E tmp(q);
+    E m = std::move(tmp);
+    E n(std::move(m));
+    EXPECT_TRUE(e != n);
+  }
+
+  // Comparisons work.
+  {
+    // MSVC emits error 2718 when using EXPECT_EQ(e, x)
+    //  * actual parameter with __declspec(align('#')) won't be aligned
+    E a(q);
+    E b(q);
+
+    EXPECT_TRUE(a != e);
+    EXPECT_TRUE(a == b);
+
+    a();
+    EXPECT_TRUE(a != b);
+  }
+
+  // e.seed(s) not supported.
+
+  // [rand.req.eng] specifies the parameter as 'unsigned long long'
+  // e.discard(unsigned long long) is supported.
+  unsigned long long z = 1;  // NOLINT(runtime/int)
+  e.discard(z);
+}
+
+TEST(NonsecureURBGBase, SeedSeqConstructorIsValid) {
+  std::seed_seq seq;
+  ExampleNonsecureURBG rbg(seq);
+}
+
+TEST(NonsecureURBGBase, CompatibleWithDistributionUtils) {
+  ExampleNonsecureURBG rbg;
+
+  absl::Uniform(rbg, 0, 100);
+  absl::Uniform(rbg, 0.5, 0.7);
+  absl::Poisson<uint32_t>(rbg);
+  absl::Exponential<float>(rbg);
+}
+
+TEST(NonsecureURBGBase, CompatibleWithStdDistributions) {
+  ExampleNonsecureURBG rbg;
+
+  std::uniform_int_distribution<uint32_t>(0, 100)(rbg);
+  std::uniform_real_distribution<float>()(rbg);
+  std::bernoulli_distribution(0.2)(rbg);
+}
+
+TEST(NonsecureURBGBase, ConsecutiveDefaultInstancesYieldUniqueVariates) {
+  const size_t kNumSamples = 128;
+
+  ExampleNonsecureURBG rbg1;
+  ExampleNonsecureURBG rbg2;
+
+  for (size_t i = 0; i < kNumSamples; i++) {
+    EXPECT_NE(rbg1(), rbg2());
+  }
+}
+
+TEST(NonsecureURBGBase, EqualSeedSequencesYieldEqualVariates) {
+  std::seed_seq seq;
+
+  ExampleNonsecureURBG rbg1(seq);
+  ExampleNonsecureURBG rbg2(seq);
+
+  // ExampleNonsecureURBG rbg3({1, 2, 3});  // Should not compile.
+
+  for (uint32_t i = 0; i < 1000; i++) {
+    EXPECT_EQ(rbg1(), rbg2());
+  }
+
+  rbg1.discard(100);
+  rbg2.discard(100);
+
+  // The sequences should continue after discarding
+  for (uint32_t i = 0; i < 1000; i++) {
+    EXPECT_EQ(rbg1(), rbg2());
+  }
+}
+
+// This is a PRNG-compatible type specifically designed to test
+// that NonsecureURBGBase::Seeder can correctly handle iterators
+// to arbitrary non-uint32_t size types.
+template <typename T>
+struct SeederTestEngine {
+  using result_type = T;
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  template <class SeedSequence,
+            typename = typename absl::enable_if_t<
+                !std::is_same<SeedSequence, SeederTestEngine>::value>>
+  explicit SeederTestEngine(SeedSequence&& seq) {
+    seed(seq);
+  }
+
+  SeederTestEngine(const SeederTestEngine&) = default;
+  SeederTestEngine& operator=(const SeederTestEngine&) = default;
+  SeederTestEngine(SeederTestEngine&&) = default;
+  SeederTestEngine& operator=(SeederTestEngine&&) = default;
+
+  result_type operator()() { return state[0]; }
+
+  template <class SeedSequence>
+  void seed(SeedSequence&& seq) {
+    std::fill(std::begin(state), std::end(state), T(0));
+    seq.generate(std::begin(state), std::end(state));
+  }
+
+  T state[2];
+};
+
+TEST(NonsecureURBGBase, SeederWorksForU32) {
+  using U32 =
+      absl::random_internal::NonsecureURBGBase<SeederTestEngine<uint32_t>>;
+  U32 x;
+  EXPECT_NE(0, x());
+}
+
+TEST(NonsecureURBGBase, SeederWorksForU64) {
+  using U64 =
+      absl::random_internal::NonsecureURBGBase<SeederTestEngine<uint64_t>>;
+
+  U64 x;
+  EXPECT_NE(0, x());
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/pcg_engine.h b/third_party/abseil-cpp/absl/random/internal/pcg_engine.h
new file mode 100644
index 0000000..33fea0b
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/pcg_engine.h
@@ -0,0 +1,305 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_PCG_ENGINE_H_
+#define ABSL_RANDOM_PCG_ENGINE_H_
+
+#include <type_traits>
+
+#include "absl/base/config.h"
+#include "absl/meta/type_traits.h"
+#include "absl/numeric/int128.h"
+#include "absl/random/internal/fastmath.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+namespace random_internal {
+
+// pcg_engine is a simplified implementation of Melissa O'Neil's PCG engine in
+// C++.  PCG combines a linear congruential generator (LCG) with output state
+// mixing functions to generate each random variate.  pcg_engine supports only a
+// single sequence (oneseq), and does not support streams.
+//
+// pcg_engine is parameterized by two types:
+//   Params, which provides the multiplier and increment values;
+//   Mix, which mixes the state into the result.
+//
+template <typename Params, typename Mix>
+class pcg_engine {
+  static_assert(std::is_same<typename Params::state_type,
+                             typename Mix::state_type>::value,
+                "Class-template absl::pcg_engine must be parameterized by "
+                "Params and Mix with identical state_type");
+
+  static_assert(std::is_unsigned<typename Mix::result_type>::value,
+                "Class-template absl::pcg_engine must be parameterized by "
+                "an unsigned Mix::result_type");
+
+  using params_type = Params;
+  using mix_type = Mix;
+  using state_type = typename Mix::state_type;
+
+ public:
+  // C++11 URBG interface:
+  using result_type = typename Mix::result_type;
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  explicit pcg_engine(uint64_t seed_value = 0) { seed(seed_value); }
+
+  template <class SeedSequence,
+            typename = typename absl::enable_if_t<
+                !std::is_same<SeedSequence, pcg_engine>::value>>
+  explicit pcg_engine(SeedSequence&& seq) {
+    seed(seq);
+  }
+
+  pcg_engine(const pcg_engine&) = default;
+  pcg_engine& operator=(const pcg_engine&) = default;
+  pcg_engine(pcg_engine&&) = default;
+  pcg_engine& operator=(pcg_engine&&) = default;
+
+  result_type operator()() {
+    // Advance the LCG state, always using the new value to generate the output.
+    state_ = lcg(state_);
+    return Mix{}(state_);
+  }
+
+  void seed(uint64_t seed_value = 0) {
+    state_type tmp = seed_value;
+    state_ = lcg(tmp + Params::increment());
+  }
+
+  template <class SeedSequence>
+  typename absl::enable_if_t<
+      !std::is_convertible<SeedSequence, uint64_t>::value, void>
+  seed(SeedSequence&& seq) {
+    reseed(seq);
+  }
+
+  void discard(uint64_t count) { state_ = advance(state_, count); }
+
+  bool operator==(const pcg_engine& other) const {
+    return state_ == other.state_;
+  }
+
+  bool operator!=(const pcg_engine& other) const { return !(*this == other); }
+
+  template <class CharT, class Traits>
+  friend typename absl::enable_if_t<(sizeof(state_type) == 16),
+                                    std::basic_ostream<CharT, Traits>&>
+  operator<<(
+      std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+      const pcg_engine& engine) {
+    auto saver = random_internal::make_ostream_state_saver(os);
+    random_internal::stream_u128_helper<state_type> helper;
+    helper.write(pcg_engine::params_type::multiplier(), os);
+    os << os.fill();
+    helper.write(pcg_engine::params_type::increment(), os);
+    os << os.fill();
+    helper.write(engine.state_, os);
+    return os;
+  }
+
+  template <class CharT, class Traits>
+  friend typename absl::enable_if_t<(sizeof(state_type) <= 8),
+                                    std::basic_ostream<CharT, Traits>&>
+  operator<<(
+      std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+      const pcg_engine& engine) {
+    auto saver = random_internal::make_ostream_state_saver(os);
+    os << pcg_engine::params_type::multiplier() << os.fill();
+    os << pcg_engine::params_type::increment() << os.fill();
+    os << engine.state_;
+    return os;
+  }
+
+  template <class CharT, class Traits>
+  friend typename absl::enable_if_t<(sizeof(state_type) == 16),
+                                    std::basic_istream<CharT, Traits>&>
+  operator>>(
+      std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+      pcg_engine& engine) {                   // NOLINT(runtime/references)
+    random_internal::stream_u128_helper<state_type> helper;
+    auto mult = helper.read(is);
+    auto inc = helper.read(is);
+    auto tmp = helper.read(is);
+    if (mult != pcg_engine::params_type::multiplier() ||
+        inc != pcg_engine::params_type::increment()) {
+      // signal failure by setting the failbit.
+      is.setstate(is.rdstate() | std::ios_base::failbit);
+    }
+    if (!is.fail()) {
+      engine.state_ = tmp;
+    }
+    return is;
+  }
+
+  template <class CharT, class Traits>
+  friend typename absl::enable_if_t<(sizeof(state_type) <= 8),
+                                    std::basic_istream<CharT, Traits>&>
+  operator>>(
+      std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+      pcg_engine& engine) {                   // NOLINT(runtime/references)
+    state_type mult{}, inc{}, tmp{};
+    is >> mult >> inc >> tmp;
+    if (mult != pcg_engine::params_type::multiplier() ||
+        inc != pcg_engine::params_type::increment()) {
+      // signal failure by setting the failbit.
+      is.setstate(is.rdstate() | std::ios_base::failbit);
+    }
+    if (!is.fail()) {
+      engine.state_ = tmp;
+    }
+    return is;
+  }
+
+ private:
+  state_type state_;
+
+  // Returns the linear-congruential generator next state.
+  static inline constexpr state_type lcg(state_type s) {
+    return s * Params::multiplier() + Params::increment();
+  }
+
+  // Returns the linear-congruential arbitrary seek state.
+  inline state_type advance(state_type s, uint64_t n) const {
+    state_type mult = Params::multiplier();
+    state_type inc = Params::increment();
+    state_type m = 1;
+    state_type i = 0;
+    while (n > 0) {
+      if (n & 1) {
+        m *= mult;
+        i = i * mult + inc;
+      }
+      inc = (mult + 1) * inc;
+      mult *= mult;
+      n >>= 1;
+    }
+    return m * s + i;
+  }
+
+  template <class SeedSequence>
+  void reseed(SeedSequence& seq) {
+    using sequence_result_type = typename SeedSequence::result_type;
+    constexpr size_t kBufferSize =
+        sizeof(state_type) / sizeof(sequence_result_type);
+    sequence_result_type buffer[kBufferSize];
+    seq.generate(std::begin(buffer), std::end(buffer));
+    // Convert the seed output to a single state value.
+    state_type tmp = buffer[0];
+    for (size_t i = 1; i < kBufferSize; i++) {
+      tmp <<= (sizeof(sequence_result_type) * 8);
+      tmp |= buffer[i];
+    }
+    state_ = lcg(tmp + params_type::increment());
+  }
+};
+
+// Parameterized implementation of the PCG 128-bit oneseq state.
+// This provides state_type, multiplier, and increment for pcg_engine.
+template <uint64_t kMultA, uint64_t kMultB, uint64_t kIncA, uint64_t kIncB>
+class pcg128_params {
+ public:
+#if ABSL_HAVE_INTRINSIC_INT128
+  using state_type = __uint128_t;
+  static inline constexpr state_type make_u128(uint64_t a, uint64_t b) {
+    return (static_cast<__uint128_t>(a) << 64) | b;
+  }
+#else
+  using state_type = absl::uint128;
+  static inline constexpr state_type make_u128(uint64_t a, uint64_t b) {
+    return absl::MakeUint128(a, b);
+  }
+#endif
+
+  static inline constexpr state_type multiplier() {
+    return make_u128(kMultA, kMultB);
+  }
+  static inline constexpr state_type increment() {
+    return make_u128(kIncA, kIncB);
+  }
+};
+
+// Implementation of the PCG xsl_rr_128_64 128-bit mixing function, which
+// accepts an input of state_type and mixes it into an output of result_type.
+struct pcg_xsl_rr_128_64 {
+#if ABSL_HAVE_INTRINSIC_INT128
+  using state_type = __uint128_t;
+#else
+  using state_type = absl::uint128;
+#endif
+  using result_type = uint64_t;
+
+  inline uint64_t operator()(state_type state) {
+    // This is equivalent to the xsl_rr_128_64 mixing function.
+#if ABSL_HAVE_INTRINSIC_INT128
+    uint64_t rotate = static_cast<uint64_t>(state >> 122u);
+    state ^= state >> 64;
+    uint64_t s = static_cast<uint64_t>(state);
+#else
+    uint64_t h = Uint128High64(state);
+    uint64_t rotate = h >> 58u;
+    uint64_t s = Uint128Low64(state) ^ h;
+#endif
+    return random_internal::rotr(s, rotate);
+  }
+};
+
+// Parameterized implementation of the PCG 64-bit oneseq state.
+// This provides state_type, multiplier, and increment for pcg_engine.
+template <uint64_t kMult, uint64_t kInc>
+class pcg64_params {
+ public:
+  using state_type = uint64_t;
+  static inline constexpr state_type multiplier() { return kMult; }
+  static inline constexpr state_type increment() { return kInc; }
+};
+
+// Implementation of the PCG xsh_rr_64_32 64-bit mixing function, which accepts
+// an input of state_type and mixes it into an output of result_type.
+struct pcg_xsh_rr_64_32 {
+  using state_type = uint64_t;
+  using result_type = uint32_t;
+  inline uint32_t operator()(uint64_t state) {
+    return random_internal::rotr(
+        static_cast<uint32_t>(((state >> 18) ^ state) >> 27), state >> 59);
+  }
+};
+
+// Stable pcg_engine implementations:
+// This is a 64-bit generator using 128-bits of state.
+// The output sequence is equivalent to Melissa O'Neil's pcg64_oneseq.
+using pcg64_2018_engine = pcg_engine<
+    random_internal::pcg128_params<0x2360ed051fc65da4ull, 0x4385df649fccf645ull,
+                                   0x5851f42d4c957f2d, 0x14057b7ef767814f>,
+    random_internal::pcg_xsl_rr_128_64>;
+
+// This is a 32-bit generator using 64-bits of state.
+// This is equivalent to Melissa O'Neil's pcg32_oneseq.
+using pcg32_2018_engine = pcg_engine<
+    random_internal::pcg64_params<0x5851f42d4c957f2dull, 0x14057b7ef767814full>,
+    random_internal::pcg_xsh_rr_64_32>;
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_PCG2018_ENGINE_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/pcg_engine_test.cc b/third_party/abseil-cpp/absl/random/internal/pcg_engine_test.cc
new file mode 100644
index 0000000..4d763e89
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/pcg_engine_test.cc
@@ -0,0 +1,638 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/pcg_engine.h"
+
+#include <algorithm>
+#include <bitset>
+#include <random>
+#include <sstream>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/random/internal/explicit_seed_seq.h"
+#include "absl/time/clock.h"
+
+#define UPDATE_GOLDEN 0
+
+namespace {
+
+using absl::random_internal::ExplicitSeedSeq;
+using absl::random_internal::pcg32_2018_engine;
+using absl::random_internal::pcg64_2018_engine;
+
+template <typename EngineType>
+class PCGEngineTest : public ::testing::Test {};
+
+using EngineTypes = ::testing::Types<pcg64_2018_engine, pcg32_2018_engine>;
+
+TYPED_TEST_SUITE(PCGEngineTest, EngineTypes);
+
+TYPED_TEST(PCGEngineTest, VerifyReseedChangesAllValues) {
+  using engine_type = TypeParam;
+  using result_type = typename engine_type::result_type;
+
+  const size_t kNumOutputs = 16;
+  engine_type engine;
+
+  // MSVC emits error 2719 without the use of std::ref below.
+  //  * formal parameter with __declspec(align('#')) won't be aligned
+
+  {
+    std::seed_seq seq1{1, 2, 3, 4, 5, 6, 7};
+    engine.seed(seq1);
+  }
+  result_type a[kNumOutputs];
+  std::generate(std::begin(a), std::end(a), std::ref(engine));
+
+  {
+    std::random_device rd;
+    std::seed_seq seq2{rd(), rd(), rd()};
+    engine.seed(seq2);
+  }
+  result_type b[kNumOutputs];
+  std::generate(std::begin(b), std::end(b), std::ref(engine));
+
+  // Verify that two uncorrelated values have ~50% of there bits in common. Use
+  // a 10% margin-of-error to reduce flakiness.
+  size_t changed_bits = 0;
+  size_t unchanged_bits = 0;
+  size_t total_set = 0;
+  size_t total_bits = 0;
+  size_t equal_count = 0;
+  for (size_t i = 0; i < kNumOutputs; ++i) {
+    equal_count += (a[i] == b[i]) ? 1 : 0;
+    std::bitset<sizeof(result_type) * 8> bitset(a[i] ^ b[i]);
+    changed_bits += bitset.count();
+    unchanged_bits += bitset.size() - bitset.count();
+
+    std::bitset<sizeof(result_type) * 8> a_set(a[i]);
+    std::bitset<sizeof(result_type) * 8> b_set(b[i]);
+    total_set += a_set.count() + b_set.count();
+    total_bits += 2 * 8 * sizeof(result_type);
+  }
+  // On average, half the bits are changed between two calls.
+  EXPECT_LE(changed_bits, 0.60 * (changed_bits + unchanged_bits));
+  EXPECT_GE(changed_bits, 0.40 * (changed_bits + unchanged_bits));
+
+  // verify using a quick normal-approximation to the binomial.
+  EXPECT_NEAR(total_set, total_bits * 0.5, 4 * std::sqrt(total_bits))
+      << "@" << total_set / static_cast<double>(total_bits);
+
+  // Also, A[i] == B[i] with probability (1/range) * N.
+  // Give this a pretty wide latitude, though.
+  const double kExpected = kNumOutputs / (1.0 * sizeof(result_type) * 8);
+  EXPECT_LE(equal_count, 1.0 + kExpected);
+}
+
+// Number of values that needs to be consumed to clean two sizes of buffer
+// and trigger third refresh. (slightly overestimates the actual state size).
+constexpr size_t kTwoBufferValues = 16;
+
+TYPED_TEST(PCGEngineTest, VerifyDiscard) {
+  using engine_type = TypeParam;
+
+  for (size_t num_used = 0; num_used < kTwoBufferValues; ++num_used) {
+    engine_type engine_used;
+    for (size_t i = 0; i < num_used; ++i) {
+      engine_used();
+    }
+
+    for (size_t num_discard = 0; num_discard < kTwoBufferValues;
+         ++num_discard) {
+      engine_type engine1 = engine_used;
+      engine_type engine2 = engine_used;
+      for (size_t i = 0; i < num_discard; ++i) {
+        engine1();
+      }
+      engine2.discard(num_discard);
+      for (size_t i = 0; i < kTwoBufferValues; ++i) {
+        const auto r1 = engine1();
+        const auto r2 = engine2();
+        ASSERT_EQ(r1, r2) << "used=" << num_used << " discard=" << num_discard;
+      }
+    }
+  }
+}
+
+TYPED_TEST(PCGEngineTest, StreamOperatorsResult) {
+  using engine_type = TypeParam;
+
+  std::wostringstream os;
+  std::wistringstream is;
+  engine_type engine;
+
+  EXPECT_EQ(&(os << engine), &os);
+  EXPECT_EQ(&(is >> engine), &is);
+}
+
+TYPED_TEST(PCGEngineTest, StreamSerialization) {
+  using engine_type = TypeParam;
+
+  for (size_t discard = 0; discard < kTwoBufferValues; ++discard) {
+    ExplicitSeedSeq seed_sequence{12, 34, 56};
+    engine_type engine(seed_sequence);
+    engine.discard(discard);
+
+    std::stringstream stream;
+    stream << engine;
+
+    engine_type new_engine;
+    stream >> new_engine;
+    for (size_t i = 0; i < 64; ++i) {
+      EXPECT_EQ(engine(), new_engine()) << " " << i;
+    }
+  }
+}
+
+constexpr size_t kNumGoldenOutputs = 127;
+
+// This test is checking if randen_engine is meets interface requirements
+// defined in [rand.req.urbg].
+TYPED_TEST(PCGEngineTest, RandomNumberEngineInterface) {
+  using engine_type = TypeParam;
+
+  using E = engine_type;
+  using T = typename E::result_type;
+
+  static_assert(std::is_copy_constructible<E>::value,
+                "engine_type must be copy constructible");
+
+  static_assert(absl::is_copy_assignable<E>::value,
+                "engine_type must be copy assignable");
+
+  static_assert(std::is_move_constructible<E>::value,
+                "engine_type must be move constructible");
+
+  static_assert(absl::is_move_assignable<E>::value,
+                "engine_type must be move assignable");
+
+  static_assert(std::is_same<decltype(std::declval<E>()()), T>::value,
+                "return type of operator() must be result_type");
+
+  // Names after definition of [rand.req.urbg] in C++ standard.
+  // e us a value of E
+  // v is a lvalue of E
+  // x, y are possibly const values of E
+  // s is a value of T
+  // q is a value satisfying requirements of seed_sequence
+  // z is a value of type unsigned long long
+  // os is a some specialization of basic_ostream
+  // is is a some specialization of basic_istream
+
+  E e, v;
+  const E x, y;
+  T s = 1;
+  std::seed_seq q{1, 2, 3};
+  unsigned long long z = 1;  // NOLINT(runtime/int)
+  std::wostringstream os;
+  std::wistringstream is;
+
+  E{};
+  E{x};
+  E{s};
+  E{q};
+
+  e.seed();
+
+  // MSVC emits error 2718 when using EXPECT_EQ(e, x)
+  //  * actual parameter with __declspec(align('#')) won't be aligned
+  EXPECT_TRUE(e == x);
+
+  e.seed(q);
+  {
+    E tmp(q);
+    EXPECT_TRUE(e == tmp);
+  }
+
+  e();
+  {
+    E tmp(q);
+    EXPECT_TRUE(e != tmp);
+  }
+
+  e.discard(z);
+
+  static_assert(std::is_same<decltype(x == y), bool>::value,
+                "return type of operator== must be bool");
+
+  static_assert(std::is_same<decltype(x != y), bool>::value,
+                "return type of operator== must be bool");
+}
+
+TYPED_TEST(PCGEngineTest, RandenEngineSFINAETest) {
+  using engine_type = TypeParam;
+  using result_type = typename engine_type::result_type;
+
+  {
+    engine_type engine(result_type(1));
+    engine.seed(result_type(1));
+  }
+
+  {
+    result_type n = 1;
+    engine_type engine(n);
+    engine.seed(n);
+  }
+
+  {
+    engine_type engine(1);
+    engine.seed(1);
+  }
+
+  {
+    int n = 1;
+    engine_type engine(n);
+    engine.seed(n);
+  }
+
+  {
+    std::seed_seq seed_seq;
+    engine_type engine(seed_seq);
+    engine.seed(seed_seq);
+  }
+
+  {
+    engine_type engine{std::seed_seq()};
+    engine.seed(std::seed_seq());
+  }
+}
+
+// ------------------------------------------------------------------
+// Stability tests for pcg64_2018_engine
+// ------------------------------------------------------------------
+TEST(PCG642018EngineTest, VerifyGolden) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0x01070196e695f8f1, 0x703ec840c59f4493, 0xe54954914b3a44fa,
+      0x96130ff204b9285e, 0x7d9fdef535ceb21a, 0x666feed42e1219a0,
+      0x981f685721c8326f, 0xad80710d6eab4dda, 0xe202c480b037a029,
+      0x5d3390eaedd907e2, 0x0756befb39c6b8aa, 0x1fb44ba6634d62a3,
+      0x8d20423662426642, 0x34ea910167a39fb4, 0x93010b43a80d0ab6,
+      0x663db08a98fc568a, 0x720b0a1335956fae, 0x2c35483e31e1d3ba,
+      0x429f39776337409d, 0xb46d99e638687344, 0x105370b96aedcaee,
+      0x3999e92f811cff71, 0xd230f8bcb591cfc9, 0x0dce3db2ba7bdea5,
+      0xcf2f52c91eec99af, 0x2bc7c24a8b998a39, 0xbd8af1b0d599a19c,
+      0x56bc45abc66059f5, 0x170a46dc170f7f1e, 0xc25daf5277b85fad,
+      0xe629c2e0c948eadb, 0x1720a796915542ed, 0x22fb0caa4f909951,
+      0x7e0c0f4175acd83d, 0xd9fcab37ff2a860c, 0xab2280fb2054bad1,
+      0x58e8a06f37fa9e99, 0xc3a52a30b06528c7, 0x0175f773a13fc1bd,
+      0x731cfc584b00e840, 0x404cc7b2648069cb, 0x5bc29153b0b7f783,
+      0x771310a38cc999d1, 0x766a572f0a71a916, 0x90f450fb4fc48348,
+      0xf080ea3e1c7b1a0d, 0x15471a4507d66a44, 0x7d58e55a78f3df69,
+      0x0130a094576ac99c, 0x46669cb2d04b1d87, 0x17ab5bed20191840,
+      0x95b177d260adff3e, 0x025fb624b6ee4c07, 0xb35de4330154a95f,
+      0xe8510fff67e24c79, 0x132c3cbcd76ed2d3, 0x35e7cc145a093904,
+      0x9f5b5b5f81583b79, 0x3ee749a533966233, 0x4af85886cdeda8cd,
+      0x0ca5380ecb3ef3aa, 0x4f674eb7661d3192, 0x88a29aad00cd7733,
+      0x70b627ca045ffac6, 0x5912b43ea887623d, 0x95dc9fc6f62cf221,
+      0x926081a12a5c905b, 0x9c57d4cd7dfce651, 0x85ab2cbf23e3bb5d,
+      0xc5cd669f63023152, 0x3067be0fad5d898e, 0x12b56f444cb53d05,
+      0xbc2e5a640c3434fc, 0x9280bff0e4613fe1, 0x98819094c528743e,
+      0x999d1c98d829df33, 0x9ff82a012dc89242, 0xf99183ed39c8be94,
+      0xf0f59161cd421c55, 0x3c705730c2f6c48d, 0x66ad85c6e9278a61,
+      0x2a3428e4a428d5d0, 0x79207d68fd04940d, 0xea7f2b402edc8430,
+      0xa06b419ac857f63b, 0xcb1dd0e6fbc47e1c, 0x4f55229200ada6a4,
+      0x9647b5e6359c927f, 0x30bf8f9197c7efe5, 0xa79519529cc384d0,
+      0xbb22c4f339ad6497, 0xd7b9782f59d14175, 0x0dff12fff2ec0118,
+      0xa331ad8305343a7c, 0x48dad7e3f17e0862, 0x324c6fb3fd3c9665,
+      0xf0e4350e7933dfc4, 0x7ccda2f30b8b03b6, 0xa0afc6179005de40,
+      0xee65da6d063b3a30, 0xb9506f42f2bfe87a, 0xc9a2e26b0ef5baa0,
+      0x39fa9d4f495011d6, 0xbecc21a45d023948, 0x6bf484c6593f737f,
+      0x8065e0070cadc3b7, 0x9ef617ed8d419799, 0xac692cf8c233dd15,
+      0xd2ed87583c4ebb98, 0xad95ba1bebfedc62, 0x9b60b160a8264e43,
+      0x0bc8c45f71fcf25b, 0x4a78035cdf1c9931, 0x4602dc106667e029,
+      0xb335a3c250498ac8, 0x0256ebc4df20cab8, 0x0c61efd153f0c8d9,
+      0xe5d0150a4f806f88, 0x99d6521d351e7d87, 0x8d4888c9f80f4325,
+      0x106c5735c1ba868d, 0x73414881b880a878, 0x808a9a58a3064751,
+      0x339a29f3746de3d5, 0x5410d7fa4f873896, 0xd84623c81d7b8a03,
+      0x1f7c7e7a7f47f462,
+  };
+
+  pcg64_2018_engine engine(0);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed();
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(PCG642018EngineTest, VerifyGoldenSeeded) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0xb03988f1e39691ee, 0xbd2a1eb5ac31e97a, 0x8f00d6d433634d02,
+      0x1823c28d483d5776, 0x000c3ee3e1aeb74a, 0xfa82ef27a4f3df9c,
+      0xc6f382308654e454, 0x414afb1a238996c2, 0x4703a4bc252eb411,
+      0x99d64f62c8f7f654, 0xbb07ebe11a34fa44, 0x79eb06a363c06131,
+      0xf66ad3756f1c6b21, 0x130c01d5e869f457, 0x5ca2b9963aecbc81,
+      0xfef7bebc1de27e6c, 0x1d174faa5ed2cdbf, 0xd75b7a773f2bb889,
+      0xc35c872327a170a5, 0x46da6d88646a42fe, 0x4622985e0442dae2,
+      0xbe3cbd67297f1f9b, 0xe7c37b4a4798bfd1, 0x173d5dfad15a25c3,
+      0x0eb6849ba2961522, 0xb0ff7246e6700d73, 0x88cb9c42d3afa577,
+      0xb609731dbd94d917, 0xd3941cda04b40081, 0x28d140f7409bea3a,
+      0x3c96699a920a124a, 0xdb28be521958b2fd, 0x0a3f44db3d4c5124,
+      0x7ac8e60ba13b70d2, 0x75f03a41ded5195a, 0xaed10ac7c4e4825d,
+      0xb92a3b18aadb7adc, 0xda45e0081f2bca46, 0x74d39ab3753143fc,
+      0xb686038018fac9ca, 0x4cc309fe99542dbb, 0xf3e1a4fcb311097c,
+      0x58763d6fa698d69d, 0xd11c365dbecd8d60, 0x2c15d55725b1dee7,
+      0x89805f254d85658c, 0x2374c44dfc62158b, 0x9a8350fa7995328d,
+      0x198f838970cf91da, 0x96aff569562c0e53, 0xd76c8c52b7ec6e3f,
+      0x23a01cd9ae4baa81, 0x3adb366b6d02a893, 0xb3313e2a4c5b333f,
+      0x04c11230b96a5425, 0x1f7f7af04787d571, 0xaddb019365275ec7,
+      0x5c960468ccb09f42, 0x8438db698c69a44a, 0x492be1e46111637e,
+      0x9c6c01e18100c610, 0xbfe48e75b7d0aceb, 0xb5e0b89ec1ce6a00,
+      0x9d280ecbc2fe8997, 0x290d9e991ba5fcab, 0xeec5bec7d9d2a4f0,
+      0x726e81488f19150e, 0x1a6df7955a7e462c, 0x37a12d174ba46bb5,
+      0x3cdcdffd96b1b5c5, 0x2c5d5ac10661a26e, 0xa742ed18f22e50c4,
+      0x00e0ed88ff0d8a35, 0x3d3c1718cb1efc0b, 0x1d70c51ffbccbf11,
+      0xfbbb895132a4092f, 0x619d27f2fb095f24, 0x69af68200985e5c4,
+      0xbee4885f57373f8d, 0x10b7a6bfe0587e40, 0xa885e6cf2f7e5f0a,
+      0x59f879464f767550, 0x24e805d69056990d, 0x860970b911095891,
+      0xca3189954f84170d, 0x6652a5edd4590134, 0x5e1008cef76174bf,
+      0xcbd417881f2bcfe5, 0xfd49fc9d706ecd17, 0xeebf540221ebd066,
+      0x46af7679464504cb, 0xd4028486946956f1, 0xd4f41864b86c2103,
+      0x7af090e751583372, 0x98cdaa09278cb642, 0xffd42b921215602f,
+      0x1d05bec8466b1740, 0xf036fa78a0132044, 0x787880589d1ecc78,
+      0x5644552cfef33230, 0x0a97e275fe06884b, 0x96d1b13333d470b5,
+      0xc8b3cdad52d3b034, 0x091357b9db7376fd, 0xa5fe4232555edf8c,
+      0x3371bc3b6ada76b5, 0x7deeb2300477c995, 0x6fc6d4244f2849c1,
+      0x750e8cc797ca340a, 0x81728613cd79899f, 0x3467f4ee6f9aeb93,
+      0x5ef0a905f58c640f, 0x432db85e5101c98a, 0x6488e96f46ac80c2,
+      0x22fddb282625048c, 0x15b287a0bc2d4c5d, 0xa7e2343ef1f28bce,
+      0xc87ee1aa89bed09e, 0x220610107812c5e9, 0xcbdab6fcd640f586,
+      0x8d41047970928784, 0x1aa431509ec1ade0, 0xac3f0be53f518ddc,
+      0x16f4428ad81d0cbb, 0x675b13c2736fc4bb, 0x6db073afdd87e32d,
+      0x572f3ca2f1a078c6,
+  };
+
+  ExplicitSeedSeq seed_sequence{12, 34, 56};
+  pcg64_2018_engine engine(seed_sequence);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed(seed_sequence);
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(PCG642018EngineTest, VerifyGoldenFromDeserializedEngine) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0xdd425b47b4113dea, 0x1b07176479d444b0, 0x6b391027586f2e42,
+      0xa166f2b15f4a2143, 0xffb6dbd7a179ee97, 0xb2c00035365bf0b1,
+      0x8fbb518b45855521, 0xfc789a55ddf87c3b, 0x429531f0f17ff355,
+      0xbe708560d603d283, 0x5bff415175c5cb6b, 0xe813491f4ad45394,
+      0xa853f4506d55880d, 0x7e538453e568172e, 0xe101f1e098ddd0ec,
+      0x6ee31266ee4c766d, 0xa8786d92d66b39d7, 0xfee622a2acf5e5b0,
+      0x5fe8e82c102fa7b3, 0x01f10be4cdb53c9d, 0xbe0545366f857022,
+      0x12e74f010a339bca, 0xb10d85ca40d5ce34, 0xe80d6feba5054875,
+      0x2b7c1ee6d567d4ee, 0x2a9cd043bfd03b66, 0x5cfc531bd239f3f1,
+      0x1c4734e4647d70f5, 0x85a8f60f006b5760, 0x6a4239ce76dca387,
+      0x8da0f86d7339335c, 0xf055b0468551374d, 0x486e8567e9bea9a0,
+      0x4cb531b8405192dd, 0xf813b1ee3157110b, 0x214c2a664a875d8e,
+      0x74531237b29b35f7, 0xa6f0267bb77a771e, 0x64b552bff54184a4,
+      0xa2d6f7af2d75b6fc, 0x460a10018e03b5ab, 0x76fd1fdcb81d0800,
+      0x76f5f81805070d9d, 0x1fb75cb1a70b289a, 0x9dfd25a022c4b27f,
+      0x9a31a14a80528e9e, 0x910dc565ddc25820, 0xd6aef8e2b0936c10,
+      0xe1773c507fe70225, 0xe027fd7aadd632bc, 0xc1fecb427089c8b8,
+      0xb5c74c69fa9dbf26, 0x71bf9b0e4670227d, 0x25f48fad205dcfdd,
+      0x905248ec4d689c56, 0x5c2b7631b0de5c9d, 0x9f2ee0f8f485036c,
+      0xfd6ce4ebb90bf7ea, 0xd435d20046085574, 0x6b7eadcb0625f986,
+      0x679d7d44b48be89e, 0x49683b8e1cdc49de, 0x4366cf76e9a2f4ca,
+      0x54026ec1cdad7bed, 0xa9a04385207f28d3, 0xc8e66de4eba074b2,
+      0x40b08c42de0f4cc0, 0x1d4c5e0e93c5bbc0, 0x19b80792e470ae2d,
+      0x6fcaaeaa4c2a5bd9, 0xa92cb07c4238438e, 0x8bb5c918a007e298,
+      0x7cd671e944874cf4, 0x88166470b1ba3cac, 0xd013d476eaeeade6,
+      0xcee416947189b3c3, 0x5d7c16ab0dce6088, 0xd3578a5c32b13d27,
+      0x3875db5adc9cc973, 0xfbdaba01c5b5dc56, 0xffc4fdd391b231c3,
+      0x2334520ecb164fec, 0x361c115e7b6de1fa, 0xeee58106cc3563d7,
+      0x8b7f35a8db25ebb8, 0xb29d00211e2cafa6, 0x22a39fe4614b646b,
+      0x92ca6de8b998506d, 0x40922fe3d388d1db, 0x9da47f1e540f802a,
+      0x811dceebf16a25db, 0xf6524ae22e0e53a9, 0x52d9e780a16eb99d,
+      0x4f504286bb830207, 0xf6654d4786bd5cc3, 0x00bd98316003a7e1,
+      0xefda054a6ab8f5f3, 0x46cfb0f4c1872827, 0xc22b316965c0f3b2,
+      0xd1a28087c7e7562a, 0xaa4f6a094b7f5cff, 0xfe2bc853a041f7da,
+      0xe9d531402a83c3ba, 0xe545d8663d3ce4dd, 0xfa2dcd7d91a13fa8,
+      0xda1a080e52a127b8, 0x19c98f1f809c3d84, 0x2cef109af4678c88,
+      0x53462accab3b9132, 0x176b13a80415394e, 0xea70047ef6bc178b,
+      0x57bca80506d6dcdf, 0xd853ba09ff09f5c4, 0x75f4df3a7ddd4775,
+      0x209c367ade62f4fe, 0xa9a0bbc74d5f4682, 0x5dfe34bada86c21a,
+      0xc2c05bbcd38566d1, 0x6de8088e348c916a, 0x6a7001c6000c2196,
+      0xd9fb51865fc4a367, 0x12f320e444ece8ff, 0x6d56f7f793d65035,
+      0x138f31b7a865f8aa, 0x58fc68b4026b9adf, 0xcd48954b79fb6436,
+      0x27dfce4a0232af87,
+  };
+
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  std::seed_seq seed_sequence{1, 2, 3};
+  pcg64_2018_engine engine(seed_sequence);
+  std::ostringstream stream;
+  stream << engine;
+  auto str = stream.str();
+  printf("%s\n\n", str.c_str());
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  pcg64_2018_engine engine;
+  std::istringstream stream(
+      "2549297995355413924 4865540595714422341 6364136223846793005 "
+      "1442695040888963407 18088519957565336995 4845369368158826708");
+  stream >> engine;
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+// ------------------------------------------------------------------
+// Stability tests for pcg32_2018_engine
+// ------------------------------------------------------------------
+TEST(PCG322018EngineTest, VerifyGolden) {
+  constexpr uint32_t kGolden[kNumGoldenOutputs] = {
+      0x7a7ecbd9, 0x89fd6c06, 0xae646aa8, 0xcd3cf945, 0x6204b303, 0x198c8585,
+      0x49fce611, 0xd1e9297a, 0x142d9440, 0xee75f56b, 0x473a9117, 0xe3a45903,
+      0xbce807a1, 0xe54e5f4d, 0x497d6c51, 0x61829166, 0xa740474b, 0x031912a8,
+      0x9de3defa, 0xd266dbf1, 0x0f38bebb, 0xec3c4f65, 0x07c5057d, 0xbbce03c8,
+      0xfd2ac7a8, 0xffcf4773, 0x5b10affb, 0xede1c842, 0xe22b01b7, 0xda133c8c,
+      0xaf89b0f4, 0x25d1b8bc, 0x9f625482, 0x7bfd6882, 0x2e2210c0, 0x2c8fb9a6,
+      0x42cb3b83, 0x40ce0dab, 0x644a3510, 0x36230ef2, 0xe2cb6d43, 0x1012b343,
+      0x746c6c9f, 0x36714cf8, 0xed1f5026, 0x8bbbf83e, 0xe98710f4, 0x8a2afa36,
+      0x09035349, 0x6dc1a487, 0x682b634b, 0xc106794f, 0x7dd78beb, 0x628c262b,
+      0x852fb232, 0xb153ac4c, 0x4f169d1b, 0xa69ab774, 0x4bd4b6f2, 0xdc351dd3,
+      0x93ff3c8c, 0xa30819ab, 0xff07758c, 0x5ab13c62, 0xd16d7fb5, 0xc4950ffa,
+      0xd309ae49, 0xb9677a87, 0x4464e317, 0x90dc44f1, 0xc694c1d4, 0x1d5e1168,
+      0xadf37a2d, 0xda38990d, 0x1ec4bd33, 0x36ca25ce, 0xfa0dc76a, 0x968a9d43,
+      0x6950ac39, 0xdd3276bc, 0x06d5a71e, 0x1f6f282d, 0x5c626c62, 0xdde3fc31,
+      0x152194ce, 0xc35ed14c, 0xb1f7224e, 0x47f76bb8, 0xb34fdd08, 0x7011395e,
+      0x162d2a49, 0x0d1bf09f, 0x9428a952, 0x03c5c344, 0xd3525616, 0x7816fff3,
+      0x6bceb8a8, 0x8345a081, 0x366420fd, 0x182abeda, 0x70f82745, 0xaf15ded8,
+      0xc7f52ca2, 0xa98db9c5, 0x919d99ba, 0x9c376c1c, 0xed8d34c2, 0x716ae9f5,
+      0xef062fa5, 0xee3b6c56, 0x52325658, 0x61afa9c3, 0xfdaf02f0, 0x961cf3ab,
+      0x9f291565, 0x4fbf3045, 0x0590c899, 0xde901385, 0x45005ffb, 0x509db162,
+      0x262fa941, 0x4c421653, 0x4b17c21e, 0xea0d1530, 0xde803845, 0x61bfd515,
+      0x438523ef,
+  };
+
+  pcg32_2018_engine engine(0);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%08x, ", engine());
+    if (i % 6 == 5) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed();
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(PCG322018EngineTest, VerifyGoldenSeeded) {
+  constexpr uint32_t kGolden[kNumGoldenOutputs] = {
+      0x60b5a64c, 0x978502f9, 0x80a75f60, 0x241f1158, 0xa4cd1dbb, 0xe7284017,
+      0x3b678da5, 0x5223ec99, 0xe4bdd5d9, 0x72190e6d, 0xe6e702c9, 0xff80c768,
+      0xcf126ed3, 0x1fbd20ab, 0x60980489, 0xbc72bf89, 0x407ac6c0, 0x00bf3c51,
+      0xf9087897, 0x172e4eb6, 0xe9e4f443, 0x1a6098bf, 0xbf44f8c2, 0xdd84a0e5,
+      0xd9a52364, 0xc0e2e786, 0x061ae2ba, 0x9facb8e3, 0x6109432d, 0xd4e0a013,
+      0xbd8eb9a6, 0x7e86c3b6, 0x629c0e68, 0x05337430, 0xb495b9f4, 0x11ccd65d,
+      0xb578db25, 0x66f1246d, 0x6ef20a7f, 0x5e429812, 0x11772130, 0xb944b5c2,
+      0x01624128, 0xa2385ab7, 0xd3e10d35, 0xbe570ec3, 0xc951656f, 0xbe8944a0,
+      0x7be41062, 0x5709f919, 0xd745feda, 0x9870b9ae, 0xb44b8168, 0x19e7683b,
+      0xded8017f, 0xc6e4d544, 0x91ae4225, 0xd6745fba, 0xb992f284, 0x65b12b33,
+      0xa9d5fdb4, 0xf105ce1a, 0x35ca1a6e, 0x2ff70dd0, 0xd8335e49, 0xfb71ddf2,
+      0xcaeabb89, 0x5c6f5f84, 0x9a811a7d, 0xbcecbbd1, 0x0f661ba0, 0x9ad93b9d,
+      0xedd23e0b, 0x42062f48, 0xd38dd7e4, 0x6cd63c9c, 0x640b98ae, 0x4bff5653,
+      0x12626371, 0x13266017, 0xe7a698d8, 0x39c74667, 0xe8fdf2e3, 0x52803bf8,
+      0x2af6895b, 0x91335b7b, 0x699e4961, 0x00a40fff, 0x253ff2b6, 0x4a6cf672,
+      0x9584e85f, 0xf2a5000c, 0x4d58aba8, 0xb8513e6a, 0x767fad65, 0x8e326f9e,
+      0x182f15a1, 0x163dab52, 0xdf99c780, 0x047282a1, 0xee4f90dd, 0xd50394ae,
+      0x6c9fd5f0, 0xb06a9194, 0x387e3840, 0x04a9487b, 0xf678a4c2, 0xd0a78810,
+      0xd502c97e, 0xd6a9b12a, 0x4accc5dc, 0x416ed53e, 0x50411536, 0xeeb89c24,
+      0x813a7902, 0x034ebca6, 0xffa52e7c, 0x7ecd3d0e, 0xfa37a0d2, 0xb1fbe2c1,
+      0xb7efc6d1, 0xefa4ccee, 0xf6f80424, 0x2283f3d9, 0x68732284, 0x94f3b5c8,
+      0xbbdeceb9,
+  };
+
+  ExplicitSeedSeq seed_sequence{12, 34, 56};
+  pcg32_2018_engine engine(seed_sequence);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%08x, ", engine());
+    if (i % 6 == 5) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed(seed_sequence);
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(PCG322018EngineTest, VerifyGoldenFromDeserializedEngine) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0x780f7042, 0xba137215, 0x43ab6f22, 0x0cb55f46, 0x44b2627d, 0x835597af,
+      0xea973ea1, 0x0d2abd35, 0x4fdd601c, 0xac4342fe, 0x7db7e93c, 0xe56ebcaf,
+      0x3596470a, 0x7770a9ad, 0x9b893320, 0x57db3415, 0xb432de54, 0xa02baf71,
+      0xa256aadb, 0x88921fc7, 0xa35fa6b3, 0xde3eca46, 0x605739a7, 0xa890b82b,
+      0xe457b7ad, 0x335fb903, 0xeb06790c, 0xb3c54bf6, 0x6141e442, 0xa599a482,
+      0xb78987cc, 0xc61dfe9d, 0x0f1d6ace, 0x17460594, 0x8f6a5061, 0x083dc354,
+      0xe9c337fb, 0xcfd105f7, 0x926764b6, 0x638d24dc, 0xeaac650a, 0x67d2cb9c,
+      0xd807733c, 0x205fc52e, 0xf5399e2e, 0x6c46ddcc, 0xb603e875, 0xce113a25,
+      0x3c8d4813, 0xfb584db8, 0xf6d255ff, 0xea80954f, 0x42e8be85, 0xb2feee72,
+      0x62bd8d16, 0x1be4a142, 0x97dca1a4, 0xdd6e7333, 0xb2caa20e, 0xa12b1588,
+      0xeb3a5a1a, 0x6fa5ba89, 0x077ea931, 0x8ddb1713, 0x0dd03079, 0x2c2ba965,
+      0xa77fac17, 0xc8325742, 0x8bb893bf, 0xc2315741, 0xeaceee92, 0x81dd2ee2,
+      0xe5214216, 0x1b9b8fb2, 0x01646d03, 0x24facc25, 0xd8c0e0bb, 0xa33fe106,
+      0xf34fe976, 0xb3b4b44e, 0x65618fed, 0x032c6192, 0xa9dd72ce, 0xf391887b,
+      0xf41c6a6e, 0x05c4bd6d, 0x37fa260e, 0x46b05659, 0xb5f6348a, 0x62d26d89,
+      0x39f6452d, 0xb17b30a2, 0xbdd82743, 0x38ecae3b, 0xfe90f0a2, 0xcb2d226d,
+      0xcf8a0b1c, 0x0eed3d4d, 0xa1f69cfc, 0xd7ac3ba5, 0xce9d9a6b, 0x121deb4c,
+      0x4a0d03f3, 0xc1821ed1, 0x59c249ac, 0xc0abb474, 0x28149985, 0xfd9a82ba,
+      0x5960c3b2, 0xeff00cba, 0x6073aa17, 0x25dc0919, 0x9976626e, 0xdd2ccc33,
+      0x39ecb6ec, 0xc6e15d13, 0xfac94cfd, 0x28cfd34f, 0xf2d2c32d, 0x51c23d08,
+      0x4fdb2f48, 0x97baa807, 0xf2c1004c, 0xc4ae8136, 0x71f31c94, 0x8c92d601,
+      0x36caf5cd,
+  };
+
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  std::seed_seq seed_sequence{1, 2, 3};
+  pcg32_2018_engine engine(seed_sequence);
+  std::ostringstream stream;
+  stream << engine;
+  auto str = stream.str();
+  printf("%s\n\n", str.c_str());
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%08x, ", engine());
+    if (i % 6 == 5) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+
+  EXPECT_FALSE(true);
+#else
+  pcg32_2018_engine engine;
+  std::istringstream stream(
+      "6364136223846793005 1442695040888963407 6537028157270659894");
+  stream >> engine;
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/platform.h b/third_party/abseil-cpp/absl/random/internal/platform.h
new file mode 100644
index 0000000..5edab344
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/platform.h
@@ -0,0 +1,212 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_PLATFORM_H_
+#define ABSL_RANDOM_INTERNAL_PLATFORM_H_
+
+// HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
+// symbols from arbitrary system and other headers, since it may be built
+// with different flags from other targets, using different levels of
+// optimization, potentially introducing ODR violations.
+
+// -----------------------------------------------------------------------------
+// Platform Feature Checks
+// -----------------------------------------------------------------------------
+
+// Currently supported operating systems and associated preprocessor
+// symbols:
+//
+//   Linux and Linux-derived           __linux__
+//   Android                           __ANDROID__ (implies __linux__)
+//   Linux (non-Android)               __linux__ && !__ANDROID__
+//   Darwin (Mac OS X and iOS)         __APPLE__
+//   Akaros (http://akaros.org)        __ros__
+//   Windows                           _WIN32
+//   NaCL                              __native_client__
+//   AsmJS                             __asmjs__
+//   WebAssembly                       __wasm__
+//   Fuchsia                           __Fuchsia__
+//
+// Note that since Android defines both __ANDROID__ and __linux__, one
+// may probe for either Linux or Android by simply testing for __linux__.
+//
+// NOTE: For __APPLE__ platforms, we use #include <TargetConditionals.h>
+// to distinguish os variants.
+//
+// http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
+
+#if defined(__APPLE__)
+#include <TargetConditionals.h>
+#endif
+
+// -----------------------------------------------------------------------------
+// Architecture Checks
+// -----------------------------------------------------------------------------
+
+// These preprocessor directives are trying to determine CPU architecture,
+// including necessary headers to support hardware AES.
+//
+// ABSL_ARCH_{X86/PPC/ARM} macros determine the platform.
+#if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64) || \
+    defined(_M_X64)
+#define ABSL_ARCH_X86_64
+#elif defined(__i386) || defined(_M_IX86)
+#define ABSL_ARCH_X86_32
+#elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)
+#define ABSL_ARCH_AARCH64
+#elif defined(__arm__) || defined(__ARMEL__) || defined(_M_ARM)
+#define ABSL_ARCH_ARM
+#elif defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
+    defined(__ppc__) || defined(__PPC__)
+#define ABSL_ARCH_PPC
+#else
+// Unsupported architecture.
+//  * https://sourceforge.net/p/predef/wiki/Architectures/
+//  * https://msdn.microsoft.com/en-us/library/b0084kay.aspx
+//  * for gcc, clang: "echo | gcc -E -dM -"
+#endif
+
+// -----------------------------------------------------------------------------
+// Attribute Checks
+// -----------------------------------------------------------------------------
+
+// ABSL_HAVE_ATTRIBUTE
+#undef ABSL_HAVE_ATTRIBUTE
+#ifdef __has_attribute
+#define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x)
+#else
+#define ABSL_HAVE_ATTRIBUTE(x) 0
+#endif
+
+// ABSL_ATTRIBUTE_ALWAYS_INLINE forces inlining of the method.
+#undef ABSL_ATTRIBUTE_ALWAYS_INLINE
+#if ABSL_HAVE_ATTRIBUTE(always_inline) || \
+    (defined(__GNUC__) && !defined(__clang__))
+#define ABSL_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
+#elif defined(_MSC_VER)
+// We can achieve something similar to attribute((always_inline)) with MSVC by
+// using the __forceinline keyword, however this is not perfect. MSVC is
+// much less aggressive about inlining, and even with the __forceinline keyword.
+#define ABSL_ATTRIBUTE_ALWAYS_INLINE __forceinline
+#else
+#define ABSL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+// ABSL_ATTRIBUTE_NEVER_INLINE prevents inlining of the method.
+#undef ABSL_ATTRIBUTE_NEVER_INLINE
+#if ABSL_HAVE_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
+#define ABSL_ATTRIBUTE_NEVER_INLINE __attribute__((noinline))
+#elif defined(_MSC_VER)
+#define ABSL_ATTRIBUTE_NEVER_INLINE __declspec(noinline)
+#else
+#define ABSL_ATTRIBUTE_NEVER_INLINE
+#endif
+
+// ABSL_ATTRIBUTE_FLATTEN enables much more aggressive inlining within
+// the indicated function.
+#undef ABSL_ATTRIBUTE_FLATTEN
+#if ABSL_HAVE_ATTRIBUTE(flatten) || (defined(__GNUC__) && !defined(__clang__))
+#define ABSL_ATTRIBUTE_FLATTEN __attribute__((flatten))
+#else
+#define ABSL_ATTRIBUTE_FLATTEN
+#endif
+
+// ABSL_RANDOM_INTERNAL_RESTRICT annotates whether pointers may be considered
+// to be unaliased.
+#undef ABSL_RANDOM_INTERNAL_RESTRICT
+#if defined(__clang__) || defined(__GNUC__)
+#define ABSL_RANDOM_INTERNAL_RESTRICT __restrict__
+#elif defined(_MSC_VER)
+#define ABSL_RANDOM_INTERNAL_RESTRICT __restrict
+#else
+#define ABSL_RANDOM_INTERNAL_RESTRICT
+#endif
+
+// ABSL_HAVE_ACCELERATED_AES indicates whether the currently active compiler
+// flags (e.g. -maes) allow using hardware accelerated AES instructions, which
+// implies us assuming that the target platform supports them.
+#define ABSL_HAVE_ACCELERATED_AES 0
+
+#if defined(ABSL_ARCH_X86_64)
+
+#if defined(__AES__) || defined(__AVX__)
+#undef ABSL_HAVE_ACCELERATED_AES
+#define ABSL_HAVE_ACCELERATED_AES 1
+#endif
+
+#elif defined(ABSL_ARCH_PPC)
+
+// Rely on VSX and CRYPTO extensions for vcipher on PowerPC.
+#if (defined(__VEC__) || defined(__ALTIVEC__)) && defined(__VSX__) && \
+    defined(__CRYPTO__)
+#undef ABSL_HAVE_ACCELERATED_AES
+#define ABSL_HAVE_ACCELERATED_AES 1
+#endif
+
+#elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
+
+// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053c/IHI0053C_acle_2_0.pdf
+// Rely on NEON+CRYPTO extensions for ARM.
+#if defined(__ARM_NEON) && defined(__ARM_FEATURE_CRYPTO)
+#undef ABSL_HAVE_ACCELERATED_AES
+#define ABSL_HAVE_ACCELERATED_AES 1
+#endif
+
+#endif
+
+// NaCl does not allow AES.
+#if defined(__native_client__)
+#undef ABSL_HAVE_ACCELERATED_AES
+#define ABSL_HAVE_ACCELERATED_AES 0
+#endif
+
+// ABSL_RANDOM_INTERNAL_AES_DISPATCH indicates whether the currently active
+// platform has, or should use run-time dispatch for selecting the
+// acclerated Randen implementation.
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
+
+#if defined(ABSL_ARCH_X86_64)
+// Dispatch is available on x86_64
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
+#elif defined(__linux__) && defined(ABSL_ARCH_PPC)
+// Or when running linux PPC
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
+#elif defined(__linux__) && defined(ABSL_ARCH_AARCH64)
+// Or when running linux AArch64
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
+#elif defined(__linux__) && defined(ABSL_ARCH_ARM) && (__ARM_ARCH >= 8)
+// Or when running linux ARM v8 or higher.
+// (This captures a lot of Android configurations.)
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
+#endif
+
+// NaCl does not allow dispatch.
+#if defined(__native_client__)
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
+#endif
+
+// iOS does not support dispatch, even on x86, since applications
+// should be bundled as fat binaries, with a different build tailored for
+// each specific supported platform/architecture.
+#if defined(__APPLE__) && (TARGET_OS_IPHONE || TARGET_OS_IPHONE_SIMULATOR)
+#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
+#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
+#endif
+
+#endif  // ABSL_RANDOM_INTERNAL_PLATFORM_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc b/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc
new file mode 100644
index 0000000..f2e1c1f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc
@@ -0,0 +1,252 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/pool_urbg.h"
+
+#include <algorithm>
+#include <atomic>
+#include <cstdint>
+#include <cstring>
+#include <iterator>
+
+#include "absl/base/attributes.h"
+#include "absl/base/call_once.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/endian.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/internal/spinlock.h"
+#include "absl/base/internal/sysinfo.h"
+#include "absl/base/internal/unaligned_access.h"
+#include "absl/base/optimization.h"
+#include "absl/random/internal/randen.h"
+#include "absl/random/internal/seed_material.h"
+#include "absl/random/seed_gen_exception.h"
+
+using absl::base_internal::SpinLock;
+using absl::base_internal::SpinLockHolder;
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+// RandenPoolEntry is a thread-safe pseudorandom bit generator, implementing a
+// single generator within a RandenPool<T>. It is an internal implementation
+// detail, and does not aim to conform to [rand.req.urng].
+//
+// NOTE: There are alignment issues when used on ARM, for instance.
+// See the allocation code in PoolAlignedAlloc().
+class RandenPoolEntry {
+ public:
+  static constexpr size_t kState = RandenTraits::kStateBytes / sizeof(uint32_t);
+  static constexpr size_t kCapacity =
+      RandenTraits::kCapacityBytes / sizeof(uint32_t);
+
+  void Init(absl::Span<const uint32_t> data) {
+    SpinLockHolder l(&mu_);  // Always uncontested.
+    std::copy(data.begin(), data.end(), std::begin(state_));
+    next_ = kState;
+  }
+
+  // Copy bytes into out.
+  void Fill(uint8_t* out, size_t bytes) ABSL_LOCKS_EXCLUDED(mu_);
+
+  // Returns random bits from the buffer in units of T.
+  template <typename T>
+  inline T Generate() ABSL_LOCKS_EXCLUDED(mu_);
+
+  inline void MaybeRefill() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+    if (next_ >= kState) {
+      next_ = kCapacity;
+      impl_.Generate(state_);
+    }
+  }
+
+ private:
+  // Randen URBG state.
+  uint32_t state_[kState] ABSL_GUARDED_BY(mu_);  // First to satisfy alignment.
+  SpinLock mu_;
+  const Randen impl_;
+  size_t next_ ABSL_GUARDED_BY(mu_);
+};
+
+template <>
+inline uint8_t RandenPoolEntry::Generate<uint8_t>() {
+  SpinLockHolder l(&mu_);
+  MaybeRefill();
+  return static_cast<uint8_t>(state_[next_++]);
+}
+
+template <>
+inline uint16_t RandenPoolEntry::Generate<uint16_t>() {
+  SpinLockHolder l(&mu_);
+  MaybeRefill();
+  return static_cast<uint16_t>(state_[next_++]);
+}
+
+template <>
+inline uint32_t RandenPoolEntry::Generate<uint32_t>() {
+  SpinLockHolder l(&mu_);
+  MaybeRefill();
+  return state_[next_++];
+}
+
+template <>
+inline uint64_t RandenPoolEntry::Generate<uint64_t>() {
+  SpinLockHolder l(&mu_);
+  if (next_ >= kState - 1) {
+    next_ = kCapacity;
+    impl_.Generate(state_);
+  }
+  auto p = state_ + next_;
+  next_ += 2;
+
+  uint64_t result;
+  std::memcpy(&result, p, sizeof(result));
+  return result;
+}
+
+void RandenPoolEntry::Fill(uint8_t* out, size_t bytes) {
+  SpinLockHolder l(&mu_);
+  while (bytes > 0) {
+    MaybeRefill();
+    size_t remaining = (kState - next_) * sizeof(state_[0]);
+    size_t to_copy = std::min(bytes, remaining);
+    std::memcpy(out, &state_[next_], to_copy);
+    out += to_copy;
+    bytes -= to_copy;
+    next_ += (to_copy + sizeof(state_[0]) - 1) / sizeof(state_[0]);
+  }
+}
+
+// Number of pooled urbg entries.
+static constexpr int kPoolSize = 8;
+
+// Shared pool entries.
+static absl::once_flag pool_once;
+ABSL_CACHELINE_ALIGNED static RandenPoolEntry* shared_pools[kPoolSize];
+
+// Returns an id in the range [0 ... kPoolSize), which indexes into the
+// pool of random engines.
+//
+// Each thread to access the pool is assigned a sequential ID (without reuse)
+// from the pool-id space; the id is cached in a thread_local variable.
+// This id is assigned based on the arrival-order of the thread to the
+// GetPoolID call; this has no binary, CL, or runtime stability because
+// on subsequent runs the order within the same program may be significantly
+// different. However, as other thread IDs are not assigned sequentially,
+// this is not expected to matter.
+int GetPoolID() {
+  static_assert(kPoolSize >= 1,
+                "At least one urbg instance is required for PoolURBG");
+
+  ABSL_CONST_INIT static std::atomic<int64_t> sequence{0};
+
+#ifdef ABSL_HAVE_THREAD_LOCAL
+  static thread_local int my_pool_id = -1;
+  if (ABSL_PREDICT_FALSE(my_pool_id < 0)) {
+    my_pool_id = (sequence++ % kPoolSize);
+  }
+  return my_pool_id;
+#else
+  static pthread_key_t tid_key = [] {
+    pthread_key_t tmp_key;
+    int err = pthread_key_create(&tmp_key, nullptr);
+    if (err) {
+      ABSL_RAW_LOG(FATAL, "pthread_key_create failed with %d", err);
+    }
+    return tmp_key;
+  }();
+
+  // Store the value in the pthread_{get/set}specific. However an uninitialized
+  // value is 0, so add +1 to distinguish from the null value.
+  intptr_t my_pool_id =
+      reinterpret_cast<intptr_t>(pthread_getspecific(tid_key));
+  if (ABSL_PREDICT_FALSE(my_pool_id == 0)) {
+    // No allocated ID, allocate the next value, cache it, and return.
+    my_pool_id = (sequence++ % kPoolSize) + 1;
+    int err = pthread_setspecific(tid_key, reinterpret_cast<void*>(my_pool_id));
+    if (err) {
+      ABSL_RAW_LOG(FATAL, "pthread_setspecific failed with %d", err);
+    }
+  }
+  return my_pool_id - 1;
+#endif
+}
+
+// Allocate a RandenPoolEntry with at least 32-byte alignment, which is required
+// by ARM platform code.
+RandenPoolEntry* PoolAlignedAlloc() {
+  constexpr size_t kAlignment =
+      ABSL_CACHELINE_SIZE > 32 ? ABSL_CACHELINE_SIZE : 32;
+
+  // Not all the platforms that we build for have std::aligned_alloc, however
+  // since we never free these objects, we can over allocate and munge the
+  // pointers to the correct alignment.
+  void* memory = std::malloc(sizeof(RandenPoolEntry) + kAlignment);
+  auto x = reinterpret_cast<intptr_t>(memory);
+  auto y = x % kAlignment;
+  void* aligned =
+      (y == 0) ? memory : reinterpret_cast<void*>(x + kAlignment - y);
+  return new (aligned) RandenPoolEntry();
+}
+
+// Allocate and initialize kPoolSize objects of type RandenPoolEntry.
+//
+// The initialization strategy is to initialize one object directly from
+// OS entropy, then to use that object to seed all of the individual
+// pool instances.
+void InitPoolURBG() {
+  static constexpr size_t kSeedSize =
+      RandenTraits::kStateBytes / sizeof(uint32_t);
+  // Read the seed data from OS entropy once.
+  uint32_t seed_material[kPoolSize * kSeedSize];
+  if (!random_internal::ReadSeedMaterialFromOSEntropy(
+          absl::MakeSpan(seed_material))) {
+    random_internal::ThrowSeedGenException();
+  }
+  for (int i = 0; i < kPoolSize; i++) {
+    shared_pools[i] = PoolAlignedAlloc();
+    shared_pools[i]->Init(
+        absl::MakeSpan(&seed_material[i * kSeedSize], kSeedSize));
+  }
+}
+
+// Returns the pool entry for the current thread.
+RandenPoolEntry* GetPoolForCurrentThread() {
+  absl::call_once(pool_once, InitPoolURBG);
+  return shared_pools[GetPoolID()];
+}
+
+}  // namespace
+
+template <typename T>
+typename RandenPool<T>::result_type RandenPool<T>::Generate() {
+  auto* pool = GetPoolForCurrentThread();
+  return pool->Generate<T>();
+}
+
+template <typename T>
+void RandenPool<T>::Fill(absl::Span<result_type> data) {
+  auto* pool = GetPoolForCurrentThread();
+  pool->Fill(reinterpret_cast<uint8_t*>(data.data()),
+             data.size() * sizeof(result_type));
+}
+
+template class RandenPool<uint8_t>;
+template class RandenPool<uint16_t>;
+template class RandenPool<uint32_t>;
+template class RandenPool<uint64_t>;
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/pool_urbg.h b/third_party/abseil-cpp/absl/random/internal/pool_urbg.h
new file mode 100644
index 0000000..9b2dd4b
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/pool_urbg.h
@@ -0,0 +1,129 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_POOL_URBG_H_
+#define ABSL_RANDOM_INTERNAL_POOL_URBG_H_
+
+#include <cinttypes>
+#include <limits>
+
+#include "absl/random/internal/traits.h"
+#include "absl/types/span.h"
+
+namespace absl {
+namespace random_internal {
+
+// RandenPool is a thread-safe random number generator [random.req.urbg] that
+// uses an underlying pool of Randen generators to generate values.  Each thread
+// has affinity to one instance of the underlying pool generators.  Concurrent
+// access is guarded by a spin-lock.
+template <typename T>
+class RandenPool {
+ public:
+  using result_type = T;
+  static_assert(std::is_unsigned<result_type>::value,
+                "RandenPool template argument must be a built-in unsigned "
+                "integer type");
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  RandenPool() {}
+
+  // Returns a single value.
+  inline result_type operator()() { return Generate(); }
+
+  // Fill data with random values.
+  static void Fill(absl::Span<result_type> data);
+
+ protected:
+  // Generate returns a single value.
+  static result_type Generate();
+};
+
+extern template class RandenPool<uint8_t>;
+extern template class RandenPool<uint16_t>;
+extern template class RandenPool<uint32_t>;
+extern template class RandenPool<uint64_t>;
+
+// PoolURBG uses an underlying pool of random generators to implement a
+// thread-compatible [random.req.urbg] interface with an internal cache of
+// values.
+template <typename T, size_t kBufferSize>
+class PoolURBG {
+  // Inheritance to access the protected static members of RandenPool.
+  using unsigned_type = typename make_unsigned_bits<T>::type;
+  using PoolType = RandenPool<unsigned_type>;
+  using SpanType = absl::Span<unsigned_type>;
+
+  static constexpr size_t kInitialBuffer = kBufferSize + 1;
+  static constexpr size_t kHalfBuffer = kBufferSize / 2;
+
+ public:
+  using result_type = T;
+
+  static_assert(std::is_unsigned<result_type>::value,
+                "PoolURBG must be parameterized by an unsigned integer type");
+
+  static_assert(kBufferSize > 1,
+                "PoolURBG must be parameterized by a buffer-size > 1");
+
+  static_assert(kBufferSize <= 256,
+                "PoolURBG must be parameterized by a buffer-size <= 256");
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  PoolURBG() : next_(kInitialBuffer) {}
+
+  // copy-constructor does not copy cache.
+  PoolURBG(const PoolURBG&) : next_(kInitialBuffer) {}
+  const PoolURBG& operator=(const PoolURBG&) {
+    next_ = kInitialBuffer;
+    return *this;
+  }
+
+  // move-constructor does move cache.
+  PoolURBG(PoolURBG&&) = default;
+  PoolURBG& operator=(PoolURBG&&) = default;
+
+  inline result_type operator()() {
+    if (next_ >= kBufferSize) {
+      next_ = (kBufferSize > 2 && next_ > kBufferSize) ? kHalfBuffer : 0;
+      PoolType::Fill(SpanType(reinterpret_cast<unsigned_type*>(state_ + next_),
+                              kBufferSize - next_));
+    }
+    return state_[next_++];
+  }
+
+ private:
+  // Buffer size.
+  size_t next_;  // index within state_
+  result_type state_[kBufferSize];
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_POOL_URBG_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/pool_urbg_test.cc b/third_party/abseil-cpp/absl/random/internal/pool_urbg_test.cc
new file mode 100644
index 0000000..53f4eacf
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/pool_urbg_test.cc
@@ -0,0 +1,182 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/pool_urbg.h"
+
+#include <algorithm>
+#include <bitset>
+#include <cmath>
+#include <cstdint>
+#include <iterator>
+
+#include "gtest/gtest.h"
+#include "absl/meta/type_traits.h"
+#include "absl/types/span.h"
+
+using absl::random_internal::PoolURBG;
+using absl::random_internal::RandenPool;
+
+namespace {
+
+// is_randen_pool trait is true when parameterized by an RandenPool
+template <typename T>
+using is_randen_pool = typename absl::disjunction<  //
+    std::is_same<T, RandenPool<uint8_t>>,           //
+    std::is_same<T, RandenPool<uint16_t>>,          //
+    std::is_same<T, RandenPool<uint32_t>>,          //
+    std::is_same<T, RandenPool<uint64_t>>>;         //
+
+// MyFill either calls RandenPool::Fill() or std::generate(..., rng)
+template <typename T, typename V>
+typename absl::enable_if_t<absl::negation<is_randen_pool<T>>::value, void>  //
+MyFill(T& rng, absl::Span<V> data) {  // NOLINT(runtime/references)
+  std::generate(std::begin(data), std::end(data), rng);
+}
+
+template <typename T, typename V>
+typename absl::enable_if_t<is_randen_pool<T>::value, void>  //
+MyFill(T& rng, absl::Span<V> data) {  // NOLINT(runtime/references)
+  rng.Fill(data);
+}
+
+template <typename EngineType>
+class PoolURBGTypedTest : public ::testing::Test {};
+
+using EngineTypes = ::testing::Types<  //
+    RandenPool<uint8_t>,               //
+    RandenPool<uint16_t>,              //
+    RandenPool<uint32_t>,              //
+    RandenPool<uint64_t>,              //
+    PoolURBG<uint8_t, 2>,              //
+    PoolURBG<uint16_t, 2>,             //
+    PoolURBG<uint32_t, 2>,             //
+    PoolURBG<uint64_t, 2>,             //
+    PoolURBG<unsigned int, 8>,         // NOLINT(runtime/int)
+    PoolURBG<unsigned long, 8>,        // NOLINT(runtime/int)
+    PoolURBG<unsigned long int, 4>,    // NOLINT(runtime/int)
+    PoolURBG<unsigned long long, 4>>;  // NOLINT(runtime/int)
+
+TYPED_TEST_SUITE(PoolURBGTypedTest, EngineTypes);
+
+// This test is checks that the engines meet the URBG interface requirements
+// defined in [rand.req.urbg].
+TYPED_TEST(PoolURBGTypedTest, URBGInterface) {
+  using E = TypeParam;
+  using T = typename E::result_type;
+
+  static_assert(std::is_copy_constructible<E>::value,
+                "engine must be copy constructible");
+
+  static_assert(absl::is_copy_assignable<E>::value,
+                "engine must be copy assignable");
+
+  E e;
+  const E x;
+
+  e();
+
+  static_assert(std::is_same<decltype(e()), T>::value,
+                "return type of operator() must be result_type");
+
+  E u0(x);
+  u0();
+
+  E u1 = e;
+  u1();
+}
+
+// This validates that sequences are independent.
+TYPED_TEST(PoolURBGTypedTest, VerifySequences) {
+  using E = TypeParam;
+  using result_type = typename E::result_type;
+
+  E rng;
+  (void)rng();  // Discard one value.
+
+  constexpr int kNumOutputs = 64;
+  result_type a[kNumOutputs];
+  result_type b[kNumOutputs];
+  std::fill(std::begin(b), std::end(b), 0);
+
+  // Fill a using Fill or generate, depending on the engine type.
+  {
+    E x = rng;
+    MyFill(x, absl::MakeSpan(a));
+  }
+
+  // Fill b using std::generate().
+  {
+    E x = rng;
+    std::generate(std::begin(b), std::end(b), x);
+  }
+
+  // Test that generated sequence changed as sequence of bits, i.e. if about
+  // half of the bites were flipped between two non-correlated values.
+  size_t changed_bits = 0;
+  size_t unchanged_bits = 0;
+  size_t total_set = 0;
+  size_t total_bits = 0;
+  size_t equal_count = 0;
+  for (size_t i = 0; i < kNumOutputs; ++i) {
+    equal_count += (a[i] == b[i]) ? 1 : 0;
+    std::bitset<sizeof(result_type) * 8> bitset(a[i] ^ b[i]);
+    changed_bits += bitset.count();
+    unchanged_bits += bitset.size() - bitset.count();
+
+    std::bitset<sizeof(result_type) * 8> a_set(a[i]);
+    std::bitset<sizeof(result_type) * 8> b_set(b[i]);
+    total_set += a_set.count() + b_set.count();
+    total_bits += 2 * 8 * sizeof(result_type);
+  }
+  // On average, half the bits are changed between two calls.
+  EXPECT_LE(changed_bits, 0.60 * (changed_bits + unchanged_bits));
+  EXPECT_GE(changed_bits, 0.40 * (changed_bits + unchanged_bits));
+
+  // verify using a quick normal-approximation to the binomial.
+  EXPECT_NEAR(total_set, total_bits * 0.5, 4 * std::sqrt(total_bits))
+      << "@" << total_set / static_cast<double>(total_bits);
+
+  // Also, A[i] == B[i] with probability (1/range) * N.
+  // Give this a pretty wide latitude, though.
+  const double kExpected = kNumOutputs / (1.0 * sizeof(result_type) * 8);
+  EXPECT_LE(equal_count, 1.0 + kExpected);
+}
+
+}  // namespace
+
+/*
+$ nanobenchmarks 1 RandenPool construct
+$ nanobenchmarks 1 PoolURBG construct
+
+RandenPool<uint32_t> | 1    | 1000 |    48482.00 ticks | 48.48 ticks | 13.9 ns
+RandenPool<uint32_t> | 10   | 2000 |  1028795.00 ticks | 51.44 ticks | 14.7 ns
+RandenPool<uint32_t> | 100  | 1000 |  5119968.00 ticks | 51.20 ticks | 14.6 ns
+RandenPool<uint32_t> | 1000 |  500 | 25867936.00 ticks | 51.74 ticks | 14.8 ns
+
+RandenPool<uint64_t> | 1    | 1000 |    49921.00 ticks | 49.92 ticks | 14.3 ns
+RandenPool<uint64_t> | 10   | 2000 |  1208269.00 ticks | 60.41 ticks | 17.3 ns
+RandenPool<uint64_t> | 100  | 1000 |  5844955.00 ticks | 58.45 ticks | 16.7 ns
+RandenPool<uint64_t> | 1000 |  500 | 28767404.00 ticks | 57.53 ticks | 16.4 ns
+
+PoolURBG<uint32_t,8> | 1    | 1000 |    86431.00 ticks | 86.43 ticks | 24.7 ns
+PoolURBG<uint32_t,8> | 10   | 1000 |   206191.00 ticks | 20.62 ticks |  5.9 ns
+PoolURBG<uint32_t,8> | 100  | 1000 |  1516049.00 ticks | 15.16 ticks |  4.3 ns
+PoolURBG<uint32_t,8> | 1000 |  500 |  7613936.00 ticks | 15.23 ticks |  4.4 ns
+
+PoolURBG<uint64_t,4> | 1    | 1000 |    96668.00 ticks | 96.67 ticks | 27.6 ns
+PoolURBG<uint64_t,4> | 10   | 1000 |   282423.00 ticks | 28.24 ticks |  8.1 ns
+PoolURBG<uint64_t,4> | 100  | 1000 |  2609587.00 ticks | 26.10 ticks |  7.5 ns
+PoolURBG<uint64_t,4> | 1000 |  500 | 12408757.00 ticks | 24.82 ticks |  7.1 ns
+
+*/
diff --git a/third_party/abseil-cpp/absl/random/internal/randen-keys.inc b/third_party/abseil-cpp/absl/random/internal/randen-keys.inc
new file mode 100644
index 0000000..fa4b1668
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen-keys.inc
@@ -0,0 +1,207 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_
+#define ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_
+
+// Textual header to include the randen_keys where necessary.
+// REQUIRES: struct u64x2{}
+//
+// PROVIDES: kKeys
+// PROVIDES: round_keys[]
+
+// "Nothing up my sleeve" numbers from the first hex digits of Pi, obtained
+// from http://hexpi.sourceforge.net/. The array was generated by following
+// Python script:
+/*
+python << EOF
+"""Generates Randen round keys array from pi-hex.62500.txt file."""
+import binascii
+
+KEYS = 136
+
+def chunks(l, n):
+    """Yield successive n-sized chunks from l."""
+    for i in range(0, len(l), n):
+        yield l[i:i + n]
+
+def pairwise(t):
+    """Transforms sequence into sequence of pairs."""
+    it = iter(t)
+    return zip(it,it)
+
+def digits_from_pi():
+  """Reads digits from hexpi.sourceforge.net file."""
+  with open("pi-hex.62500.txt") as file:
+    return file.read()
+
+def digits_from_urandom():
+  """Reads digits from /dev/urandom."""
+  with open("/dev/urandom") as file:
+    return binascii.hexlify(file.read(KEYS * 16))
+
+digits = digits_from_pi()
+print("static constexpr const size_t kRoundKeys = {0};\n".format(KEYS))
+print("alignas(16) constexpr const u64x2 round_keys[kRoundKeys] = {")
+
+for i, (hi, lo) in zip(range(KEYS), pairwise(chunks(digits, 16))):
+  hi = "0x{0}ull".format(hi)
+  lo = "0x{0}ull".format(lo)
+  print("  u64x2({0}, {1}){2}".format(hi, lo, ',' if i+1 < KEYS else ''))
+
+print("};")
+EOF
+*/
+
+static constexpr const size_t kRoundKeys = 136;
+
+alignas(16) constexpr u64x2 round_keys[kRoundKeys] = {
+    u64x2(0x243F6A8885A308D3ull, 0x13198A2E03707344ull),
+    u64x2(0xA4093822299F31D0ull, 0x082EFA98EC4E6C89ull),
+    u64x2(0x452821E638D01377ull, 0xBE5466CF34E90C6Cull),
+    u64x2(0xC0AC29B7C97C50DDull, 0x3F84D5B5B5470917ull),
+    u64x2(0x9216D5D98979FB1Bull, 0xD1310BA698DFB5ACull),
+    u64x2(0x2FFD72DBD01ADFB7ull, 0xB8E1AFED6A267E96ull),
+    u64x2(0xBA7C9045F12C7F99ull, 0x24A19947B3916CF7ull),
+    u64x2(0x0801F2E2858EFC16ull, 0x636920D871574E69ull),
+    u64x2(0xA458FEA3F4933D7Eull, 0x0D95748F728EB658ull),
+    u64x2(0x718BCD5882154AEEull, 0x7B54A41DC25A59B5ull),
+    u64x2(0x9C30D5392AF26013ull, 0xC5D1B023286085F0ull),
+    u64x2(0xCA417918B8DB38EFull, 0x8E79DCB0603A180Eull),
+    u64x2(0x6C9E0E8BB01E8A3Eull, 0xD71577C1BD314B27ull),
+    u64x2(0x78AF2FDA55605C60ull, 0xE65525F3AA55AB94ull),
+    u64x2(0x5748986263E81440ull, 0x55CA396A2AAB10B6ull),
+    u64x2(0xB4CC5C341141E8CEull, 0xA15486AF7C72E993ull),
+    u64x2(0xB3EE1411636FBC2Aull, 0x2BA9C55D741831F6ull),
+    u64x2(0xCE5C3E169B87931Eull, 0xAFD6BA336C24CF5Cull),
+    u64x2(0x7A32538128958677ull, 0x3B8F48986B4BB9AFull),
+    u64x2(0xC4BFE81B66282193ull, 0x61D809CCFB21A991ull),
+    u64x2(0x487CAC605DEC8032ull, 0xEF845D5DE98575B1ull),
+    u64x2(0xDC262302EB651B88ull, 0x23893E81D396ACC5ull),
+    u64x2(0x0F6D6FF383F44239ull, 0x2E0B4482A4842004ull),
+    u64x2(0x69C8F04A9E1F9B5Eull, 0x21C66842F6E96C9Aull),
+    u64x2(0x670C9C61ABD388F0ull, 0x6A51A0D2D8542F68ull),
+    u64x2(0x960FA728AB5133A3ull, 0x6EEF0B6C137A3BE4ull),
+    u64x2(0xBA3BF0507EFB2A98ull, 0xA1F1651D39AF0176ull),
+    u64x2(0x66CA593E82430E88ull, 0x8CEE8619456F9FB4ull),
+    u64x2(0x7D84A5C33B8B5EBEull, 0xE06F75D885C12073ull),
+    u64x2(0x401A449F56C16AA6ull, 0x4ED3AA62363F7706ull),
+    u64x2(0x1BFEDF72429B023Dull, 0x37D0D724D00A1248ull),
+    u64x2(0xDB0FEAD349F1C09Bull, 0x075372C980991B7Bull),
+    u64x2(0x25D479D8F6E8DEF7ull, 0xE3FE501AB6794C3Bull),
+    u64x2(0x976CE0BD04C006BAull, 0xC1A94FB6409F60C4ull),
+    u64x2(0x5E5C9EC2196A2463ull, 0x68FB6FAF3E6C53B5ull),
+    u64x2(0x1339B2EB3B52EC6Full, 0x6DFC511F9B30952Cull),
+    u64x2(0xCC814544AF5EBD09ull, 0xBEE3D004DE334AFDull),
+    u64x2(0x660F2807192E4BB3ull, 0xC0CBA85745C8740Full),
+    u64x2(0xD20B5F39B9D3FBDBull, 0x5579C0BD1A60320Aull),
+    u64x2(0xD6A100C6402C7279ull, 0x679F25FEFB1FA3CCull),
+    u64x2(0x8EA5E9F8DB3222F8ull, 0x3C7516DFFD616B15ull),
+    u64x2(0x2F501EC8AD0552ABull, 0x323DB5FAFD238760ull),
+    u64x2(0x53317B483E00DF82ull, 0x9E5C57BBCA6F8CA0ull),
+    u64x2(0x1A87562EDF1769DBull, 0xD542A8F6287EFFC3ull),
+    u64x2(0xAC6732C68C4F5573ull, 0x695B27B0BBCA58C8ull),
+    u64x2(0xE1FFA35DB8F011A0ull, 0x10FA3D98FD2183B8ull),
+    u64x2(0x4AFCB56C2DD1D35Bull, 0x9A53E479B6F84565ull),
+    u64x2(0xD28E49BC4BFB9790ull, 0xE1DDF2DAA4CB7E33ull),
+    u64x2(0x62FB1341CEE4C6E8ull, 0xEF20CADA36774C01ull),
+    u64x2(0xD07E9EFE2BF11FB4ull, 0x95DBDA4DAE909198ull),
+    u64x2(0xEAAD8E716B93D5A0ull, 0xD08ED1D0AFC725E0ull),
+    u64x2(0x8E3C5B2F8E7594B7ull, 0x8FF6E2FBF2122B64ull),
+    u64x2(0x8888B812900DF01Cull, 0x4FAD5EA0688FC31Cull),
+    u64x2(0xD1CFF191B3A8C1ADull, 0x2F2F2218BE0E1777ull),
+    u64x2(0xEA752DFE8B021FA1ull, 0xE5A0CC0FB56F74E8ull),
+    u64x2(0x18ACF3D6CE89E299ull, 0xB4A84FE0FD13E0B7ull),
+    u64x2(0x7CC43B81D2ADA8D9ull, 0x165FA26680957705ull),
+    u64x2(0x93CC7314211A1477ull, 0xE6AD206577B5FA86ull),
+    u64x2(0xC75442F5FB9D35CFull, 0xEBCDAF0C7B3E89A0ull),
+    u64x2(0xD6411BD3AE1E7E49ull, 0x00250E2D2071B35Eull),
+    u64x2(0x226800BB57B8E0AFull, 0x2464369BF009B91Eull),
+    u64x2(0x5563911D59DFA6AAull, 0x78C14389D95A537Full),
+    u64x2(0x207D5BA202E5B9C5ull, 0x832603766295CFA9ull),
+    u64x2(0x11C819684E734A41ull, 0xB3472DCA7B14A94Aull),
+    u64x2(0x1B5100529A532915ull, 0xD60F573FBC9BC6E4ull),
+    u64x2(0x2B60A47681E67400ull, 0x08BA6FB5571BE91Full),
+    u64x2(0xF296EC6B2A0DD915ull, 0xB6636521E7B9F9B6ull),
+    u64x2(0xFF34052EC5855664ull, 0x53B02D5DA99F8FA1ull),
+    u64x2(0x08BA47996E85076Aull, 0x4B7A70E9B5B32944ull),
+    u64x2(0xDB75092EC4192623ull, 0xAD6EA6B049A7DF7Dull),
+    u64x2(0x9CEE60B88FEDB266ull, 0xECAA8C71699A18FFull),
+    u64x2(0x5664526CC2B19EE1ull, 0x193602A575094C29ull),
+    u64x2(0xA0591340E4183A3Eull, 0x3F54989A5B429D65ull),
+    u64x2(0x6B8FE4D699F73FD6ull, 0xA1D29C07EFE830F5ull),
+    u64x2(0x4D2D38E6F0255DC1ull, 0x4CDD20868470EB26ull),
+    u64x2(0x6382E9C6021ECC5Eull, 0x09686B3F3EBAEFC9ull),
+    u64x2(0x3C9718146B6A70A1ull, 0x687F358452A0E286ull),
+    u64x2(0xB79C5305AA500737ull, 0x3E07841C7FDEAE5Cull),
+    u64x2(0x8E7D44EC5716F2B8ull, 0xB03ADA37F0500C0Dull),
+    u64x2(0xF01C1F040200B3FFull, 0xAE0CF51A3CB574B2ull),
+    u64x2(0x25837A58DC0921BDull, 0xD19113F97CA92FF6ull),
+    u64x2(0x9432477322F54701ull, 0x3AE5E58137C2DADCull),
+    u64x2(0xC8B576349AF3DDA7ull, 0xA94461460FD0030Eull),
+    u64x2(0xECC8C73EA4751E41ull, 0xE238CD993BEA0E2Full),
+    u64x2(0x3280BBA1183EB331ull, 0x4E548B384F6DB908ull),
+    u64x2(0x6F420D03F60A04BFull, 0x2CB8129024977C79ull),
+    u64x2(0x5679B072BCAF89AFull, 0xDE9A771FD9930810ull),
+    u64x2(0xB38BAE12DCCF3F2Eull, 0x5512721F2E6B7124ull),
+    u64x2(0x501ADDE69F84CD87ull, 0x7A5847187408DA17ull),
+    u64x2(0xBC9F9ABCE94B7D8Cull, 0xEC7AEC3ADB851DFAull),
+    u64x2(0x63094366C464C3D2ull, 0xEF1C18473215D808ull),
+    u64x2(0xDD433B3724C2BA16ull, 0x12A14D432A65C451ull),
+    u64x2(0x50940002133AE4DDull, 0x71DFF89E10314E55ull),
+    u64x2(0x81AC77D65F11199Bull, 0x043556F1D7A3C76Bull),
+    u64x2(0x3C11183B5924A509ull, 0xF28FE6ED97F1FBFAull),
+    u64x2(0x9EBABF2C1E153C6Eull, 0x86E34570EAE96FB1ull),
+    u64x2(0x860E5E0A5A3E2AB3ull, 0x771FE71C4E3D06FAull),
+    u64x2(0x2965DCB999E71D0Full, 0x803E89D65266C825ull),
+    u64x2(0x2E4CC9789C10B36Aull, 0xC6150EBA94E2EA78ull),
+    u64x2(0xA6FC3C531E0A2DF4ull, 0xF2F74EA7361D2B3Dull),
+    u64x2(0x1939260F19C27960ull, 0x5223A708F71312B6ull),
+    u64x2(0xEBADFE6EEAC31F66ull, 0xE3BC4595A67BC883ull),
+    u64x2(0xB17F37D1018CFF28ull, 0xC332DDEFBE6C5AA5ull),
+    u64x2(0x6558218568AB9702ull, 0xEECEA50FDB2F953Bull),
+    u64x2(0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull),
+    u64x2(0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull),
+    u64x2(0x0334FE1EAA0363CFull, 0xB5735C904C70A239ull),
+    u64x2(0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull),
+    u64x2(0x9CAB5CABB2F3846Eull, 0x648B1EAF19BDF0CAull),
+    u64x2(0xA02369B9655ABB50ull, 0x40685A323C2AB4B3ull),
+    u64x2(0x319EE9D5C021B8F7ull, 0x9B540B19875FA099ull),
+    u64x2(0x95F7997E623D7DA8ull, 0xF837889A97E32D77ull),
+    u64x2(0x11ED935F16681281ull, 0x0E358829C7E61FD6ull),
+    u64x2(0x96DEDFA17858BA99ull, 0x57F584A51B227263ull),
+    u64x2(0x9B83C3FF1AC24696ull, 0xCDB30AEB532E3054ull),
+    u64x2(0x8FD948E46DBC3128ull, 0x58EBF2EF34C6FFEAull),
+    u64x2(0xFE28ED61EE7C3C73ull, 0x5D4A14D9E864B7E3ull),
+    u64x2(0x42105D14203E13E0ull, 0x45EEE2B6A3AAABEAull),
+    u64x2(0xDB6C4F15FACB4FD0ull, 0xC742F442EF6ABBB5ull),
+    u64x2(0x654F3B1D41CD2105ull, 0xD81E799E86854DC7ull),
+    u64x2(0xE44B476A3D816250ull, 0xCF62A1F25B8D2646ull),
+    u64x2(0xFC8883A0C1C7B6A3ull, 0x7F1524C369CB7492ull),
+    u64x2(0x47848A0B5692B285ull, 0x095BBF00AD19489Dull),
+    u64x2(0x1462B17423820D00ull, 0x58428D2A0C55F5EAull),
+    u64x2(0x1DADF43E233F7061ull, 0x3372F0928D937E41ull),
+    u64x2(0xD65FECF16C223BDBull, 0x7CDE3759CBEE7460ull),
+    u64x2(0x4085F2A7CE77326Eull, 0xA607808419F8509Eull),
+    u64x2(0xE8EFD85561D99735ull, 0xA969A7AAC50C06C2ull),
+    u64x2(0x5A04ABFC800BCADCull, 0x9E447A2EC3453484ull),
+    u64x2(0xFDD567050E1E9EC9ull, 0xDB73DBD3105588CDull),
+    u64x2(0x675FDA79E3674340ull, 0xC5C43465713E38D8ull),
+    u64x2(0x3D28F89EF16DFF20ull, 0x153E21E78FB03D4Aull),
+    u64x2(0xE6E39F2BDB83ADF7ull, 0xE93D5A68948140F7ull),
+    u64x2(0xF64C261C94692934ull, 0x411520F77602D4F7ull),
+    u64x2(0xBCF46B2ED4A10068ull, 0xD40824713320F46Aull),
+    u64x2(0x43B7D4B7500061AFull, 0x1E39F62E97244546ull)};
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen.cc b/third_party/abseil-cpp/absl/random/internal/randen.cc
new file mode 100644
index 0000000..bab8075
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen.cc
@@ -0,0 +1,89 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen.h"
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/randen_detect.h"
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// High-level summary:
+// 1) Reverie (see "A Robust and Sponge-Like PRNG with Improved Efficiency") is
+//    a sponge-like random generator that requires a cryptographic permutation.
+//    It improves upon "Provably Robust Sponge-Based PRNGs and KDFs" by
+//    achieving backtracking resistance with only one Permute() per buffer.
+//
+// 2) "Simpira v2: A Family of Efficient Permutations Using the AES Round
+//    Function" constructs up to 1024-bit permutations using an improved
+//    Generalized Feistel network with 2-round AES-128 functions. This Feistel
+//    block shuffle achieves diffusion faster and is less vulnerable to
+//    sliced-biclique attacks than the Type-2 cyclic shuffle.
+//
+// 3) "Improving the Generalized Feistel" and "New criterion for diffusion
+//    property" extends the same kind of improved Feistel block shuffle to 16
+//    branches, which enables a 2048-bit permutation.
+//
+// We combine these three ideas and also change Simpira's subround keys from
+// structured/low-entropy counters to digits of Pi.
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+struct RandenState {
+  const void* keys;
+  bool has_crypto;
+};
+
+RandenState GetRandenState() {
+  static const RandenState state = []() {
+    RandenState tmp;
+#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
+    // HW AES Dispatch.
+    if (HasRandenHwAesImplementation() && CPUSupportsRandenHwAes()) {
+      tmp.has_crypto = true;
+      tmp.keys = RandenHwAes::GetKeys();
+    } else {
+      tmp.has_crypto = false;
+      tmp.keys = RandenSlow::GetKeys();
+    }
+#elif ABSL_HAVE_ACCELERATED_AES
+    // HW AES is enabled.
+    tmp.has_crypto = true;
+    tmp.keys = RandenHwAes::GetKeys();
+#else
+    // HW AES is disabled.
+    tmp.has_crypto = false;
+    tmp.keys = RandenSlow::GetKeys();
+#endif
+    return tmp;
+  }();
+  return state;
+}
+
+}  // namespace
+
+Randen::Randen() {
+  auto tmp = GetRandenState();
+  keys_ = tmp.keys;
+#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
+  has_crypto_ = tmp.has_crypto;
+#endif
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/randen.h b/third_party/abseil-cpp/absl/random/internal/randen.h
new file mode 100644
index 0000000..a4ff2545
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen.h
@@ -0,0 +1,100 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_H_
+
+#include <cstddef>
+
+#include "absl/random/internal/platform.h"
+#include "absl/random/internal/randen_hwaes.h"
+#include "absl/random/internal/randen_slow.h"
+#include "absl/random/internal/randen_traits.h"
+
+namespace absl {
+namespace random_internal {
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// Randen implements the basic state manipulation methods.
+class Randen {
+ public:
+  static constexpr size_t kStateBytes = RandenTraits::kStateBytes;
+  static constexpr size_t kCapacityBytes = RandenTraits::kCapacityBytes;
+  static constexpr size_t kSeedBytes = RandenTraits::kSeedBytes;
+
+  ~Randen() = default;
+
+  Randen();
+
+  // Generate updates the randen sponge. The outer portion of the sponge
+  // (kCapacityBytes .. kStateBytes) may be consumed as PRNG state.
+  template <typename T, size_t N>
+  void Generate(T (&state)[N]) const {
+    static_assert(N * sizeof(T) == kStateBytes,
+                  "Randen::Generate() requires kStateBytes of state");
+#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
+    // HW AES Dispatch.
+    if (has_crypto_) {
+      RandenHwAes::Generate(keys_, state);
+    } else {
+      RandenSlow::Generate(keys_, state);
+    }
+#elif ABSL_HAVE_ACCELERATED_AES
+    // HW AES is enabled.
+    RandenHwAes::Generate(keys_, state);
+#else
+    // HW AES is disabled.
+    RandenSlow::Generate(keys_, state);
+#endif
+  }
+
+  // Absorb incorporates additional seed material into the randen sponge.  After
+  // absorb returns, Generate must be called before the state may be consumed.
+  template <typename S, size_t M, typename T, size_t N>
+  void Absorb(const S (&seed)[M], T (&state)[N]) const {
+    static_assert(M * sizeof(S) == RandenTraits::kSeedBytes,
+                  "Randen::Absorb() requires kSeedBytes of seed");
+
+    static_assert(N * sizeof(T) == RandenTraits::kStateBytes,
+                  "Randen::Absorb() requires kStateBytes of state");
+#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
+    // HW AES Dispatch.
+    if (has_crypto_) {
+      RandenHwAes::Absorb(seed, state);
+    } else {
+      RandenSlow::Absorb(seed, state);
+    }
+#elif ABSL_HAVE_ACCELERATED_AES
+    // HW AES is enabled.
+    RandenHwAes::Absorb(seed, state);
+#else
+    // HW AES is disabled.
+    RandenSlow::Absorb(seed, state);
+#endif
+  }
+
+ private:
+  const void* keys_;
+#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
+  bool has_crypto_;
+#endif
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_benchmarks.cc b/third_party/abseil-cpp/absl/random/internal/randen_benchmarks.cc
new file mode 100644
index 0000000..f589172
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_benchmarks.cc
@@ -0,0 +1,174 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include "absl/random/internal/randen.h"
+
+#include <cstdint>
+#include <cstdio>
+#include <cstring>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/nanobenchmark.h"
+#include "absl/random/internal/platform.h"
+#include "absl/random/internal/randen_engine.h"
+#include "absl/random/internal/randen_hwaes.h"
+#include "absl/random/internal/randen_slow.h"
+#include "absl/strings/numbers.h"
+
+namespace {
+
+using absl::random_internal::Randen;
+using absl::random_internal::RandenHwAes;
+using absl::random_internal::RandenSlow;
+
+using absl::random_internal_nanobenchmark::FuncInput;
+using absl::random_internal_nanobenchmark::FuncOutput;
+using absl::random_internal_nanobenchmark::InvariantTicksPerSecond;
+using absl::random_internal_nanobenchmark::MeasureClosure;
+using absl::random_internal_nanobenchmark::Params;
+using absl::random_internal_nanobenchmark::PinThreadToCPU;
+using absl::random_internal_nanobenchmark::Result;
+
+// Local state parameters.
+static constexpr size_t kStateSizeT = Randen::kStateBytes / sizeof(uint64_t);
+static constexpr size_t kSeedSizeT = Randen::kSeedBytes / sizeof(uint32_t);
+
+// Randen implementation benchmarks.
+template <typename T>
+struct AbsorbFn : public T {
+  mutable uint64_t state[kStateSizeT] = {};
+  mutable uint32_t seed[kSeedSizeT] = {};
+
+  static constexpr size_t bytes() { return sizeof(seed); }
+
+  FuncOutput operator()(const FuncInput num_iters) const {
+    for (size_t i = 0; i < num_iters; ++i) {
+      this->Absorb(seed, state);
+    }
+    return state[0];
+  }
+};
+
+template <typename T>
+struct GenerateFn : public T {
+  mutable uint64_t state[kStateSizeT];
+  GenerateFn() { std::memset(state, 0, sizeof(state)); }
+
+  static constexpr size_t bytes() { return sizeof(state); }
+
+  FuncOutput operator()(const FuncInput num_iters) const {
+    const auto* keys = this->GetKeys();
+    for (size_t i = 0; i < num_iters; ++i) {
+      this->Generate(keys, state);
+    }
+    return state[0];
+  }
+};
+
+template <typename UInt>
+struct Engine {
+  mutable absl::random_internal::randen_engine<UInt> rng;
+
+  static constexpr size_t bytes() { return sizeof(UInt); }
+
+  FuncOutput operator()(const FuncInput num_iters) const {
+    for (size_t i = 0; i < num_iters - 1; ++i) {
+      rng();
+    }
+    return rng();
+  }
+};
+
+template <size_t N>
+void Print(const char* name, const size_t n, const Result (&results)[N],
+           const size_t bytes) {
+  if (n == 0) {
+    ABSL_RAW_LOG(
+        WARNING,
+        "WARNING: Measurement failed, should not happen when using "
+        "PinThreadToCPU unless the region to measure takes > 1 second.\n");
+    return;
+  }
+
+  static const double ns_per_tick = 1e9 / InvariantTicksPerSecond();
+  static constexpr const double kNsPerS = 1e9;                 // ns/s
+  static constexpr const double kMBPerByte = 1.0 / 1048576.0;  // Mb / b
+  static auto header = [] {
+    return printf("%20s %8s: %12s ticks; %9s  (%9s) %8s\n", "Name", "Count",
+                  "Total", "Variance", "Time", "bytes/s");
+  }();
+  (void)header;
+
+  for (size_t i = 0; i < n; ++i) {
+    const double ticks_per_call = results[i].ticks / results[i].input;
+    const double ns_per_call = ns_per_tick * ticks_per_call;
+    const double bytes_per_ns = bytes / ns_per_call;
+    const double mb_per_s = bytes_per_ns * kNsPerS * kMBPerByte;
+    // Output
+    printf("%20s %8zu: %12.2f ticks; MAD=%4.2f%%  (%6.1f ns) %8.1f Mb/s\n",
+           name, results[i].input, results[i].ticks,
+           results[i].variability * 100.0, ns_per_call, mb_per_s);
+  }
+}
+
+// Fails here
+template <typename Op, size_t N>
+void Measure(const char* name, const FuncInput (&inputs)[N]) {
+  Op op;
+
+  Result results[N];
+  Params params;
+  params.verbose = false;
+  params.max_evals = 6;  // avoid test timeout
+  const size_t num_results = MeasureClosure(op, inputs, N, results, params);
+  Print(name, num_results, results, op.bytes());
+}
+
+// unpredictable == 1 but the compiler does not know that.
+void RunAll(const int argc, char* argv[]) {
+  if (argc == 2) {
+    int cpu = -1;
+    if (!absl::SimpleAtoi(argv[1], &cpu)) {
+      ABSL_RAW_LOG(FATAL, "The optional argument must be a CPU number >= 0.\n");
+    }
+    PinThreadToCPU(cpu);
+  }
+
+  // The compiler cannot reduce this to a constant.
+  const FuncInput unpredictable = (argc != 999);
+  static const FuncInput inputs[] = {unpredictable * 100, unpredictable * 1000};
+
+#if !defined(ABSL_INTERNAL_DISABLE_AES) && ABSL_HAVE_ACCELERATED_AES
+  Measure<AbsorbFn<RandenHwAes>>("Absorb (HwAes)", inputs);
+#endif
+  Measure<AbsorbFn<RandenSlow>>("Absorb (Slow)", inputs);
+
+#if !defined(ABSL_INTERNAL_DISABLE_AES) && ABSL_HAVE_ACCELERATED_AES
+  Measure<GenerateFn<RandenHwAes>>("Generate (HwAes)", inputs);
+#endif
+  Measure<GenerateFn<RandenSlow>>("Generate (Slow)", inputs);
+
+  // Measure the production engine.
+  static const FuncInput inputs1[] = {unpredictable * 1000,
+                                      unpredictable * 10000};
+  Measure<Engine<uint64_t>>("randen_engine<uint64_t>", inputs1);
+  Measure<Engine<uint32_t>>("randen_engine<uint32_t>", inputs1);
+}
+
+}  // namespace
+
+int main(int argc, char* argv[]) {
+  RunAll(argc, argv);
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_detect.cc b/third_party/abseil-cpp/absl/random/internal/randen_detect.cc
new file mode 100644
index 0000000..d5946b21
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_detect.cc
@@ -0,0 +1,219 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the"License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an"AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
+// symbols from arbitrary system and other headers, since it may be built
+// with different flags from other targets, using different levels of
+// optimization, potentially introducing ODR violations.
+
+#include "absl/random/internal/randen_detect.h"
+
+#include <cstdint>
+#include <cstring>
+
+#include "absl/random/internal/platform.h"
+
+#if defined(ABSL_ARCH_X86_64)
+#define ABSL_INTERNAL_USE_X86_CPUID
+#elif defined(ABSL_ARCH_PPC) || defined(ABSL_ARCH_ARM) || \
+    defined(ABSL_ARCH_AARCH64)
+#if defined(__ANDROID__)
+#define ABSL_INTERNAL_USE_ANDROID_GETAUXVAL
+#define ABSL_INTERNAL_USE_GETAUXVAL
+#elif defined(__linux__)
+#define ABSL_INTERNAL_USE_LINUX_GETAUXVAL
+#define ABSL_INTERNAL_USE_GETAUXVAL
+#endif
+#endif
+
+#if defined(ABSL_INTERNAL_USE_X86_CPUID)
+#if defined(_WIN32) || defined(_WIN64)
+#include <intrin.h>  // NOLINT(build/include_order)
+#pragma intrinsic(__cpuid)
+#else
+// MSVC-equivalent __cpuid intrinsic function.
+static void __cpuid(int cpu_info[4], int info_type) {
+  __asm__ volatile("cpuid \n\t"
+                   : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]),
+                     "=d"(cpu_info[3])
+                   : "a"(info_type), "c"(0));
+}
+#endif
+#endif  // ABSL_INTERNAL_USE_X86_CPUID
+
+// On linux, just use the c-library getauxval call.
+#if defined(ABSL_INTERNAL_USE_LINUX_GETAUXVAL)
+
+extern "C" unsigned long getauxval(unsigned long type);  // NOLINT(runtime/int)
+
+static uint32_t GetAuxval(uint32_t hwcap_type) {
+  return static_cast<uint32_t>(getauxval(hwcap_type));
+}
+
+#endif
+
+// On android, probe the system's C library for getauxval().
+// This is the same technique used by the android NDK cpu features library
+// as well as the google open-source cpu_features library.
+//
+// TODO(absl-team): Consider implementing a fallback of directly reading
+// /proc/self/auxval.
+#if defined(ABSL_INTERNAL_USE_ANDROID_GETAUXVAL)
+#include <dlfcn.h>
+
+static uint32_t GetAuxval(uint32_t hwcap_type) {
+  // NOLINTNEXTLINE(runtime/int)
+  typedef unsigned long (*getauxval_func_t)(unsigned long);
+
+  dlerror();  // Cleaning error state before calling dlopen.
+  void* libc_handle = dlopen("libc.so", RTLD_NOW);
+  if (!libc_handle) {
+    return 0;
+  }
+  uint32_t result = 0;
+  void* sym = dlsym(libc_handle, "getauxval");
+  if (sym) {
+    getauxval_func_t func;
+    memcpy(&func, &sym, sizeof(func));
+    result = static_cast<uint32_t>((*func)(hwcap_type));
+  }
+  dlclose(libc_handle);
+  return result;
+}
+
+#endif
+
+namespace absl {
+namespace random_internal {
+
+// The default return at the end of the function might be unreachable depending
+// on the configuration. Ignore that warning.
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code-return"
+#endif
+
+// CPUSupportsRandenHwAes returns whether the CPU is a microarchitecture
+// which supports the crpyto/aes instructions or extensions necessary to use the
+// accelerated RandenHwAes implementation.
+//
+// 1. For x86 it is sufficient to use the CPUID instruction to detect whether
+//    the cpu supports AES instructions. Done.
+//
+// Fon non-x86 it is much more complicated.
+//
+// 2. When ABSL_INTERNAL_USE_GETAUXVAL is defined, use getauxval() (either
+//    the direct c-library version, or the android probing version which loads
+//    libc), and read the hardware capability bits.
+//    This is based on the technique used by boringssl uses to detect
+//    cpu capabilities, and should allow us to enable crypto in the android
+//    builds where it is supported.
+//
+// 3. Use the default for the compiler architecture.
+//
+
+bool CPUSupportsRandenHwAes() {
+#if defined(ABSL_INTERNAL_USE_X86_CPUID)
+  // 1. For x86: Use CPUID to detect the required AES instruction set.
+  int regs[4];
+  __cpuid(reinterpret_cast<int*>(regs), 1);
+  return regs[2] & (1 << 25);  // AES
+
+#elif defined(ABSL_INTERNAL_USE_GETAUXVAL)
+  // 2. Use getauxval() to read the hardware bits and determine
+  // cpu capabilities.
+
+#define AT_HWCAP 16
+#define AT_HWCAP2 26
+#if defined(ABSL_ARCH_PPC)
+  // For Power / PPC: Expect that the cpu supports VCRYPTO
+  // See https://members.openpowerfoundation.org/document/dl/576
+  // VCRYPTO should be present in POWER8 >= 2.07.
+  // Uses Linux kernel constants from arch/powerpc/include/uapi/asm/cputable.h
+  static const uint32_t kVCRYPTO = 0x02000000;
+  const uint32_t hwcap = GetAuxval(AT_HWCAP2);
+  return (hwcap & kVCRYPTO) != 0;
+
+#elif defined(ABSL_ARCH_ARM)
+  // For ARM: Require crypto+neon
+  // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500f/CIHBIBBA.html
+  // Uses Linux kernel constants from arch/arm64/include/asm/hwcap.h
+  static const uint32_t kNEON = 1 << 12;
+  uint32_t hwcap = GetAuxval(AT_HWCAP);
+  if ((hwcap & kNEON) == 0) {
+    return false;
+  }
+
+  // And use it again to detect AES.
+  static const uint32_t kAES = 1 << 0;
+  const uint32_t hwcap2 = GetAuxval(AT_HWCAP2);
+  return (hwcap2 & kAES) != 0;
+
+#elif defined(ABSL_ARCH_AARCH64)
+  // For AARCH64: Require crypto+neon
+  // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500f/CIHBIBBA.html
+  static const uint32_t kNEON = 1 << 1;
+  static const uint32_t kAES = 1 << 3;
+  const uint32_t hwcap = GetAuxval(AT_HWCAP);
+  return ((hwcap & kNEON) != 0) && ((hwcap & kAES) != 0);
+#endif
+
+#else  // ABSL_INTERNAL_USE_GETAUXVAL
+  // 3. By default, assume that the compiler default.
+  return ABSL_HAVE_ACCELERATED_AES ? true : false;
+
+#endif
+  // NOTE: There are some other techniques that may be worth trying:
+  //
+  // * Use an environment variable: ABSL_RANDOM_USE_HWAES
+  //
+  // * Rely on compiler-generated target-based dispatch.
+  // Using x86/gcc it might look something like this:
+  //
+  // int __attribute__((target("aes"))) HasAes() { return 1; }
+  // int __attribute__((target("default"))) HasAes() { return 0; }
+  //
+  // This does not work on all architecture/compiler combinations.
+  //
+  // * On Linux consider reading /proc/cpuinfo and/or /proc/self/auxv.
+  // These files have lines which are easy to parse; for ARM/AARCH64 it is quite
+  // easy to find the Features: line and extract aes / neon. Likewise for
+  // PPC.
+  //
+  // * Fork a process and test for SIGILL:
+  //
+  // * Many architectures have instructions to read the ISA. Unfortunately
+  //   most of those require that the code is running in ring 0 /
+  //   protected-mode.
+  //
+  //   There are several examples. e.g. Valgrind detects PPC ISA 2.07:
+  //   https://github.com/lu-zero/valgrind/blob/master/none/tests/ppc64/test_isa_2_07_part1.c
+  //
+  //   MRS <Xt>, ID_AA64ISAR0_EL1 ; Read ID_AA64ISAR0_EL1 into Xt
+  //
+  //   uint64_t val;
+  //   __asm __volatile("mrs %0, id_aa64isar0_el1" :"=&r" (val));
+  //
+  // * Use a CPUID-style heuristic database.
+  //
+  // * On Apple (__APPLE__), AES is available on Arm v8.
+  //   https://stackoverflow.com/questions/45637888/how-to-determine-armv8-features-at-runtime-on-ios
+}
+
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_detect.h b/third_party/abseil-cpp/absl/random/internal/randen_detect.h
new file mode 100644
index 0000000..ab45f34
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_detect.h
@@ -0,0 +1,29 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_DETECT_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_DETECT_H_
+
+namespace absl {
+namespace random_internal {
+
+// Returns whether the current CPU supports RandenHwAes implementation.
+// This typically involves supporting cryptographic extensions on whichever
+// platform is currently running.
+bool CPUSupportsRandenHwAes();
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_FAST_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_engine.h b/third_party/abseil-cpp/absl/random/internal/randen_engine.h
new file mode 100644
index 0000000..02212a13
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_engine.h
@@ -0,0 +1,228 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_ENGINE_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_ENGINE_H_
+
+#include <algorithm>
+#include <cinttypes>
+#include <cstdlib>
+#include <iostream>
+#include <iterator>
+#include <limits>
+#include <type_traits>
+
+#include "absl/meta/type_traits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+#include "absl/random/internal/randen.h"
+
+namespace absl {
+namespace random_internal {
+
+// Deterministic pseudorandom byte generator with backtracking resistance
+// (leaking the state does not compromise prior outputs). Based on Reverie
+// (see "A Robust and Sponge-Like PRNG with Improved Efficiency") instantiated
+// with an improved Simpira-like permutation.
+// Returns values of type "T" (must be a built-in unsigned integer type).
+//
+// RANDen = RANDom generator or beetroots in Swiss High German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+template <typename T>
+class alignas(16) randen_engine {
+ public:
+  // C++11 URBG interface:
+  using result_type = T;
+  static_assert(std::is_unsigned<result_type>::value,
+                "randen_engine template argument must be a built-in unsigned "
+                "integer type");
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  explicit randen_engine(result_type seed_value = 0) { seed(seed_value); }
+
+  template <class SeedSequence,
+            typename = typename absl::enable_if_t<
+                !std::is_same<SeedSequence, randen_engine>::value>>
+  explicit randen_engine(SeedSequence&& seq) {
+    seed(seq);
+  }
+
+  randen_engine(const randen_engine&) = default;
+
+  // Returns random bits from the buffer in units of result_type.
+  result_type operator()() {
+    // Refill the buffer if needed (unlikely).
+    if (next_ >= kStateSizeT) {
+      next_ = kCapacityT;
+      impl_.Generate(state_);
+    }
+
+    return state_[next_++];
+  }
+
+  template <class SeedSequence>
+  typename absl::enable_if_t<
+      !std::is_convertible<SeedSequence, result_type>::value>
+  seed(SeedSequence&& seq) {
+    // Zeroes the state.
+    seed();
+    reseed(seq);
+  }
+
+  void seed(result_type seed_value = 0) {
+    next_ = kStateSizeT;
+    // Zeroes the inner state and fills the outer state with seed_value to
+    // mimics behaviour of reseed
+    std::fill(std::begin(state_), std::begin(state_) + kCapacityT, 0);
+    std::fill(std::begin(state_) + kCapacityT, std::end(state_), seed_value);
+  }
+
+  // Inserts entropy into (part of) the state. Calling this periodically with
+  // sufficient entropy ensures prediction resistance (attackers cannot predict
+  // future outputs even if state is compromised).
+  template <class SeedSequence>
+  void reseed(SeedSequence& seq) {
+    using sequence_result_type = typename SeedSequence::result_type;
+    static_assert(sizeof(sequence_result_type) == 4,
+                  "SeedSequence::result_type must be 32-bit");
+
+    constexpr size_t kBufferSize =
+        Randen::kSeedBytes / sizeof(sequence_result_type);
+    alignas(16) sequence_result_type buffer[kBufferSize];
+
+    // Randen::Absorb XORs the seed into state, which is then mixed by a call
+    // to Randen::Generate. Seeding with only the provided entropy is preferred
+    // to using an arbitrary generate() call, so use [rand.req.seed_seq]
+    // size as a proxy for the number of entropy units that can be generated
+    // without relying on seed sequence mixing...
+    const size_t entropy_size = seq.size();
+    if (entropy_size < kBufferSize) {
+      // ... and only request that many values, or 256-bits, when unspecified.
+      const size_t requested_entropy = (entropy_size == 0) ? 8u : entropy_size;
+      std::fill(std::begin(buffer) + requested_entropy, std::end(buffer), 0);
+      seq.generate(std::begin(buffer), std::begin(buffer) + requested_entropy);
+      // The Randen paper suggests preferentially initializing even-numbered
+      // 128-bit vectors of the randen state (there are 16 such vectors).
+      // The seed data is merged into the state offset by 128-bits, which
+      // implies prefering seed bytes [16..31, ..., 208..223]. Since the
+      // buffer is 32-bit values, we swap the corresponding buffer positions in
+      // 128-bit chunks.
+      size_t dst = kBufferSize;
+      while (dst > 7) {
+        // leave the odd bucket as-is.
+        dst -= 4;
+        size_t src = dst >> 1;
+        // swap 128-bits into the even bucket
+        std::swap(buffer[--dst], buffer[--src]);
+        std::swap(buffer[--dst], buffer[--src]);
+        std::swap(buffer[--dst], buffer[--src]);
+        std::swap(buffer[--dst], buffer[--src]);
+      }
+    } else {
+      seq.generate(std::begin(buffer), std::end(buffer));
+    }
+    impl_.Absorb(buffer, state_);
+
+    // Generate will be called when operator() is called
+    next_ = kStateSizeT;
+  }
+
+  void discard(uint64_t count) {
+    uint64_t step = std::min<uint64_t>(kStateSizeT - next_, count);
+    count -= step;
+
+    constexpr uint64_t kRateT = kStateSizeT - kCapacityT;
+    while (count > 0) {
+      next_ = kCapacityT;
+      impl_.Generate(state_);
+      step = std::min<uint64_t>(kRateT, count);
+      count -= step;
+    }
+    next_ += step;
+  }
+
+  bool operator==(const randen_engine& other) const {
+    return next_ == other.next_ &&
+           std::equal(std::begin(state_), std::end(state_),
+                      std::begin(other.state_));
+  }
+
+  bool operator!=(const randen_engine& other) const {
+    return !(*this == other);
+  }
+
+  template <class CharT, class Traits>
+  friend std::basic_ostream<CharT, Traits>& operator<<(
+      std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+      const randen_engine<T>& engine) {       // NOLINT(runtime/references)
+    using numeric_type =
+        typename random_internal::stream_format_type<result_type>::type;
+    auto saver = random_internal::make_ostream_state_saver(os);
+    for (const auto& elem : engine.state_) {
+      // In the case that `elem` is `uint8_t`, it must be cast to something
+      // larger so that it prints as an integer rather than a character. For
+      // simplicity, apply the cast all circumstances.
+      os << static_cast<numeric_type>(elem) << os.fill();
+    }
+    os << engine.next_;
+    return os;
+  }
+
+  template <class CharT, class Traits>
+  friend std::basic_istream<CharT, Traits>& operator>>(
+      std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+      randen_engine<T>& engine) {             // NOLINT(runtime/references)
+    using numeric_type =
+        typename random_internal::stream_format_type<result_type>::type;
+    result_type state[kStateSizeT];
+    size_t next;
+    for (auto& elem : state) {
+      // It is not possible to read uint8_t from wide streams, so it is
+      // necessary to read a wider type and then cast it to uint8_t.
+      numeric_type value;
+      is >> value;
+      elem = static_cast<result_type>(value);
+    }
+    is >> next;
+    if (is.fail()) {
+      return is;
+    }
+    std::memcpy(engine.state_, state, sizeof(engine.state_));
+    engine.next_ = next;
+    return is;
+  }
+
+ private:
+  static constexpr size_t kStateSizeT =
+      Randen::kStateBytes / sizeof(result_type);
+  static constexpr size_t kCapacityT =
+      Randen::kCapacityBytes / sizeof(result_type);
+
+  // First kCapacityT are `inner', the others are accessible random bits.
+  alignas(16) result_type state_[kStateSizeT];
+  size_t next_;  // index within state_
+  Randen impl_;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_ENGINE_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_engine_test.cc b/third_party/abseil-cpp/absl/random/internal/randen_engine_test.cc
new file mode 100644
index 0000000..c8e7685b
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_engine_test.cc
@@ -0,0 +1,656 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen_engine.h"
+
+#include <algorithm>
+#include <bitset>
+#include <random>
+#include <sstream>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/explicit_seed_seq.h"
+#include "absl/strings/str_cat.h"
+#include "absl/time/clock.h"
+
+#define UPDATE_GOLDEN 0
+
+using randen_u64 = absl::random_internal::randen_engine<uint64_t>;
+using randen_u32 = absl::random_internal::randen_engine<uint32_t>;
+using absl::random_internal::ExplicitSeedSeq;
+
+namespace {
+
+template <typename UIntType>
+class RandenEngineTypedTest : public ::testing::Test {};
+
+using UIntTypes = ::testing::Types<uint8_t, uint16_t, uint32_t, uint64_t>;
+
+TYPED_TEST_SUITE(RandenEngineTypedTest, UIntTypes);
+
+TYPED_TEST(RandenEngineTypedTest, VerifyReseedChangesAllValues) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+  using result_type = typename randen::result_type;
+
+  const size_t kNumOutputs = (sizeof(randen) * 2 / sizeof(TypeParam)) + 1;
+  randen engine;
+
+  // MSVC emits error 2719 without the use of std::ref below.
+  //  * formal parameter with __declspec(align('#')) won't be aligned
+
+  {
+    std::seed_seq seq1{1, 2, 3, 4, 5, 6, 7};
+    engine.seed(seq1);
+  }
+  result_type a[kNumOutputs];
+  std::generate(std::begin(a), std::end(a), std::ref(engine));
+
+  {
+    std::random_device rd;
+    std::seed_seq seq2{rd(), rd(), rd()};
+    engine.seed(seq2);
+  }
+  result_type b[kNumOutputs];
+  std::generate(std::begin(b), std::end(b), std::ref(engine));
+
+  // Test that generated sequence changed as sequence of bits, i.e. if about
+  // half of the bites were flipped between two non-correlated values.
+  size_t changed_bits = 0;
+  size_t unchanged_bits = 0;
+  size_t total_set = 0;
+  size_t total_bits = 0;
+  size_t equal_count = 0;
+  for (size_t i = 0; i < kNumOutputs; ++i) {
+    equal_count += (a[i] == b[i]) ? 1 : 0;
+    std::bitset<sizeof(result_type) * 8> bitset(a[i] ^ b[i]);
+    changed_bits += bitset.count();
+    unchanged_bits += bitset.size() - bitset.count();
+
+    std::bitset<sizeof(result_type) * 8> a_set(a[i]);
+    std::bitset<sizeof(result_type) * 8> b_set(b[i]);
+    total_set += a_set.count() + b_set.count();
+    total_bits += 2 * 8 * sizeof(result_type);
+  }
+  // On average, half the bits are changed between two calls.
+  EXPECT_LE(changed_bits, 0.60 * (changed_bits + unchanged_bits));
+  EXPECT_GE(changed_bits, 0.40 * (changed_bits + unchanged_bits));
+
+  // Verify using a quick normal-approximation to the binomial.
+  EXPECT_NEAR(total_set, total_bits * 0.5, 4 * std::sqrt(total_bits))
+      << "@" << total_set / static_cast<double>(total_bits);
+
+  // Also, A[i] == B[i] with probability (1/range) * N.
+  // Give this a pretty wide latitude, though.
+  const double kExpected = kNumOutputs / (1.0 * sizeof(result_type) * 8);
+  EXPECT_LE(equal_count, 1.0 + kExpected);
+}
+
+// Number of values that needs to be consumed to clean two sizes of buffer
+// and trigger third refresh. (slightly overestimates the actual state size).
+constexpr size_t kTwoBufferValues = sizeof(randen_u64) / sizeof(uint16_t) + 1;
+
+TYPED_TEST(RandenEngineTypedTest, VerifyDiscard) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+
+  for (size_t num_used = 0; num_used < kTwoBufferValues; ++num_used) {
+    randen engine_used;
+    for (size_t i = 0; i < num_used; ++i) {
+      engine_used();
+    }
+
+    for (size_t num_discard = 0; num_discard < kTwoBufferValues;
+         ++num_discard) {
+      randen engine1 = engine_used;
+      randen engine2 = engine_used;
+      for (size_t i = 0; i < num_discard; ++i) {
+        engine1();
+      }
+      engine2.discard(num_discard);
+      for (size_t i = 0; i < kTwoBufferValues; ++i) {
+        const auto r1 = engine1();
+        const auto r2 = engine2();
+        ASSERT_EQ(r1, r2) << "used=" << num_used << " discard=" << num_discard;
+      }
+    }
+  }
+}
+
+TYPED_TEST(RandenEngineTypedTest, StreamOperatorsResult) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+  std::wostringstream os;
+  std::wistringstream is;
+  randen engine;
+
+  EXPECT_EQ(&(os << engine), &os);
+  EXPECT_EQ(&(is >> engine), &is);
+}
+
+TYPED_TEST(RandenEngineTypedTest, StreamSerialization) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+
+  for (size_t discard = 0; discard < kTwoBufferValues; ++discard) {
+    ExplicitSeedSeq seed_sequence{12, 34, 56};
+    randen engine(seed_sequence);
+    engine.discard(discard);
+
+    std::stringstream stream;
+    stream << engine;
+
+    randen new_engine;
+    stream >> new_engine;
+    for (size_t i = 0; i < 64; ++i) {
+      EXPECT_EQ(engine(), new_engine()) << " " << i;
+    }
+  }
+}
+
+constexpr size_t kNumGoldenOutputs = 127;
+
+// This test is checking if randen_engine is meets interface requirements
+// defined in [rand.req.urbg].
+TYPED_TEST(RandenEngineTypedTest, RandomNumberEngineInterface) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+
+  using E = randen;
+  using T = typename E::result_type;
+
+  static_assert(std::is_copy_constructible<E>::value,
+                "randen_engine must be copy constructible");
+
+  static_assert(absl::is_copy_assignable<E>::value,
+                "randen_engine must be copy assignable");
+
+  static_assert(std::is_move_constructible<E>::value,
+                "randen_engine must be move constructible");
+
+  static_assert(absl::is_move_assignable<E>::value,
+                "randen_engine must be move assignable");
+
+  static_assert(std::is_same<decltype(std::declval<E>()()), T>::value,
+                "return type of operator() must be result_type");
+
+  // Names after definition of [rand.req.urbg] in C++ standard.
+  // e us a value of E
+  // v is a lvalue of E
+  // x, y are possibly const values of E
+  // s is a value of T
+  // q is a value satisfying requirements of seed_sequence
+  // z is a value of type unsigned long long
+  // os is a some specialization of basic_ostream
+  // is is a some specialization of basic_istream
+
+  E e, v;
+  const E x, y;
+  T s = 1;
+  std::seed_seq q{1, 2, 3};
+  unsigned long long z = 1;  // NOLINT(runtime/int)
+  std::wostringstream os;
+  std::wistringstream is;
+
+  E{};
+  E{x};
+  E{s};
+  E{q};
+
+  e.seed();
+
+  // MSVC emits error 2718 when using EXPECT_EQ(e, x)
+  //  * actual parameter with __declspec(align('#')) won't be aligned
+  EXPECT_TRUE(e == x);
+
+  e.seed(q);
+  {
+    E tmp(q);
+    EXPECT_TRUE(e == tmp);
+  }
+
+  e();
+  {
+    E tmp(q);
+    EXPECT_TRUE(e != tmp);
+  }
+
+  e.discard(z);
+
+  static_assert(std::is_same<decltype(x == y), bool>::value,
+                "return type of operator== must be bool");
+
+  static_assert(std::is_same<decltype(x != y), bool>::value,
+                "return type of operator== must be bool");
+}
+
+TYPED_TEST(RandenEngineTypedTest, RandenEngineSFINAETest) {
+  using randen = typename absl::random_internal::randen_engine<TypeParam>;
+  using result_type = typename randen::result_type;
+
+  {
+    randen engine(result_type(1));
+    engine.seed(result_type(1));
+  }
+
+  {
+    result_type n = 1;
+    randen engine(n);
+    engine.seed(n);
+  }
+
+  {
+    randen engine(1);
+    engine.seed(1);
+  }
+
+  {
+    int n = 1;
+    randen engine(n);
+    engine.seed(n);
+  }
+
+  {
+    std::seed_seq seed_seq;
+    randen engine(seed_seq);
+    engine.seed(seed_seq);
+  }
+
+  {
+    randen engine{std::seed_seq()};
+    engine.seed(std::seed_seq());
+  }
+}
+
+TEST(RandenTest, VerifyGoldenRanden64Default) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0xc3c14f134e433977, 0xdda9f47cd90410ee, 0x887bf3087fd8ca10,
+      0xf0b780f545c72912, 0x15dbb1d37696599f, 0x30ec63baff3c6d59,
+      0xb29f73606f7f20a6, 0x02808a316f49a54c, 0x3b8feaf9d5c8e50e,
+      0x9cbf605e3fd9de8a, 0xc970ae1a78183bbb, 0xd8b2ffd356301ed5,
+      0xf4b327fe0fc73c37, 0xcdfd8d76eb8f9a19, 0xc3a506eb91420c9d,
+      0xd5af05dd3eff9556, 0x48db1bb78f83c4a1, 0x7023920e0d6bfe8c,
+      0x58d3575834956d42, 0xed1ef4c26b87b840, 0x8eef32a23e0b2df3,
+      0x497cabf3431154fc, 0x4e24370570029a8b, 0xd88b5749f090e5ea,
+      0xc651a582a970692f, 0x78fcec2cbb6342f5, 0x463cb745612f55db,
+      0x352ee4ad1816afe3, 0x026ff374c101da7e, 0x811ef0821c3de851,
+      0x6f7e616704c4fa59, 0xa0660379992d58fc, 0x04b0a374a3b795c7,
+      0x915f3445685da798, 0x26802a8ac76571ce, 0x4663352533ce1882,
+      0xb9fdefb4a24dc738, 0x5588ba3a4d6e6c51, 0xa2101a42d35f1956,
+      0x607195a5e200f5fd, 0x7e100308f3290764, 0xe1e5e03c759c0709,
+      0x082572cc5da6606f, 0xcbcf585399e432f1, 0xe8a2be4f8335d8f1,
+      0x0904469acbfee8f2, 0xf08bd31b6daecd51, 0x08e8a1f1a69da69a,
+      0x6542a20aad57bff5, 0x2e9705bb053d6b46, 0xda2fc9db0713c391,
+      0x78e3a810213b6ffb, 0xdc16a59cdd85f8a6, 0xc0932718cd55781f,
+      0xb9bfb29c2b20bfe5, 0xb97289c1be0f2f9c, 0xc0a2a0e403a892d4,
+      0x5524bb834771435b, 0x8265da3d39d1a750, 0xff4af3ab8d1b78c5,
+      0xf0ec5f424bcad77f, 0x66e455f627495189, 0xc82d3120b57e3270,
+      0x3424e47dc22596e3, 0xbc0c95129ccedcdd, 0xc191c595afc4dcbf,
+      0x120392bd2bb70939, 0x7f90650ea6cd6ab4, 0x7287491832695ad3,
+      0xa7c8fac5a7917eb0, 0xd088cb9418be0361, 0x7c1bf9839c7c1ce5,
+      0xe2e991fa58e1e79e, 0x78565cdefd28c4ad, 0x7351b9fef98bafad,
+      0x2a9eac28b08c96bf, 0x6c4f179696cb2225, 0x13a685861bab87e0,
+      0x64c6de5aa0501971, 0x30537425cac70991, 0x01590d9dc6c532b7,
+      0x7e05e3aa8ec720dc, 0x74a07d9c54e3e63f, 0x738184388f3bc1d2,
+      0x26ffdc5067be3acb, 0x6bcdf185561f255f, 0xa0eaf2e1cf99b1c6,
+      0x171df81934f68604, 0x7ea5a21665683e5a, 0x5d1cb02075ba1cea,
+      0x957f38cbd2123fdf, 0xba6364eff80de02f, 0x606e0a0e41d452ee,
+      0x892d8317de82f7a2, 0xe707b1db50f7b43e, 0x4eb28826766fcf5b,
+      0x5a362d56e80a0951, 0x6ee217df16527d78, 0xf6737962ba6b23dd,
+      0x443e63857d4076ca, 0x790d9a5f048adfeb, 0xd796b052151ee94d,
+      0x033ed95c12b04a03, 0x8b833ff84893da5d, 0x3d6724b1bb15eab9,
+      0x9877c4225061ca76, 0xd68d6810adf74fb3, 0x42e5352fe30ce989,
+      0x265b565a7431fde7, 0x3cdbf7e358df4b8b, 0x2922a47f6d3e8779,
+      0x52d2242f65b37f88, 0x5d836d6e2958d6b5, 0x29d40f00566d5e26,
+      0x288db0e1124b14a0, 0x6c056608b7d9c1b6, 0x0b9471bdb8f19d32,
+      0x8fb946504faa6c9d, 0x8943a9464540251c, 0xfd1fe27d144a09e0,
+      0xea6ac458da141bda, 0x8048f217633fce36, 0xfeda1384ade74d31,
+      0x4334b8b02ff7612f, 0xdbc8441f5227e216, 0x096d119a3605c85b,
+      0x2b72b31c21b7d7d0};
+
+  randen_u64 engine;
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed();
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(RandenTest, VerifyGoldenRanden64Seeded) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0x83a9e58f94d3dcd5, 0x70bbdff3d97949fb, 0x0438481f7471c1b4,
+      0x34fdc58ee5fb5930, 0xceee4f2d2a937d17, 0xb5a26a68e432aea9,
+      0x8b64774a3fb51740, 0xd89ac1fc74249c74, 0x03910d1d23fc3fdf,
+      0xd38f630878aa897f, 0x0ee8f0f5615f7e44, 0x98f5a53df8279d52,
+      0xb403f52c25938d0e, 0x240072996ea6e838, 0xd3a791246190fa61,
+      0xaaedd3df7a7b4f80, 0xc6eacabe05deaf6e, 0xb7967dd8790edf4d,
+      0x9a0a8e67e049d279, 0x0494f606aebc23e7, 0x598dcd687bc3e0ee,
+      0x010ac81802d452a1, 0x6407c87160aa2842, 0x5a56e276486f93a0,
+      0xc887a399d46a8f02, 0x9e1e6100fe93b740, 0x12d02e330f8901f6,
+      0xc39ca52b47e790b7, 0xb0b0a2fa11e82e61, 0x1542d841a303806a,
+      0x1fe659fd7d6e9d86, 0xb8c90d80746541ac, 0x239d56a5669ddc94,
+      0xd40db57c8123d13c, 0x3abc2414153a0db0, 0x9bad665630cb8d61,
+      0x0bd1fb90ee3f4bbc, 0x8f0b4d7e079b4e42, 0xfa0fb0e0ee59e793,
+      0x51080b283e071100, 0x2c4b9e715081cc15, 0xbe10ed49de4941df,
+      0xf8eaac9d4b1b0d37, 0x4bcce4b54605e139, 0xa64722b76765dda6,
+      0xb9377d738ca28ab5, 0x779fad81a8ccc1af, 0x65cb3ee61ffd3ba7,
+      0xd74e79087862836f, 0xd05b9c584c3f25bf, 0x2ba93a4693579827,
+      0xd81530aff05420ce, 0xec06cea215478621, 0x4b1798a6796d65ad,
+      0xf142f3fb3a6f6fa6, 0x002b7bf7e237b560, 0xf47f2605ef65b4f8,
+      0x9804ec5517effc18, 0xaed3d7f8b7d481cd, 0x5651c24c1ce338d1,
+      0x3e7a38208bf0a3c6, 0x6796a7b614534aed, 0x0d0f3b848358460f,
+      0x0fa5fe7600b19524, 0x2b0cf38253faaedc, 0x10df9188233a9fd6,
+      0x3a10033880138b59, 0x5fb0b0d23948e80f, 0x9e76f7b02fbf5350,
+      0x0816052304b1a985, 0x30c9880db41fd218, 0x14aa399b65e20f28,
+      0xe1454a8cace787b4, 0x325ac971b6c6f0f5, 0x716b1aa2784f3d36,
+      0x3d5ce14accfd144f, 0x6c0c97710f651792, 0xbc5b0f59fb333532,
+      0x2a90a7d2140470bc, 0x8da269f55c1e1c8d, 0xcfc37143895792ca,
+      0xbe21eab1f30b238f, 0x8c47229dee4d65fd, 0x5743614ed1ed7d54,
+      0x351372a99e9c476e, 0x2bd5ea15e5db085f, 0x6925fde46e0af4ca,
+      0xed3eda2bdc1f45bd, 0xdef68c68d460fa6e, 0xe42a0de76253e2b5,
+      0x4e5176dcbc29c305, 0xbfd85fba9f810f6e, 0x76a5a2a9beb815c6,
+      0x01edc4ddceaf414c, 0xa4e98904b4bb3b4b, 0x00bd63ac7d2f1ddd,
+      0xb8491fe6e998ddbb, 0xb386a3463dda6800, 0x0081887688871619,
+      0x33d394b3344e9a38, 0x815dba65a3a8baf9, 0x4232f6ec02c2fd1a,
+      0xb5cff603edd20834, 0x580189243f687663, 0xa8d5a2cbdc27fe99,
+      0x725d881693fa0131, 0xa2be2c13db2c7ac5, 0x7b6a9614b509fd78,
+      0xb6b136d71e717636, 0x660f1a71aff046ea, 0x0ba10ae346c8ec9e,
+      0xe66dde53e3145b41, 0x3b18288c88c26be6, 0x4d9d9d2ff02db933,
+      0x4167da8c70f46e8a, 0xf183beef8c6318b4, 0x4d889e1e71eeeef1,
+      0x7175c71ad6689b6b, 0xfb9e42beacd1b7dd, 0xc33d0e91b29b5e0d,
+      0xd39b83291ce47922, 0xc4d570fb8493d12e, 0x23d5a5724f424ae6,
+      0x5245f161876b6616, 0x38d77dbd21ab578d, 0x9c3423311f4ecbfe,
+      0x76fe31389bacd9d5,
+  };
+
+  ExplicitSeedSeq seed_sequence{12, 34, 56};
+  randen_u64 engine(seed_sequence);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed(seed_sequence);
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(RandenTest, VerifyGoldenRanden32Default) {
+  constexpr uint64_t kGolden[2 * kNumGoldenOutputs] = {
+      0x4e433977, 0xc3c14f13, 0xd90410ee, 0xdda9f47c, 0x7fd8ca10, 0x887bf308,
+      0x45c72912, 0xf0b780f5, 0x7696599f, 0x15dbb1d3, 0xff3c6d59, 0x30ec63ba,
+      0x6f7f20a6, 0xb29f7360, 0x6f49a54c, 0x02808a31, 0xd5c8e50e, 0x3b8feaf9,
+      0x3fd9de8a, 0x9cbf605e, 0x78183bbb, 0xc970ae1a, 0x56301ed5, 0xd8b2ffd3,
+      0x0fc73c37, 0xf4b327fe, 0xeb8f9a19, 0xcdfd8d76, 0x91420c9d, 0xc3a506eb,
+      0x3eff9556, 0xd5af05dd, 0x8f83c4a1, 0x48db1bb7, 0x0d6bfe8c, 0x7023920e,
+      0x34956d42, 0x58d35758, 0x6b87b840, 0xed1ef4c2, 0x3e0b2df3, 0x8eef32a2,
+      0x431154fc, 0x497cabf3, 0x70029a8b, 0x4e243705, 0xf090e5ea, 0xd88b5749,
+      0xa970692f, 0xc651a582, 0xbb6342f5, 0x78fcec2c, 0x612f55db, 0x463cb745,
+      0x1816afe3, 0x352ee4ad, 0xc101da7e, 0x026ff374, 0x1c3de851, 0x811ef082,
+      0x04c4fa59, 0x6f7e6167, 0x992d58fc, 0xa0660379, 0xa3b795c7, 0x04b0a374,
+      0x685da798, 0x915f3445, 0xc76571ce, 0x26802a8a, 0x33ce1882, 0x46633525,
+      0xa24dc738, 0xb9fdefb4, 0x4d6e6c51, 0x5588ba3a, 0xd35f1956, 0xa2101a42,
+      0xe200f5fd, 0x607195a5, 0xf3290764, 0x7e100308, 0x759c0709, 0xe1e5e03c,
+      0x5da6606f, 0x082572cc, 0x99e432f1, 0xcbcf5853, 0x8335d8f1, 0xe8a2be4f,
+      0xcbfee8f2, 0x0904469a, 0x6daecd51, 0xf08bd31b, 0xa69da69a, 0x08e8a1f1,
+      0xad57bff5, 0x6542a20a, 0x053d6b46, 0x2e9705bb, 0x0713c391, 0xda2fc9db,
+      0x213b6ffb, 0x78e3a810, 0xdd85f8a6, 0xdc16a59c, 0xcd55781f, 0xc0932718,
+      0x2b20bfe5, 0xb9bfb29c, 0xbe0f2f9c, 0xb97289c1, 0x03a892d4, 0xc0a2a0e4,
+      0x4771435b, 0x5524bb83, 0x39d1a750, 0x8265da3d, 0x8d1b78c5, 0xff4af3ab,
+      0x4bcad77f, 0xf0ec5f42, 0x27495189, 0x66e455f6, 0xb57e3270, 0xc82d3120,
+      0xc22596e3, 0x3424e47d, 0x9ccedcdd, 0xbc0c9512, 0xafc4dcbf, 0xc191c595,
+      0x2bb70939, 0x120392bd, 0xa6cd6ab4, 0x7f90650e, 0x32695ad3, 0x72874918,
+      0xa7917eb0, 0xa7c8fac5, 0x18be0361, 0xd088cb94, 0x9c7c1ce5, 0x7c1bf983,
+      0x58e1e79e, 0xe2e991fa, 0xfd28c4ad, 0x78565cde, 0xf98bafad, 0x7351b9fe,
+      0xb08c96bf, 0x2a9eac28, 0x96cb2225, 0x6c4f1796, 0x1bab87e0, 0x13a68586,
+      0xa0501971, 0x64c6de5a, 0xcac70991, 0x30537425, 0xc6c532b7, 0x01590d9d,
+      0x8ec720dc, 0x7e05e3aa, 0x54e3e63f, 0x74a07d9c, 0x8f3bc1d2, 0x73818438,
+      0x67be3acb, 0x26ffdc50, 0x561f255f, 0x6bcdf185, 0xcf99b1c6, 0xa0eaf2e1,
+      0x34f68604, 0x171df819, 0x65683e5a, 0x7ea5a216, 0x75ba1cea, 0x5d1cb020,
+      0xd2123fdf, 0x957f38cb, 0xf80de02f, 0xba6364ef, 0x41d452ee, 0x606e0a0e,
+      0xde82f7a2, 0x892d8317, 0x50f7b43e, 0xe707b1db, 0x766fcf5b, 0x4eb28826,
+      0xe80a0951, 0x5a362d56, 0x16527d78, 0x6ee217df, 0xba6b23dd, 0xf6737962,
+      0x7d4076ca, 0x443e6385, 0x048adfeb, 0x790d9a5f, 0x151ee94d, 0xd796b052,
+      0x12b04a03, 0x033ed95c, 0x4893da5d, 0x8b833ff8, 0xbb15eab9, 0x3d6724b1,
+      0x5061ca76, 0x9877c422, 0xadf74fb3, 0xd68d6810, 0xe30ce989, 0x42e5352f,
+      0x7431fde7, 0x265b565a, 0x58df4b8b, 0x3cdbf7e3, 0x6d3e8779, 0x2922a47f,
+      0x65b37f88, 0x52d2242f, 0x2958d6b5, 0x5d836d6e, 0x566d5e26, 0x29d40f00,
+      0x124b14a0, 0x288db0e1, 0xb7d9c1b6, 0x6c056608, 0xb8f19d32, 0x0b9471bd,
+      0x4faa6c9d, 0x8fb94650, 0x4540251c, 0x8943a946, 0x144a09e0, 0xfd1fe27d,
+      0xda141bda, 0xea6ac458, 0x633fce36, 0x8048f217, 0xade74d31, 0xfeda1384,
+      0x2ff7612f, 0x4334b8b0, 0x5227e216, 0xdbc8441f, 0x3605c85b, 0x096d119a,
+      0x21b7d7d0, 0x2b72b31c};
+
+  randen_u32 engine;
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < 2 * kNumGoldenOutputs; ++i) {
+    printf("0x%08x, ", engine());
+    if (i % 6 == 5) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed();
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(RandenTest, VerifyGoldenRanden32Seeded) {
+  constexpr uint64_t kGolden[2 * kNumGoldenOutputs] = {
+      0x94d3dcd5, 0x83a9e58f, 0xd97949fb, 0x70bbdff3, 0x7471c1b4, 0x0438481f,
+      0xe5fb5930, 0x34fdc58e, 0x2a937d17, 0xceee4f2d, 0xe432aea9, 0xb5a26a68,
+      0x3fb51740, 0x8b64774a, 0x74249c74, 0xd89ac1fc, 0x23fc3fdf, 0x03910d1d,
+      0x78aa897f, 0xd38f6308, 0x615f7e44, 0x0ee8f0f5, 0xf8279d52, 0x98f5a53d,
+      0x25938d0e, 0xb403f52c, 0x6ea6e838, 0x24007299, 0x6190fa61, 0xd3a79124,
+      0x7a7b4f80, 0xaaedd3df, 0x05deaf6e, 0xc6eacabe, 0x790edf4d, 0xb7967dd8,
+      0xe049d279, 0x9a0a8e67, 0xaebc23e7, 0x0494f606, 0x7bc3e0ee, 0x598dcd68,
+      0x02d452a1, 0x010ac818, 0x60aa2842, 0x6407c871, 0x486f93a0, 0x5a56e276,
+      0xd46a8f02, 0xc887a399, 0xfe93b740, 0x9e1e6100, 0x0f8901f6, 0x12d02e33,
+      0x47e790b7, 0xc39ca52b, 0x11e82e61, 0xb0b0a2fa, 0xa303806a, 0x1542d841,
+      0x7d6e9d86, 0x1fe659fd, 0x746541ac, 0xb8c90d80, 0x669ddc94, 0x239d56a5,
+      0x8123d13c, 0xd40db57c, 0x153a0db0, 0x3abc2414, 0x30cb8d61, 0x9bad6656,
+      0xee3f4bbc, 0x0bd1fb90, 0x079b4e42, 0x8f0b4d7e, 0xee59e793, 0xfa0fb0e0,
+      0x3e071100, 0x51080b28, 0x5081cc15, 0x2c4b9e71, 0xde4941df, 0xbe10ed49,
+      0x4b1b0d37, 0xf8eaac9d, 0x4605e139, 0x4bcce4b5, 0x6765dda6, 0xa64722b7,
+      0x8ca28ab5, 0xb9377d73, 0xa8ccc1af, 0x779fad81, 0x1ffd3ba7, 0x65cb3ee6,
+      0x7862836f, 0xd74e7908, 0x4c3f25bf, 0xd05b9c58, 0x93579827, 0x2ba93a46,
+      0xf05420ce, 0xd81530af, 0x15478621, 0xec06cea2, 0x796d65ad, 0x4b1798a6,
+      0x3a6f6fa6, 0xf142f3fb, 0xe237b560, 0x002b7bf7, 0xef65b4f8, 0xf47f2605,
+      0x17effc18, 0x9804ec55, 0xb7d481cd, 0xaed3d7f8, 0x1ce338d1, 0x5651c24c,
+      0x8bf0a3c6, 0x3e7a3820, 0x14534aed, 0x6796a7b6, 0x8358460f, 0x0d0f3b84,
+      0x00b19524, 0x0fa5fe76, 0x53faaedc, 0x2b0cf382, 0x233a9fd6, 0x10df9188,
+      0x80138b59, 0x3a100338, 0x3948e80f, 0x5fb0b0d2, 0x2fbf5350, 0x9e76f7b0,
+      0x04b1a985, 0x08160523, 0xb41fd218, 0x30c9880d, 0x65e20f28, 0x14aa399b,
+      0xace787b4, 0xe1454a8c, 0xb6c6f0f5, 0x325ac971, 0x784f3d36, 0x716b1aa2,
+      0xccfd144f, 0x3d5ce14a, 0x0f651792, 0x6c0c9771, 0xfb333532, 0xbc5b0f59,
+      0x140470bc, 0x2a90a7d2, 0x5c1e1c8d, 0x8da269f5, 0x895792ca, 0xcfc37143,
+      0xf30b238f, 0xbe21eab1, 0xee4d65fd, 0x8c47229d, 0xd1ed7d54, 0x5743614e,
+      0x9e9c476e, 0x351372a9, 0xe5db085f, 0x2bd5ea15, 0x6e0af4ca, 0x6925fde4,
+      0xdc1f45bd, 0xed3eda2b, 0xd460fa6e, 0xdef68c68, 0x6253e2b5, 0xe42a0de7,
+      0xbc29c305, 0x4e5176dc, 0x9f810f6e, 0xbfd85fba, 0xbeb815c6, 0x76a5a2a9,
+      0xceaf414c, 0x01edc4dd, 0xb4bb3b4b, 0xa4e98904, 0x7d2f1ddd, 0x00bd63ac,
+      0xe998ddbb, 0xb8491fe6, 0x3dda6800, 0xb386a346, 0x88871619, 0x00818876,
+      0x344e9a38, 0x33d394b3, 0xa3a8baf9, 0x815dba65, 0x02c2fd1a, 0x4232f6ec,
+      0xedd20834, 0xb5cff603, 0x3f687663, 0x58018924, 0xdc27fe99, 0xa8d5a2cb,
+      0x93fa0131, 0x725d8816, 0xdb2c7ac5, 0xa2be2c13, 0xb509fd78, 0x7b6a9614,
+      0x1e717636, 0xb6b136d7, 0xaff046ea, 0x660f1a71, 0x46c8ec9e, 0x0ba10ae3,
+      0xe3145b41, 0xe66dde53, 0x88c26be6, 0x3b18288c, 0xf02db933, 0x4d9d9d2f,
+      0x70f46e8a, 0x4167da8c, 0x8c6318b4, 0xf183beef, 0x71eeeef1, 0x4d889e1e,
+      0xd6689b6b, 0x7175c71a, 0xacd1b7dd, 0xfb9e42be, 0xb29b5e0d, 0xc33d0e91,
+      0x1ce47922, 0xd39b8329, 0x8493d12e, 0xc4d570fb, 0x4f424ae6, 0x23d5a572,
+      0x876b6616, 0x5245f161, 0x21ab578d, 0x38d77dbd, 0x1f4ecbfe, 0x9c342331,
+      0x9bacd9d5, 0x76fe3138,
+  };
+
+  ExplicitSeedSeq seed_sequence{12, 34, 56};
+  randen_u32 engine(seed_sequence);
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < 2 * kNumGoldenOutputs; ++i) {
+    printf("0x%08x, ", engine());
+    if (i % 6 == 5) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+  engine.seed(seed_sequence);
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(RandenTest, VerifyGoldenFromDeserializedEngine) {
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0x067f9f9ab919657a, 0x0534605912988583, 0x8a303f72feaa673f,
+      0x77b7fd747909185c, 0xd9af90403c56d891, 0xd939c6cb204d14b5,
+      0x7fbe6b954a47b483, 0x8b31a47cc34c768d, 0x3a9e546da2701a9c,
+      0x5246539046253e71, 0x417191ffb2a848a1, 0x7b1c7bf5a5001d09,
+      0x9489b15d194f2361, 0xfcebdeea3bcd2461, 0xd643027c854cec97,
+      0x5885397f91e0d21c, 0x53173b0efae30d58, 0x1c9c71168449fac1,
+      0xe358202b711ed8aa, 0x94e3918ed1d8227c, 0x5bb4e251450144cf,
+      0xb5c7a519b489af3b, 0x6f8b560b1f7b3469, 0xfde11dd4a1c74eef,
+      0x33383d2f76457dcf, 0x3060c0ec6db9fce1, 0x18f451fcddeec766,
+      0xe73c5d6b9f26da2a, 0x8d4cc566671b32a4, 0xb8189b73776bc9ff,
+      0x497a70f9caf0bc23, 0x23afcc509791dcea, 0x18af70dc4b27d306,
+      0xd3853f955a0ce5b9, 0x441db6c01a0afb17, 0xd0136c3fb8e1f13f,
+      0x5e4fd6fc2f33783c, 0xe0d24548adb5da51, 0x0f4d8362a7d3485a,
+      0x9f572d68270fa563, 0x6351fbc823024393, 0xa66dbfc61810e9ab,
+      0x0ff17fc14b651af8, 0xd74c55dafb99e623, 0x36303bc1ad85c6c2,
+      0x4920cd6a2af7e897, 0x0b8848addc30fecd, 0x9e1562eda6488e93,
+      0x197553807d607828, 0xbef5eaeda5e21235, 0x18d91d2616aca527,
+      0xb7821937f5c873cd, 0x2cd4ae5650dbeefc, 0xb35a64376f75ffdf,
+      0x9226d414d647fe07, 0x663f3db455bbb35e, 0xa829eead6ae93247,
+      0x7fd69c204dd0d25f, 0xbe1411f891c9acb1, 0xd476f34a506d5f11,
+      0xf423d2831649c5ca, 0x1e503962951abd75, 0xeccc9e8b1e34b537,
+      0xb11a147294044854, 0xc4cf27f0abf4929d, 0xe9193abf6fa24c8c,
+      0xa94a259e3aba8808, 0x21dc414197deffa3, 0xa2ae211d1ff622ae,
+      0xfe3995c46be5a4f4, 0xe9984c284bf11128, 0xcb1ce9d2f0851a80,
+      0x42fee17971d87cd8, 0xac76a98d177adc88, 0xa0973b3dedc4af6f,
+      0xdf56d6bbcb1b8e86, 0xf1e6485f407b11c9, 0x2c63de4deccb15c0,
+      0x6fe69db32ed4fad7, 0xaa51a65f84bca1f1, 0x242f2ee81d608afc,
+      0x8eb88b2b69fc153b, 0x22c20098baf73fd1, 0x57759466f576488c,
+      0x075ca562cea1be9d, 0x9a74814d73d28891, 0x73d1555fc02f4d3d,
+      0xc17f8f210ee89337, 0x46cca7999eaeafd4, 0x5db8d6a327a0d8ac,
+      0xb79b4f93c738d7a1, 0x9994512f0036ded1, 0xd3883026f38747f4,
+      0xf31f7458078d097c, 0x736ce4d480680669, 0x7a496f4c7e1033e3,
+      0xecf85bf297fbc68c, 0x9e37e1d0f24f3c4e, 0x15b6e067ca0746fc,
+      0xdd4a39905c5db81c, 0xb5dfafa7bcfdf7da, 0xca6646fb6f92a276,
+      0x1c6b35f363ef0efd, 0x6a33d06037ad9f76, 0x45544241afd8f80f,
+      0x83f8d83f859c90c5, 0x22aea9c5365e8c19, 0xfac35b11f20b6a6a,
+      0xd1acf49d1a27dd2f, 0xf281cd09c4fed405, 0x076000a42cd38e4f,
+      0x6ace300565070445, 0x463a62781bddc4db, 0x1477126b46b569ac,
+      0x127f2bb15035fbb8, 0xdfa30946049c04a8, 0x89072a586ba8dd3e,
+      0x62c809582bb7e74d, 0x22c0c3641406c28b, 0x9b66e36c47ff004d,
+      0xb9cd2c7519653330, 0x18608d79cd7a598d, 0x92c0bd1323e53e32,
+      0x887ff00de8524aa5, 0xa074410b787abd10, 0x18ab41b8057a2063,
+      0x1560abf26bc5f987};
+
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  std::seed_seq seed_sequence{1, 2, 3, 4, 5};
+  randen_u64 engine(seed_sequence);
+  std::ostringstream stream;
+  stream << engine;
+  auto str = stream.str();
+  printf("%s\n\n", str.c_str());
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    printf("0x%016lx, ", engine());
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+#else
+  randen_u64 engine;
+  std::istringstream stream(
+      "0 0 9824501439887287479 3242284395352394785 243836530774933777 "
+      "4047941804708365596 17165468127298385802 949276103645889255 "
+      "10659970394998657921 1657570836810929787 11697746266668051452 "
+      "9967209969299905230 14140390331161524430 7383014124183271684 "
+      "13146719127702337852 13983155220295807171 11121125587542359264 "
+      "195757810993252695 17138580243103178492 11326030747260920501 "
+      "8585097322474965590 18342582839328350995 15052982824209724634 "
+      "7321861343874683609 1806786911778767826 10100850842665572955 "
+      "9249328950653985078 13600624835326909759 11137960060943860251 "
+      "10208781341792329629 9282723971471525577 16373271619486811032 32");
+  stream >> engine;
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, engine());
+  }
+#endif
+}
+
+TEST(RandenTest, IsFastOrSlow) {
+  // randen_engine typically costs ~5ns per value for the optimized code paths,
+  // and the ~1000ns per value for slow code paths.  However when running under
+  // msan, asan, etc. it can take much longer.
+  //
+  // The estimated operation time is something like:
+  //
+  // linux, optimized ~5ns
+  // ppc, optimized ~7ns
+  // nacl (slow), ~1100ns
+  //
+  // `kCount` is chosen below so that, in debug builds and without hardware
+  // acceleration, the test (assuming ~1us per call) should finish in ~0.1s
+  static constexpr size_t kCount = 100000;
+  randen_u64 engine;
+  randen_u64::result_type sum = 0;
+  auto start = absl::GetCurrentTimeNanos();
+  for (int i = 0; i < kCount; i++) {
+    sum += engine();
+  }
+  auto duration = absl::GetCurrentTimeNanos() - start;
+
+  ABSL_INTERNAL_LOG(INFO, absl::StrCat(static_cast<double>(duration) /
+                                           static_cast<double>(kCount),
+                                       "ns"));
+
+  EXPECT_GT(sum, 0);
+  EXPECT_GE(duration, kCount);  // Should be slower than 1ns per call.
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc
new file mode 100644
index 0000000..0fcd9a85
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc
@@ -0,0 +1,666 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
+// symbols from arbitrary system and other headers, since it may be built
+// with different flags from other targets, using different levels of
+// optimization, potentially introducing ODR violations.
+
+#include "absl/random/internal/randen_hwaes.h"
+
+#include <cstdint>
+#include <cstring>
+
+#include "absl/random/internal/platform.h"
+
+// ABSL_RANDEN_HWAES_IMPL indicates whether this file will contain
+// a hardware accelerated implementation of randen, or whether it
+// will contain stubs that exit the process.
+#if defined(ABSL_ARCH_X86_64) || defined(ABSL_ARCH_X86_32)
+// The platform.h directives are sufficient to indicate whether
+// we should build accelerated implementations for x86.
+#if (ABSL_HAVE_ACCELERATED_AES || ABSL_RANDOM_INTERNAL_AES_DISPATCH)
+#define ABSL_RANDEN_HWAES_IMPL 1
+#endif
+#elif defined(ABSL_ARCH_PPC)
+// The platform.h directives are sufficient to indicate whether
+// we should build accelerated implementations for PPC.
+//
+// NOTE: This has mostly been tested on 64-bit Power variants,
+// and not embedded cpus such as powerpc32-8540
+#if ABSL_HAVE_ACCELERATED_AES
+#define ABSL_RANDEN_HWAES_IMPL 1
+#endif
+#elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
+// ARM is somewhat more complicated. We might support crypto natively...
+#if ABSL_HAVE_ACCELERATED_AES || \
+    (defined(__ARM_NEON) && defined(__ARM_FEATURE_CRYPTO))
+#define ABSL_RANDEN_HWAES_IMPL 1
+
+#elif ABSL_RANDOM_INTERNAL_AES_DISPATCH && !defined(__APPLE__) && \
+    (defined(__GNUC__) && __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 9)
+// ...or, on GCC, we can use an ASM directive to
+// instruct the assember to allow crypto instructions.
+#define ABSL_RANDEN_HWAES_IMPL 1
+#define ABSL_RANDEN_HWAES_IMPL_CRYPTO_DIRECTIVE 1
+#endif
+#else
+// HWAES is unsupported by these architectures / platforms:
+//   __myriad2__
+//   __mips__
+//
+// Other architectures / platforms are unknown.
+//
+// See the Abseil documentation on supported macros at:
+// https://abseil.io/docs/cpp/platforms/macros
+#endif
+
+#if !defined(ABSL_RANDEN_HWAES_IMPL)
+// No accelerated implementation is supported.
+// The RandenHwAes functions are stubs that print an error and exit.
+
+#include <cstdio>
+#include <cstdlib>
+
+namespace absl {
+namespace random_internal {
+
+// No accelerated implementation.
+bool HasRandenHwAesImplementation() { return false; }
+
+// NOLINTNEXTLINE
+const void* RandenHwAes::GetKeys() {
+  // Attempted to dispatch to an unsupported dispatch target.
+  const int d = ABSL_RANDOM_INTERNAL_AES_DISPATCH;
+  fprintf(stderr, "AES Hardware detection failed (%d).\n", d);
+  exit(1);
+  return nullptr;
+}
+
+// NOLINTNEXTLINE
+void RandenHwAes::Absorb(const void*, void*) {
+  // Attempted to dispatch to an unsupported dispatch target.
+  const int d = ABSL_RANDOM_INTERNAL_AES_DISPATCH;
+  fprintf(stderr, "AES Hardware detection failed (%d).\n", d);
+  exit(1);
+}
+
+// NOLINTNEXTLINE
+void RandenHwAes::Generate(const void*, void*) {
+  // Attempted to dispatch to an unsupported dispatch target.
+  const int d = ABSL_RANDOM_INTERNAL_AES_DISPATCH;
+  fprintf(stderr, "AES Hardware detection failed (%d).\n", d);
+  exit(1);
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#else  // defined(ABSL_RANDEN_HWAES_IMPL)
+//
+// Accelerated implementations are supported.
+// We need the per-architecture includes and defines.
+//
+
+#include "absl/random/internal/randen_traits.h"
+
+// ABSL_FUNCTION_ALIGN32 defines a 32-byte alignment attribute
+// for the functions in this file.
+//
+// NOTE: Determine whether we actually have any wins from ALIGN32
+// using microbenchmarks. If not, remove.
+#undef ABSL_FUNCTION_ALIGN32
+#if ABSL_HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__))
+#define ABSL_FUNCTION_ALIGN32 __attribute__((aligned(32)))
+#else
+#define ABSL_FUNCTION_ALIGN32
+#endif
+
+// TARGET_CRYPTO defines a crypto attribute for each architecture.
+//
+// NOTE: Evaluate whether we should eliminate ABSL_TARGET_CRYPTO.
+#if (defined(__clang__) || defined(__GNUC__))
+#if defined(ABSL_ARCH_X86_64) || defined(ABSL_ARCH_X86_32)
+#define ABSL_TARGET_CRYPTO __attribute__((target("aes")))
+#elif defined(ABSL_ARCH_PPC)
+#define ABSL_TARGET_CRYPTO __attribute__((target("crypto")))
+#else
+#define ABSL_TARGET_CRYPTO
+#endif
+#else
+#define ABSL_TARGET_CRYPTO
+#endif
+
+#if defined(ABSL_ARCH_PPC)
+// NOTE: Keep in mind that PPC can operate in little-endian or big-endian mode,
+// however the PPC altivec vector registers (and thus the AES instructions)
+// always operate in big-endian mode.
+
+#include <altivec.h>
+// <altivec.h> #defines vector __vector; in C++, this is bad form.
+#undef vector
+
+// Rely on the PowerPC AltiVec vector operations for accelerated AES
+// instructions. GCC support of the PPC vector types is described in:
+// https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/PowerPC-AltiVec_002fVSX-Built-in-Functions.html
+//
+// Already provides operator^=.
+using Vector128 = __vector unsigned long long;  // NOLINT(runtime/int)
+
+namespace {
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+ReverseBytes(const Vector128& v) {
+  // Reverses the bytes of the vector.
+  const __vector unsigned char perm = {15, 14, 13, 12, 11, 10, 9, 8,
+                                       7,  6,  5,  4,  3,  2,  1, 0};
+  return vec_perm(v, v, perm);
+}
+
+// WARNING: these load/store in native byte order. It is OK to load and then
+// store an unchanged vector, but interpreting the bits as a number or input
+// to AES will have undefined results.
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+Vector128Load(const void* ABSL_RANDOM_INTERNAL_RESTRICT from) {
+  return vec_vsx_ld(0, reinterpret_cast<const Vector128*>(from));
+}
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void Vector128Store(
+    const Vector128& v, void* ABSL_RANDOM_INTERNAL_RESTRICT to) {
+  vec_vsx_st(v, 0, reinterpret_cast<Vector128*>(to));
+}
+
+// One round of AES. "round_key" is a public constant for breaking the
+// symmetry of AES (ensures previously equal columns differ afterwards).
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+AesRound(const Vector128& state, const Vector128& round_key) {
+  return Vector128(__builtin_crypto_vcipher(state, round_key));
+}
+
+// Enables native loads in the round loop by pre-swapping.
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void SwapEndian(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state) {
+  using absl::random_internal::RandenTraits;
+  constexpr size_t kLanes = 2;
+  constexpr size_t kFeistelBlocks = RandenTraits::kFeistelBlocks;
+
+  for (uint32_t branch = 0; branch < kFeistelBlocks; ++branch) {
+    const Vector128 v = ReverseBytes(Vector128Load(state + kLanes * branch));
+    Vector128Store(v, state + kLanes * branch);
+  }
+}
+
+}  // namespace
+
+#elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
+
+// This asm directive will cause the file to be compiled with crypto extensions
+// whether or not the cpu-architecture supports it.
+#if ABSL_RANDEN_HWAES_IMPL_CRYPTO_DIRECTIVE
+asm(".arch_extension  crypto\n");
+
+// Override missing defines.
+#if !defined(__ARM_NEON)
+#define __ARM_NEON 1
+#endif
+
+#if !defined(__ARM_FEATURE_CRYPTO)
+#define __ARM_FEATURE_CRYPTO 1
+#endif
+
+#endif
+
+// Rely on the ARM NEON+Crypto advanced simd types, defined in <arm_neon.h>.
+// uint8x16_t is the user alias for underlying __simd128_uint8_t type.
+// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf
+//
+// <arm_neon> defines the following
+//
+// typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;
+// typedef __attribute__((neon_vector_type(16))) int8_t int8x16_t;
+// typedef __attribute__((neon_polyvector_type(16))) int8_t poly8x16_t;
+//
+// vld1q_v
+// vst1q_v
+// vaeseq_v
+// vaesmcq_v
+#include <arm_neon.h>
+
+// Already provides operator^=.
+using Vector128 = uint8x16_t;
+
+namespace {
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+Vector128Load(const void* ABSL_RANDOM_INTERNAL_RESTRICT from) {
+  return vld1q_u8(reinterpret_cast<const uint8_t*>(from));
+}
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void Vector128Store(
+    const Vector128& v, void* ABSL_RANDOM_INTERNAL_RESTRICT to) {
+  vst1q_u8(reinterpret_cast<uint8_t*>(to), v);
+}
+
+// One round of AES. "round_key" is a public constant for breaking the
+// symmetry of AES (ensures previously equal columns differ afterwards).
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+AesRound(const Vector128& state, const Vector128& round_key) {
+  // It is important to always use the full round function - omitting the
+  // final MixColumns reduces security [https://eprint.iacr.org/2010/041.pdf]
+  // and does not help because we never decrypt.
+  //
+  // Note that ARM divides AES instructions differently than x86 / PPC,
+  // And we need to skip the first AddRoundKey step and add an extra
+  // AddRoundKey step to the end. Lucky for us this is just XOR.
+  return vaesmcq_u8(vaeseq_u8(state, uint8x16_t{})) ^ round_key;
+}
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void SwapEndian(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT) {}
+
+}  // namespace
+
+#elif defined(ABSL_ARCH_X86_64) || defined(ABSL_ARCH_X86_32)
+// On x86 we rely on the aesni instructions
+#include <wmmintrin.h>
+
+namespace {
+
+// Vector128 class is only wrapper for __m128i, benchmark indicates that it's
+// faster than using __m128i directly.
+class Vector128 {
+ public:
+  // Convert from/to intrinsics.
+  inline ABSL_ATTRIBUTE_ALWAYS_INLINE explicit Vector128(
+      const __m128i& Vector128)
+      : data_(Vector128) {}
+
+  inline ABSL_ATTRIBUTE_ALWAYS_INLINE __m128i data() const { return data_; }
+
+  inline ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128& operator^=(
+      const Vector128& other) {
+    data_ = _mm_xor_si128(data_, other.data());
+    return *this;
+  }
+
+ private:
+  __m128i data_;
+};
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+Vector128Load(const void* ABSL_RANDOM_INTERNAL_RESTRICT from) {
+  return Vector128(_mm_load_si128(reinterpret_cast<const __m128i*>(from)));
+}
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void Vector128Store(
+    const Vector128& v, void* ABSL_RANDOM_INTERNAL_RESTRICT to) {
+  _mm_store_si128(reinterpret_cast<__m128i * ABSL_RANDOM_INTERNAL_RESTRICT>(to),
+                  v.data());
+}
+
+// One round of AES. "round_key" is a public constant for breaking the
+// symmetry of AES (ensures previously equal columns differ afterwards).
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+AesRound(const Vector128& state, const Vector128& round_key) {
+  // It is important to always use the full round function - omitting the
+  // final MixColumns reduces security [https://eprint.iacr.org/2010/041.pdf]
+  // and does not help because we never decrypt.
+  return Vector128(_mm_aesenc_si128(state.data(), round_key.data()));
+}
+
+inline ABSL_TARGET_CRYPTO ABSL_ATTRIBUTE_ALWAYS_INLINE void SwapEndian(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT) {}
+
+}  // namespace
+
+#endif
+
+namespace {
+
+// u64x2 is a 128-bit, (2 x uint64_t lanes) struct used to store
+// the randen_keys.
+struct alignas(16) u64x2 {
+  constexpr u64x2(uint64_t hi, uint64_t lo)
+#if defined(ABSL_ARCH_PPC)
+      // This has been tested with PPC running in little-endian mode;
+      // We byte-swap the u64x2 structure from little-endian to big-endian
+      // because altivec always runs in big-endian mode.
+      : v{__builtin_bswap64(hi), __builtin_bswap64(lo)} {
+#else
+      : v{lo, hi} {
+#endif
+  }
+
+  constexpr bool operator==(const u64x2& other) const {
+    return v[0] == other.v[0] && v[1] == other.v[1];
+  }
+
+  constexpr bool operator!=(const u64x2& other) const {
+    return !(*this == other);
+  }
+
+  uint64_t v[2];
+};  // namespace
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#endif
+
+// At this point, all of the platform-specific features have been defined /
+// implemented.
+//
+// REQUIRES: using u64x2 = ...
+// REQUIRES: using Vector128 = ...
+// REQUIRES: Vector128 Vector128Load(void*) {...}
+// REQUIRES: void Vector128Store(Vector128, void*) {...}
+// REQUIRES: Vector128 AesRound(Vector128, Vector128) {...}
+// REQUIRES: void SwapEndian(uint64_t*) {...}
+//
+// PROVIDES: absl::random_internal::RandenHwAes::Absorb
+// PROVIDES: absl::random_internal::RandenHwAes::Generate
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// High-level summary:
+// 1) Reverie (see "A Robust and Sponge-Like PRNG with Improved Efficiency") is
+//    a sponge-like random generator that requires a cryptographic permutation.
+//    It improves upon "Provably Robust Sponge-Based PRNGs and KDFs" by
+//    achieving backtracking resistance with only one Permute() per buffer.
+//
+// 2) "Simpira v2: A Family of Efficient Permutations Using the AES Round
+//    Function" constructs up to 1024-bit permutations using an improved
+//    Generalized Feistel network with 2-round AES-128 functions. This Feistel
+//    block shuffle achieves diffusion faster and is less vulnerable to
+//    sliced-biclique attacks than the Type-2 cyclic shuffle.
+//
+// 3) "Improving the Generalized Feistel" and "New criterion for diffusion
+//    property" extends the same kind of improved Feistel block shuffle to 16
+//    branches, which enables a 2048-bit permutation.
+//
+// We combine these three ideas and also change Simpira's subround keys from
+// structured/low-entropy counters to digits of Pi.
+
+// Randen constants.
+using absl::random_internal::RandenTraits;
+constexpr size_t kStateBytes = RandenTraits::kStateBytes;
+constexpr size_t kCapacityBytes = RandenTraits::kCapacityBytes;
+constexpr size_t kFeistelBlocks = RandenTraits::kFeistelBlocks;
+constexpr size_t kFeistelRounds = RandenTraits::kFeistelRounds;
+constexpr size_t kFeistelFunctions = RandenTraits::kFeistelFunctions;
+
+// Independent keys (272 = 2.1 KiB) for the first AES subround of each function.
+constexpr size_t kKeys = kFeistelRounds * kFeistelFunctions;
+
+// INCLUDE keys.
+#include "absl/random/internal/randen-keys.inc"
+
+static_assert(kKeys == kRoundKeys, "kKeys and kRoundKeys must be equal");
+static_assert(round_keys[kKeys - 1] != u64x2(0, 0),
+              "Too few round_keys initializers");
+
+// Number of uint64_t lanes per 128-bit vector;
+constexpr size_t kLanes = 2;
+
+// Block shuffles applies a shuffle to the entire state between AES rounds.
+// Improved odd-even shuffle from "New criterion for diffusion property".
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_TARGET_CRYPTO void BlockShuffle(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state) {
+  static_assert(kFeistelBlocks == 16, "Expecting 16 FeistelBlocks.");
+
+  constexpr size_t shuffle[kFeistelBlocks] = {7,  2, 13, 4,  11, 8,  3, 6,
+                                              15, 0, 9,  10, 1,  14, 5, 12};
+
+  // The fully unrolled loop without the memcpy improves the speed by about
+  // 30% over the equivalent loop.
+  const Vector128 v0 = Vector128Load(state + kLanes * shuffle[0]);
+  const Vector128 v1 = Vector128Load(state + kLanes * shuffle[1]);
+  const Vector128 v2 = Vector128Load(state + kLanes * shuffle[2]);
+  const Vector128 v3 = Vector128Load(state + kLanes * shuffle[3]);
+  const Vector128 v4 = Vector128Load(state + kLanes * shuffle[4]);
+  const Vector128 v5 = Vector128Load(state + kLanes * shuffle[5]);
+  const Vector128 v6 = Vector128Load(state + kLanes * shuffle[6]);
+  const Vector128 v7 = Vector128Load(state + kLanes * shuffle[7]);
+  const Vector128 w0 = Vector128Load(state + kLanes * shuffle[8]);
+  const Vector128 w1 = Vector128Load(state + kLanes * shuffle[9]);
+  const Vector128 w2 = Vector128Load(state + kLanes * shuffle[10]);
+  const Vector128 w3 = Vector128Load(state + kLanes * shuffle[11]);
+  const Vector128 w4 = Vector128Load(state + kLanes * shuffle[12]);
+  const Vector128 w5 = Vector128Load(state + kLanes * shuffle[13]);
+  const Vector128 w6 = Vector128Load(state + kLanes * shuffle[14]);
+  const Vector128 w7 = Vector128Load(state + kLanes * shuffle[15]);
+
+  Vector128Store(v0, state + kLanes * 0);
+  Vector128Store(v1, state + kLanes * 1);
+  Vector128Store(v2, state + kLanes * 2);
+  Vector128Store(v3, state + kLanes * 3);
+  Vector128Store(v4, state + kLanes * 4);
+  Vector128Store(v5, state + kLanes * 5);
+  Vector128Store(v6, state + kLanes * 6);
+  Vector128Store(v7, state + kLanes * 7);
+  Vector128Store(w0, state + kLanes * 8);
+  Vector128Store(w1, state + kLanes * 9);
+  Vector128Store(w2, state + kLanes * 10);
+  Vector128Store(w3, state + kLanes * 11);
+  Vector128Store(w4, state + kLanes * 12);
+  Vector128Store(w5, state + kLanes * 13);
+  Vector128Store(w6, state + kLanes * 14);
+  Vector128Store(w7, state + kLanes * 15);
+}
+
+// Feistel round function using two AES subrounds. Very similar to F()
+// from Simpira v2, but with independent subround keys. Uses 17 AES rounds
+// per 16 bytes (vs. 10 for AES-CTR). Computing eight round functions in
+// parallel hides the 7-cycle AESNI latency on HSW. Note that the Feistel
+// XORs are 'free' (included in the second AES instruction).
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_TARGET_CRYPTO const u64x2*
+FeistelRound(uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state,
+             const u64x2* ABSL_RANDOM_INTERNAL_RESTRICT keys) {
+  static_assert(kFeistelBlocks == 16, "Expecting 16 FeistelBlocks.");
+
+  // MSVC does a horrible job at unrolling loops.
+  // So we unroll the loop by hand to improve the performance.
+  const Vector128 s0 = Vector128Load(state + kLanes * 0);
+  const Vector128 s1 = Vector128Load(state + kLanes * 1);
+  const Vector128 s2 = Vector128Load(state + kLanes * 2);
+  const Vector128 s3 = Vector128Load(state + kLanes * 3);
+  const Vector128 s4 = Vector128Load(state + kLanes * 4);
+  const Vector128 s5 = Vector128Load(state + kLanes * 5);
+  const Vector128 s6 = Vector128Load(state + kLanes * 6);
+  const Vector128 s7 = Vector128Load(state + kLanes * 7);
+  const Vector128 s8 = Vector128Load(state + kLanes * 8);
+  const Vector128 s9 = Vector128Load(state + kLanes * 9);
+  const Vector128 s10 = Vector128Load(state + kLanes * 10);
+  const Vector128 s11 = Vector128Load(state + kLanes * 11);
+  const Vector128 s12 = Vector128Load(state + kLanes * 12);
+  const Vector128 s13 = Vector128Load(state + kLanes * 13);
+  const Vector128 s14 = Vector128Load(state + kLanes * 14);
+  const Vector128 s15 = Vector128Load(state + kLanes * 15);
+
+  // Encode even blocks with keys.
+  const Vector128 e0 = AesRound(s0, Vector128Load(keys + 0));
+  const Vector128 e2 = AesRound(s2, Vector128Load(keys + 1));
+  const Vector128 e4 = AesRound(s4, Vector128Load(keys + 2));
+  const Vector128 e6 = AesRound(s6, Vector128Load(keys + 3));
+  const Vector128 e8 = AesRound(s8, Vector128Load(keys + 4));
+  const Vector128 e10 = AesRound(s10, Vector128Load(keys + 5));
+  const Vector128 e12 = AesRound(s12, Vector128Load(keys + 6));
+  const Vector128 e14 = AesRound(s14, Vector128Load(keys + 7));
+
+  // Encode odd blocks with even output from above.
+  const Vector128 o1 = AesRound(e0, s1);
+  const Vector128 o3 = AesRound(e2, s3);
+  const Vector128 o5 = AesRound(e4, s5);
+  const Vector128 o7 = AesRound(e6, s7);
+  const Vector128 o9 = AesRound(e8, s9);
+  const Vector128 o11 = AesRound(e10, s11);
+  const Vector128 o13 = AesRound(e12, s13);
+  const Vector128 o15 = AesRound(e14, s15);
+
+  // Store odd blocks. (These will be shuffled later).
+  Vector128Store(o1, state + kLanes * 1);
+  Vector128Store(o3, state + kLanes * 3);
+  Vector128Store(o5, state + kLanes * 5);
+  Vector128Store(o7, state + kLanes * 7);
+  Vector128Store(o9, state + kLanes * 9);
+  Vector128Store(o11, state + kLanes * 11);
+  Vector128Store(o13, state + kLanes * 13);
+  Vector128Store(o15, state + kLanes * 15);
+
+  return keys + 8;
+}
+
+// Cryptographic permutation based via type-2 Generalized Feistel Network.
+// Indistinguishable from ideal by chosen-ciphertext adversaries using less than
+// 2^64 queries if the round function is a PRF. This is similar to the b=8 case
+// of Simpira v2, but more efficient than its generic construction for b=16.
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_TARGET_CRYPTO void Permute(
+    const void* ABSL_RANDOM_INTERNAL_RESTRICT keys,
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state) {
+  const u64x2* ABSL_RANDOM_INTERNAL_RESTRICT keys128 =
+      static_cast<const u64x2*>(keys);
+
+  // (Successfully unrolled; the first iteration jumps into the second half)
+#ifdef __clang__
+#pragma clang loop unroll_count(2)
+#endif
+  for (size_t round = 0; round < kFeistelRounds; ++round) {
+    keys128 = FeistelRound(state, keys128);
+    BlockShuffle(state);
+  }
+}
+
+}  // namespace
+
+namespace absl {
+namespace random_internal {
+
+bool HasRandenHwAesImplementation() { return true; }
+
+const void* ABSL_TARGET_CRYPTO ABSL_FUNCTION_ALIGN32 ABSL_ATTRIBUTE_FLATTEN
+RandenHwAes::GetKeys() {
+  // Round keys for one AES per Feistel round and branch.
+  // The canonical implementation uses first digits of Pi.
+  return round_keys;
+}
+
+// NOLINTNEXTLINE
+void ABSL_TARGET_CRYPTO ABSL_FUNCTION_ALIGN32 ABSL_ATTRIBUTE_FLATTEN
+RandenHwAes::Absorb(const void* seed_void, void* state_void) {
+  uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state =
+      reinterpret_cast<uint64_t*>(state_void);
+  const uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT seed =
+      reinterpret_cast<const uint64_t*>(seed_void);
+
+  constexpr size_t kCapacityBlocks = kCapacityBytes / sizeof(Vector128);
+  constexpr size_t kStateBlocks = kStateBytes / sizeof(Vector128);
+
+  static_assert(kCapacityBlocks * sizeof(Vector128) == kCapacityBytes,
+                "Not i*V");
+  static_assert(kCapacityBlocks == 1, "Unexpected Randen kCapacityBlocks");
+  static_assert(kStateBlocks == 16, "Unexpected Randen kStateBlocks");
+
+  Vector128 b1 = Vector128Load(state + kLanes * 1);
+  b1 ^= Vector128Load(seed + kLanes * 0);
+  Vector128Store(b1, state + kLanes * 1);
+
+  Vector128 b2 = Vector128Load(state + kLanes * 2);
+  b2 ^= Vector128Load(seed + kLanes * 1);
+  Vector128Store(b2, state + kLanes * 2);
+
+  Vector128 b3 = Vector128Load(state + kLanes * 3);
+  b3 ^= Vector128Load(seed + kLanes * 2);
+  Vector128Store(b3, state + kLanes * 3);
+
+  Vector128 b4 = Vector128Load(state + kLanes * 4);
+  b4 ^= Vector128Load(seed + kLanes * 3);
+  Vector128Store(b4, state + kLanes * 4);
+
+  Vector128 b5 = Vector128Load(state + kLanes * 5);
+  b5 ^= Vector128Load(seed + kLanes * 4);
+  Vector128Store(b5, state + kLanes * 5);
+
+  Vector128 b6 = Vector128Load(state + kLanes * 6);
+  b6 ^= Vector128Load(seed + kLanes * 5);
+  Vector128Store(b6, state + kLanes * 6);
+
+  Vector128 b7 = Vector128Load(state + kLanes * 7);
+  b7 ^= Vector128Load(seed + kLanes * 6);
+  Vector128Store(b7, state + kLanes * 7);
+
+  Vector128 b8 = Vector128Load(state + kLanes * 8);
+  b8 ^= Vector128Load(seed + kLanes * 7);
+  Vector128Store(b8, state + kLanes * 8);
+
+  Vector128 b9 = Vector128Load(state + kLanes * 9);
+  b9 ^= Vector128Load(seed + kLanes * 8);
+  Vector128Store(b9, state + kLanes * 9);
+
+  Vector128 b10 = Vector128Load(state + kLanes * 10);
+  b10 ^= Vector128Load(seed + kLanes * 9);
+  Vector128Store(b10, state + kLanes * 10);
+
+  Vector128 b11 = Vector128Load(state + kLanes * 11);
+  b11 ^= Vector128Load(seed + kLanes * 10);
+  Vector128Store(b11, state + kLanes * 11);
+
+  Vector128 b12 = Vector128Load(state + kLanes * 12);
+  b12 ^= Vector128Load(seed + kLanes * 11);
+  Vector128Store(b12, state + kLanes * 12);
+
+  Vector128 b13 = Vector128Load(state + kLanes * 13);
+  b13 ^= Vector128Load(seed + kLanes * 12);
+  Vector128Store(b13, state + kLanes * 13);
+
+  Vector128 b14 = Vector128Load(state + kLanes * 14);
+  b14 ^= Vector128Load(seed + kLanes * 13);
+  Vector128Store(b14, state + kLanes * 14);
+
+  Vector128 b15 = Vector128Load(state + kLanes * 15);
+  b15 ^= Vector128Load(seed + kLanes * 14);
+  Vector128Store(b15, state + kLanes * 15);
+}
+
+// NOLINTNEXTLINE
+void ABSL_TARGET_CRYPTO ABSL_FUNCTION_ALIGN32 ABSL_ATTRIBUTE_FLATTEN
+RandenHwAes::Generate(const void* keys, void* state_void) {
+  static_assert(kCapacityBytes == sizeof(Vector128), "Capacity mismatch");
+
+  uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state =
+      reinterpret_cast<uint64_t*>(state_void);
+
+  const Vector128 prev_inner = Vector128Load(state);
+
+  SwapEndian(state);
+
+  Permute(keys, state);
+
+  SwapEndian(state);
+
+  // Ensure backtracking resistance.
+  Vector128 inner = Vector128Load(state);
+  inner ^= prev_inner;
+  Vector128Store(inner, state);
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // (ABSL_RANDEN_HWAES_IMPL)
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h
new file mode 100644
index 0000000..0acec4b
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h
@@ -0,0 +1,46 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_HWAES_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_HWAES_H_
+
+// HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
+// symbols from arbitrary system and other headers, since it may be built
+// with different flags from other targets, using different levels of
+// optimization, potentially introducing ODR violations.
+
+namespace absl {
+namespace random_internal {
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// RandenHwAes implements the basic state manipulation methods.
+class RandenHwAes {
+ public:
+  static void Generate(const void* keys, void* state_void);
+  static void Absorb(const void* seed_void, void* state_void);
+  static const void* GetKeys();
+};
+
+// HasRandenHwAesImplementation returns true when there is an accelerated
+// implementation, and false otherwise.  If there is no implementation,
+// then attempting to use it will abort the program.
+bool HasRandenHwAesImplementation();
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_FAST_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_hwaes_test.cc b/third_party/abseil-cpp/absl/random/internal/randen_hwaes_test.cc
new file mode 100644
index 0000000..a7cbd46
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_hwaes_test.cc
@@ -0,0 +1,102 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen_hwaes.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/platform.h"
+#include "absl/random/internal/randen_detect.h"
+#include "absl/random/internal/randen_traits.h"
+#include "absl/strings/str_format.h"
+
+namespace {
+
+using absl::random_internal::RandenHwAes;
+using absl::random_internal::RandenTraits;
+
+struct randen {
+  static constexpr size_t kStateSizeT =
+      RandenTraits::kStateBytes / sizeof(uint64_t);
+  uint64_t state[kStateSizeT];
+  static constexpr size_t kSeedSizeT =
+      RandenTraits::kSeedBytes / sizeof(uint32_t);
+  uint32_t seed[kSeedSizeT];
+};
+
+TEST(RandenHwAesTest, Default) {
+  EXPECT_TRUE(absl::random_internal::CPUSupportsRandenHwAes());
+
+  constexpr uint64_t kGolden[] = {
+      0x6c6534090ee6d3ee, 0x044e2b9b9d5333c6, 0xc3c14f134e433977,
+      0xdda9f47cd90410ee, 0x887bf3087fd8ca10, 0xf0b780f545c72912,
+      0x15dbb1d37696599f, 0x30ec63baff3c6d59, 0xb29f73606f7f20a6,
+      0x02808a316f49a54c, 0x3b8feaf9d5c8e50e, 0x9cbf605e3fd9de8a,
+      0xc970ae1a78183bbb, 0xd8b2ffd356301ed5, 0xf4b327fe0fc73c37,
+      0xcdfd8d76eb8f9a19, 0xc3a506eb91420c9d, 0xd5af05dd3eff9556,
+      0x48db1bb78f83c4a1, 0x7023920e0d6bfe8c, 0x58d3575834956d42,
+      0xed1ef4c26b87b840, 0x8eef32a23e0b2df3, 0x497cabf3431154fc,
+      0x4e24370570029a8b, 0xd88b5749f090e5ea, 0xc651a582a970692f,
+      0x78fcec2cbb6342f5, 0x463cb745612f55db, 0x352ee4ad1816afe3,
+      0x026ff374c101da7e, 0x811ef0821c3de851,
+  };
+
+  alignas(16) randen d;
+  memset(d.state, 0, sizeof(d.state));
+  RandenHwAes::Generate(RandenHwAes::GetKeys(), d.state);
+
+  uint64_t* id = d.state;
+  for (const auto& elem : kGolden) {
+    auto a = absl::StrFormat("%#x", elem);
+    auto b = absl::StrFormat("%#x", *id++);
+    EXPECT_EQ(a, b);
+  }
+}
+
+}  // namespace
+
+int main(int argc, char* argv[]) {
+  testing::InitGoogleTest(&argc, argv);
+
+  ABSL_RAW_LOG(INFO, "ABSL_HAVE_ACCELERATED_AES=%d", ABSL_HAVE_ACCELERATED_AES);
+  ABSL_RAW_LOG(INFO, "ABSL_RANDOM_INTERNAL_AES_DISPATCH=%d",
+               ABSL_RANDOM_INTERNAL_AES_DISPATCH);
+
+#if defined(ABSL_ARCH_X86_64)
+  ABSL_RAW_LOG(INFO, "ABSL_ARCH_X86_64");
+#elif defined(ABSL_ARCH_X86_32)
+  ABSL_RAW_LOG(INFO, "ABSL_ARCH_X86_32");
+#elif defined(ABSL_ARCH_AARCH64)
+  ABSL_RAW_LOG(INFO, "ABSL_ARCH_AARCH64");
+#elif defined(ABSL_ARCH_ARM)
+  ABSL_RAW_LOG(INFO, "ABSL_ARCH_ARM");
+#elif defined(ABSL_ARCH_PPC)
+  ABSL_RAW_LOG(INFO, "ABSL_ARCH_PPC");
+#else
+  ABSL_RAW_LOG(INFO, "ARCH Unknown");
+#endif
+
+  int x = absl::random_internal::HasRandenHwAesImplementation();
+  ABSL_RAW_LOG(INFO, "HasRandenHwAesImplementation = %d", x);
+
+  int y = absl::random_internal::CPUSupportsRandenHwAes();
+  ABSL_RAW_LOG(INFO, "CPUSupportsRandenHwAes = %d", x);
+
+  if (!x || !y) {
+    ABSL_RAW_LOG(INFO, "Skipping Randen HWAES tests.");
+    return 0;
+  }
+  return RUN_ALL_TESTS();
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow.cc b/third_party/abseil-cpp/absl/random/internal/randen_slow.cc
new file mode 100644
index 0000000..b2ecabf
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_slow.cc
@@ -0,0 +1,490 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen_slow.h"
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#include "absl/random/internal/platform.h"
+
+namespace {
+
+// AES portions based on rijndael-alg-fst.c,
+// https://fastcrypto.org/front/misc/rijndael-alg-fst.c
+//
+// Implementation of
+// http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
+constexpr uint32_t te0[256] = {
+    0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd,
+    0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
+    0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d,
+    0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
+    0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7,
+    0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
+    0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4,
+    0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
+    0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1,
+    0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
+    0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e,
+    0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
+    0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e,
+    0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
+    0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46,
+    0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
+    0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7,
+    0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
+    0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe,
+    0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
+    0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a,
+    0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
+    0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2,
+    0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
+    0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e,
+    0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
+    0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256,
+    0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
+    0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4,
+    0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
+    0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa,
+    0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
+    0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1,
+    0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
+    0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42,
+    0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
+    0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158,
+    0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
+    0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22,
+    0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
+    0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631,
+    0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
+    0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
+};
+
+constexpr uint32_t te1[256] = {
+    0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b,
+    0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
+    0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282,
+    0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
+    0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4,
+    0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
+    0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5,
+    0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
+    0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696,
+    0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
+    0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383,
+    0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
+    0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3,
+    0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
+    0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb,
+    0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
+    0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d,
+    0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
+    0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3,
+    0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
+    0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff,
+    0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
+    0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7,
+    0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
+    0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a,
+    0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
+    0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232,
+    0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
+    0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595,
+    0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
+    0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656,
+    0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
+    0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6,
+    0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
+    0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e,
+    0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
+    0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1,
+    0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
+    0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e,
+    0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
+    0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6,
+    0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
+    0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
+};
+
+constexpr uint32_t te2[256] = {
+    0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b,
+    0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
+    0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82,
+    0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
+    0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4,
+    0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
+    0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5,
+    0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
+    0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796,
+    0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
+    0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83,
+    0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
+    0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3,
+    0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
+    0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb,
+    0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
+    0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d,
+    0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
+    0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3,
+    0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
+    0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff,
+    0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
+    0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7,
+    0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
+    0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a,
+    0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
+    0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432,
+    0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
+    0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195,
+    0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
+    0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56,
+    0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
+    0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6,
+    0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
+    0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e,
+    0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
+    0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1,
+    0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
+    0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e,
+    0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
+    0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6,
+    0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
+    0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
+};
+
+constexpr uint32_t te3[256] = {
+    0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6,
+    0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
+    0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f,
+    0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
+    0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753,
+    0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
+    0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451,
+    0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
+    0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137,
+    0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
+    0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d,
+    0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
+    0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd,
+    0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
+    0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d,
+    0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
+    0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a,
+    0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
+    0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d,
+    0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
+    0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5,
+    0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
+    0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255,
+    0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
+    0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54,
+    0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
+    0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664,
+    0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
+    0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431,
+    0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
+    0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac,
+    0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
+    0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157,
+    0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
+    0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c,
+    0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
+    0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899,
+    0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
+    0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c,
+    0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
+    0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7,
+    0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
+    0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
+};
+
+struct alignas(16) u64x2 {
+  constexpr u64x2() : v{0, 0} {};
+  constexpr u64x2(uint64_t hi, uint64_t lo) : v{lo, hi} {}
+
+  uint64_t v[2];
+};
+
+// Software implementation of the Vector128 class, using uint32_t
+// as an underlying vector register.
+//
+struct Vector128 {
+  inline ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128& operator^=(
+      const Vector128& other) {
+    s[0] ^= other.s[0];
+    s[1] ^= other.s[1];
+    s[2] ^= other.s[2];
+    s[3] ^= other.s[3];
+    return *this;
+  }
+
+  uint32_t s[4];
+};
+
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+Vector128Load(const void* ABSL_RANDOM_INTERNAL_RESTRICT from) {
+  Vector128 result;
+  const uint8_t* ABSL_RANDOM_INTERNAL_RESTRICT src =
+      reinterpret_cast<const uint8_t*>(from);
+
+  result.s[0] = static_cast<uint32_t>(src[0]) << 24 |
+                static_cast<uint32_t>(src[1]) << 16 |
+                static_cast<uint32_t>(src[2]) << 8 |
+                static_cast<uint32_t>(src[3]);
+  result.s[1] = static_cast<uint32_t>(src[4]) << 24 |
+                static_cast<uint32_t>(src[5]) << 16 |
+                static_cast<uint32_t>(src[6]) << 8 |
+                static_cast<uint32_t>(src[7]);
+  result.s[2] = static_cast<uint32_t>(src[8]) << 24 |
+                static_cast<uint32_t>(src[9]) << 16 |
+                static_cast<uint32_t>(src[10]) << 8 |
+                static_cast<uint32_t>(src[11]);
+  result.s[3] = static_cast<uint32_t>(src[12]) << 24 |
+                static_cast<uint32_t>(src[13]) << 16 |
+                static_cast<uint32_t>(src[14]) << 8 |
+                static_cast<uint32_t>(src[15]);
+  return result;
+}
+
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE void Vector128Store(
+    const Vector128& v, void* ABSL_RANDOM_INTERNAL_RESTRICT to) {
+  uint8_t* dst = reinterpret_cast<uint8_t*>(to);
+  dst[0] = static_cast<uint8_t>(v.s[0] >> 24);
+  dst[1] = static_cast<uint8_t>(v.s[0] >> 16);
+  dst[2] = static_cast<uint8_t>(v.s[0] >> 8);
+  dst[3] = static_cast<uint8_t>(v.s[0]);
+  dst[4] = static_cast<uint8_t>(v.s[1] >> 24);
+  dst[5] = static_cast<uint8_t>(v.s[1] >> 16);
+  dst[6] = static_cast<uint8_t>(v.s[1] >> 8);
+  dst[7] = static_cast<uint8_t>(v.s[1]);
+  dst[8] = static_cast<uint8_t>(v.s[2] >> 24);
+  dst[9] = static_cast<uint8_t>(v.s[2] >> 16);
+  dst[10] = static_cast<uint8_t>(v.s[2] >> 8);
+  dst[11] = static_cast<uint8_t>(v.s[2]);
+  dst[12] = static_cast<uint8_t>(v.s[3] >> 24);
+  dst[13] = static_cast<uint8_t>(v.s[3] >> 16);
+  dst[14] = static_cast<uint8_t>(v.s[3] >> 8);
+  dst[15] = static_cast<uint8_t>(v.s[3]);
+}
+
+// One round of AES. "round_key" is a public constant for breaking the
+// symmetry of AES (ensures previously equal columns differ afterwards).
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE Vector128
+AesRound(const Vector128& state, const Vector128& round_key) {
+  // clang-format off
+  Vector128 result;
+  result.s[0] = round_key.s[0] ^
+                te0[uint8_t(state.s[0] >> 24)] ^
+                te1[uint8_t(state.s[1] >> 16)] ^
+                te2[uint8_t(state.s[2] >> 8)] ^
+                te3[uint8_t(state.s[3])];
+  result.s[1] = round_key.s[1] ^
+                te0[uint8_t(state.s[1] >> 24)] ^
+                te1[uint8_t(state.s[2] >> 16)] ^
+                te2[uint8_t(state.s[3] >> 8)] ^
+                te3[uint8_t(state.s[0])];
+  result.s[2] = round_key.s[2] ^
+                te0[uint8_t(state.s[2] >> 24)] ^
+                te1[uint8_t(state.s[3] >> 16)] ^
+                te2[uint8_t(state.s[0] >> 8)] ^
+                te3[uint8_t(state.s[1])];
+  result.s[3] = round_key.s[3] ^
+                te0[uint8_t(state.s[3] >> 24)] ^
+                te1[uint8_t(state.s[0] >> 16)] ^
+                te2[uint8_t(state.s[1] >> 8)] ^
+                te3[uint8_t(state.s[2])];
+  return result;
+  // clang-format on
+}
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// High-level summary:
+// 1) Reverie (see "A Robust and Sponge-Like PRNG with Improved Efficiency") is
+//    a sponge-like random generator that requires a cryptographic permutation.
+//    It improves upon "Provably Robust Sponge-Based PRNGs and KDFs" by
+//    achieving backtracking resistance with only one Permute() per buffer.
+//
+// 2) "Simpira v2: A Family of Efficient Permutations Using the AES Round
+//    Function" constructs up to 1024-bit permutations using an improved
+//    Generalized Feistel network with 2-round AES-128 functions. This Feistel
+//    block shuffle achieves diffusion faster and is less vulnerable to
+//    sliced-biclique attacks than the Type-2 cyclic shuffle.
+//
+// 3) "Improving the Generalized Feistel" and "New criterion for diffusion
+//    property" extends the same kind of improved Feistel block shuffle to 16
+//    branches, which enables a 2048-bit permutation.
+//
+// Combine these three ideas and also change Simpira's subround keys from
+// structured/low-entropy counters to digits of Pi.
+
+// Randen constants.
+constexpr size_t kFeistelBlocks = 16;
+constexpr size_t kFeistelFunctions = kFeistelBlocks / 2;  // = 8
+constexpr size_t kFeistelRounds = 16 + 1;  // > 4 * log2(kFeistelBlocks)
+constexpr size_t kKeys = kFeistelRounds * kFeistelFunctions;
+
+// INCLUDE keys.
+#include "absl/random/internal/randen-keys.inc"
+
+static_assert(kKeys == kRoundKeys, "kKeys and kRoundKeys must be equal");
+
+// 2 uint64_t lanes per Vector128
+static constexpr size_t kLanes = 2;
+
+// The improved Feistel block shuffle function for 16 blocks.
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE void BlockShuffle(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state_u64) {
+  static_assert(kFeistelBlocks == 16,
+                "Feistel block shuffle only works for 16 blocks.");
+
+  constexpr size_t shuffle[kFeistelBlocks] = {7,  2, 13, 4,  11, 8,  3, 6,
+                                              15, 0, 9,  10, 1,  14, 5, 12};
+
+  u64x2* ABSL_RANDOM_INTERNAL_RESTRICT state =
+      reinterpret_cast<u64x2*>(state_u64);
+
+  // The fully unrolled loop without the memcpy improves the speed by about
+  // 30% over the equivalent (leaving code here as a comment):
+  if (false) {
+    u64x2 source[kFeistelBlocks];
+    std::memcpy(source, state, sizeof(source));
+    for (size_t i = 0; i < kFeistelBlocks; i++) {
+      const u64x2 v0 = source[shuffle[i]];
+      state[i] = v0;
+    }
+  }
+
+  const u64x2 v0 = state[shuffle[0]];
+  const u64x2 v1 = state[shuffle[1]];
+  const u64x2 v2 = state[shuffle[2]];
+  const u64x2 v3 = state[shuffle[3]];
+  const u64x2 v4 = state[shuffle[4]];
+  const u64x2 v5 = state[shuffle[5]];
+  const u64x2 v6 = state[shuffle[6]];
+  const u64x2 v7 = state[shuffle[7]];
+  const u64x2 w0 = state[shuffle[8]];
+  const u64x2 w1 = state[shuffle[9]];
+  const u64x2 w2 = state[shuffle[10]];
+  const u64x2 w3 = state[shuffle[11]];
+  const u64x2 w4 = state[shuffle[12]];
+  const u64x2 w5 = state[shuffle[13]];
+  const u64x2 w6 = state[shuffle[14]];
+  const u64x2 w7 = state[shuffle[15]];
+  state[0] = v0;
+  state[1] = v1;
+  state[2] = v2;
+  state[3] = v3;
+  state[4] = v4;
+  state[5] = v5;
+  state[6] = v6;
+  state[7] = v7;
+  state[8] = w0;
+  state[9] = w1;
+  state[10] = w2;
+  state[11] = w3;
+  state[12] = w4;
+  state[13] = w5;
+  state[14] = w6;
+  state[15] = w7;
+}
+
+// Feistel round function using two AES subrounds. Very similar to F()
+// from Simpira v2, but with independent subround keys. Uses 17 AES rounds
+// per 16 bytes (vs. 10 for AES-CTR). Computing eight round functions in
+// parallel hides the 7-cycle AESNI latency on HSW. Note that the Feistel
+// XORs are 'free' (included in the second AES instruction).
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE const u64x2* FeistelRound(
+    uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state,
+    const u64x2* ABSL_RANDOM_INTERNAL_RESTRICT keys) {
+  for (size_t branch = 0; branch < kFeistelBlocks; branch += 4) {
+    const Vector128 s0 = Vector128Load(state + kLanes * branch);
+    const Vector128 s1 = Vector128Load(state + kLanes * (branch + 1));
+    const Vector128 f0 = AesRound(s0, Vector128Load(keys));
+    keys++;
+    const Vector128 o1 = AesRound(f0, s1);
+    Vector128Store(o1, state + kLanes * (branch + 1));
+
+    // Manually unroll this loop once. about 10% better than not unrolled.
+    const Vector128 s2 = Vector128Load(state + kLanes * (branch + 2));
+    const Vector128 s3 = Vector128Load(state + kLanes * (branch + 3));
+    const Vector128 f2 = AesRound(s2, Vector128Load(keys));
+    keys++;
+    const Vector128 o3 = AesRound(f2, s3);
+    Vector128Store(o3, state + kLanes * (branch + 3));
+  }
+  return keys;
+}
+
+// Cryptographic permutation based via type-2 Generalized Feistel Network.
+// Indistinguishable from ideal by chosen-ciphertext adversaries using less than
+// 2^64 queries if the round function is a PRF. This is similar to the b=8 case
+// of Simpira v2, but more efficient than its generic construction for b=16.
+inline ABSL_ATTRIBUTE_ALWAYS_INLINE void Permute(
+    const void* keys, uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state) {
+  const u64x2* ABSL_RANDOM_INTERNAL_RESTRICT keys128 =
+      static_cast<const u64x2*>(keys);
+  for (size_t round = 0; round < kFeistelRounds; ++round) {
+    keys128 = FeistelRound(state, keys128);
+    BlockShuffle(state);
+  }
+}
+
+}  // namespace
+
+namespace absl {
+namespace random_internal {
+
+const void* RandenSlow::GetKeys() {
+  // Round keys for one AES per Feistel round and branch.
+  // The canonical implementation uses first digits of Pi.
+  return round_keys;
+}
+
+void RandenSlow::Absorb(const void* seed_void, void* state_void) {
+  uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state =
+      reinterpret_cast<uint64_t*>(state_void);
+  const uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT seed =
+      reinterpret_cast<const uint64_t*>(seed_void);
+
+  constexpr size_t kCapacityBlocks = kCapacityBytes / sizeof(uint64_t);
+  static_assert(kCapacityBlocks * sizeof(uint64_t) == kCapacityBytes,
+                "Not i*V");
+  for (size_t i = kCapacityBlocks; i < kStateBytes / sizeof(uint64_t); ++i) {
+    state[i] ^= seed[i - kCapacityBlocks];
+  }
+}
+
+void RandenSlow::Generate(const void* keys, void* state_void) {
+  static_assert(kCapacityBytes == sizeof(Vector128), "Capacity mismatch");
+
+  uint64_t* ABSL_RANDOM_INTERNAL_RESTRICT state =
+      reinterpret_cast<uint64_t*>(state_void);
+
+  const Vector128 prev_inner = Vector128Load(state);
+
+  Permute(keys, state);
+
+  // Ensure backtracking resistance.
+  Vector128 inner = Vector128Load(state);
+  inner ^= prev_inner;
+  Vector128Store(inner, state);
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow.h b/third_party/abseil-cpp/absl/random/internal/randen_slow.h
new file mode 100644
index 0000000..3058613
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_slow.h
@@ -0,0 +1,43 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_SLOW_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_SLOW_H_
+
+#include <cstddef>
+
+namespace absl {
+namespace random_internal {
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// RandenSlow implements the basic state manipulation methods for
+// architectures lacking AES hardware acceleration intrinsics.
+class RandenSlow {
+ public:
+  // Size of the entire sponge / state for the randen PRNG.
+  static constexpr size_t kStateBytes = 256;  // 2048-bit
+
+  // Size of the 'inner' (inaccessible) part of the sponge. Larger values would
+  // require more frequent calls to RandenGenerate.
+  static constexpr size_t kCapacityBytes = 16;  // 128-bit
+
+  static void Generate(const void* keys, void* state_void);
+  static void Absorb(const void* seed_void, void* state_void);
+  static const void* GetKeys();
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_SLOW_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc b/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc
new file mode 100644
index 0000000..c07155d
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc
@@ -0,0 +1,61 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen_slow.h"
+
+#include <cstring>
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using absl::random_internal::RandenSlow;
+
+// Local state parameters.
+constexpr size_t kSeedBytes =
+    RandenSlow::kStateBytes - RandenSlow::kCapacityBytes;
+constexpr size_t kStateSizeT = RandenSlow::kStateBytes / sizeof(uint64_t);
+constexpr size_t kSeedSizeT = kSeedBytes / sizeof(uint32_t);
+
+struct randen {
+  uint64_t state[kStateSizeT];
+  uint32_t seed[kSeedSizeT];
+};
+
+TEST(RandenSlowTest, Default) {
+  constexpr uint64_t kGolden[] = {
+      0x6c6534090ee6d3ee, 0x044e2b9b9d5333c6, 0xc3c14f134e433977,
+      0xdda9f47cd90410ee, 0x887bf3087fd8ca10, 0xf0b780f545c72912,
+      0x15dbb1d37696599f, 0x30ec63baff3c6d59, 0xb29f73606f7f20a6,
+      0x02808a316f49a54c, 0x3b8feaf9d5c8e50e, 0x9cbf605e3fd9de8a,
+      0xc970ae1a78183bbb, 0xd8b2ffd356301ed5, 0xf4b327fe0fc73c37,
+      0xcdfd8d76eb8f9a19, 0xc3a506eb91420c9d, 0xd5af05dd3eff9556,
+      0x48db1bb78f83c4a1, 0x7023920e0d6bfe8c, 0x58d3575834956d42,
+      0xed1ef4c26b87b840, 0x8eef32a23e0b2df3, 0x497cabf3431154fc,
+      0x4e24370570029a8b, 0xd88b5749f090e5ea, 0xc651a582a970692f,
+      0x78fcec2cbb6342f5, 0x463cb745612f55db, 0x352ee4ad1816afe3,
+      0x026ff374c101da7e, 0x811ef0821c3de851,
+  };
+
+  alignas(16) randen d;
+  std::memset(d.state, 0, sizeof(d.state));
+  RandenSlow::Generate(RandenSlow::GetKeys(), d.state);
+
+  uint64_t* id = d.state;
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, *id++);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_test.cc b/third_party/abseil-cpp/absl/random/internal/randen_test.cc
new file mode 100644
index 0000000..c186fe0
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_test.cc
@@ -0,0 +1,70 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/randen.h"
+
+#include <cstring>
+
+#include "gtest/gtest.h"
+#include "absl/meta/type_traits.h"
+
+namespace {
+
+using absl::random_internal::Randen;
+
+// Local state parameters.
+constexpr size_t kStateSizeT = Randen::kStateBytes / sizeof(uint64_t);
+
+TEST(RandenTest, CopyAndMove) {
+  static_assert(std::is_copy_constructible<Randen>::value,
+                "Randen must be copy constructible");
+
+  static_assert(absl::is_copy_assignable<Randen>::value,
+                "Randen must be copy assignable");
+
+  static_assert(std::is_move_constructible<Randen>::value,
+                "Randen must be move constructible");
+
+  static_assert(absl::is_move_assignable<Randen>::value,
+                "Randen must be move assignable");
+}
+
+TEST(RandenTest, Default) {
+  constexpr uint64_t kGolden[] = {
+      0x6c6534090ee6d3ee, 0x044e2b9b9d5333c6, 0xc3c14f134e433977,
+      0xdda9f47cd90410ee, 0x887bf3087fd8ca10, 0xf0b780f545c72912,
+      0x15dbb1d37696599f, 0x30ec63baff3c6d59, 0xb29f73606f7f20a6,
+      0x02808a316f49a54c, 0x3b8feaf9d5c8e50e, 0x9cbf605e3fd9de8a,
+      0xc970ae1a78183bbb, 0xd8b2ffd356301ed5, 0xf4b327fe0fc73c37,
+      0xcdfd8d76eb8f9a19, 0xc3a506eb91420c9d, 0xd5af05dd3eff9556,
+      0x48db1bb78f83c4a1, 0x7023920e0d6bfe8c, 0x58d3575834956d42,
+      0xed1ef4c26b87b840, 0x8eef32a23e0b2df3, 0x497cabf3431154fc,
+      0x4e24370570029a8b, 0xd88b5749f090e5ea, 0xc651a582a970692f,
+      0x78fcec2cbb6342f5, 0x463cb745612f55db, 0x352ee4ad1816afe3,
+      0x026ff374c101da7e, 0x811ef0821c3de851,
+  };
+
+  alignas(16) uint64_t state[kStateSizeT];
+  std::memset(state, 0, sizeof(state));
+
+  Randen r;
+  r.Generate(state);
+
+  auto id = std::begin(state);
+  for (const auto& elem : kGolden) {
+    EXPECT_EQ(elem, *id++);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_traits.h b/third_party/abseil-cpp/absl/random/internal/randen_traits.h
new file mode 100644
index 0000000..4f1f408
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/randen_traits.h
@@ -0,0 +1,59 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_RANDEN_TRAITS_H_
+#define ABSL_RANDOM_INTERNAL_RANDEN_TRAITS_H_
+
+// HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
+// symbols from arbitrary system and other headers, since it may be built
+// with different flags from other targets, using different levels of
+// optimization, potentially introducing ODR violations.
+
+#include <cstddef>
+
+namespace absl {
+namespace random_internal {
+
+// RANDen = RANDom generator or beetroots in Swiss German.
+// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
+// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
+//
+// RandenTraits contains the basic algorithm traits, such as the size of the
+// state, seed, sponge, etc.
+struct RandenTraits {
+  // Size of the entire sponge / state for the randen PRNG.
+  static constexpr size_t kStateBytes = 256;  // 2048-bit
+
+  // Size of the 'inner' (inaccessible) part of the sponge. Larger values would
+  // require more frequent calls to RandenGenerate.
+  static constexpr size_t kCapacityBytes = 16;  // 128-bit
+
+  // Size of the default seed consumed by the sponge.
+  static constexpr size_t kSeedBytes = kStateBytes - kCapacityBytes;
+
+  // Largest size for which security proofs are known.
+  static constexpr size_t kFeistelBlocks = 16;
+
+  // Type-2 generalized Feistel => one round function for every two blocks.
+  static constexpr size_t kFeistelFunctions = kFeistelBlocks / 2;  // = 8
+
+  // Ensures SPRP security and two full subblock diffusions.
+  // Must be > 4 * log2(kFeistelBlocks).
+  static constexpr size_t kFeistelRounds = 16 + 1;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_RANDEN_TRAITS_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h b/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h
new file mode 100644
index 0000000..3d16cf9
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h
@@ -0,0 +1,152 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_
+#define ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_
+
+#include <cstdint>
+#include <cstdlib>
+#include <initializer_list>
+#include <iterator>
+#include <memory>
+#include <type_traits>
+#include <utility>
+
+#include "absl/container/inlined_vector.h"
+#include "absl/meta/type_traits.h"
+#include "absl/random/internal/seed_material.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+
+namespace absl {
+namespace random_internal {
+
+// This class conforms to the C++ Standard "Seed Sequence" concept
+// [rand.req.seedseq].
+//
+// A `SaltedSeedSeq` is meant to wrap an existing seed sequence and modify
+// generated sequence by mixing with extra entropy. This entropy may be
+// build-dependent or process-dependent. The implementation may change to be
+// have either or both kinds of entropy. If salt is not available sequence is
+// not modified.
+template <typename SSeq>
+class SaltedSeedSeq {
+ public:
+  using inner_sequence_type = SSeq;
+  using result_type = typename SSeq::result_type;
+
+  SaltedSeedSeq() : seq_(absl::make_unique<SSeq>()) {}
+
+  template <typename Iterator>
+  SaltedSeedSeq(Iterator begin, Iterator end)
+      : seq_(absl::make_unique<SSeq>(begin, end)) {}
+
+  template <typename T>
+  SaltedSeedSeq(std::initializer_list<T> il)
+      : SaltedSeedSeq(il.begin(), il.end()) {}
+
+  SaltedSeedSeq(const SaltedSeedSeq& other) = delete;
+  SaltedSeedSeq& operator=(const SaltedSeedSeq& other) = delete;
+
+  SaltedSeedSeq(SaltedSeedSeq&& other) = default;
+  SaltedSeedSeq& operator=(SaltedSeedSeq&& other) = default;
+
+  template <typename RandomAccessIterator>
+  void generate(RandomAccessIterator begin, RandomAccessIterator end) {
+    if (begin != end) {
+      generate_impl(
+          std::integral_constant<bool, sizeof(*begin) == sizeof(uint32_t)>{},
+          begin, end);
+    }
+  }
+
+  template <typename OutIterator>
+  void param(OutIterator out) const {
+    seq_->param(out);
+  }
+
+  size_t size() const { return seq_->size(); }
+
+ private:
+  // The common case for generate is that it is called with iterators over a
+  // 32-bit value buffer. These can be reinterpreted to a uint32_t and we can
+  // operate on them as such.
+  template <typename RandomAccessIterator>
+  void generate_impl(std::integral_constant<bool, true> /*is_32bit*/,
+                     RandomAccessIterator begin, RandomAccessIterator end) {
+    seq_->generate(begin, end);
+    const uint32_t salt = absl::random_internal::GetSaltMaterial().value_or(0);
+    auto buffer = absl::MakeSpan(begin, end);
+    MixIntoSeedMaterial(
+        absl::MakeConstSpan(&salt, 1),
+        absl::MakeSpan(reinterpret_cast<uint32_t*>(buffer.data()),
+                       buffer.size()));
+  }
+
+  // The uncommon case for generate is that it is called with iterators over
+  // some other buffer type which is assignable from a 32-bit value. In this
+  // case we allocate a temporary 32-bit buffer and then copy-assign back
+  // to the initial inputs.
+  template <typename RandomAccessIterator>
+  void generate_impl(std::integral_constant<bool, false> /*is_32bit*/,
+                     RandomAccessIterator begin, RandomAccessIterator end) {
+    // Allocate a temporary buffer, seed, and then copy.
+    absl::InlinedVector<uint32_t, 8> data(std::distance(begin, end), 0);
+    generate_impl(std::integral_constant<bool, true>{}, data.begin(),
+                  data.end());
+    std::copy(data.begin(), data.end(), begin);
+  }
+
+  // Because [rand.req.seedseq] is not copy-constructible, copy-assignable nor
+  // movable so we wrap it with unique pointer to be able to move SaltedSeedSeq.
+  std::unique_ptr<SSeq> seq_;
+};
+
+// is_salted_seed_seq indicates whether the type is a SaltedSeedSeq.
+template <typename T, typename = void>
+struct is_salted_seed_seq : public std::false_type {};
+
+template <typename T>
+struct is_salted_seed_seq<
+    T, typename std::enable_if<std::is_same<
+           T, SaltedSeedSeq<typename T::inner_sequence_type>>::value>::type>
+    : public std::true_type {};
+
+// MakeSaltedSeedSeq returns a salted variant of the seed sequence.
+// When provided with an existing SaltedSeedSeq, returns the input parameter,
+// otherwise constructs a new SaltedSeedSeq which embodies the original
+// non-salted seed parameters.
+template <
+    typename SSeq,  //
+    typename EnableIf = absl::enable_if_t<is_salted_seed_seq<SSeq>::value>>
+SSeq MakeSaltedSeedSeq(SSeq&& seq) {
+  return SSeq(std::forward<SSeq>(seq));
+}
+
+template <
+    typename SSeq,  //
+    typename EnableIf = absl::enable_if_t<!is_salted_seed_seq<SSeq>::value>>
+SaltedSeedSeq<typename std::decay<SSeq>::type> MakeSaltedSeedSeq(SSeq&& seq) {
+  using sseq_type = typename std::decay<SSeq>::type;
+  using result_type = typename sseq_type::result_type;
+
+  absl::InlinedVector<result_type, 8> data;
+  seq.param(std::back_inserter(data));
+  return SaltedSeedSeq<sseq_type>(data.begin(), data.end());
+}
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_SALTED_SEED_SEQ_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/salted_seed_seq_test.cc b/third_party/abseil-cpp/absl/random/internal/salted_seed_seq_test.cc
new file mode 100644
index 0000000..0bf19a6
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/salted_seed_seq_test.cc
@@ -0,0 +1,168 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/salted_seed_seq.h"
+
+#include <iterator>
+#include <random>
+#include <utility>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using absl::random_internal::GetSaltMaterial;
+using absl::random_internal::MakeSaltedSeedSeq;
+using absl::random_internal::SaltedSeedSeq;
+using testing::Eq;
+using testing::Pointwise;
+
+namespace {
+
+template <typename Sseq>
+void ConformsToInterface() {
+  // Check that the SeedSequence can be default-constructed.
+  { Sseq default_constructed_seq; }
+  // Check that the SeedSequence can be constructed with two iterators.
+  {
+    uint32_t init_array[] = {1, 3, 5, 7, 9};
+    Sseq iterator_constructed_seq(std::begin(init_array), std::end(init_array));
+  }
+  // Check that the SeedSequence can be std::initializer_list-constructed.
+  { Sseq list_constructed_seq = {1, 3, 5, 7, 9, 11, 13}; }
+  // Check that param() and size() return state provided to constructor.
+  {
+    uint32_t init_array[] = {1, 2, 3, 4, 5};
+    Sseq seq(std::begin(init_array), std::end(init_array));
+    EXPECT_EQ(seq.size(), ABSL_ARRAYSIZE(init_array));
+
+    std::vector<uint32_t> state_vector;
+    seq.param(std::back_inserter(state_vector));
+
+    EXPECT_EQ(state_vector.size(), ABSL_ARRAYSIZE(init_array));
+    for (int i = 0; i < state_vector.size(); i++) {
+      EXPECT_EQ(state_vector[i], i + 1);
+    }
+  }
+  // Check for presence of generate() method.
+  {
+    Sseq seq;
+    uint32_t seeds[5];
+
+    seq.generate(std::begin(seeds), std::end(seeds));
+  }
+}
+
+TEST(SaltedSeedSeq, CheckInterfaces) {
+  // Control case
+  ConformsToInterface<std::seed_seq>();
+
+  // Abseil classes
+  ConformsToInterface<SaltedSeedSeq<std::seed_seq>>();
+}
+
+TEST(SaltedSeedSeq, CheckConstructingFromOtherSequence) {
+  std::vector<uint32_t> seed_values(10, 1);
+  std::seed_seq seq(seed_values.begin(), seed_values.end());
+  auto salted_seq = MakeSaltedSeedSeq(std::move(seq));
+
+  EXPECT_EQ(seq.size(), salted_seq.size());
+
+  std::vector<uint32_t> param_result;
+  seq.param(std::back_inserter(param_result));
+
+  EXPECT_EQ(seed_values, param_result);
+}
+
+TEST(SaltedSeedSeq, SaltedSaltedSeedSeqIsNotDoubleSalted) {
+  uint32_t init[] = {1, 3, 5, 7, 9};
+
+  std::seed_seq seq(std::begin(init), std::end(init));
+
+  // The first salting.
+  SaltedSeedSeq<std::seed_seq> salted_seq = MakeSaltedSeedSeq(std::move(seq));
+  uint32_t a[16];
+  salted_seq.generate(std::begin(a), std::end(a));
+
+  // The second salting.
+  SaltedSeedSeq<std::seed_seq> salted_salted_seq =
+      MakeSaltedSeedSeq(std::move(salted_seq));
+  uint32_t b[16];
+  salted_salted_seq.generate(std::begin(b), std::end(b));
+
+  // ... both should be equal.
+  EXPECT_THAT(b, Pointwise(Eq(), a)) << "a[0] " << a[0];
+}
+
+TEST(SaltedSeedSeq, SeedMaterialIsSalted) {
+  const size_t kNumBlocks = 16;
+
+  uint32_t seed_material[kNumBlocks];
+  std::random_device urandom{"/dev/urandom"};
+  for (uint32_t& seed : seed_material) {
+    seed = urandom();
+  }
+
+  std::seed_seq seq(std::begin(seed_material), std::end(seed_material));
+  SaltedSeedSeq<std::seed_seq> salted_seq(std::begin(seed_material),
+                                          std::end(seed_material));
+
+  bool salt_is_available = GetSaltMaterial().has_value();
+
+  // If salt is available generated sequence should be different.
+  if (salt_is_available) {
+    uint32_t outputs[kNumBlocks];
+    uint32_t salted_outputs[kNumBlocks];
+
+    seq.generate(std::begin(outputs), std::end(outputs));
+    salted_seq.generate(std::begin(salted_outputs), std::end(salted_outputs));
+
+    EXPECT_THAT(outputs, Pointwise(testing::Ne(), salted_outputs));
+  }
+}
+
+TEST(SaltedSeedSeq, GenerateAcceptsDifferentTypes) {
+  const size_t kNumBlocks = 4;
+
+  SaltedSeedSeq<std::seed_seq> seq({1, 2, 3});
+
+  uint32_t expected[kNumBlocks];
+  seq.generate(std::begin(expected), std::end(expected));
+
+  // 32-bit outputs
+  {
+    unsigned long seed_material[kNumBlocks];  // NOLINT(runtime/int)
+    seq.generate(std::begin(seed_material), std::end(seed_material));
+    EXPECT_THAT(seed_material, Pointwise(Eq(), expected));
+  }
+  {
+    unsigned int seed_material[kNumBlocks];  // NOLINT(runtime/int)
+    seq.generate(std::begin(seed_material), std::end(seed_material));
+    EXPECT_THAT(seed_material, Pointwise(Eq(), expected));
+  }
+
+  // 64-bit outputs.
+  {
+    uint64_t seed_material[kNumBlocks];
+    seq.generate(std::begin(seed_material), std::end(seed_material));
+    EXPECT_THAT(seed_material, Pointwise(Eq(), expected));
+  }
+  {
+    int64_t seed_material[kNumBlocks];
+    seq.generate(std::begin(seed_material), std::end(seed_material));
+    EXPECT_THAT(seed_material, Pointwise(Eq(), expected));
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/seed_material.cc b/third_party/abseil-cpp/absl/random/internal/seed_material.cc
new file mode 100644
index 0000000..ec3afe04
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/seed_material.cc
@@ -0,0 +1,204 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/seed_material.h"
+
+#include <fcntl.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
+#include <algorithm>
+#include <cerrno>
+#include <cstdint>
+#include <cstdlib>
+#include <cstring>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/strip.h"
+
+#if defined(__native_client__)
+
+#include <nacl/nacl_random.h>
+#define ABSL_RANDOM_USE_NACL_SECURE_RANDOM 1
+
+#elif defined(_WIN32)
+
+#include <windows.h>
+#define ABSL_RANDOM_USE_BCRYPT 1
+#pragma comment(lib, "bcrypt.lib")
+#endif
+
+#if defined(ABSL_RANDOM_USE_BCRYPT)
+#include <bcrypt.h>
+
+#ifndef BCRYPT_SUCCESS
+#define BCRYPT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
+#endif
+// Also link bcrypt; this can be done via linker options or:
+// #pragma comment(lib, "bcrypt.lib")
+#endif
+
+namespace absl {
+namespace random_internal {
+namespace {
+
+// Read OS Entropy for random number seeds.
+// TODO(absl-team): Possibly place a cap on how much entropy may be read at a
+// time.
+
+#if defined(ABSL_RANDOM_USE_BCRYPT)
+
+// On Windows potentially use the BCRYPT CNG API to read available entropy.
+bool ReadSeedMaterialFromOSEntropyImpl(absl::Span<uint32_t> values) {
+  BCRYPT_ALG_HANDLE hProvider;
+  NTSTATUS ret;
+  ret = BCryptOpenAlgorithmProvider(&hProvider, BCRYPT_RNG_ALGORITHM,
+                                    MS_PRIMITIVE_PROVIDER, 0);
+  if (!(BCRYPT_SUCCESS(ret))) {
+    ABSL_RAW_LOG(ERROR, "Failed to open crypto provider.");
+    return false;
+  }
+  ret = BCryptGenRandom(
+      hProvider,                                             // provider
+      reinterpret_cast<UCHAR*>(values.data()),               // buffer
+      static_cast<ULONG>(sizeof(uint32_t) * values.size()),  // bytes
+      0);                                                    // flags
+  BCryptCloseAlgorithmProvider(hProvider, 0);
+  return BCRYPT_SUCCESS(ret);
+}
+
+#elif defined(ABSL_RANDOM_USE_NACL_SECURE_RANDOM)
+
+// On NaCL use nacl_secure_random to acquire bytes.
+bool ReadSeedMaterialFromOSEntropyImpl(absl::Span<uint32_t> values) {
+  auto buffer = reinterpret_cast<uint8_t*>(values.data());
+  size_t buffer_size = sizeof(uint32_t) * values.size();
+
+  uint8_t* output_ptr = buffer;
+  while (buffer_size > 0) {
+    size_t nread = 0;
+    const int error = nacl_secure_random(output_ptr, buffer_size, &nread);
+    if (error != 0 || nread > buffer_size) {
+      ABSL_RAW_LOG(ERROR, "Failed to read secure_random seed data: %d", error);
+      return false;
+    }
+    output_ptr += nread;
+    buffer_size -= nread;
+  }
+  return true;
+}
+
+#else
+
+// On *nix, read entropy from /dev/urandom.
+bool ReadSeedMaterialFromOSEntropyImpl(absl::Span<uint32_t> values) {
+  const char kEntropyFile[] = "/dev/urandom";
+
+  auto buffer = reinterpret_cast<uint8_t*>(values.data());
+  size_t buffer_size = sizeof(uint32_t) * values.size();
+
+  int dev_urandom = open(kEntropyFile, O_RDONLY);
+  bool success = (-1 != dev_urandom);
+  if (!success) {
+    return false;
+  }
+
+  while (success && buffer_size > 0) {
+    int bytes_read = read(dev_urandom, buffer, buffer_size);
+    int read_error = errno;
+    success = (bytes_read > 0);
+    if (success) {
+      buffer += bytes_read;
+      buffer_size -= bytes_read;
+    } else if (bytes_read == -1 && read_error == EINTR) {
+      success = true;  // Need to try again.
+    }
+  }
+  close(dev_urandom);
+  return success;
+}
+
+#endif
+
+}  // namespace
+
+bool ReadSeedMaterialFromOSEntropy(absl::Span<uint32_t> values) {
+  assert(values.data() != nullptr);
+  if (values.data() == nullptr) {
+    return false;
+  }
+  if (values.empty()) {
+    return true;
+  }
+  return ReadSeedMaterialFromOSEntropyImpl(values);
+}
+
+void MixIntoSeedMaterial(absl::Span<const uint32_t> sequence,
+                         absl::Span<uint32_t> seed_material) {
+  // Algorithm is based on code available at
+  // https://gist.github.com/imneme/540829265469e673d045
+  constexpr uint32_t kInitVal = 0x43b0d7e5;
+  constexpr uint32_t kHashMul = 0x931e8875;
+  constexpr uint32_t kMixMulL = 0xca01f9dd;
+  constexpr uint32_t kMixMulR = 0x4973f715;
+  constexpr uint32_t kShiftSize = sizeof(uint32_t) * 8 / 2;
+
+  uint32_t hash_const = kInitVal;
+  auto hash = [&](uint32_t value) {
+    value ^= hash_const;
+    hash_const *= kHashMul;
+    value *= hash_const;
+    value ^= value >> kShiftSize;
+    return value;
+  };
+
+  auto mix = [&](uint32_t x, uint32_t y) {
+    uint32_t result = kMixMulL * x - kMixMulR * y;
+    result ^= result >> kShiftSize;
+    return result;
+  };
+
+  for (const auto& seq_val : sequence) {
+    for (auto& elem : seed_material) {
+      elem = mix(elem, hash(seq_val));
+    }
+  }
+}
+
+absl::optional<uint32_t> GetSaltMaterial() {
+  // Salt must be common for all generators within the same process so read it
+  // only once and store in static variable.
+  static const auto salt_material = []() -> absl::optional<uint32_t> {
+    uint32_t salt_value = 0;
+
+    if (random_internal::ReadSeedMaterialFromOSEntropy(
+            MakeSpan(&salt_value, 1))) {
+      return salt_value;
+    }
+
+    return absl::nullopt;
+  }();
+
+  return salt_material;
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/internal/seed_material.h b/third_party/abseil-cpp/absl/random/internal/seed_material.h
new file mode 100644
index 0000000..57de8a2
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/seed_material.h
@@ -0,0 +1,102 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_SEED_MATERIAL_H_
+#define ABSL_RANDOM_INTERNAL_SEED_MATERIAL_H_
+
+#include <cassert>
+#include <cstdint>
+#include <cstdlib>
+#include <string>
+#include <vector>
+
+#include "absl/base/attributes.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+
+namespace absl {
+namespace random_internal {
+
+// Returns the number of 32-bit blocks needed to contain the given number of
+// bits.
+constexpr size_t SeedBitsToBlocks(size_t seed_size) {
+  return (seed_size + 31) / 32;
+}
+
+// Amount of entropy (measured in bits) used to instantiate a Seed Sequence,
+// with which to create a URBG.
+constexpr size_t kEntropyBitsNeeded = 256;
+
+// Amount of entropy (measured in 32-bit blocks) used to instantiate a Seed
+// Sequence, with which to create a URBG.
+constexpr size_t kEntropyBlocksNeeded =
+    random_internal::SeedBitsToBlocks(kEntropyBitsNeeded);
+
+static_assert(kEntropyBlocksNeeded > 0,
+              "Entropy used to seed URBGs must be nonzero.");
+
+// Attempts to fill a span of uint32_t-values using an OS-provided source of
+// true entropy (eg. /dev/urandom) into an array of uint32_t blocks of data. The
+// resulting array may be used to initialize an instance of a class conforming
+// to the C++ Standard "Seed Sequence" concept [rand.req.seedseq].
+//
+// If values.data() == nullptr, the behavior is undefined.
+ABSL_MUST_USE_RESULT
+bool ReadSeedMaterialFromOSEntropy(absl::Span<uint32_t> values);
+
+// Attempts to fill a span of uint32_t-values using variates generated by an
+// existing instance of a class conforming to the C++ Standard "Uniform Random
+// Bit Generator" concept [rand.req.urng]. The resulting data may be used to
+// initialize an instance of a class conforming to the C++ Standard
+// "Seed Sequence" concept [rand.req.seedseq].
+//
+// If urbg == nullptr or values.data() == nullptr, the behavior is undefined.
+template <typename URBG>
+ABSL_MUST_USE_RESULT bool ReadSeedMaterialFromURBG(
+    URBG* urbg, absl::Span<uint32_t> values) {
+  random_internal::FastUniformBits<uint32_t> distr;
+
+  assert(urbg != nullptr && values.data() != nullptr);
+  if (urbg == nullptr || values.data() == nullptr) {
+    return false;
+  }
+
+  for (uint32_t& seed_value : values) {
+    seed_value = distr(*urbg);
+  }
+  return true;
+}
+
+// Mixes given sequence of values with into given sequence of seed material.
+// Time complexity of this function is O(sequence.size() *
+// seed_material.size()).
+//
+// Algorithm is based on code available at
+// https://gist.github.com/imneme/540829265469e673d045
+// by Melissa O'Neill.
+void MixIntoSeedMaterial(absl::Span<const uint32_t> sequence,
+                         absl::Span<uint32_t> seed_material);
+
+// Returns salt value.
+//
+// Salt is obtained only once and stored in static variable.
+//
+// May return empty value if optaining the salt was not possible.
+absl::optional<uint32_t> GetSaltMaterial();
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_SEED_MATERIAL_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/seed_material_test.cc b/third_party/abseil-cpp/absl/random/internal/seed_material_test.cc
new file mode 100644
index 0000000..0de6c4c
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/seed_material_test.cc
@@ -0,0 +1,201 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/seed_material.h"
+
+#include <bitset>
+#include <cstdlib>
+#include <cstring>
+#include <random>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#ifdef __ANDROID__
+// Android assert messages only go to system log, so death tests cannot inspect
+// the message for matching.
+#define ABSL_EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+  EXPECT_DEATH_IF_SUPPORTED(statement, ".*")
+#else
+#define ABSL_EXPECT_DEATH_IF_SUPPORTED EXPECT_DEATH_IF_SUPPORTED
+#endif
+
+namespace {
+
+using testing::Each;
+using testing::ElementsAre;
+using testing::Eq;
+using testing::Ne;
+using testing::Pointwise;
+
+TEST(SeedBitsToBlocks, VerifyCases) {
+  EXPECT_EQ(0, absl::random_internal::SeedBitsToBlocks(0));
+  EXPECT_EQ(1, absl::random_internal::SeedBitsToBlocks(1));
+  EXPECT_EQ(1, absl::random_internal::SeedBitsToBlocks(31));
+  EXPECT_EQ(1, absl::random_internal::SeedBitsToBlocks(32));
+  EXPECT_EQ(2, absl::random_internal::SeedBitsToBlocks(33));
+  EXPECT_EQ(4, absl::random_internal::SeedBitsToBlocks(127));
+  EXPECT_EQ(4, absl::random_internal::SeedBitsToBlocks(128));
+  EXPECT_EQ(5, absl::random_internal::SeedBitsToBlocks(129));
+}
+
+TEST(ReadSeedMaterialFromOSEntropy, SuccessiveReadsAreDistinct) {
+  constexpr size_t kSeedMaterialSize = 64;
+  uint32_t seed_material_1[kSeedMaterialSize] = {};
+  uint32_t seed_material_2[kSeedMaterialSize] = {};
+
+  EXPECT_TRUE(absl::random_internal::ReadSeedMaterialFromOSEntropy(
+      absl::Span<uint32_t>(seed_material_1, kSeedMaterialSize)));
+  EXPECT_TRUE(absl::random_internal::ReadSeedMaterialFromOSEntropy(
+      absl::Span<uint32_t>(seed_material_2, kSeedMaterialSize)));
+
+  EXPECT_THAT(seed_material_1, Pointwise(Ne(), seed_material_2));
+}
+
+TEST(ReadSeedMaterialFromOSEntropy, ReadZeroBytesIsNoOp) {
+  uint32_t seed_material[32] = {};
+  std::memset(seed_material, 0xAA, sizeof(seed_material));
+  EXPECT_TRUE(absl::random_internal::ReadSeedMaterialFromOSEntropy(
+      absl::Span<uint32_t>(seed_material, 0)));
+
+  EXPECT_THAT(seed_material, Each(Eq(0xAAAAAAAA)));
+}
+
+TEST(ReadSeedMaterialFromOSEntropy, NullPtrVectorArgument) {
+#ifdef NDEBUG
+  EXPECT_FALSE(absl::random_internal::ReadSeedMaterialFromOSEntropy(
+      absl::Span<uint32_t>(nullptr, 32)));
+#else
+  bool result;
+  ABSL_EXPECT_DEATH_IF_SUPPORTED(
+      result = absl::random_internal::ReadSeedMaterialFromOSEntropy(
+          absl::Span<uint32_t>(nullptr, 32)),
+      "!= nullptr");
+  (void)result;  // suppress unused-variable warning
+#endif
+}
+
+TEST(ReadSeedMaterialFromURBG, SeedMaterialEqualsVariateSequence) {
+  // Two default-constructed instances of std::mt19937_64 are guaranteed to
+  // produce equal variate-sequences.
+  std::mt19937 urbg_1;
+  std::mt19937 urbg_2;
+  constexpr size_t kSeedMaterialSize = 1024;
+  uint32_t seed_material[kSeedMaterialSize] = {};
+
+  EXPECT_TRUE(absl::random_internal::ReadSeedMaterialFromURBG(
+      &urbg_1, absl::Span<uint32_t>(seed_material, kSeedMaterialSize)));
+  for (uint32_t seed : seed_material) {
+    EXPECT_EQ(seed, urbg_2());
+  }
+}
+
+TEST(ReadSeedMaterialFromURBG, ReadZeroBytesIsNoOp) {
+  std::mt19937_64 urbg;
+  uint32_t seed_material[32];
+  std::memset(seed_material, 0xAA, sizeof(seed_material));
+  EXPECT_TRUE(absl::random_internal::ReadSeedMaterialFromURBG(
+      &urbg, absl::Span<uint32_t>(seed_material, 0)));
+
+  EXPECT_THAT(seed_material, Each(Eq(0xAAAAAAAA)));
+}
+
+TEST(ReadSeedMaterialFromURBG, NullUrbgArgument) {
+  constexpr size_t kSeedMaterialSize = 32;
+  uint32_t seed_material[kSeedMaterialSize];
+#ifdef NDEBUG
+  EXPECT_FALSE(absl::random_internal::ReadSeedMaterialFromURBG<std::mt19937_64>(
+      nullptr, absl::Span<uint32_t>(seed_material, kSeedMaterialSize)));
+#else
+  bool result;
+  ABSL_EXPECT_DEATH_IF_SUPPORTED(
+      result = absl::random_internal::ReadSeedMaterialFromURBG<std::mt19937_64>(
+          nullptr, absl::Span<uint32_t>(seed_material, kSeedMaterialSize)),
+      "!= nullptr");
+  (void)result;  // suppress unused-variable warning
+#endif
+}
+
+TEST(ReadSeedMaterialFromURBG, NullPtrVectorArgument) {
+  std::mt19937_64 urbg;
+#ifdef NDEBUG
+  EXPECT_FALSE(absl::random_internal::ReadSeedMaterialFromURBG(
+      &urbg, absl::Span<uint32_t>(nullptr, 32)));
+#else
+  bool result;
+  ABSL_EXPECT_DEATH_IF_SUPPORTED(
+      result = absl::random_internal::ReadSeedMaterialFromURBG(
+          &urbg, absl::Span<uint32_t>(nullptr, 32)),
+      "!= nullptr");
+  (void)result;  // suppress unused-variable warning
+#endif
+}
+
+// The avalanche effect is a desirable cryptographic property of hashes in which
+// changing a single bit in the input causes each bit of the output to be
+// changed with probability near 50%.
+//
+// https://en.wikipedia.org/wiki/Avalanche_effect
+
+TEST(MixSequenceIntoSeedMaterial, AvalancheEffectTestOneBitLong) {
+  std::vector<uint32_t> seed_material = {1, 2, 3, 4, 5, 6, 7, 8};
+
+  // For every 32-bit number with exactly one bit set, verify the avalanche
+  // effect holds.  In order to reduce flakiness of tests, accept values
+  // anywhere in the range of 30%-70%.
+  for (uint32_t v = 1; v != 0; v <<= 1) {
+    std::vector<uint32_t> seed_material_copy = seed_material;
+    absl::random_internal::MixIntoSeedMaterial(
+        absl::Span<uint32_t>(&v, 1),
+        absl::Span<uint32_t>(seed_material_copy.data(),
+                             seed_material_copy.size()));
+
+    uint32_t changed_bits = 0;
+    for (size_t i = 0; i < seed_material.size(); i++) {
+      std::bitset<sizeof(uint32_t) * 8> bitset(seed_material[i] ^
+                                               seed_material_copy[i]);
+      changed_bits += bitset.count();
+    }
+
+    EXPECT_LE(changed_bits, 0.7 * sizeof(uint32_t) * 8 * seed_material.size());
+    EXPECT_GE(changed_bits, 0.3 * sizeof(uint32_t) * 8 * seed_material.size());
+  }
+}
+
+TEST(MixSequenceIntoSeedMaterial, AvalancheEffectTestOneBitShort) {
+  std::vector<uint32_t> seed_material = {1};
+
+  // For every 32-bit number with exactly one bit set, verify the avalanche
+  // effect holds.  In order to reduce flakiness of tests, accept values
+  // anywhere in the range of 30%-70%.
+  for (uint32_t v = 1; v != 0; v <<= 1) {
+    std::vector<uint32_t> seed_material_copy = seed_material;
+    absl::random_internal::MixIntoSeedMaterial(
+        absl::Span<uint32_t>(&v, 1),
+        absl::Span<uint32_t>(seed_material_copy.data(),
+                             seed_material_copy.size()));
+
+    uint32_t changed_bits = 0;
+    for (size_t i = 0; i < seed_material.size(); i++) {
+      std::bitset<sizeof(uint32_t) * 8> bitset(seed_material[i] ^
+                                               seed_material_copy[i]);
+      changed_bits += bitset.count();
+    }
+
+    EXPECT_LE(changed_bits, 0.7 * sizeof(uint32_t) * 8 * seed_material.size());
+    EXPECT_GE(changed_bits, 0.3 * sizeof(uint32_t) * 8 * seed_material.size());
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator.cc b/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator.cc
new file mode 100644
index 0000000..31fdcfe
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <iostream>
+#include <random>
+
+#include "absl/random/random.h"
+
+// This program is used in integration tests.
+
+int main() {
+  std::seed_seq seed_seq{1234};
+  absl::BitGen rng(seed_seq);
+  constexpr size_t kSequenceLength = 8;
+  for (size_t i = 0; i < kSequenceLength; i++) {
+    std::cout << rng() << "\n";
+  }
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator_empty_sequence.cc b/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator_empty_sequence.cc
new file mode 100644
index 0000000..8797e2e
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/seed_salting_sequence_generator_empty_sequence.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <iostream>
+#include <random>
+
+#include "absl/random/random.h"
+
+// This program is used in integration tests.
+
+int main() {
+  std::seed_seq seed_seq{};
+  absl::BitGen rng(seed_seq);
+  constexpr size_t kSequenceLength = 8;
+  for (size_t i = 0; i < kSequenceLength; i++) {
+    std::cout << rng() << "\n";
+  }
+  return 0;
+}
diff --git a/third_party/abseil-cpp/absl/random/internal/sequence_urbg.h b/third_party/abseil-cpp/absl/random/internal/sequence_urbg.h
new file mode 100644
index 0000000..9a9b577
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/sequence_urbg.h
@@ -0,0 +1,56 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_SEQUENCE_URBG_H_
+#define ABSL_RANDOM_INTERNAL_SEQUENCE_URBG_H_
+
+#include <cstdint>
+#include <cstring>
+#include <limits>
+#include <type_traits>
+#include <vector>
+
+namespace absl {
+namespace random_internal {
+
+// `sequence_urbg` is a simple random number generator which meets the
+// requirements of [rand.req.urbg], and is solely for testing absl
+// distributions.
+class sequence_urbg {
+ public:
+  using result_type = uint64_t;
+
+  static constexpr result_type(min)() {
+    return (std::numeric_limits<result_type>::min)();
+  }
+  static constexpr result_type(max)() {
+    return (std::numeric_limits<result_type>::max)();
+  }
+
+  sequence_urbg(std::initializer_list<result_type> data) : i_(0), data_(data) {}
+  void reset() { i_ = 0; }
+
+  result_type operator()() { return data_[i_++ % data_.size()]; }
+
+  size_t invocations() const { return i_; }
+
+ private:
+  size_t i_;
+  std::vector<result_type> data_;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_SEQUENCE_URBG_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/traits.h b/third_party/abseil-cpp/absl/random/internal/traits.h
new file mode 100644
index 0000000..40eb011
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/traits.h
@@ -0,0 +1,99 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_INTERNAL_TRAITS_H_
+#define ABSL_RANDOM_INTERNAL_TRAITS_H_
+
+#include <cstdint>
+#include <limits>
+#include <type_traits>
+
+#include "absl/base/config.h"
+
+namespace absl {
+namespace random_internal {
+
+// random_internal::is_widening_convertible<A, B>
+//
+// Returns whether a type A is widening-convertible to a type B.
+//
+// A is widening-convertible to B means:
+//   A a = <any number>;
+//   B b = a;
+//   A c = b;
+//   EXPECT_EQ(a, c);
+template <typename A, typename B>
+class is_widening_convertible {
+  // As long as there are enough bits in the exact part of a number:
+  // - unsigned can fit in float, signed, unsigned
+  // - signed can fit in float, signed
+  // - float can fit in float
+  // So we define rank to be:
+  // - rank(float) -> 2
+  // - rank(signed) -> 1
+  // - rank(unsigned) -> 0
+  template <class T>
+  static constexpr int rank() {
+    return !std::numeric_limits<T>::is_integer +
+           std::numeric_limits<T>::is_signed;
+  }
+
+ public:
+  // If an arithmetic-type B can represent at least as many digits as a type A,
+  // and B belongs to a rank no lower than A, then A can be safely represented
+  // by B through a widening-conversion.
+  static constexpr bool value =
+      std::numeric_limits<A>::digits <= std::numeric_limits<B>::digits &&
+      rank<A>() <= rank<B>();
+};
+
+// unsigned_bits<N>::type returns the unsigned int type with the indicated
+// number of bits.
+template <size_t N>
+struct unsigned_bits;
+
+template <>
+struct unsigned_bits<8> {
+  using type = uint8_t;
+};
+template <>
+struct unsigned_bits<16> {
+  using type = uint16_t;
+};
+template <>
+struct unsigned_bits<32> {
+  using type = uint32_t;
+};
+template <>
+struct unsigned_bits<64> {
+  using type = uint64_t;
+};
+
+#ifdef ABSL_HAVE_INTRINSIC_INT128
+template <>
+struct unsigned_bits<128> {
+  using type = __uint128_t;
+};
+#endif
+
+template <typename IntType>
+struct make_unsigned_bits {
+  using type = typename unsigned_bits<std::numeric_limits<
+      typename std::make_unsigned<IntType>::type>::digits>::type;
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_INTERNAL_TRAITS_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/traits_test.cc b/third_party/abseil-cpp/absl/random/internal/traits_test.cc
new file mode 100644
index 0000000..a844887
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/traits_test.cc
@@ -0,0 +1,126 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/internal/traits.h"
+
+#include <cstdint>
+#include <type_traits>
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using absl::random_internal::is_widening_convertible;
+
+// CheckWideningConvertsToSelf<T1, T2, ...>()
+//
+// For each type T, checks:
+// - T IS widening-convertible to itself.
+//
+template <typename T>
+void CheckWideningConvertsToSelf() {
+  static_assert(is_widening_convertible<T, T>::value,
+                "Type is not convertible to self!");
+}
+
+template <typename T, typename Next, typename... Args>
+void CheckWideningConvertsToSelf() {
+  CheckWideningConvertsToSelf<T>();
+  CheckWideningConvertsToSelf<Next, Args...>();
+}
+
+// CheckNotWideningConvertibleWithSigned<T1, T2, ...>()
+//
+// For each unsigned-type T, checks that:
+// - T is NOT widening-convertible to Signed(T)
+// - Signed(T) is NOT widening-convertible to T
+//
+template <typename T>
+void CheckNotWideningConvertibleWithSigned() {
+  using signed_t = typename std::make_signed<T>::type;
+
+  static_assert(!is_widening_convertible<T, signed_t>::value,
+                "Unsigned type is convertible to same-sized signed-type!");
+  static_assert(!is_widening_convertible<signed_t, T>::value,
+                "Signed type is convertible to same-sized unsigned-type!");
+}
+
+template <typename T, typename Next, typename... Args>
+void CheckNotWideningConvertibleWithSigned() {
+  CheckNotWideningConvertibleWithSigned<T>();
+  CheckWideningConvertsToSelf<Next, Args...>();
+}
+
+// CheckWideningConvertsToLargerType<T1, T2, ...>()
+//
+// For each successive unsigned-types {Ti, Ti+1}, checks that:
+// - Ti IS widening-convertible to Ti+1
+// - Ti IS widening-convertible to Signed(Ti+1)
+// - Signed(Ti) is NOT widening-convertible to Ti
+// - Signed(Ti) IS widening-convertible to Ti+1
+template <typename T, typename Higher>
+void CheckWideningConvertsToLargerTypes() {
+  using signed_t = typename std::make_signed<T>::type;
+  using higher_t = Higher;
+  using signed_higher_t = typename std::make_signed<Higher>::type;
+
+  static_assert(is_widening_convertible<T, higher_t>::value,
+                "Type not embeddable into larger type!");
+  static_assert(is_widening_convertible<T, signed_higher_t>::value,
+                "Type not embeddable into larger signed type!");
+  static_assert(!is_widening_convertible<signed_t, higher_t>::value,
+                "Signed type is embeddable into larger unsigned type!");
+  static_assert(is_widening_convertible<signed_t, signed_higher_t>::value,
+                "Signed type not embeddable into larger signed type!");
+}
+
+template <typename T, typename Higher, typename Next, typename... Args>
+void CheckWideningConvertsToLargerTypes() {
+  CheckWideningConvertsToLargerTypes<T, Higher>();
+  CheckWideningConvertsToLargerTypes<Higher, Next, Args...>();
+}
+
+// CheckWideningConvertsTo<T, U, [expect]>
+//
+// Checks that T DOES widening-convert to U.
+// If "expect" is false, then asserts that T does NOT widening-convert to U.
+template <typename T, typename U, bool expect = true>
+void CheckWideningConvertsTo() {
+  static_assert(is_widening_convertible<T, U>::value == expect,
+                "Unexpected result for is_widening_convertible<T, U>!");
+}
+
+TEST(TraitsTest, IsWideningConvertibleTest) {
+  constexpr bool kInvalid = false;
+
+  CheckWideningConvertsToSelf<
+      uint8_t, uint16_t, uint32_t, uint64_t,
+      int8_t,  int16_t,  int32_t,  int64_t,
+      float,   double>();
+  CheckNotWideningConvertibleWithSigned<
+      uint8_t, uint16_t, uint32_t, uint64_t>();
+  CheckWideningConvertsToLargerTypes<
+      uint8_t, uint16_t, uint32_t, uint64_t>();
+
+  CheckWideningConvertsTo<float, double>();
+  CheckWideningConvertsTo<uint16_t, float>();
+  CheckWideningConvertsTo<uint32_t, double>();
+  CheckWideningConvertsTo<uint64_t, double, kInvalid>();
+  CheckWideningConvertsTo<double, float, kInvalid>();
+
+  CheckWideningConvertsTo<bool, int>();
+  CheckWideningConvertsTo<bool, float>();
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/internal/uniform_helper.h b/third_party/abseil-cpp/absl/random/internal/uniform_helper.h
new file mode 100644
index 0000000..b6e2a4a
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/internal/uniform_helper.h
@@ -0,0 +1,150 @@
+// Copyright 2019 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef ABSL_RANDOM_UNIFORM_HELPER_H_
+#define ABSL_RANDOM_UNIFORM_HELPER_H_
+
+#include <cmath>
+#include <limits>
+#include <type_traits>
+
+#include "absl/meta/type_traits.h"
+
+namespace absl {
+template <typename IntType>
+class uniform_int_distribution;
+
+template <typename RealType>
+class uniform_real_distribution;
+
+// Interval tag types which specify whether the interval is open or closed
+// on either boundary.
+namespace random_internal {
+struct IntervalClosedClosedT {};
+struct IntervalClosedOpenT {};
+struct IntervalOpenClosedT {};
+struct IntervalOpenOpenT {};
+}  // namespace random_internal
+
+namespace random_internal {
+
+// The functions
+//    uniform_lower_bound(tag, a, b)
+// and
+//    uniform_upper_bound(tag, a, b)
+// are used as implementation-details for absl::Uniform().
+//
+// Conceptually,
+//    [a, b] == [uniform_lower_bound(IntervalClosedClosed, a, b),
+//               uniform_upper_bound(IntervalClosedClosed, a, b)]
+//    (a, b) == [uniform_lower_bound(IntervalOpenOpen, a, b),
+//               uniform_upper_bound(IntervalOpenOpen, a, b)]
+//    [a, b) == [uniform_lower_bound(IntervalClosedOpen, a, b),
+//               uniform_upper_bound(IntervalClosedOpen, a, b)]
+//    (a, b] == [uniform_lower_bound(IntervalOpenClosed, a, b),
+//               uniform_upper_bound(IntervalOpenClosed, a, b)]
+//
+template <typename IntType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_integral<IntType>,
+        absl::disjunction<std::is_same<Tag, IntervalOpenClosedT>,
+                          std::is_same<Tag, IntervalOpenOpenT>>>::value,
+    IntType>
+uniform_lower_bound(Tag, IntType a, IntType) {
+  return a + 1;
+}
+
+template <typename FloatType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_floating_point<FloatType>,
+        absl::disjunction<std::is_same<Tag, IntervalOpenClosedT>,
+                          std::is_same<Tag, IntervalOpenOpenT>>>::value,
+    FloatType>
+uniform_lower_bound(Tag, FloatType a, FloatType b) {
+  return std::nextafter(a, b);
+}
+
+template <typename NumType, typename Tag>
+typename absl::enable_if_t<
+    absl::disjunction<std::is_same<Tag, IntervalClosedClosedT>,
+                      std::is_same<Tag, IntervalClosedOpenT>>::value,
+    NumType>
+uniform_lower_bound(Tag, NumType a, NumType) {
+  return a;
+}
+
+template <typename IntType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_integral<IntType>,
+        absl::disjunction<std::is_same<Tag, IntervalClosedOpenT>,
+                          std::is_same<Tag, IntervalOpenOpenT>>>::value,
+    IntType>
+uniform_upper_bound(Tag, IntType, IntType b) {
+  return b - 1;
+}
+
+template <typename FloatType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_floating_point<FloatType>,
+        absl::disjunction<std::is_same<Tag, IntervalClosedOpenT>,
+                          std::is_same<Tag, IntervalOpenOpenT>>>::value,
+    FloatType>
+uniform_upper_bound(Tag, FloatType, FloatType b) {
+  return b;
+}
+
+template <typename IntType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_integral<IntType>,
+        absl::disjunction<std::is_same<Tag, IntervalClosedClosedT>,
+                          std::is_same<Tag, IntervalOpenClosedT>>>::value,
+    IntType>
+uniform_upper_bound(Tag, IntType, IntType b) {
+  return b;
+}
+
+template <typename FloatType, typename Tag>
+typename absl::enable_if_t<
+    absl::conjunction<
+        std::is_floating_point<FloatType>,
+        absl::disjunction<std::is_same<Tag, IntervalClosedClosedT>,
+                          std::is_same<Tag, IntervalOpenClosedT>>>::value,
+    FloatType>
+uniform_upper_bound(Tag, FloatType, FloatType b) {
+  return std::nextafter(b, (std::numeric_limits<FloatType>::max)());
+}
+
+template <typename NumType>
+using UniformDistribution =
+    typename std::conditional<std::is_integral<NumType>::value,
+                              absl::uniform_int_distribution<NumType>,
+                              absl::uniform_real_distribution<NumType>>::type;
+
+template <typename TagType, typename NumType>
+struct UniformDistributionWrapper : public UniformDistribution<NumType> {
+  explicit UniformDistributionWrapper(NumType lo, NumType hi)
+      : UniformDistribution<NumType>(
+            uniform_lower_bound<NumType>(TagType{}, lo, hi),
+            uniform_upper_bound<NumType>(TagType{}, lo, hi)) {}
+};
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_UNIFORM_HELPER_H_
diff --git a/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h b/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h
new file mode 100644
index 0000000..ac43416e
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h
@@ -0,0 +1,250 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_LOG_UNIFORM_INT_DISTRIBUTION_H_
+#define ABSL_RANDOM_LOG_UNIFORM_INT_DISTRIBUTION_H_
+
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <ostream>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fastmath.h"
+#include "absl/random/internal/iostream_state_saver.h"
+#include "absl/random/internal/traits.h"
+#include "absl/random/uniform_int_distribution.h"
+
+namespace absl {
+
+// log_uniform_int_distribution:
+//
+// Returns a random variate R in range [min, max] such that
+// floor(log(R-min, base)) is uniformly distributed.
+// We ensure uniformity by discretization using the
+// boundary sets [0, 1, base, base * base, ... min(base*n, max)]
+//
+template <typename IntType = int>
+class log_uniform_int_distribution {
+ private:
+  using unsigned_type =
+      typename random_internal::make_unsigned_bits<IntType>::type;
+
+ public:
+  using result_type = IntType;
+
+  class param_type {
+   public:
+    using distribution_type = log_uniform_int_distribution;
+
+    explicit param_type(
+        result_type min = 0,
+        result_type max = (std::numeric_limits<result_type>::max)(),
+        result_type base = 2)
+        : min_(min),
+          max_(max),
+          base_(base),
+          range_(static_cast<unsigned_type>(max_) -
+                 static_cast<unsigned_type>(min_)),
+          log_range_(0) {
+      assert(max_ >= min_);
+      assert(base_ > 1);
+
+      if (base_ == 2) {
+        // Determine where the first set bit is on range(), giving a log2(range)
+        // value which can be used to construct bounds.
+        log_range_ = (std::min)(random_internal::LeadingSetBit(range()),
+                                std::numeric_limits<unsigned_type>::digits);
+      } else {
+        // NOTE: Computing the logN(x) introduces error from 2 sources:
+        // 1. Conversion of int to double loses precision for values >=
+        // 2^53, which may cause some log() computations to operate on
+        // different values.
+        // 2. The error introduced by the division will cause the result
+        // to differ from the expected value.
+        //
+        // Thus a result which should equal K may equal K +/- epsilon,
+        // which can eliminate some values depending on where the bounds fall.
+        const double inv_log_base = 1.0 / std::log(base_);
+        const double log_range = std::log(static_cast<double>(range()) + 0.5);
+        log_range_ = static_cast<int>(std::ceil(inv_log_base * log_range));
+      }
+    }
+
+    result_type(min)() const { return min_; }
+    result_type(max)() const { return max_; }
+    result_type base() const { return base_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.min_ == b.min_ && a.max_ == b.max_ && a.base_ == b.base_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class log_uniform_int_distribution;
+
+    int log_range() const { return log_range_; }
+    unsigned_type range() const { return range_; }
+
+    result_type min_;
+    result_type max_;
+    result_type base_;
+    unsigned_type range_;  // max - min
+    int log_range_;        // ceil(logN(range_))
+
+    static_assert(std::is_integral<IntType>::value,
+                  "Class-template absl::log_uniform_int_distribution<> must be "
+                  "parameterized using an integral type.");
+  };
+
+  log_uniform_int_distribution() : log_uniform_int_distribution(0) {}
+
+  explicit log_uniform_int_distribution(
+      result_type min,
+      result_type max = (std::numeric_limits<result_type>::max)(),
+      result_type base = 2)
+      : param_(min, max, base) {}
+
+  explicit log_uniform_int_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  // generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p) {
+    return (p.min)() + Generate(g, p);
+  }
+
+  result_type(min)() const { return (param_.min)(); }
+  result_type(max)() const { return (param_.max)(); }
+  result_type base() const { return param_.base(); }
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  friend bool operator==(const log_uniform_int_distribution& a,
+                         const log_uniform_int_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const log_uniform_int_distribution& a,
+                         const log_uniform_int_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  // Returns a log-uniform variate in the range [0, p.range()]. The caller
+  // should add min() to shift the result to the correct range.
+  template <typename URNG>
+  unsigned_type Generate(URNG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  param_type param_;
+};
+
+template <typename IntType>
+template <typename URBG>
+typename log_uniform_int_distribution<IntType>::unsigned_type
+log_uniform_int_distribution<IntType>::Generate(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  // sample e over [0, log_range]. Map the results of e to this:
+  // 0 => 0
+  // 1 => [1, b-1]
+  // 2 => [b, (b^2)-1]
+  // n => [b^(n-1)..(b^n)-1]
+  const int e = absl::uniform_int_distribution<int>(0, p.log_range())(g);
+  if (e == 0) {
+    return 0;
+  }
+  const int d = e - 1;
+
+  unsigned_type base_e, top_e;
+  if (p.base() == 2) {
+    base_e = static_cast<unsigned_type>(1) << d;
+
+    top_e = (e >= std::numeric_limits<unsigned_type>::digits)
+                ? (std::numeric_limits<unsigned_type>::max)()
+                : (static_cast<unsigned_type>(1) << e) - 1;
+  } else {
+    const double r = std::pow(p.base(), d);
+    const double s = (r * p.base()) - 1.0;
+
+    base_e = (r > (std::numeric_limits<unsigned_type>::max)())
+                 ? (std::numeric_limits<unsigned_type>::max)()
+                 : static_cast<unsigned_type>(r);
+
+    top_e = (s > (std::numeric_limits<unsigned_type>::max)())
+                ? (std::numeric_limits<unsigned_type>::max)()
+                : static_cast<unsigned_type>(s);
+  }
+
+  const unsigned_type lo = (base_e >= p.range()) ? p.range() : base_e;
+  const unsigned_type hi = (top_e >= p.range()) ? p.range() : top_e;
+
+  // choose uniformly over [lo, hi]
+  return absl::uniform_int_distribution<result_type>(lo, hi)(g);
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const log_uniform_int_distribution<IntType>& x) {
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os << static_cast<stream_type>((x.min)()) << os.fill()
+     << static_cast<stream_type>((x.max)()) << os.fill()
+     << static_cast<stream_type>(x.base());
+  return os;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,       // NOLINT(runtime/references)
+    log_uniform_int_distribution<IntType>& x) {  // NOLINT(runtime/references)
+  using param_type = typename log_uniform_int_distribution<IntType>::param_type;
+  using result_type =
+      typename log_uniform_int_distribution<IntType>::result_type;
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+
+  stream_type min;
+  stream_type max;
+  stream_type base;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  is >> min >> max >> base;
+  if (!is.fail()) {
+    x.param(param_type(static_cast<result_type>(min),
+                       static_cast<result_type>(max),
+                       static_cast<result_type>(base)));
+  }
+  return is;
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_LOG_UNIFORM_INT_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/log_uniform_int_distribution_test.cc b/third_party/abseil-cpp/absl/random/log_uniform_int_distribution_test.cc
new file mode 100644
index 0000000..0ff4c32d
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/log_uniform_int_distribution_test.cc
@@ -0,0 +1,277 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/log_uniform_int_distribution.h"
+
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+template <typename IntType>
+class LogUniformIntDistributionTypeTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<int8_t, int16_t, int32_t, int64_t,  //
+                                  uint8_t, uint16_t, uint32_t, uint64_t>;
+TYPED_TEST_CASE(LogUniformIntDistributionTypeTest, IntTypes);
+
+TYPED_TEST(LogUniformIntDistributionTypeTest, SerializeTest) {
+  using param_type =
+      typename absl::log_uniform_int_distribution<TypeParam>::param_type;
+  using Limits = std::numeric_limits<TypeParam>;
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  for (const auto& param : {
+           param_type(0, 1),                             //
+           param_type(0, 2),                             //
+           param_type(0, 2, 10),                         //
+           param_type(9, 32, 4),                         //
+           param_type(1, 101, 10),                       //
+           param_type(1, Limits::max() / 2),             //
+           param_type(0, Limits::max() - 1),             //
+           param_type(0, Limits::max(), 2),              //
+           param_type(0, Limits::max(), 10),             //
+           param_type(Limits::min(), 0),                 //
+           param_type(Limits::lowest(), Limits::max()),  //
+           param_type(Limits::min(), Limits::max()),     //
+       }) {
+    // Validate parameters.
+    const auto min = param.min();
+    const auto max = param.max();
+    const auto base = param.base();
+    absl::log_uniform_int_distribution<TypeParam> before(min, max, base);
+    EXPECT_EQ(before.min(), param.min());
+    EXPECT_EQ(before.max(), param.max());
+    EXPECT_EQ(before.base(), param.base());
+
+    {
+      absl::log_uniform_int_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+    }
+
+    // Validate stream serialization.
+    std::stringstream ss;
+    ss << before;
+
+    absl::log_uniform_int_distribution<TypeParam> after(3, 6, 17);
+
+    EXPECT_NE(before.max(), after.max());
+    EXPECT_NE(before.base(), after.base());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+    EXPECT_EQ(before.min(), after.min());
+    EXPECT_EQ(before.max(), after.max());
+    EXPECT_EQ(before.base(), after.base());
+    EXPECT_EQ(before.param(), after.param());
+    EXPECT_EQ(before, after);
+
+    // Smoke test.
+    auto sample_min = after.max();
+    auto sample_max = after.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = after(gen);
+      EXPECT_GE(sample, after.min());
+      EXPECT_LE(sample, after.max());
+      if (sample > sample_max) sample_max = sample;
+      if (sample < sample_min) sample_min = sample;
+    }
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrCat("Range: ", +sample_min, ", ", +sample_max));
+  }
+}
+
+using log_uniform_i32 = absl::log_uniform_int_distribution<int32_t>;
+
+class LogUniformIntChiSquaredTest
+    : public testing::TestWithParam<log_uniform_i32::param_type> {
+ public:
+  // The ChiSquaredTestImpl provides a chi-squared goodness of fit test for
+  // data generated by the log-uniform-int distribution.
+  double ChiSquaredTestImpl();
+
+  absl::InsecureBitGen rng_;
+};
+
+double LogUniformIntChiSquaredTest::ChiSquaredTestImpl() {
+  using absl::random_internal::kChiSquared;
+
+  const auto& param = GetParam();
+
+  // Check the distribution of L=log(log_uniform_int_distribution, base),
+  // expecting that L is roughly uniformly distributed, that is:
+  //
+  //   P[L=0] ~= P[L=1] ~= ... ~= P[L=log(max)]
+  //
+  // For a total of X entries, each bucket should contain some number of samples
+  // in the interval [X/k - a, X/k + a].
+  //
+  // Where `a` is approximately sqrt(X/k). This is validated by bucketing
+  // according to the log function and using a chi-squared test for uniformity.
+
+  const bool is_2 = (param.base() == 2);
+  const double base_log = 1.0 / std::log(param.base());
+  const auto bucket_index = [base_log, is_2, &param](int32_t x) {
+    uint64_t y = static_cast<uint64_t>(x) - param.min();
+    return (y == 0) ? 0
+                    : is_2 ? static_cast<int>(1 + std::log2(y))
+                           : static_cast<int>(1 + std::log(y) * base_log);
+  };
+  const int max_bucket = bucket_index(param.max());  // inclusive
+  const size_t trials = 15 + (max_bucket + 1) * 10;
+
+  log_uniform_i32 dist(param);
+
+  std::vector<int64_t> buckets(max_bucket + 1);
+  for (size_t i = 0; i < trials; ++i) {
+    const auto sample = dist(rng_);
+    // Check the bounds.
+    ABSL_ASSERT(sample <= dist.max());
+    ABSL_ASSERT(sample >= dist.min());
+    // Convert the output of the generator to one of num_bucket buckets.
+    int bucket = bucket_index(sample);
+    ABSL_ASSERT(bucket <= max_bucket);
+    ++buckets[bucket];
+  }
+
+  // The null-hypothesis is that the distribution is uniform with respect to
+  // log-uniform-int bucketization.
+  const int dof = buckets.size() - 1;
+  const double expected = trials / static_cast<double>(buckets.size());
+
+  const double threshold = absl::random_internal::ChiSquareValue(dof, 0.98);
+
+  double chi_square = absl::random_internal::ChiSquareWithExpected(
+      std::begin(buckets), std::end(buckets), expected);
+
+  const double p = absl::random_internal::ChiSquarePValue(chi_square, dof);
+
+  if (chi_square > threshold) {
+    ABSL_INTERNAL_LOG(INFO, "values");
+    for (size_t i = 0; i < buckets.size(); i++) {
+      ABSL_INTERNAL_LOG(INFO, absl::StrCat(i, ": ", buckets[i]));
+    }
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrFormat("trials=%d\n"
+                                      "%s(data, %d) = %f (%f)\n"
+                                      "%s @ 0.98 = %f",
+                                      trials, kChiSquared, dof, chi_square, p,
+                                      kChiSquared, threshold));
+  }
+  return p;
+}
+
+TEST_P(LogUniformIntChiSquaredTest, MultiTest) {
+  const int kTrials = 5;
+
+  int failures = 0;
+  for (int i = 0; i < kTrials; i++) {
+    double p_value = ChiSquaredTestImpl();
+    if (p_value < 0.005) {
+      failures++;
+    }
+  }
+
+  // There is a 0.10% chance of producing at least one failure, so raise the
+  // failure threshold high enough to allow for a flake rate < 10,000.
+  EXPECT_LE(failures, 4);
+}
+
+// Generate the parameters for the test.
+std::vector<log_uniform_i32::param_type> GenParams() {
+  using Param = log_uniform_i32::param_type;
+  using Limits = std::numeric_limits<int32_t>;
+
+  return std::vector<Param>{
+      Param{0, 1, 2},
+      Param{1, 1, 2},
+      Param{0, 2, 2},
+      Param{0, 3, 2},
+      Param{0, 4, 2},
+      Param{0, 9, 10},
+      Param{0, 10, 10},
+      Param{0, 11, 10},
+      Param{1, 10, 10},
+      Param{0, (1 << 8) - 1, 2},
+      Param{0, (1 << 8), 2},
+      Param{0, (1 << 30) - 1, 2},
+      Param{-1000, 1000, 10},
+      Param{0, Limits::max(), 2},
+      Param{0, Limits::max(), 3},
+      Param{0, Limits::max(), 10},
+      Param{Limits::min(), 0},
+      Param{Limits::min(), Limits::max(), 2},
+  };
+}
+
+std::string ParamName(
+    const ::testing::TestParamInfo<log_uniform_i32::param_type>& info) {
+  const auto& p = info.param;
+  std::string name =
+      absl::StrCat("min_", p.min(), "__max_", p.max(), "__base_", p.base());
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_SUITE_P(, LogUniformIntChiSquaredTest,
+                         ::testing::ValuesIn(GenParams()), ParamName);
+
+// NOTE: absl::log_uniform_int_distribution is not guaranteed to be stable.
+TEST(LogUniformIntDistributionTest, StabilityTest) {
+  using testing::ElementsAre;
+  // absl::uniform_int_distribution stability relies on
+  // absl::random_internal::LeadingSetBit, std::log, std::pow.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(6);
+
+  {
+    absl::log_uniform_int_distribution<int32_t> dist(0, 256);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+    EXPECT_THAT(output, ElementsAre(256, 66, 4, 6, 57, 103));
+  }
+  urbg.reset();
+  {
+    absl::log_uniform_int_distribution<int32_t> dist(0, 256, 10);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+    EXPECT_THAT(output, ElementsAre(8, 4, 0, 0, 0, 69));
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/poisson_distribution.h b/third_party/abseil-cpp/absl/random/poisson_distribution.h
new file mode 100644
index 0000000..7750b1c
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/poisson_distribution.h
@@ -0,0 +1,254 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_POISSON_DISTRIBUTION_H_
+#define ABSL_RANDOM_POISSON_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <ostream>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/fastmath.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+
+// absl::poisson_distribution:
+// Generates discrete variates conforming to a Poisson distribution.
+//   p(n) = (mean^n / n!) exp(-mean)
+//
+// Depending on the parameter, the distribution selects one of the following
+// algorithms:
+// * The standard algorithm, attributed to Knuth, extended using a split method
+// for larger values
+// * The "Ratio of Uniforms as a convenient method for sampling from classical
+// discrete distributions", Stadlober, 1989.
+// http://www.sciencedirect.com/science/article/pii/0377042790903495
+//
+// NOTE: param_type.mean() is a double, which permits values larger than
+// poisson_distribution<IntType>::max(), however this should be avoided and
+// the distribution results are limited to the max() value.
+//
+// The goals of this implementation are to provide good performance while still
+// beig thread-safe: This limits the implementation to not using lgamma provided
+// by <math.h>.
+//
+template <typename IntType = int>
+class poisson_distribution {
+ public:
+  using result_type = IntType;
+
+  class param_type {
+   public:
+    using distribution_type = poisson_distribution;
+    explicit param_type(double mean = 1.0);
+
+    double mean() const { return mean_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.mean_ == b.mean_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class poisson_distribution;
+
+    double mean_;
+    double emu_;  // e ^ -mean_
+    double lmu_;  // ln(mean_)
+    double s_;
+    double log_k_;
+    int split_;
+
+    static_assert(std::is_integral<IntType>::value,
+                  "Class-template absl::poisson_distribution<> must be "
+                  "parameterized using an integral type.");
+  };
+
+  poisson_distribution() : poisson_distribution(1.0) {}
+
+  explicit poisson_distribution(double mean) : param_(mean) {}
+
+  explicit poisson_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  // generating functions
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const { return 0; }
+  result_type(max)() const { return (std::numeric_limits<result_type>::max)(); }
+
+  double mean() const { return param_.mean(); }
+
+  friend bool operator==(const poisson_distribution& a,
+                         const poisson_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const poisson_distribution& a,
+                         const poisson_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+  random_internal::FastUniformBits<uint64_t> fast_u64_;
+};
+
+// -----------------------------------------------------------------------------
+// Implementation details follow
+// -----------------------------------------------------------------------------
+
+template <typename IntType>
+poisson_distribution<IntType>::param_type::param_type(double mean)
+    : mean_(mean), split_(0) {
+  assert(mean >= 0);
+  assert(mean <= (std::numeric_limits<result_type>::max)());
+  // As a defensive measure, avoid large values of the mean.  The rejection
+  // algorithm used does not support very large values well.  It my be worth
+  // changing algorithms to better deal with these cases.
+  assert(mean <= 1e10);
+  if (mean_ < 10) {
+    // For small lambda, use the knuth method.
+    split_ = 1;
+    emu_ = std::exp(-mean_);
+  } else if (mean_ <= 50) {
+    // Use split-knuth method.
+    split_ = 1 + static_cast<int>(mean_ / 10.0);
+    emu_ = std::exp(-mean_ / static_cast<double>(split_));
+  } else {
+    // Use ratio of uniforms method.
+    constexpr double k2E = 0.7357588823428846;
+    constexpr double kSA = 0.4494580810294493;
+
+    lmu_ = std::log(mean_);
+    double a = mean_ + 0.5;
+    s_ = kSA + std::sqrt(k2E * a);
+    const double mode = std::ceil(mean_) - 1;
+    log_k_ = lmu_ * mode - absl::random_internal::StirlingLogFactorial(mode);
+  }
+}
+
+template <typename IntType>
+template <typename URBG>
+typename poisson_distribution<IntType>::result_type
+poisson_distribution<IntType>::operator()(
+    URBG& g,  // NOLINT(runtime/references)
+    const param_type& p) {
+  using random_internal::PositiveValueT;
+  using random_internal::RandU64ToDouble;
+  using random_internal::SignedValueT;
+
+  if (p.split_ != 0) {
+    // Use Knuth's algorithm with range splitting to avoid floating-point
+    // errors. Knuth's algorithm is: Ui is a sequence of uniform variates on
+    // (0,1); return the number of variates required for product(Ui) <
+    // exp(-lambda).
+    //
+    // The expected number of variates required for Knuth's method can be
+    // computed as follows:
+    // The expected value of U is 0.5, so solving for 0.5^n < exp(-lambda) gives
+    // the expected number of uniform variates
+    // required for a given lambda, which is:
+    //  lambda = [2, 5,  9, 10, 11, 12, 13, 14, 15, 16, 17]
+    //  n      = [3, 8, 13, 15, 16, 18, 19, 21, 22, 24, 25]
+    //
+    result_type n = 0;
+    for (int split = p.split_; split > 0; --split) {
+      double r = 1.0;
+      do {
+        r *= RandU64ToDouble<PositiveValueT, true>(fast_u64_(g));
+        ++n;
+      } while (r > p.emu_);
+      --n;
+    }
+    return n;
+  }
+
+  // Use ratio of uniforms method.
+  //
+  // Let u ~ Uniform(0, 1), v ~ Uniform(-1, 1),
+  //     a = lambda + 1/2,
+  //     s = 1.5 - sqrt(3/e) + sqrt(2(lambda + 1/2)/e),
+  //     x = s * v/u + a.
+  // P(floor(x) = k | u^2 < f(floor(x))/k), where
+  // f(m) = lambda^m exp(-lambda)/ m!, for 0 <= m, and f(m) = 0 otherwise,
+  // and k = max(f).
+  const double a = p.mean_ + 0.5;
+  for (;;) {
+    const double u =
+        RandU64ToDouble<PositiveValueT, false>(fast_u64_(g));  // (0, 1)
+    const double v =
+        RandU64ToDouble<SignedValueT, false>(fast_u64_(g));  // (-1, 1)
+    const double x = std::floor(p.s_ * v / u + a);
+    if (x < 0) continue;  // f(negative) = 0
+    const double rhs = x * p.lmu_;
+    // clang-format off
+    double s = (x <= 1.0) ? 0.0
+             : (x == 2.0) ? 0.693147180559945
+             : absl::random_internal::StirlingLogFactorial(x);
+    // clang-format on
+    const double lhs = 2.0 * std::log(u) + p.log_k_ + s;
+    if (lhs < rhs) {
+      return x > (max)() ? (max)()
+                         : static_cast<result_type>(x);  // f(x)/k >= u^2
+    }
+  }
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const poisson_distribution<IntType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<double>::kPrecision);
+  os << x.mean();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    poisson_distribution<IntType>& x) {     // NOLINT(runtime/references)
+  using param_type = typename poisson_distribution<IntType>::param_type;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  double mean = random_internal::read_floating_point<double>(is);
+  if (!is.fail()) {
+    x.param(param_type(mean));
+  }
+  return is;
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_POISSON_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/poisson_distribution_test.cc b/third_party/abseil-cpp/absl/random/poisson_distribution_test.cc
new file mode 100644
index 0000000..6d68999
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/poisson_distribution_test.cc
@@ -0,0 +1,565 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/poisson_distribution.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/macros.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+// Notes about generating poisson variates:
+//
+// It is unlikely that any implementation of std::poisson_distribution
+// will be stable over time and across library implementations. For instance
+// the three different poisson variate generators listed below all differ:
+//
+// https://github.com/ampl/gsl/tree/master/randist/poisson.c
+// * GSL uses a gamma + binomial + knuth method to compute poisson variates.
+//
+// https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/random.tcc
+// * GCC uses the Devroye rejection algorithm, based on
+// Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag,
+// New York, 1986, Ch. X, Sects. 3.3 & 3.4 (+ Errata!), ~p.511
+//   http://www.nrbook.com/devroye/
+//
+// https://github.com/llvm-mirror/libcxx/blob/master/include/random
+// * CLANG uses a different rejection method, which appears to include a
+// normal-distribution approximation and an exponential distribution to
+// compute the threshold, including a similar factorial approximation to this
+// one, but it is unclear where the algorithm comes from, exactly.
+//
+
+namespace {
+
+using absl::random_internal::kChiSquared;
+
+// The PoissonDistributionInterfaceTest provides a basic test that
+// absl::poisson_distribution conforms to the interface and serialization
+// requirements imposed by [rand.req.dist] for the common integer types.
+
+template <typename IntType>
+class PoissonDistributionInterfaceTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<int, int8_t, int16_t, int32_t, int64_t,
+                                  uint8_t, uint16_t, uint32_t, uint64_t>;
+TYPED_TEST_CASE(PoissonDistributionInterfaceTest, IntTypes);
+
+TYPED_TEST(PoissonDistributionInterfaceTest, SerializeTest) {
+  using param_type = typename absl::poisson_distribution<TypeParam>::param_type;
+  const double kMax =
+      std::min(1e10 /* assertion limit */,
+               static_cast<double>(std::numeric_limits<TypeParam>::max()));
+
+  const double kParams[] = {
+      // Cases around 1.
+      1,                         //
+      std::nextafter(1.0, 0.0),  // 1 - epsilon
+      std::nextafter(1.0, 2.0),  // 1 + epsilon
+      // Arbitrary values.
+      1e-8, 1e-4,
+      0.0000005,  // ~7.2e-7
+      0.2,        // ~0.2x
+      0.5,        // 0.72
+      2,          // ~2.8
+      20,         // 3x ~9.6
+      100, 1e4, 1e8, 1.5e9, 1e20,
+      // Boundary cases.
+      std::numeric_limits<double>::max(),
+      std::numeric_limits<double>::epsilon(),
+      std::nextafter(std::numeric_limits<double>::min(),
+                     1.0),                        // min + epsilon
+      std::numeric_limits<double>::min(),         // smallest normal
+      std::numeric_limits<double>::denorm_min(),  // smallest denorm
+      std::numeric_limits<double>::min() / 2,     // denorm
+      std::nextafter(std::numeric_limits<double>::min(),
+                     0.0),  // denorm_max
+  };
+
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  for (const double m : kParams) {
+    const double mean = std::min(kMax, m);
+    const param_type param(mean);
+
+    // Validate parameters.
+    absl::poisson_distribution<TypeParam> before(mean);
+    EXPECT_EQ(before.mean(), param.mean());
+
+    {
+      absl::poisson_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+      EXPECT_EQ(via_param.param(), before.param());
+    }
+
+    // Smoke test.
+    auto sample_min = before.max();
+    auto sample_max = before.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = before(gen);
+      EXPECT_GE(sample, before.min());
+      EXPECT_LE(sample, before.max());
+      if (sample > sample_max) sample_max = sample;
+      if (sample < sample_min) sample_min = sample;
+    }
+
+    ABSL_INTERNAL_LOG(INFO, absl::StrCat("Range {", param.mean(), "}: ",
+                                         +sample_min, ", ", +sample_max));
+
+    // Validate stream serialization.
+    std::stringstream ss;
+    ss << before;
+
+    absl::poisson_distribution<TypeParam> after(3.8);
+
+    EXPECT_NE(before.mean(), after.mean());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+    EXPECT_EQ(before.mean(), after.mean())  //
+        << ss.str() << " "                  //
+        << (ss.good() ? "good " : "")       //
+        << (ss.bad() ? "bad " : "")         //
+        << (ss.eof() ? "eof " : "")         //
+        << (ss.fail() ? "fail " : "");
+  }
+}
+
+// See http://www.itl.nist.gov/div898/handbook/eda/section3/eda366j.htm
+
+class PoissonModel {
+ public:
+  explicit PoissonModel(double mean) : mean_(mean) {}
+
+  double mean() const { return mean_; }
+  double variance() const { return mean_; }
+  double stddev() const { return std::sqrt(variance()); }
+  double skew() const { return 1.0 / mean_; }
+  double kurtosis() const { return 3.0 + 1.0 / mean_; }
+
+  // InitCDF() initializes the CDF for the distribution parameters.
+  void InitCDF();
+
+  // The InverseCDF, or the Percent-point function returns x, P(x) < v.
+  struct CDF {
+    size_t index;
+    double pmf;
+    double cdf;
+  };
+  CDF InverseCDF(double p) {
+    CDF target{0, 0, p};
+    auto it = std::upper_bound(
+        std::begin(cdf_), std::end(cdf_), target,
+        [](const CDF& a, const CDF& b) { return a.cdf < b.cdf; });
+    return *it;
+  }
+
+  void LogCDF() {
+    ABSL_INTERNAL_LOG(INFO, absl::StrCat("CDF (mean = ", mean_, ")"));
+    for (const auto c : cdf_) {
+      ABSL_INTERNAL_LOG(INFO,
+                        absl::StrCat(c.index, ": pmf=", c.pmf, " cdf=", c.cdf));
+    }
+  }
+
+ private:
+  const double mean_;
+
+  std::vector<CDF> cdf_;
+};
+
+// The goal is to compute an InverseCDF function, or percent point function for
+// the poisson distribution, and use that to partition our output into equal
+// range buckets.  However there is no closed form solution for the inverse cdf
+// for poisson distributions (the closest is the incomplete gamma function).
+// Instead, `InitCDF` iteratively computes the PMF and the CDF. This enables
+// searching for the bucket points.
+void PoissonModel::InitCDF() {
+  if (!cdf_.empty()) {
+    // State already initialized.
+    return;
+  }
+  ABSL_ASSERT(mean_ < 201.0);
+
+  const size_t max_i = 50 * stddev() + mean();
+  const double e_neg_mean = std::exp(-mean());
+  ABSL_ASSERT(e_neg_mean > 0);
+
+  double d = 1;
+  double last_result = e_neg_mean;
+  double cumulative = e_neg_mean;
+  if (e_neg_mean > 1e-10) {
+    cdf_.push_back({0, e_neg_mean, cumulative});
+  }
+  for (size_t i = 1; i < max_i; i++) {
+    d *= (mean() / i);
+    double result = e_neg_mean * d;
+    cumulative += result;
+    if (result < 1e-10 && result < last_result && cumulative > 0.999999) {
+      break;
+    }
+    if (result > 1e-7) {
+      cdf_.push_back({i, result, cumulative});
+    }
+    last_result = result;
+  }
+  ABSL_ASSERT(!cdf_.empty());
+}
+
+// PoissonDistributionZTest implements a z-test for the poisson distribution.
+
+struct ZParam {
+  double mean;
+  double p_fail;   // Z-Test probability of failure.
+  int trials;      // Z-Test trials.
+  size_t samples;  // Z-Test samples.
+};
+
+class PoissonDistributionZTest : public testing::TestWithParam<ZParam>,
+                                 public PoissonModel {
+ public:
+  PoissonDistributionZTest() : PoissonModel(GetParam().mean) {}
+
+  // ZTestImpl provides a basic z-squared test of the mean vs. expected
+  // mean for data generated by the poisson distribution.
+  template <typename D>
+  bool SingleZTest(const double p, const size_t samples);
+
+  absl::InsecureBitGen rng_;
+};
+
+template <typename D>
+bool PoissonDistributionZTest::SingleZTest(const double p,
+                                           const size_t samples) {
+  D dis(mean());
+
+  absl::flat_hash_map<int32_t, int> buckets;
+  std::vector<double> data;
+  data.reserve(samples);
+  for (int j = 0; j < samples; j++) {
+    const auto x = dis(rng_);
+    buckets[x]++;
+    data.push_back(x);
+  }
+
+  // The null-hypothesis is that the distribution is a poisson distribution with
+  // the provided mean (not estimated from the data).
+  const auto m = absl::random_internal::ComputeDistributionMoments(data);
+  const double max_err = absl::random_internal::MaxErrorTolerance(p);
+  const double z = absl::random_internal::ZScore(mean(), m);
+  const bool pass = absl::random_internal::Near("z", z, 0.0, max_err);
+
+  if (!pass) {
+    ABSL_INTERNAL_LOG(
+        INFO, absl::StrFormat("p=%f max_err=%f\n"
+                              " mean=%f vs. %f\n"
+                              " stddev=%f vs. %f\n"
+                              " skewness=%f vs. %f\n"
+                              " kurtosis=%f vs. %f\n"
+                              " z=%f",
+                              p, max_err, m.mean, mean(), std::sqrt(m.variance),
+                              stddev(), m.skewness, skew(), m.kurtosis,
+                              kurtosis(), z));
+  }
+  return pass;
+}
+
+TEST_P(PoissonDistributionZTest, AbslPoissonDistribution) {
+  const auto& param = GetParam();
+  const int expected_failures =
+      std::max(1, static_cast<int>(std::ceil(param.trials * param.p_fail)));
+  const double p = absl::random_internal::RequiredSuccessProbability(
+      param.p_fail, param.trials);
+
+  int failures = 0;
+  for (int i = 0; i < param.trials; i++) {
+    failures +=
+        SingleZTest<absl::poisson_distribution<int32_t>>(p, param.samples) ? 0
+                                                                           : 1;
+  }
+  EXPECT_LE(failures, expected_failures);
+}
+
+std::vector<ZParam> GetZParams() {
+  // These values have been adjusted from the "exact" computed values to reduce
+  // failure rates.
+  //
+  // It turns out that the actual values are not as close to the expected values
+  // as would be ideal.
+  return std::vector<ZParam>({
+      // Knuth method.
+      ZParam{0.5, 0.01, 100, 1000},
+      ZParam{1.0, 0.01, 100, 1000},
+      ZParam{10.0, 0.01, 100, 5000},
+      // Split-knuth method.
+      ZParam{20.0, 0.01, 100, 10000},
+      ZParam{50.0, 0.01, 100, 10000},
+      // Ratio of gaussians method.
+      ZParam{51.0, 0.01, 100, 10000},
+      ZParam{200.0, 0.05, 10, 100000},
+      ZParam{100000.0, 0.05, 10, 1000000},
+  });
+}
+
+std::string ZParamName(const ::testing::TestParamInfo<ZParam>& info) {
+  const auto& p = info.param;
+  std::string name = absl::StrCat("mean_", absl::SixDigits(p.mean));
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_SUITE_P(, PoissonDistributionZTest,
+                         ::testing::ValuesIn(GetZParams()), ZParamName);
+
+// The PoissonDistributionChiSquaredTest class provides a basic test framework
+// for variates generated by a conforming poisson_distribution.
+class PoissonDistributionChiSquaredTest : public testing::TestWithParam<double>,
+                                          public PoissonModel {
+ public:
+  PoissonDistributionChiSquaredTest() : PoissonModel(GetParam()) {}
+
+  // The ChiSquaredTestImpl provides a chi-squared goodness of fit test for data
+  // generated by the poisson distribution.
+  template <typename D>
+  double ChiSquaredTestImpl();
+
+ private:
+  void InitChiSquaredTest(const double buckets);
+
+  absl::InsecureBitGen rng_;
+  std::vector<size_t> cutoffs_;
+  std::vector<double> expected_;
+};
+
+void PoissonDistributionChiSquaredTest::InitChiSquaredTest(
+    const double buckets) {
+  if (!cutoffs_.empty() && !expected_.empty()) {
+    return;
+  }
+  InitCDF();
+
+  // The code below finds cuttoffs that yield approximately equally-sized
+  // buckets to the extent that it is possible. However for poisson
+  // distributions this is particularly challenging for small mean parameters.
+  // Track the expected proportion of items in each bucket.
+  double last_cdf = 0;
+  const double inc = 1.0 / buckets;
+  for (double p = inc; p <= 1.0; p += inc) {
+    auto result = InverseCDF(p);
+    if (!cutoffs_.empty() && cutoffs_.back() == result.index) {
+      continue;
+    }
+    double d = result.cdf - last_cdf;
+    cutoffs_.push_back(result.index);
+    expected_.push_back(d);
+    last_cdf = result.cdf;
+  }
+  cutoffs_.push_back(std::numeric_limits<size_t>::max());
+  expected_.push_back(std::max(0.0, 1.0 - last_cdf));
+}
+
+template <typename D>
+double PoissonDistributionChiSquaredTest::ChiSquaredTestImpl() {
+  const int kSamples = 2000;
+  const int kBuckets = 50;
+
+  // The poisson CDF fails for large mean values, since e^-mean exceeds the
+  // machine precision. For these cases, using a normal approximation would be
+  // appropriate.
+  ABSL_ASSERT(mean() <= 200);
+  InitChiSquaredTest(kBuckets);
+
+  D dis(mean());
+
+  std::vector<int32_t> counts(cutoffs_.size(), 0);
+  for (int j = 0; j < kSamples; j++) {
+    const size_t x = dis(rng_);
+    auto it = std::lower_bound(std::begin(cutoffs_), std::end(cutoffs_), x);
+    counts[std::distance(cutoffs_.begin(), it)]++;
+  }
+
+  // Normalize the counts.
+  std::vector<int32_t> e(expected_.size(), 0);
+  for (int i = 0; i < e.size(); i++) {
+    e[i] = kSamples * expected_[i];
+  }
+
+  // The null-hypothesis is that the distribution is a poisson distribution with
+  // the provided mean (not estimated from the data).
+  const int dof = static_cast<int>(counts.size()) - 1;
+
+  // The threshold for logging is 1-in-50.
+  const double threshold = absl::random_internal::ChiSquareValue(dof, 0.98);
+
+  const double chi_square = absl::random_internal::ChiSquare(
+      std::begin(counts), std::end(counts), std::begin(e), std::end(e));
+
+  const double p = absl::random_internal::ChiSquarePValue(chi_square, dof);
+
+  // Log if the chi_squared value is above the threshold.
+  if (chi_square > threshold) {
+    LogCDF();
+
+    ABSL_INTERNAL_LOG(INFO, absl::StrCat("VALUES  buckets=", counts.size(),
+                                         "  samples=", kSamples));
+    for (size_t i = 0; i < counts.size(); i++) {
+      ABSL_INTERNAL_LOG(
+          INFO, absl::StrCat(cutoffs_[i], ": ", counts[i], " vs. E=", e[i]));
+    }
+
+    ABSL_INTERNAL_LOG(
+        INFO,
+        absl::StrCat(kChiSquared, "(data, dof=", dof, ") = ", chi_square, " (",
+                     p, ")\n", " vs.\n", kChiSquared, " @ 0.98 = ", threshold));
+  }
+  return p;
+}
+
+TEST_P(PoissonDistributionChiSquaredTest, AbslPoissonDistribution) {
+  const int kTrials = 20;
+
+  // Large values are not yet supported -- this requires estimating the cdf
+  // using the normal distribution instead of the poisson in this case.
+  ASSERT_LE(mean(), 200.0);
+  if (mean() > 200.0) {
+    return;
+  }
+
+  int failures = 0;
+  for (int i = 0; i < kTrials; i++) {
+    double p_value = ChiSquaredTestImpl<absl::poisson_distribution<int32_t>>();
+    if (p_value < 0.005) {
+      failures++;
+    }
+  }
+  // There is a 0.10% chance of producing at least one failure, so raise the
+  // failure threshold high enough to allow for a flake rate < 10,000.
+  EXPECT_LE(failures, 4);
+}
+
+INSTANTIATE_TEST_SUITE_P(, PoissonDistributionChiSquaredTest,
+                         ::testing::Values(0.5, 1.0, 2.0, 10.0, 50.0, 51.0,
+                                           200.0));
+
+// NOTE: absl::poisson_distribution is not guaranteed to be stable.
+TEST(PoissonDistributionTest, StabilityTest) {
+  using testing::ElementsAre;
+  // absl::poisson_distribution stability relies on stability of
+  // std::exp, std::log, std::sqrt, std::ceil, std::floor, and
+  // absl::FastUniformBits, absl::StirlingLogFactorial, absl::RandU64ToDouble.
+  absl::random_internal::sequence_urbg urbg({
+      0x035b0dc7e0a18acfull, 0x06cebe0d2653682eull, 0x0061e9b23861596bull,
+      0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+      0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+      0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+      0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull,
+      0x4864f22c059bf29eull, 0x247856d8b862665cull, 0xe46e86e9a1337e10ull,
+      0xd8c8541f3519b133ull, 0xe75b5162c567b9e4ull, 0xf732e5ded7009c5bull,
+      0xb170b98353121eacull, 0x1ec2e8986d2362caull, 0x814c8e35fe9a961aull,
+      0x0c3cd59c9b638a02ull, 0xcb3bb6478a07715cull, 0x1224e62c978bbc7full,
+      0x671ef2cb04e81f6eull, 0x3c1cbd811eaf1808ull, 0x1bbc23cfa8fac721ull,
+      0xa4c2cda65e596a51ull, 0xb77216fad37adf91ull, 0x836d794457c08849ull,
+      0xe083df03475f49d7ull, 0xbc9feb512e6b0d6cull, 0xb12d74fdd718c8c5ull,
+      0x12ff09653bfbe4caull, 0x8dd03a105bc4ee7eull, 0x5738341045ba0d85ull,
+      0xf3fd722dc65ad09eull, 0xfa14fd21ea2a5705ull, 0xffe6ea4d6edb0c73ull,
+      0xD07E9EFE2BF11FB4ull, 0x95DBDA4DAE909198ull, 0xEAAD8E716B93D5A0ull,
+      0xD08ED1D0AFC725E0ull, 0x8E3C5B2F8E7594B7ull, 0x8FF6E2FBF2122B64ull,
+      0x8888B812900DF01Cull, 0x4FAD5EA0688FC31Cull, 0xD1CFF191B3A8C1ADull,
+      0x2F2F2218BE0E1777ull, 0xEA752DFE8B021FA1ull, 0xE5A0CC0FB56F74E8ull,
+      0x18ACF3D6CE89E299ull, 0xB4A84FE0FD13E0B7ull, 0x7CC43B81D2ADA8D9ull,
+      0x165FA26680957705ull, 0x93CC7314211A1477ull, 0xE6AD206577B5FA86ull,
+      0xC75442F5FB9D35CFull, 0xEBCDAF0C7B3E89A0ull, 0xD6411BD3AE1E7E49ull,
+      0x00250E2D2071B35Eull, 0x226800BB57B8E0AFull, 0x2464369BF009B91Eull,
+      0x5563911D59DFA6AAull, 0x78C14389D95A537Full, 0x207D5BA202E5B9C5ull,
+      0x832603766295CFA9ull, 0x11C819684E734A41ull, 0xB3472DCA7B14A94Aull,
+  });
+
+  std::vector<int> output(10);
+
+  // Method 1.
+  {
+    absl::poisson_distribution<int> dist(5);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+  }
+  EXPECT_THAT(output,  // mean = 4.2
+              ElementsAre(1, 0, 0, 4, 2, 10, 3, 3, 7, 12));
+
+  // Method 2.
+  {
+    urbg.reset();
+    absl::poisson_distribution<int> dist(25);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+  }
+  EXPECT_THAT(output,  // mean = 19.8
+              ElementsAre(9, 35, 18, 10, 35, 18, 10, 35, 18, 10));
+
+  // Method 3.
+  {
+    urbg.reset();
+    absl::poisson_distribution<int> dist(121);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+  }
+  EXPECT_THAT(output,  // mean = 124.1
+              ElementsAre(161, 122, 129, 124, 112, 112, 117, 120, 130, 114));
+}
+
+TEST(PoissonDistributionTest, AlgorithmExpectedValue_1) {
+  // This tests small values of the Knuth method.
+  // The underlying uniform distribution will generate exactly 0.5.
+  absl::random_internal::sequence_urbg urbg({0x8000000000000001ull});
+  absl::poisson_distribution<int> dist(5);
+  EXPECT_EQ(7, dist(urbg));
+}
+
+TEST(PoissonDistributionTest, AlgorithmExpectedValue_2) {
+  // This tests larger values of the Knuth method.
+  // The underlying uniform distribution will generate exactly 0.5.
+  absl::random_internal::sequence_urbg urbg({0x8000000000000001ull});
+  absl::poisson_distribution<int> dist(25);
+  EXPECT_EQ(36, dist(urbg));
+}
+
+TEST(PoissonDistributionTest, AlgorithmExpectedValue_3) {
+  // This variant uses the ratio of uniforms method.
+  absl::random_internal::sequence_urbg urbg(
+      {0x7fffffffffffffffull, 0x8000000000000000ull});
+
+  absl::poisson_distribution<int> dist(121);
+  EXPECT_EQ(121, dist(urbg));
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/random.h b/third_party/abseil-cpp/absl/random/random.h
new file mode 100644
index 0000000..dc6852f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/random.h
@@ -0,0 +1,187 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: random.h
+// -----------------------------------------------------------------------------
+//
+// This header defines the recommended Uniform Random Bit Generator (URBG)
+// types for use within the Abseil Random library. These types are not
+// suitable for security-related use-cases, but should suffice for most other
+// uses of generating random values.
+//
+// The Abseil random library provides the following URBG types:
+//
+//   * BitGen, a good general-purpose bit generator, optimized for generating
+//     random (but not cryptographically secure) values
+//   * InsecureBitGen, a slightly faster, though less random, bit generator, for
+//     cases where the existing BitGen is a drag on performance.
+
+#ifndef ABSL_RANDOM_RANDOM_H_
+#define ABSL_RANDOM_RANDOM_H_
+
+#include <random>
+
+#include "absl/random/distributions.h"  // IWYU pragma: export
+#include "absl/random/internal/nonsecure_base.h"  // IWYU pragma: export
+#include "absl/random/internal/pcg_engine.h"  // IWYU pragma: export
+#include "absl/random/internal/pool_urbg.h"
+#include "absl/random/internal/randen_engine.h"
+#include "absl/random/seed_sequences.h"  // IWYU pragma: export
+
+namespace absl {
+
+// -----------------------------------------------------------------------------
+// absl::BitGen
+// -----------------------------------------------------------------------------
+//
+// `absl::BitGen` is a general-purpose random bit generator for generating
+// random values for use within the Abseil random library. Typically, you use a
+// bit generator in combination with a distribution to provide random values.
+//
+// Example:
+//
+//   // Create an absl::BitGen. There is no need to seed this bit generator.
+//   absl::BitGen gen;
+//
+//   // Generate an integer value in the closed interval [1,6]
+//   int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen);
+//
+// `absl::BitGen` is seeded by default with non-deterministic data to produce
+// different sequences of random values across different instances, including
+// different binary invocations. This behavior is different than the standard
+// library bit generators, which use golden values as their seeds. Default
+// construction intentionally provides no stability guarantees, to avoid
+// accidental dependence on such a property.
+//
+// `absl::BitGen` may be constructed with an optional seed sequence type,
+// conforming to [rand.req.seed_seq], which will be mixed with additional
+// non-deterministic data.
+//
+// Example:
+//
+//  // Create an absl::BitGen using an std::seed_seq seed sequence
+//  std::seed_seq seq{1,2,3};
+//  absl::BitGen gen_with_seed(seq);
+//
+//  // Generate an integer value in the closed interval [1,6]
+//  int die_roll2 = absl::uniform_int_distribution<int>(1, 6)(gen_with_seed);
+//
+// `absl::BitGen` meets the requirements of the Uniform Random Bit Generator
+// (URBG) concept as per the C++17 standard [rand.req.urng] though differs
+// slightly with [rand.req.eng]. Like its standard library equivalents (e.g.
+// `std::mersenne_twister_engine`) `absl::BitGen` is not cryptographically
+// secure.
+//
+// Constructing two `absl::BitGen`s with the same seed sequence in the same
+// binary will produce the same sequence of variates within the same binary, but
+// need not do so across multiple binary invocations.
+//
+// This type has been optimized to perform better than Mersenne Twister
+// (https://en.wikipedia.org/wiki/Mersenne_Twister) and many other complex URBG
+// types on modern x86, ARM, and PPC architectures.
+//
+// This type is thread-compatible, but not thread-safe.
+
+// ---------------------------------------------------------------------------
+// absl::BitGen member functions
+// ---------------------------------------------------------------------------
+
+// absl::BitGen::operator()()
+//
+// Calls the BitGen, returning a generated value.
+
+// absl::BitGen::min()
+//
+// Returns the smallest possible value from this bit generator.
+
+// absl::BitGen::max()
+//
+// Returns the largest possible value from this bit generator., and
+
+// absl::BitGen::discard(num)
+//
+// Advances the internal state of this bit generator by `num` times, and
+// discards the intermediate results.
+// ---------------------------------------------------------------------------
+
+using BitGen = random_internal::NonsecureURBGBase<
+    random_internal::randen_engine<uint64_t>>;
+
+// -----------------------------------------------------------------------------
+// absl::InsecureBitGen
+// -----------------------------------------------------------------------------
+//
+// `absl::InsecureBitGen` is an efficient random bit generator for generating
+// random values, recommended only for performance-sensitive use cases where
+// `absl::BitGen` is not satisfactory when compute-bounded by bit generation
+// costs.
+//
+// Example:
+//
+//   // Create an absl::InsecureBitGen
+//   absl::InsecureBitGen gen;
+//   for (size_t i = 0; i < 1000000; i++) {
+//
+//     // Generate a bunch of random values from some complex distribution
+//     auto my_rnd = some_distribution(gen, 1, 1000);
+//   }
+//
+// Like `absl::BitGen`, `absl::InsecureBitGen` is seeded by default with
+// non-deterministic data to produce different sequences of random values across
+// different instances, including different binary invocations. (This behavior
+// is different than the standard library bit generators, which use golden
+// values as their seeds.)
+//
+// `absl::InsecureBitGen` may be constructed with an optional seed sequence
+// type, conforming to [rand.req.seed_seq], which will be mixed with additional
+// non-deterministic data. (See std_seed_seq.h for more information.)
+//
+// `absl::InsecureBitGen` meets the requirements of the Uniform Random Bit
+// Generator (URBG) concept as per the C++17 standard [rand.req.urng] though
+// its implementation differs slightly with [rand.req.eng]. Like its standard
+// library equivalents (e.g. `std::mersenne_twister_engine`)
+// `absl::InsecureBitGen` is not cryptographically secure.
+//
+// Prefer `absl::BitGen` over `absl::InsecureBitGen` as the general type is
+// often fast enough for the vast majority of applications.
+
+using InsecureBitGen =
+    random_internal::NonsecureURBGBase<random_internal::pcg64_2018_engine>;
+
+// ---------------------------------------------------------------------------
+// absl::InsecureBitGen member functions
+// ---------------------------------------------------------------------------
+
+// absl::InsecureBitGen::operator()()
+//
+// Calls the InsecureBitGen, returning a generated value.
+
+// absl::InsecureBitGen::min()
+//
+// Returns the smallest possible value from this bit generator.
+
+// absl::InsecureBitGen::max()
+//
+// Returns the largest possible value from this bit generator.
+
+// absl::InsecureBitGen::discard(num)
+//
+// Advances the internal state of this bit generator by `num` times, and
+// discards the intermediate results.
+// ---------------------------------------------------------------------------
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_RANDOM_H_
diff --git a/third_party/abseil-cpp/absl/random/seed_gen_exception.cc b/third_party/abseil-cpp/absl/random/seed_gen_exception.cc
new file mode 100644
index 0000000..e4271ba
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/seed_gen_exception.cc
@@ -0,0 +1,44 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/seed_gen_exception.h"
+
+#include <iostream>
+
+#include "absl/base/config.h"
+
+namespace absl {
+
+static constexpr const char kExceptionMessage[] =
+    "Failed generating seed-material for URBG.";
+
+SeedGenException::~SeedGenException() = default;
+
+const char* SeedGenException::what() const noexcept {
+  return kExceptionMessage;
+}
+
+namespace random_internal {
+
+void ThrowSeedGenException() {
+#ifdef ABSL_HAVE_EXCEPTIONS
+  throw absl::SeedGenException();
+#else
+  std::cerr << kExceptionMessage << std::endl;
+  std::terminate();
+#endif
+}
+
+}  // namespace random_internal
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/seed_gen_exception.h b/third_party/abseil-cpp/absl/random/seed_gen_exception.h
new file mode 100644
index 0000000..b464d52
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/seed_gen_exception.h
@@ -0,0 +1,51 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: seed_gen_exception.h
+// -----------------------------------------------------------------------------
+//
+// This header defines an exception class which may be thrown if unpredictable
+// events prevent the derivation of suitable seed-material for constructing a
+// bit generator conforming to [rand.req.urng] (eg. entropy cannot be read from
+// /dev/urandom on a Unix-based system).
+//
+// Note: if exceptions are disabled, `std::terminate()` is called instead.
+
+#ifndef ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
+#define ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
+
+#include <exception>
+
+namespace absl {
+
+//------------------------------------------------------------------------------
+// SeedGenException
+//------------------------------------------------------------------------------
+class SeedGenException : public std::exception {
+ public:
+  SeedGenException() = default;
+  ~SeedGenException() override;
+  const char* what() const noexcept override;
+};
+
+namespace random_internal {
+
+// throw delegator
+[[noreturn]] void ThrowSeedGenException();
+
+}  // namespace random_internal
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
diff --git a/third_party/abseil-cpp/absl/random/seed_sequences.cc b/third_party/abseil-cpp/absl/random/seed_sequences.cc
new file mode 100644
index 0000000..9f31961
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/seed_sequences.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/seed_sequences.h"
+
+#include "absl/random/internal/pool_urbg.h"
+
+namespace absl {
+
+SeedSeq MakeSeedSeq() {
+  SeedSeq::result_type seed_material[8];
+  random_internal::RandenPool<uint32_t>::Fill(absl::MakeSpan(seed_material));
+  return SeedSeq(std::begin(seed_material), std::end(seed_material));
+}
+
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/random/seed_sequences.h b/third_party/abseil-cpp/absl/random/seed_sequences.h
new file mode 100644
index 0000000..631d1ecd
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/seed_sequences.h
@@ -0,0 +1,108 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: seed_sequences.h
+// -----------------------------------------------------------------------------
+//
+// This header contains utilities for creating and working with seed sequences
+// conforming to [rand.req.seedseq]. In general, direct construction of seed
+// sequences is discouraged, but use-cases for construction of identical bit
+// generators (using the same seed sequence) may be helpful (e.g. replaying a
+// simulation whose state is derived from variates of a bit generator).
+
+#ifndef ABSL_RANDOM_SEED_SEQUENCES_H_
+#define ABSL_RANDOM_SEED_SEQUENCES_H_
+
+#include <iterator>
+#include <random>
+
+#include "absl/random/internal/salted_seed_seq.h"
+#include "absl/random/internal/seed_material.h"
+#include "absl/random/seed_gen_exception.h"
+#include "absl/types/span.h"
+
+namespace absl {
+
+// -----------------------------------------------------------------------------
+// absl::SeedSeq
+// -----------------------------------------------------------------------------
+//
+// `absl::SeedSeq` constructs a seed sequence according to [rand.req.seedseq]
+// for use within bit generators. `absl::SeedSeq`, unlike `std::seed_seq`
+// additionally salts the generated seeds with extra implementation-defined
+// entropy. For that reason, you can use `absl::SeedSeq` in combination with
+// standard library bit generators (e.g. `std::mt19937`) to introduce
+// non-determinism in your seeds.
+//
+// Example:
+//
+//   absl::SeedSeq my_seed_seq({a, b, c});
+//   std::mt19937 my_bitgen(my_seed_seq);
+//
+using SeedSeq = random_internal::SaltedSeedSeq<std::seed_seq>;
+
+// -----------------------------------------------------------------------------
+// absl::CreateSeedSeqFrom(bitgen*)
+// -----------------------------------------------------------------------------
+//
+// Constructs a seed sequence conforming to [rand.req.seedseq] using variates
+// produced by a provided bit generator.
+//
+// You should generally avoid direct construction of seed sequences, but
+// use-cases for reuse of a seed sequence to construct identical bit generators
+// may be helpful (eg. replaying a simulation whose state is derived from bit
+// generator values).
+//
+// If bitgen == nullptr, then behavior is undefined.
+//
+// Example:
+//
+//   absl::BitGen my_bitgen;
+//   auto seed_seq = absl::CreateSeedSeqFrom(&my_bitgen);
+//   absl::BitGen new_engine(seed_seq); // derived from my_bitgen, but not
+//                                      // correlated.
+//
+template <typename URBG>
+SeedSeq CreateSeedSeqFrom(URBG* urbg) {
+  SeedSeq::result_type
+      seed_material[random_internal::kEntropyBlocksNeeded];
+
+  if (!random_internal::ReadSeedMaterialFromURBG(
+          urbg, absl::MakeSpan(seed_material))) {
+    random_internal::ThrowSeedGenException();
+  }
+  return SeedSeq(std::begin(seed_material), std::end(seed_material));
+}
+
+// -----------------------------------------------------------------------------
+// absl::MakeSeedSeq()
+// -----------------------------------------------------------------------------
+//
+// Constructs an `absl::SeedSeq` salting the generated values using
+// implementation-defined entropy. The returned sequence can be used to create
+// equivalent bit generators correlated using this sequence.
+//
+// Example:
+//
+//   auto my_seed_seq = absl::MakeSeedSeq();
+//   std::mt19937 rng1(my_seed_seq);
+//   std::mt19937 rng2(my_seed_seq);
+//   EXPECT_EQ(rng1(), rng2());
+//
+SeedSeq MakeSeedSeq();
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_SEED_SEQUENCES_H_
diff --git a/third_party/abseil-cpp/absl/random/seed_sequences_test.cc b/third_party/abseil-cpp/absl/random/seed_sequences_test.cc
new file mode 100644
index 0000000..2cc8b0e6
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/seed_sequences_test.cc
@@ -0,0 +1,127 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/seed_sequences.h"
+
+#include <iterator>
+#include <random>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/random/internal/nonsecure_base.h"
+#include "absl/random/random.h"
+namespace {
+
+TEST(SeedSequences, Examples) {
+  {
+    absl::SeedSeq seed_seq({1, 2, 3});
+    absl::BitGen bitgen(seed_seq);
+
+    EXPECT_NE(0, bitgen());
+  }
+  {
+    absl::BitGen engine;
+    auto seed_seq = absl::CreateSeedSeqFrom(&engine);
+    absl::BitGen bitgen(seed_seq);
+
+    EXPECT_NE(engine(), bitgen());
+  }
+  {
+    auto seed_seq = absl::MakeSeedSeq();
+    std::mt19937 random(seed_seq);
+
+    EXPECT_NE(0, random());
+  }
+}
+
+TEST(CreateSeedSeqFrom, CompatibleWithStdTypes) {
+  using ExampleNonsecureURBG =
+      absl::random_internal::NonsecureURBGBase<std::minstd_rand0>;
+
+  // Construct a URBG instance.
+  ExampleNonsecureURBG rng;
+
+  // Construct a Seed Sequence from its variates.
+  auto seq_from_rng = absl::CreateSeedSeqFrom(&rng);
+
+  // Ensure that another URBG can be validly constructed from the Seed Sequence.
+  std::mt19937_64{seq_from_rng};
+}
+
+TEST(CreateSeedSeqFrom, CompatibleWithBitGenerator) {
+  // Construct a URBG instance.
+  absl::BitGen rng;
+
+  // Construct a Seed Sequence from its variates.
+  auto seq_from_rng = absl::CreateSeedSeqFrom(&rng);
+
+  // Ensure that another URBG can be validly constructed from the Seed Sequence.
+  std::mt19937_64{seq_from_rng};
+}
+
+TEST(CreateSeedSeqFrom, CompatibleWithInsecureBitGen) {
+  // Construct a URBG instance.
+  absl::InsecureBitGen rng;
+
+  // Construct a Seed Sequence from its variates.
+  auto seq_from_rng = absl::CreateSeedSeqFrom(&rng);
+
+  // Ensure that another URBG can be validly constructed from the Seed Sequence.
+  std::mt19937_64{seq_from_rng};
+}
+
+TEST(CreateSeedSeqFrom, CompatibleWithRawURBG) {
+  // Construct a URBG instance.
+  std::random_device urandom;
+
+  // Construct a Seed Sequence from its variates, using 64b of seed-material.
+  auto seq_from_rng = absl::CreateSeedSeqFrom(&urandom);
+
+  // Ensure that another URBG can be validly constructed from the Seed Sequence.
+  std::mt19937_64{seq_from_rng};
+}
+
+template <typename URBG>
+void TestReproducibleVariateSequencesForNonsecureURBG() {
+  const size_t kNumVariates = 1000;
+
+  // Master RNG instance.
+  URBG rng;
+  // Reused for both RNG instances.
+  auto reusable_seed = absl::CreateSeedSeqFrom(&rng);
+
+  typename URBG::result_type variates[kNumVariates];
+  {
+    URBG child(reusable_seed);
+    for (auto& variate : variates) {
+      variate = child();
+    }
+  }
+  // Ensure that variate-sequence can be "replayed" by identical RNG.
+  {
+    URBG child(reusable_seed);
+    for (auto& variate : variates) {
+      ASSERT_EQ(variate, child());
+    }
+  }
+}
+
+TEST(CreateSeedSeqFrom, ReproducesVariateSequencesForInsecureBitGen) {
+  TestReproducibleVariateSequencesForNonsecureURBG<absl::InsecureBitGen>();
+}
+
+TEST(CreateSeedSeqFrom, ReproducesVariateSequencesForBitGenerator) {
+  TestReproducibleVariateSequencesForNonsecureURBG<absl::BitGen>();
+}
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/uniform_int_distribution.h b/third_party/abseil-cpp/absl/random/uniform_int_distribution.h
new file mode 100644
index 0000000..4970486
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/uniform_int_distribution.h
@@ -0,0 +1,273 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: uniform_int_distribution.h
+// -----------------------------------------------------------------------------
+//
+// This header defines a class for representing a uniform integer distribution
+// over the closed (inclusive) interval [a,b]. You use this distribution in
+// combination with an Abseil random bit generator to produce random values
+// according to the rules of the distribution.
+//
+// `absl::uniform_int_distribution` is a drop-in replacement for the C++11
+// `std::uniform_int_distribution` [rand.dist.uni.int] but is considerably
+// faster than the libstdc++ implementation.
+
+#ifndef ABSL_RANDOM_UNIFORM_INT_DISTRIBUTION_H_
+#define ABSL_RANDOM_UNIFORM_INT_DISTRIBUTION_H_
+
+#include <cassert>
+#include <istream>
+#include <limits>
+#include <type_traits>
+
+#include "absl/base/optimization.h"
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+#include "absl/random/internal/traits.h"
+
+namespace absl {
+
+// absl::uniform_int_distribution<T>
+//
+// This distribution produces random integer values uniformly distributed in the
+// closed (inclusive) interval [a, b].
+//
+// Example:
+//
+//   absl::BitGen gen;
+//
+//   // Use the distribution to produce a value between 1 and 6, inclusive.
+//   int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen);
+//
+template <typename IntType = int>
+class uniform_int_distribution {
+ private:
+  using unsigned_type =
+      typename random_internal::make_unsigned_bits<IntType>::type;
+
+ public:
+  using result_type = IntType;
+
+  class param_type {
+   public:
+    using distribution_type = uniform_int_distribution;
+
+    explicit param_type(
+        result_type lo = 0,
+        result_type hi = (std::numeric_limits<result_type>::max)())
+        : lo_(lo),
+          range_(static_cast<unsigned_type>(hi) -
+                 static_cast<unsigned_type>(lo)) {
+      // [rand.dist.uni.int] precondition 2
+      assert(lo <= hi);
+    }
+
+    result_type a() const { return lo_; }
+    result_type b() const {
+      return static_cast<result_type>(static_cast<unsigned_type>(lo_) + range_);
+    }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.lo_ == b.lo_ && a.range_ == b.range_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class uniform_int_distribution;
+    unsigned_type range() const { return range_; }
+
+    result_type lo_;
+    unsigned_type range_;
+
+    static_assert(std::is_integral<result_type>::value,
+                  "Class-template absl::uniform_int_distribution<> must be "
+                  "parameterized using an integral type.");
+  };  // param_type
+
+  uniform_int_distribution() : uniform_int_distribution(0) {}
+
+  explicit uniform_int_distribution(
+      result_type lo,
+      result_type hi = (std::numeric_limits<result_type>::max)())
+      : param_(lo, hi) {}
+
+  explicit uniform_int_distribution(const param_type& param) : param_(param) {}
+
+  // uniform_int_distribution<T>::reset()
+  //
+  // Resets the uniform int distribution. Note that this function has no effect
+  // because the distribution already produces independent values.
+  void reset() {}
+
+  template <typename URBG>
+  result_type operator()(URBG& gen) {  // NOLINT(runtime/references)
+    return (*this)(gen, param());
+  }
+
+  template <typename URBG>
+  result_type operator()(
+      URBG& gen, const param_type& param) {  // NOLINT(runtime/references)
+    return param.a() + Generate(gen, param.range());
+  }
+
+  result_type a() const { return param_.a(); }
+  result_type b() const { return param_.b(); }
+
+  param_type param() const { return param_; }
+  void param(const param_type& params) { param_ = params; }
+
+  result_type(min)() const { return a(); }
+  result_type(max)() const { return b(); }
+
+  friend bool operator==(const uniform_int_distribution& a,
+                         const uniform_int_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const uniform_int_distribution& a,
+                         const uniform_int_distribution& b) {
+    return !(a == b);
+  }
+
+ private:
+  // Generates a value in the *closed* interval [0, R]
+  template <typename URBG>
+  unsigned_type Generate(URBG& g,  // NOLINT(runtime/references)
+                         unsigned_type R);
+  param_type param_;
+};
+
+// -----------------------------------------------------------------------------
+// Implementation details follow
+// -----------------------------------------------------------------------------
+template <typename CharT, typename Traits, typename IntType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,
+    const uniform_int_distribution<IntType>& x) {
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os << static_cast<stream_type>(x.a()) << os.fill()
+     << static_cast<stream_type>(x.b());
+  return os;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,
+    uniform_int_distribution<IntType>& x) {
+  using param_type = typename uniform_int_distribution<IntType>::param_type;
+  using result_type = typename uniform_int_distribution<IntType>::result_type;
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+
+  stream_type a;
+  stream_type b;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  is >> a >> b;
+  if (!is.fail()) {
+    x.param(
+        param_type(static_cast<result_type>(a), static_cast<result_type>(b)));
+  }
+  return is;
+}
+
+template <typename IntType>
+template <typename URBG>
+typename random_internal::make_unsigned_bits<IntType>::type
+uniform_int_distribution<IntType>::Generate(
+    URBG& g,  // NOLINT(runtime/references)
+    typename random_internal::make_unsigned_bits<IntType>::type R) {
+    random_internal::FastUniformBits<unsigned_type> fast_bits;
+  unsigned_type bits = fast_bits(g);
+  const unsigned_type Lim = R + 1;
+  if ((R & Lim) == 0) {
+    // If the interval's length is a power of two range, just take the low bits.
+    return bits & R;
+  }
+
+  // Generates a uniform variate on [0, Lim) using fixed-point multiplication.
+  // The above fast-path guarantees that Lim is representable in unsigned_type.
+  //
+  // Algorithm adapted from
+  // http://lemire.me/blog/2016/06/30/fast-random-shuffling/, with added
+  // explanation.
+  //
+  // The algorithm creates a uniform variate `bits` in the interval [0, 2^N),
+  // and treats it as the fractional part of a fixed-point real value in [0, 1),
+  // multiplied by 2^N.  For example, 0.25 would be represented as 2^(N - 2),
+  // because 2^N * 0.25 == 2^(N - 2).
+  //
+  // Next, `bits` and `Lim` are multiplied with a wide-multiply to bring the
+  // value into the range [0, Lim).  The integral part (the high word of the
+  // multiplication result) is then very nearly the desired result.  However,
+  // this is not quite accurate; viewing the multiplication result as one
+  // double-width integer, the resulting values for the sample are mapped as
+  // follows:
+  //
+  // If the result lies in this interval:       Return this value:
+  //        [0, 2^N)                                    0
+  //        [2^N, 2 * 2^N)                              1
+  //        ...                                         ...
+  //        [K * 2^N, (K + 1) * 2^N)                    K
+  //        ...                                         ...
+  //        [(Lim - 1) * 2^N, Lim * 2^N)                Lim - 1
+  //
+  // While all of these intervals have the same size, the result of `bits * Lim`
+  // must be a multiple of `Lim`, and not all of these intervals contain the
+  // same number of multiples of `Lim`.  In particular, some contain
+  // `F = floor(2^N / Lim)` and some contain `F + 1 = ceil(2^N / Lim)`.  This
+  // difference produces a small nonuniformity, which is corrected by applying
+  // rejection sampling to one of the values in the "larger intervals" (i.e.,
+  // the intervals containing `F + 1` multiples of `Lim`.
+  //
+  // An interval contains `F + 1` multiples of `Lim` if and only if its smallest
+  // value modulo 2^N is less than `2^N % Lim`.  The unique value satisfying
+  // this property is used as the one for rejection.  That is, a value of
+  // `bits * Lim` is rejected if `(bit * Lim) % 2^N < (2^N % Lim)`.
+
+  using helper = random_internal::wide_multiply<unsigned_type>;
+  auto product = helper::multiply(bits, Lim);
+
+  // Two optimizations here:
+  // * Rejection occurs with some probability less than 1/2, and for reasonable
+  //   ranges considerably less (in particular, less than 1/(F+1)), so
+  //   ABSL_PREDICT_FALSE is apt.
+  // * `Lim` is an overestimate of `threshold`, and doesn't require a divide.
+  if (ABSL_PREDICT_FALSE(helper::lo(product) < Lim)) {
+    // This quantity is exactly equal to `2^N % Lim`, but does not require high
+    // precision calculations: `2^N % Lim` is congruent to `(2^N - Lim) % Lim`.
+    // Ideally this could be expressed simply as `-X` rather than `2^N - X`, but
+    // for types smaller than int, this calculation is incorrect due to integer
+    // promotion rules.
+    const unsigned_type threshold =
+        ((std::numeric_limits<unsigned_type>::max)() - Lim + 1) % Lim;
+    while (helper::lo(product) < threshold) {
+      bits = fast_bits(g);
+      product = helper::multiply(bits, Lim);
+    }
+  }
+
+  return helper::hi(product);
+}
+
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_UNIFORM_INT_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/uniform_int_distribution_test.cc b/third_party/abseil-cpp/absl/random/uniform_int_distribution_test.cc
new file mode 100644
index 0000000..aacff88d
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/uniform_int_distribution_test.cc
@@ -0,0 +1,250 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/uniform_int_distribution.h"
+
+#include <cmath>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <sstream>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+
+namespace {
+
+template <typename IntType>
+class UniformIntDistributionTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<int8_t, uint8_t, int16_t, uint16_t, int32_t,
+                                  uint32_t, int64_t, uint64_t>;
+TYPED_TEST_SUITE(UniformIntDistributionTest, IntTypes);
+
+TYPED_TEST(UniformIntDistributionTest, ParamSerializeTest) {
+  // This test essentially ensures that the parameters serialize,
+  // not that the values generated cover the full range.
+  using Limits = std::numeric_limits<TypeParam>;
+  using param_type =
+      typename absl::uniform_int_distribution<TypeParam>::param_type;
+  const TypeParam kMin = std::is_unsigned<TypeParam>::value ? 37 : -105;
+  const TypeParam kNegOneOrZero = std::is_unsigned<TypeParam>::value ? 0 : -1;
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  for (const auto& param : {
+           param_type(),
+           param_type(2, 2),  // Same
+           param_type(9, 32),
+           param_type(kMin, 115),
+           param_type(kNegOneOrZero, Limits::max()),
+           param_type(Limits::min(), Limits::max()),
+           param_type(Limits::lowest(), Limits::max()),
+           param_type(Limits::min() + 1, Limits::max() - 1),
+       }) {
+    const auto a = param.a();
+    const auto b = param.b();
+    absl::uniform_int_distribution<TypeParam> before(a, b);
+    EXPECT_EQ(before.a(), param.a());
+    EXPECT_EQ(before.b(), param.b());
+
+    {
+      // Initialize via param_type
+      absl::uniform_int_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+    }
+
+    // Initialize via iostreams
+    std::stringstream ss;
+    ss << before;
+
+    absl::uniform_int_distribution<TypeParam> after(Limits::min() + 3,
+                                                    Limits::max() - 5);
+
+    EXPECT_NE(before.a(), after.a());
+    EXPECT_NE(before.b(), after.b());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+    EXPECT_EQ(before.a(), after.a());
+    EXPECT_EQ(before.b(), after.b());
+    EXPECT_EQ(before.param(), after.param());
+    EXPECT_EQ(before, after);
+
+    // Smoke test.
+    auto sample_min = after.max();
+    auto sample_max = after.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = after(gen);
+      EXPECT_GE(sample, after.min());
+      EXPECT_LE(sample, after.max());
+      if (sample > sample_max) {
+        sample_max = sample;
+      }
+      if (sample < sample_min) {
+        sample_min = sample;
+      }
+    }
+    std::string msg = absl::StrCat("Range: ", +sample_min, ", ", +sample_max);
+    ABSL_RAW_LOG(INFO, "%s", msg.c_str());
+  }
+}
+
+TYPED_TEST(UniformIntDistributionTest, ViolatesPreconditionsDeathTest) {
+#if GTEST_HAS_DEATH_TEST
+  // Hi < Lo
+  EXPECT_DEBUG_DEATH({ absl::uniform_int_distribution<TypeParam> dist(10, 1); },
+                     "");
+#endif  // GTEST_HAS_DEATH_TEST
+#if defined(NDEBUG)
+  // opt-mode, for invalid parameters, will generate a garbage value,
+  // but should not enter an infinite loop.
+  absl::InsecureBitGen gen;
+  absl::uniform_int_distribution<TypeParam> dist(10, 1);
+  auto x = dist(gen);
+
+  // Any value will generate a non-empty std::string.
+  EXPECT_FALSE(absl::StrCat(+x).empty()) << x;
+#endif  // NDEBUG
+}
+
+TYPED_TEST(UniformIntDistributionTest, TestMoments) {
+  constexpr int kSize = 100000;
+  using Limits = std::numeric_limits<TypeParam>;
+  using param_type =
+      typename absl::uniform_int_distribution<TypeParam>::param_type;
+
+  absl::InsecureBitGen rng;
+  std::vector<double> values(kSize);
+  for (const auto& param :
+       {param_type(0, Limits::max()), param_type(13, 127)}) {
+    absl::uniform_int_distribution<TypeParam> dist(param);
+    for (int i = 0; i < kSize; i++) {
+      const auto sample = dist(rng);
+      ASSERT_LE(dist.param().a(), sample);
+      ASSERT_GE(dist.param().b(), sample);
+      values[i] = sample;
+    }
+
+    auto moments = absl::random_internal::ComputeDistributionMoments(values);
+    const double a = dist.param().a();
+    const double b = dist.param().b();
+    const double n = (b - a + 1);
+    const double mean = (a + b) / 2;
+    const double var = ((b - a + 1) * (b - a + 1) - 1) / 12;
+    const double kurtosis = 3 - 6 * (n * n + 1) / (5 * (n * n - 1));
+
+    // TODO(ahh): this is not the right bound
+    // empirically validated with --runs_per_test=10000.
+    EXPECT_NEAR(mean, moments.mean, 0.01 * var);
+    EXPECT_NEAR(var, moments.variance, 0.015 * var);
+    EXPECT_NEAR(0.0, moments.skewness, 0.025);
+    EXPECT_NEAR(kurtosis, moments.kurtosis, 0.02 * kurtosis);
+  }
+}
+
+TYPED_TEST(UniformIntDistributionTest, ChiSquaredTest50) {
+  using absl::random_internal::kChiSquared;
+
+  constexpr size_t kTrials = 1000;
+  constexpr int kBuckets = 50;  // inclusive, so actally +1
+  constexpr double kExpected =
+      static_cast<double>(kTrials) / static_cast<double>(kBuckets);
+
+  // Empirically validated with --runs_per_test=10000.
+  const int kThreshold =
+      absl::random_internal::ChiSquareValue(kBuckets, 0.999999);
+
+  const TypeParam min = std::is_unsigned<TypeParam>::value ? 37 : -37;
+  const TypeParam max = min + kBuckets;
+
+  absl::InsecureBitGen rng;
+  absl::uniform_int_distribution<TypeParam> dist(min, max);
+
+  std::vector<int32_t> counts(kBuckets + 1, 0);
+  for (size_t i = 0; i < kTrials; i++) {
+    auto x = dist(rng);
+    counts[x - min]++;
+  }
+  double chi_square = absl::random_internal::ChiSquareWithExpected(
+      std::begin(counts), std::end(counts), kExpected);
+  if (chi_square > kThreshold) {
+    double p_value =
+        absl::random_internal::ChiSquarePValue(chi_square, kBuckets);
+
+    // Chi-squared test failed. Output does not appear to be uniform.
+    std::string msg;
+    for (const auto& a : counts) {
+      absl::StrAppend(&msg, a, "\n");
+    }
+    absl::StrAppend(&msg, kChiSquared, " p-value ", p_value, "\n");
+    absl::StrAppend(&msg, "High ", kChiSquared, " value: ", chi_square, " > ",
+                    kThreshold);
+    ABSL_RAW_LOG(INFO, "%s", msg.c_str());
+    FAIL() << msg;
+  }
+}
+
+TEST(UniformIntDistributionTest, StabilityTest) {
+  // absl::uniform_int_distribution stability relies only on integer operations.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(12);
+
+  {
+    absl::uniform_int_distribution<int32_t> dist(0, 4);
+    for (auto& v : output) {
+      v = dist(urbg);
+    }
+  }
+  EXPECT_EQ(12, urbg.invocations());
+  EXPECT_THAT(output, testing::ElementsAre(4, 4, 3, 2, 1, 0, 1, 4, 3, 1, 3, 1));
+
+  {
+    urbg.reset();
+    absl::uniform_int_distribution<int32_t> dist(0, 100);
+    for (auto& v : output) {
+      v = dist(urbg);
+    }
+  }
+  EXPECT_EQ(12, urbg.invocations());
+  EXPECT_THAT(output, testing::ElementsAre(97, 86, 75, 41, 36, 16, 38, 92, 67,
+                                           30, 80, 38));
+
+  {
+    urbg.reset();
+    absl::uniform_int_distribution<int32_t> dist(0, 10000);
+    for (auto& v : output) {
+      v = dist(urbg);
+    }
+  }
+  EXPECT_EQ(12, urbg.invocations());
+  EXPECT_THAT(output, testing::ElementsAre(9648, 8562, 7439, 4089, 3571, 1602,
+                                           3813, 9195, 6641, 2986, 7956, 3765));
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/uniform_real_distribution.h b/third_party/abseil-cpp/absl/random/uniform_real_distribution.h
new file mode 100644
index 0000000..600f915
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/uniform_real_distribution.h
@@ -0,0 +1,193 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: uniform_real_distribution.h
+// -----------------------------------------------------------------------------
+//
+// This header defines a class for representing a uniform floating-point
+// distribution over a half-open interval [a,b). You use this distribution in
+// combination with an Abseil random bit generator to produce random values
+// according to the rules of the distribution.
+//
+// `absl::uniform_real_distribution` is a drop-in replacement for the C++11
+// `std::uniform_real_distribution` [rand.dist.uni.real] but is considerably
+// faster than the libstdc++ implementation.
+//
+// Note: the standard-library version may occasionally return `1.0` when
+// default-initialized. See https://bugs.llvm.org//show_bug.cgi?id=18767
+// `absl::uniform_real_distribution` does not exhibit this behavior.
+
+#ifndef ABSL_RANDOM_UNIFORM_REAL_DISTRIBUTION_H_
+#define ABSL_RANDOM_UNIFORM_REAL_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <cstdint>
+#include <istream>
+#include <limits>
+#include <type_traits>
+
+#include "absl/random/internal/distribution_impl.h"
+#include "absl/random/internal/fast_uniform_bits.h"
+#include "absl/random/internal/iostream_state_saver.h"
+
+namespace absl {
+
+// absl::uniform_real_distribution<T>
+//
+// This distribution produces random floating-point values uniformly distributed
+// over the half-open interval [a, b).
+//
+// Example:
+//
+//   absl::BitGen gen;
+//
+//   // Use the distribution to produce a value between 0.0 (inclusive)
+//   // and 1.0 (exclusive).
+//   int value = absl::uniform_real_distribution<double>(0, 1)(gen);
+//
+template <typename RealType = double>
+class uniform_real_distribution {
+ public:
+  using result_type = RealType;
+
+  class param_type {
+   public:
+    using distribution_type = uniform_real_distribution;
+
+    explicit param_type(result_type lo = 0, result_type hi = 1)
+        : lo_(lo), hi_(hi), range_(hi - lo) {
+      // [rand.dist.uni.real] preconditions 2 & 3
+      assert(lo <= hi);
+      // NOTE: For integral types, we can promote the range to an unsigned type,
+      // which gives full width of the range. However for real (fp) types, this
+      // is not possible, so value generation cannot use the full range of the
+      // real type.
+      assert(range_ <= (std::numeric_limits<result_type>::max)());
+    }
+
+    result_type a() const { return lo_; }
+    result_type b() const { return hi_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.lo_ == b.lo_ && a.hi_ == b.hi_;
+    }
+
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class uniform_real_distribution;
+    result_type lo_, hi_, range_;
+
+    static_assert(std::is_floating_point<RealType>::value,
+                  "Class-template absl::uniform_real_distribution<> must be "
+                  "parameterized using a floating-point type.");
+  };
+
+  uniform_real_distribution() : uniform_real_distribution(0) {}
+
+  explicit uniform_real_distribution(result_type lo, result_type hi = 1)
+      : param_(lo, hi) {}
+
+  explicit uniform_real_distribution(const param_type& param) : param_(param) {}
+
+  // uniform_real_distribution<T>::reset()
+  //
+  // Resets the uniform real distribution. Note that this function has no effect
+  // because the distribution already produces independent values.
+  void reset() {}
+
+  template <typename URBG>
+  result_type operator()(URBG& gen) {  // NOLINT(runtime/references)
+    return operator()(gen, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& gen,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  result_type a() const { return param_.a(); }
+  result_type b() const { return param_.b(); }
+
+  param_type param() const { return param_; }
+  void param(const param_type& params) { param_ = params; }
+
+  result_type(min)() const { return a(); }
+  result_type(max)() const { return b(); }
+
+  friend bool operator==(const uniform_real_distribution& a,
+                         const uniform_real_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const uniform_real_distribution& a,
+                         const uniform_real_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+  random_internal::FastUniformBits<uint64_t> fast_u64_;
+};
+
+// -----------------------------------------------------------------------------
+// Implementation details follow
+// -----------------------------------------------------------------------------
+template <typename RealType>
+template <typename URBG>
+typename uniform_real_distribution<RealType>::result_type
+uniform_real_distribution<RealType>::operator()(
+    URBG& gen, const param_type& p) {  // NOLINT(runtime/references)
+  using random_internal::PositiveValueT;
+  while (true) {
+    const result_type sample = random_internal::RandU64ToReal<
+        result_type>::template Value<PositiveValueT, true>(fast_u64_(gen));
+    const result_type res = p.a() + (sample * p.range_);
+    if (res < p.b() || p.range_ <= 0 || !std::isfinite(p.range_)) {
+      return res;
+    }
+    // else sample rejected, try again.
+  }
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const uniform_real_distribution<RealType>& x) {
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
+  os << x.a() << os.fill() << x.b();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename RealType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,     // NOLINT(runtime/references)
+    uniform_real_distribution<RealType>& x) {  // NOLINT(runtime/references)
+  using param_type = typename uniform_real_distribution<RealType>::param_type;
+  using result_type = typename uniform_real_distribution<RealType>::result_type;
+  auto saver = random_internal::make_istream_state_saver(is);
+  auto a = random_internal::read_floating_point<result_type>(is);
+  if (is.fail()) return is;
+  auto b = random_internal::read_floating_point<result_type>(is);
+  if (!is.fail()) {
+    x.param(param_type(a, b));
+  }
+  return is;
+}
+}  // namespace absl
+
+#endif  // ABSL_RANDOM_UNIFORM_REAL_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/uniform_real_distribution_test.cc b/third_party/abseil-cpp/absl/random/uniform_real_distribution_test.cc
new file mode 100644
index 0000000..597f0ee
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/uniform_real_distribution_test.cc
@@ -0,0 +1,322 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/uniform_real_distribution.h"
+
+#include <cmath>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/distribution_test_util.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+
+// NOTES:
+// * Some documentation on generating random real values suggests that
+//   it is possible to use std::nextafter(b, DBL_MAX) to generate a value on
+//   the closed range [a, b]. Unfortunately, that technique is not universally
+//   reliable due to floating point quantization.
+//
+// * absl::uniform_real_distribution<float> generates between 2^28 and 2^29
+//   distinct floating point values in the range [0, 1).
+//
+// * absl::uniform_real_distribution<float> generates at least 2^23 distinct
+//   floating point values in the range [1, 2). This should be the same as
+//   any other range covered by a single exponent in IEEE 754.
+//
+// * absl::uniform_real_distribution<double> generates more than 2^52 distinct
+//   values in the range [0, 1), and should generate at least 2^52 distinct
+//   values in the range of [1, 2).
+//
+
+namespace {
+
+template <typename RealType>
+class UniformRealDistributionTest : public ::testing::Test {};
+
+using RealTypes = ::testing::Types<float, double, long double>;
+TYPED_TEST_SUITE(UniformRealDistributionTest, RealTypes);
+
+TYPED_TEST(UniformRealDistributionTest, ParamSerializeTest) {
+  using param_type =
+      typename absl::uniform_real_distribution<TypeParam>::param_type;
+
+  constexpr const TypeParam a{1152921504606846976};
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  for (const auto& param : {
+           param_type(),
+           param_type(TypeParam(2.0), TypeParam(2.0)),  // Same
+           param_type(TypeParam(-0.1), TypeParam(0.1)),
+           param_type(TypeParam(0.05), TypeParam(0.12)),
+           param_type(TypeParam(-0.05), TypeParam(0.13)),
+           param_type(TypeParam(-0.05), TypeParam(-0.02)),
+           // double range = 0
+           // 2^60 , 2^60 + 2^6
+           param_type(a, TypeParam(1152921504606847040)),
+           // 2^60 , 2^60 + 2^7
+           param_type(a, TypeParam(1152921504606847104)),
+           // double range = 2^8
+           // 2^60 , 2^60 + 2^8
+           param_type(a, TypeParam(1152921504606847232)),
+           // float range = 0
+           // 2^60 , 2^60 + 2^36
+           param_type(a, TypeParam(1152921573326323712)),
+           // 2^60 , 2^60 + 2^37
+           param_type(a, TypeParam(1152921642045800448)),
+           // float range = 2^38
+           // 2^60 , 2^60 + 2^38
+           param_type(a, TypeParam(1152921779484753920)),
+           // Limits
+           param_type(0, std::numeric_limits<TypeParam>::max()),
+           param_type(std::numeric_limits<TypeParam>::lowest(), 0),
+           param_type(0, std::numeric_limits<TypeParam>::epsilon()),
+           param_type(-std::numeric_limits<TypeParam>::epsilon(),
+                      std::numeric_limits<TypeParam>::epsilon()),
+           param_type(std::numeric_limits<TypeParam>::epsilon(),
+                      2 * std::numeric_limits<TypeParam>::epsilon()),
+       }) {
+    // Validate parameters.
+    const auto a = param.a();
+    const auto b = param.b();
+    absl::uniform_real_distribution<TypeParam> before(a, b);
+    EXPECT_EQ(before.a(), param.a());
+    EXPECT_EQ(before.b(), param.b());
+
+    {
+      absl::uniform_real_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+    }
+
+    std::stringstream ss;
+    ss << before;
+    absl::uniform_real_distribution<TypeParam> after(TypeParam(1.0),
+                                                     TypeParam(3.1));
+
+    EXPECT_NE(before.a(), after.a());
+    EXPECT_NE(before.b(), after.b());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+    EXPECT_EQ(before.a(), after.a());
+    EXPECT_EQ(before.b(), after.b());
+    EXPECT_EQ(before.param(), after.param());
+    EXPECT_EQ(before, after);
+
+    // Smoke test.
+    auto sample_min = after.max();
+    auto sample_max = after.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = after(gen);
+      // Failure here indicates a bug in uniform_real_distribution::operator(),
+      // or bad parameters--range too large, etc.
+      if (after.min() == after.max()) {
+        EXPECT_EQ(sample, after.min());
+      } else {
+        EXPECT_GE(sample, after.min());
+        EXPECT_LT(sample, after.max());
+      }
+      if (sample > sample_max) {
+        sample_max = sample;
+      }
+      if (sample < sample_min) {
+        sample_min = sample;
+      }
+    }
+
+    if (!std::is_same<TypeParam, long double>::value) {
+      // static_cast<double>(long double) can overflow.
+      std::string msg = absl::StrCat("Range: ", static_cast<double>(sample_min),
+                                     ", ", static_cast<double>(sample_max));
+      ABSL_RAW_LOG(INFO, "%s", msg.c_str());
+    }
+  }
+}
+
+TYPED_TEST(UniformRealDistributionTest, ViolatesPreconditionsDeathTest) {
+#if GTEST_HAS_DEATH_TEST
+  // Hi < Lo
+  EXPECT_DEBUG_DEATH(
+      { absl::uniform_real_distribution<TypeParam> dist(10.0, 1.0); }, "");
+
+  // Hi - Lo > numeric_limits<>::max()
+  EXPECT_DEBUG_DEATH(
+      {
+        absl::uniform_real_distribution<TypeParam> dist(
+            std::numeric_limits<TypeParam>::lowest(),
+            std::numeric_limits<TypeParam>::max());
+      },
+      "");
+#endif  // GTEST_HAS_DEATH_TEST
+#if defined(NDEBUG)
+  // opt-mode, for invalid parameters, will generate a garbage value,
+  // but should not enter an infinite loop.
+  absl::InsecureBitGen gen;
+  {
+    absl::uniform_real_distribution<TypeParam> dist(10.0, 1.0);
+    auto x = dist(gen);
+    EXPECT_FALSE(std::isnan(x)) << x;
+  }
+  {
+    absl::uniform_real_distribution<TypeParam> dist(
+        std::numeric_limits<TypeParam>::lowest(),
+        std::numeric_limits<TypeParam>::max());
+    auto x = dist(gen);
+    // Infinite result.
+    EXPECT_FALSE(std::isfinite(x)) << x;
+  }
+#endif  // NDEBUG
+}
+
+TYPED_TEST(UniformRealDistributionTest, TestMoments) {
+  constexpr int kSize = 1000000;
+  std::vector<double> values(kSize);
+
+  absl::InsecureBitGen rng;
+  absl::uniform_real_distribution<TypeParam> dist;
+  for (int i = 0; i < kSize; i++) {
+    values[i] = dist(rng);
+  }
+
+  const auto moments =
+      absl::random_internal::ComputeDistributionMoments(values);
+  EXPECT_NEAR(0.5, moments.mean, 0.01);
+  EXPECT_NEAR(1 / 12.0, moments.variance, 0.015);
+  EXPECT_NEAR(0.0, moments.skewness, 0.02);
+  EXPECT_NEAR(9 / 5.0, moments.kurtosis, 0.015);
+}
+
+TYPED_TEST(UniformRealDistributionTest, ChiSquaredTest50) {
+  using absl::random_internal::kChiSquared;
+  using param_type =
+      typename absl::uniform_real_distribution<TypeParam>::param_type;
+
+  constexpr size_t kTrials = 100000;
+  constexpr int kBuckets = 50;
+  constexpr double kExpected =
+      static_cast<double>(kTrials) / static_cast<double>(kBuckets);
+
+  // 1-in-100000 threshold, but remember, there are about 8 tests
+  // in this file. And the test could fail for other reasons.
+  // Empirically validated with --runs_per_test=10000.
+  const int kThreshold =
+      absl::random_internal::ChiSquareValue(kBuckets - 1, 0.999999);
+
+  absl::InsecureBitGen rng;
+  for (const auto& param : {param_type(0, 1), param_type(5, 12),
+                            param_type(-5, 13), param_type(-5, -2)}) {
+    const double min_val = param.a();
+    const double max_val = param.b();
+    const double factor = kBuckets / (max_val - min_val);
+
+    std::vector<int32_t> counts(kBuckets, 0);
+    absl::uniform_real_distribution<TypeParam> dist(param);
+    for (size_t i = 0; i < kTrials; i++) {
+      auto x = dist(rng);
+      auto bucket = static_cast<size_t>((x - min_val) * factor);
+      counts[bucket]++;
+    }
+
+    double chi_square = absl::random_internal::ChiSquareWithExpected(
+        std::begin(counts), std::end(counts), kExpected);
+    if (chi_square > kThreshold) {
+      double p_value =
+          absl::random_internal::ChiSquarePValue(chi_square, kBuckets);
+
+      // Chi-squared test failed. Output does not appear to be uniform.
+      std::string msg;
+      for (const auto& a : counts) {
+        absl::StrAppend(&msg, a, "\n");
+      }
+      absl::StrAppend(&msg, kChiSquared, " p-value ", p_value, "\n");
+      absl::StrAppend(&msg, "High ", kChiSquared, " value: ", chi_square, " > ",
+                      kThreshold);
+      ABSL_RAW_LOG(INFO, "%s", msg.c_str());
+      FAIL() << msg;
+    }
+  }
+}
+
+TYPED_TEST(UniformRealDistributionTest, StabilityTest) {
+  // absl::uniform_real_distribution stability relies only on
+  // random_internal::RandU64ToDouble and random_internal::RandU64ToFloat.
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(12);
+
+  absl::uniform_real_distribution<TypeParam> dist;
+  std::generate(std::begin(output), std::end(output), [&] {
+    return static_cast<int>(TypeParam(1000000) * dist(urbg));
+  });
+
+  EXPECT_THAT(
+      output,  //
+      testing::ElementsAre(59, 999246, 762494, 395876, 167716, 82545, 925251,
+                           77341, 12527, 708791, 834451, 932808));
+}
+
+TEST(UniformRealDistributionTest, AlgorithmBounds) {
+  absl::uniform_real_distribution<double> dist;
+
+  {
+    // This returns the smallest value >0 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0x0000000000000001ull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 5.42101086242752217004e-20);
+  }
+
+  {
+    // This returns a value very near 0.5 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0x7fffffffffffffefull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 0.499999999999999944489);
+  }
+  {
+    // This returns a value very near 0.5 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0x8000000000000000ull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 0.5);
+  }
+
+  {
+    // This returns the largest value <1 from absl::uniform_real_distribution.
+    absl::random_internal::sequence_urbg urbg({0xFFFFFFFFFFFFFFEFull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 0.999999999999999888978);
+  }
+  {
+    // This *ALSO* returns the largest value <1.
+    absl::random_internal::sequence_urbg urbg({0xFFFFFFFFFFFFFFFFull});
+    double a = dist(urbg);
+    EXPECT_EQ(a, 0.999999999999999888978);
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/random/zipf_distribution.h b/third_party/abseil-cpp/absl/random/zipf_distribution.h
new file mode 100644
index 0000000..1e4dba8
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/zipf_distribution.h
@@ -0,0 +1,269 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_RANDOM_ZIPF_DISTRIBUTION_H_
+#define ABSL_RANDOM_ZIPF_DISTRIBUTION_H_
+
+#include <cassert>
+#include <cmath>
+#include <istream>
+#include <limits>
+#include <ostream>
+#include <type_traits>
+
+#include "absl/random/internal/iostream_state_saver.h"
+#include "absl/random/uniform_real_distribution.h"
+
+namespace absl {
+
+// absl::zipf_distribution produces random integer-values in the range [0, k],
+// distributed according to the discrete probability function:
+//
+//  P(x) = (v + x) ^ -q
+//
+// The parameter `v` must be greater than 0 and the parameter `q` must be
+// greater than 1. If either of these parameters take invalid values then the
+// behavior is undefined.
+//
+// IntType is the result_type generated by the generator. It must be of integral
+// type; a static_assert ensures this is the case.
+//
+// The implementation is based on W.Hormann, G.Derflinger:
+//
+// "Rejection-Inversion to Generate Variates from Monotone Discrete
+// Distributions"
+//
+// http://eeyore.wu-wien.ac.at/papers/96-04-04.wh-der.ps.gz
+//
+template <typename IntType = int>
+class zipf_distribution {
+ public:
+  using result_type = IntType;
+
+  class param_type {
+   public:
+    using distribution_type = zipf_distribution;
+
+    // Preconditions: k > 0, v > 0, q > 1
+    // The precondidtions are validated when NDEBUG is not defined via
+    // a pair of assert() directives.
+    // If NDEBUG is defined and either or both of these parameters take invalid
+    // values, the behavior of the class is undefined.
+    explicit param_type(result_type k = (std::numeric_limits<IntType>::max)(),
+                        double q = 2.0, double v = 1.0);
+
+    result_type k() const { return k_; }
+    double q() const { return q_; }
+    double v() const { return v_; }
+
+    friend bool operator==(const param_type& a, const param_type& b) {
+      return a.k_ == b.k_ && a.q_ == b.q_ && a.v_ == b.v_;
+    }
+    friend bool operator!=(const param_type& a, const param_type& b) {
+      return !(a == b);
+    }
+
+   private:
+    friend class zipf_distribution;
+    inline double h(double x) const;
+    inline double hinv(double x) const;
+    inline double compute_s() const;
+    inline double pow_negative_q(double x) const;
+
+    // Parameters here are exactly the same as the parameters of Algorithm ZRI
+    // in the paper.
+    IntType k_;
+    double q_;
+    double v_;
+
+    double one_minus_q_;  // 1-q
+    double s_;
+    double one_minus_q_inv_;  // 1 / 1-q
+    double hxm_;              // h(k + 0.5)
+    double hx0_minus_hxm_;    // h(x0) - h(k + 0.5)
+
+    static_assert(std::is_integral<IntType>::value,
+                  "Class-template absl::zipf_distribution<> must be "
+                  "parameterized using an integral type.");
+  };
+
+  zipf_distribution()
+      : zipf_distribution((std::numeric_limits<IntType>::max)()) {}
+
+  explicit zipf_distribution(result_type k, double q = 2.0, double v = 1.0)
+      : param_(k, q, v) {}
+
+  explicit zipf_distribution(const param_type& p) : param_(p) {}
+
+  void reset() {}
+
+  template <typename URBG>
+  result_type operator()(URBG& g) {  // NOLINT(runtime/references)
+    return (*this)(g, param_);
+  }
+
+  template <typename URBG>
+  result_type operator()(URBG& g,  // NOLINT(runtime/references)
+                         const param_type& p);
+
+  result_type k() const { return param_.k(); }
+  double q() const { return param_.q(); }
+  double v() const { return param_.v(); }
+
+  param_type param() const { return param_; }
+  void param(const param_type& p) { param_ = p; }
+
+  result_type(min)() const { return 0; }
+  result_type(max)() const { return k(); }
+
+  friend bool operator==(const zipf_distribution& a,
+                         const zipf_distribution& b) {
+    return a.param_ == b.param_;
+  }
+  friend bool operator!=(const zipf_distribution& a,
+                         const zipf_distribution& b) {
+    return a.param_ != b.param_;
+  }
+
+ private:
+  param_type param_;
+};
+
+// --------------------------------------------------------------------------
+// Implementation details follow
+// --------------------------------------------------------------------------
+
+template <typename IntType>
+zipf_distribution<IntType>::param_type::param_type(
+    typename zipf_distribution<IntType>::result_type k, double q, double v)
+    : k_(k), q_(q), v_(v), one_minus_q_(1 - q) {
+  assert(q > 1);
+  assert(v > 0);
+  assert(k > 0);
+  one_minus_q_inv_ = 1 / one_minus_q_;
+
+  // Setup for the ZRI algorithm (pg 17 of the paper).
+  // Compute: h(i max) => h(k + 0.5)
+  constexpr double kMax = 18446744073709549568.0;
+  double kd = static_cast<double>(k);
+  // TODO(absl-team): Determine if this check is needed, and if so, add a test
+  // that fails for k > kMax
+  if (kd > kMax) {
+    // Ensure that our maximum value is capped to a value which will
+    // round-trip back through double.
+    kd = kMax;
+  }
+  hxm_ = h(kd + 0.5);
+
+  // Compute: h(0)
+  const bool use_precomputed = (v == 1.0 && q == 2.0);
+  const double h0x5 = use_precomputed ? (-1.0 / 1.5)  // exp(-log(1.5))
+                                      : h(0.5);
+  const double elogv_q = (v_ == 1.0) ? 1 : pow_negative_q(v_);
+
+  // h(0) = h(0.5) - exp(log(v) * -q)
+  hx0_minus_hxm_ = (h0x5 - elogv_q) - hxm_;
+
+  // And s
+  s_ = use_precomputed ? 0.46153846153846123 : compute_s();
+}
+
+template <typename IntType>
+double zipf_distribution<IntType>::param_type::h(double x) const {
+  // std::exp(one_minus_q_ * std::log(v_ + x)) * one_minus_q_inv_;
+  x += v_;
+  return (one_minus_q_ == -1.0)
+             ? (-1.0 / x)  // -exp(-log(x))
+             : (std::exp(std::log(x) * one_minus_q_) * one_minus_q_inv_);
+}
+
+template <typename IntType>
+double zipf_distribution<IntType>::param_type::hinv(double x) const {
+  // std::exp(one_minus_q_inv_ * std::log(one_minus_q_ * x)) - v_;
+  return -v_ + ((one_minus_q_ == -1.0)
+                    ? (-1.0 / x)  // exp(-log(-x))
+                    : std::exp(one_minus_q_inv_ * std::log(one_minus_q_ * x)));
+}
+
+template <typename IntType>
+double zipf_distribution<IntType>::param_type::compute_s() const {
+  // 1 - hinv(h(1.5) - std::exp(std::log(v_ + 1) * -q_));
+  return 1.0 - hinv(h(1.5) - pow_negative_q(v_ + 1.0));
+}
+
+template <typename IntType>
+double zipf_distribution<IntType>::param_type::pow_negative_q(double x) const {
+  // std::exp(std::log(x) * -q_);
+  return q_ == 2.0 ? (1.0 / (x * x)) : std::exp(std::log(x) * -q_);
+}
+
+template <typename IntType>
+template <typename URBG>
+typename zipf_distribution<IntType>::result_type
+zipf_distribution<IntType>::operator()(
+    URBG& g, const param_type& p) {  // NOLINT(runtime/references)
+  absl::uniform_real_distribution<double> uniform_double;
+  double k;
+  for (;;) {
+    const double v = uniform_double(g);
+    const double u = p.hxm_ + v * p.hx0_minus_hxm_;
+    const double x = p.hinv(u);
+    k = rint(x);              // std::floor(x + 0.5);
+    if (k > p.k()) continue;  // reject k > max_k
+    if (k - x <= p.s_) break;
+    const double h = p.h(k + 0.5);
+    const double r = p.pow_negative_q(p.v_ + k);
+    if (u >= h - r) break;
+  }
+  IntType ki = static_cast<IntType>(k);
+  assert(ki <= p.k_);
+  return ki;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_ostream<CharT, Traits>& operator<<(
+    std::basic_ostream<CharT, Traits>& os,  // NOLINT(runtime/references)
+    const zipf_distribution<IntType>& x) {
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+  auto saver = random_internal::make_ostream_state_saver(os);
+  os.precision(random_internal::stream_precision_helper<double>::kPrecision);
+  os << static_cast<stream_type>(x.k()) << os.fill() << x.q() << os.fill()
+     << x.v();
+  return os;
+}
+
+template <typename CharT, typename Traits, typename IntType>
+std::basic_istream<CharT, Traits>& operator>>(
+    std::basic_istream<CharT, Traits>& is,  // NOLINT(runtime/references)
+    zipf_distribution<IntType>& x) {        // NOLINT(runtime/references)
+  using result_type = typename zipf_distribution<IntType>::result_type;
+  using param_type = typename zipf_distribution<IntType>::param_type;
+  using stream_type =
+      typename random_internal::stream_format_type<IntType>::type;
+  stream_type k;
+  double q;
+  double v;
+
+  auto saver = random_internal::make_istream_state_saver(is);
+  is >> k >> q >> v;
+  if (!is.fail()) {
+    x.param(param_type(static_cast<result_type>(k), q, v));
+  }
+  return is;
+}
+
+}  // namespace absl.
+
+#endif  // ABSL_RANDOM_ZIPF_DISTRIBUTION_H_
diff --git a/third_party/abseil-cpp/absl/random/zipf_distribution_test.cc b/third_party/abseil-cpp/absl/random/zipf_distribution_test.cc
new file mode 100644
index 0000000..4d4a0fcf
--- /dev/null
+++ b/third_party/abseil-cpp/absl/random/zipf_distribution_test.cc
@@ -0,0 +1,423 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/random/zipf_distribution.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <random>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/random/internal/chi_square.h"
+#include "absl/random/internal/sequence_urbg.h"
+#include "absl/random/random.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+
+namespace {
+
+using ::absl::random_internal::kChiSquared;
+using ::testing::ElementsAre;
+
+template <typename IntType>
+class ZipfDistributionTypedTest : public ::testing::Test {};
+
+using IntTypes = ::testing::Types<int, int8_t, int16_t, int32_t, int64_t,
+                                  uint8_t, uint16_t, uint32_t, uint64_t>;
+TYPED_TEST_CASE(ZipfDistributionTypedTest, IntTypes);
+
+TYPED_TEST(ZipfDistributionTypedTest, SerializeTest) {
+  using param_type = typename absl::zipf_distribution<TypeParam>::param_type;
+
+  constexpr int kCount = 1000;
+  absl::InsecureBitGen gen;
+  for (const auto& param : {
+           param_type(),
+           param_type(32),
+           param_type(100, 3, 2),
+           param_type(std::numeric_limits<TypeParam>::max(), 4, 3),
+           param_type(std::numeric_limits<TypeParam>::max() / 2),
+       }) {
+    // Validate parameters.
+    const auto k = param.k();
+    const auto q = param.q();
+    const auto v = param.v();
+
+    absl::zipf_distribution<TypeParam> before(k, q, v);
+    EXPECT_EQ(before.k(), param.k());
+    EXPECT_EQ(before.q(), param.q());
+    EXPECT_EQ(before.v(), param.v());
+
+    {
+      absl::zipf_distribution<TypeParam> via_param(param);
+      EXPECT_EQ(via_param, before);
+    }
+
+    // Validate stream serialization.
+    std::stringstream ss;
+    ss << before;
+    absl::zipf_distribution<TypeParam> after(4, 5.5, 4.4);
+
+    EXPECT_NE(before.k(), after.k());
+    EXPECT_NE(before.q(), after.q());
+    EXPECT_NE(before.v(), after.v());
+    EXPECT_NE(before.param(), after.param());
+    EXPECT_NE(before, after);
+
+    ss >> after;
+
+    EXPECT_EQ(before.k(), after.k());
+    EXPECT_EQ(before.q(), after.q());
+    EXPECT_EQ(before.v(), after.v());
+    EXPECT_EQ(before.param(), after.param());
+    EXPECT_EQ(before, after);
+
+    // Smoke test.
+    auto sample_min = after.max();
+    auto sample_max = after.min();
+    for (int i = 0; i < kCount; i++) {
+      auto sample = after(gen);
+      EXPECT_GE(sample, after.min());
+      EXPECT_LE(sample, after.max());
+      if (sample > sample_max) sample_max = sample;
+      if (sample < sample_min) sample_min = sample;
+    }
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrCat("Range: ", +sample_min, ", ", +sample_max));
+  }
+}
+
+class ZipfModel {
+ public:
+  ZipfModel(size_t k, double q, double v) : k_(k), q_(q), v_(v) {}
+
+  double mean() const { return mean_; }
+
+  // For the other moments of the Zipf distribution, see, for example,
+  // http://mathworld.wolfram.com/ZipfDistribution.html
+
+  // PMF(k) = (1 / k^s) / H(N,s)
+  // Returns the probability that any single invocation returns k.
+  double PMF(size_t i) { return i >= hnq_.size() ? 0.0 : hnq_[i] / sum_hnq_; }
+
+  // CDF = H(k, s) / H(N,s)
+  double CDF(size_t i) {
+    if (i >= hnq_.size()) {
+      return 1.0;
+    }
+    auto it = std::begin(hnq_);
+    double h = 0.0;
+    for (const auto end = it; it != end; it++) {
+      h += *it;
+    }
+    return h / sum_hnq_;
+  }
+
+  // The InverseCDF returns the k values which bound p on the upper and lower
+  // bound. Since there is no closed-form solution, this is implemented as a
+  // bisction of the cdf.
+  std::pair<size_t, size_t> InverseCDF(double p) {
+    size_t min = 0;
+    size_t max = hnq_.size();
+    while (max > min + 1) {
+      size_t target = (max + min) >> 1;
+      double x = CDF(target);
+      if (x > p) {
+        max = target;
+      } else {
+        min = target;
+      }
+    }
+    return {min, max};
+  }
+
+  // Compute the probability totals, which are based on the generalized harmonic
+  // number, H(N,s).
+  //   H(N,s) == SUM(k=1..N, 1 / k^s)
+  //
+  // In the limit, H(N,s) == zetac(s) + 1.
+  //
+  // NOTE: The mean of a zipf distribution could be computed here as well.
+  // Mean :=  H(N, s-1) / H(N,s).
+  // Given the parameter v = 1, this gives the following function:
+  // (Hn(100, 1) - Hn(1,1)) / (Hn(100,2) - Hn(1,2)) = 6.5944
+  //
+  void Init() {
+    if (!hnq_.empty()) {
+      return;
+    }
+    hnq_.clear();
+    hnq_.reserve(std::min(k_, size_t{1000}));
+
+    sum_hnq_ = 0;
+    double qm1 = q_ - 1.0;
+    double sum_hnq_m1 = 0;
+    for (size_t i = 0; i < k_; i++) {
+      // Partial n-th generalized harmonic number
+      const double x = v_ + i;
+
+      // H(n, q-1)
+      const double hnqm1 =
+          (q_ == 2.0) ? (1.0 / x)
+                      : (q_ == 3.0) ? (1.0 / (x * x)) : std::pow(x, -qm1);
+      sum_hnq_m1 += hnqm1;
+
+      // H(n, q)
+      const double hnq =
+          (q_ == 2.0) ? (1.0 / (x * x))
+                      : (q_ == 3.0) ? (1.0 / (x * x * x)) : std::pow(x, -q_);
+      sum_hnq_ += hnq;
+      hnq_.push_back(hnq);
+      if (i > 1000 && hnq <= 1e-10) {
+        // The harmonic number is too small.
+        break;
+      }
+    }
+    assert(sum_hnq_ > 0);
+    mean_ = sum_hnq_m1 / sum_hnq_;
+  }
+
+ private:
+  const size_t k_;
+  const double q_;
+  const double v_;
+
+  double mean_;
+  std::vector<double> hnq_;
+  double sum_hnq_;
+};
+
+using zipf_u64 = absl::zipf_distribution<uint64_t>;
+
+class ZipfTest : public testing::TestWithParam<zipf_u64::param_type>,
+                 public ZipfModel {
+ public:
+  ZipfTest() : ZipfModel(GetParam().k(), GetParam().q(), GetParam().v()) {}
+
+  absl::InsecureBitGen rng_;
+};
+
+TEST_P(ZipfTest, ChiSquaredTest) {
+  const auto& param = GetParam();
+  Init();
+
+  size_t trials = 10000;
+
+  // Find the split-points for the buckets.
+  std::vector<size_t> points;
+  std::vector<double> expected;
+  {
+    double last_cdf = 0.0;
+    double min_p = 1.0;
+    for (double p = 0.01; p < 1.0; p += 0.01) {
+      auto x = InverseCDF(p);
+      if (points.empty() || points.back() < x.second) {
+        const double p = CDF(x.second);
+        points.push_back(x.second);
+        double q = p - last_cdf;
+        expected.push_back(q);
+        last_cdf = p;
+        if (q < min_p) {
+          min_p = q;
+        }
+      }
+    }
+    if (last_cdf < 0.999) {
+      points.push_back(std::numeric_limits<size_t>::max());
+      double q = 1.0 - last_cdf;
+      expected.push_back(q);
+      if (q < min_p) {
+        min_p = q;
+      }
+    } else {
+      points.back() = std::numeric_limits<size_t>::max();
+      expected.back() += (1.0 - last_cdf);
+    }
+    // The Chi-Squared score is not completely scale-invariant; it works best
+    // when the small values are in the small digits.
+    trials = static_cast<size_t>(8.0 / min_p);
+  }
+  ASSERT_GT(points.size(), 0);
+
+  // Generate n variates and fill the counts vector with the count of their
+  // occurrences.
+  std::vector<int64_t> buckets(points.size(), 0);
+  double avg = 0;
+  {
+    zipf_u64 dis(param);
+    for (size_t i = 0; i < trials; i++) {
+      uint64_t x = dis(rng_);
+      ASSERT_LE(x, dis.max());
+      ASSERT_GE(x, dis.min());
+      avg += static_cast<double>(x);
+      auto it = std::upper_bound(std::begin(points), std::end(points),
+                                 static_cast<size_t>(x));
+      buckets[std::distance(std::begin(points), it)]++;
+    }
+    avg = avg / static_cast<double>(trials);
+  }
+
+  // Validate the output using the Chi-Squared test.
+  for (auto& e : expected) {
+    e *= trials;
+  }
+
+  // The null-hypothesis is that the distribution is a poisson distribution with
+  // the provided mean (not estimated from the data).
+  const int dof = static_cast<int>(expected.size()) - 1;
+
+  // NOTE: This test runs about 15x per invocation, so a value of 0.9995 is
+  // approximately correct for a test suite failure rate of 1 in 100.  In
+  // practice we see failures slightly higher than that.
+  const double threshold = absl::random_internal::ChiSquareValue(dof, 0.9999);
+
+  const double chi_square = absl::random_internal::ChiSquare(
+      std::begin(buckets), std::end(buckets), std::begin(expected),
+      std::end(expected));
+
+  const double p_actual =
+      absl::random_internal::ChiSquarePValue(chi_square, dof);
+
+  // Log if the chi_squared value is above the threshold.
+  if (chi_square > threshold) {
+    ABSL_INTERNAL_LOG(INFO, "values");
+    for (size_t i = 0; i < expected.size(); i++) {
+      ABSL_INTERNAL_LOG(INFO, absl::StrCat(points[i], ": ", buckets[i],
+                                           " vs. E=", expected[i]));
+    }
+    ABSL_INTERNAL_LOG(INFO, absl::StrCat("trials ", trials));
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrCat("mean ", avg, " vs. expected ", mean()));
+    ABSL_INTERNAL_LOG(INFO, absl::StrCat(kChiSquared, "(data, ", dof, ") = ",
+                                         chi_square, " (", p_actual, ")"));
+    ABSL_INTERNAL_LOG(INFO,
+                      absl::StrCat(kChiSquared, " @ 0.9995 = ", threshold));
+    FAIL() << kChiSquared << " value of " << chi_square
+           << " is above the threshold.";
+  }
+}
+
+std::vector<zipf_u64::param_type> GenParams() {
+  using param = zipf_u64::param_type;
+  const auto k = param().k();
+  const auto q = param().q();
+  const auto v = param().v();
+  const uint64_t k2 = 1 << 10;
+  return std::vector<zipf_u64::param_type>{
+      // Default
+      param(k, q, v),
+      // vary K
+      param(4, q, v), param(1 << 4, q, v), param(k2, q, v),
+      // vary V
+      param(k2, q, 0.5), param(k2, q, 1.5), param(k2, q, 2.5), param(k2, q, 10),
+      // vary Q
+      param(k2, 1.5, v), param(k2, 3, v), param(k2, 5, v), param(k2, 10, v),
+      // Vary V & Q
+      param(k2, 1.5, 0.5), param(k2, 3, 1.5), param(k, 10, 10)};
+}
+
+std::string ParamName(
+    const ::testing::TestParamInfo<zipf_u64::param_type>& info) {
+  const auto& p = info.param;
+  std::string name = absl::StrCat("k_", p.k(), "__q_", absl::SixDigits(p.q()),
+                                  "__v_", absl::SixDigits(p.v()));
+  return absl::StrReplaceAll(name, {{"+", "_"}, {"-", "_"}, {".", "_"}});
+}
+
+INSTANTIATE_TEST_SUITE_P(All, ZipfTest, ::testing::ValuesIn(GenParams()),
+                         ParamName);
+
+// NOTE: absl::zipf_distribution is not guaranteed to be stable.
+TEST(ZipfDistributionTest, StabilityTest) {
+  // absl::zipf_distribution stability relies on
+  // absl::uniform_real_distribution, std::log, std::exp, std::log1p
+  absl::random_internal::sequence_urbg urbg(
+      {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
+       0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
+       0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
+       0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
+
+  std::vector<int> output(10);
+
+  {
+    absl::zipf_distribution<int32_t> dist;
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+    EXPECT_THAT(output, ElementsAre(10031, 0, 0, 3, 6, 0, 7, 47, 0, 0));
+  }
+  urbg.reset();
+  {
+    absl::zipf_distribution<int32_t> dist(std::numeric_limits<int32_t>::max(),
+                                          3.3);
+    std::generate(std::begin(output), std::end(output),
+                  [&] { return dist(urbg); });
+    EXPECT_THAT(output, ElementsAre(44, 0, 0, 0, 0, 1, 0, 1, 3, 0));
+  }
+}
+
+TEST(ZipfDistributionTest, AlgorithmBounds) {
+  absl::zipf_distribution<int32_t> dist;
+
+  // Small values from absl::uniform_real_distribution map to larger Zipf
+  // distribution values.
+  const std::pair<uint64_t, int32_t> kInputs[] = {
+      {0xffffffffffffffff, 0x0}, {0x7fffffffffffffff, 0x0},
+      {0x3ffffffffffffffb, 0x1}, {0x1ffffffffffffffd, 0x4},
+      {0xffffffffffffffe, 0x9},  {0x7ffffffffffffff, 0x12},
+      {0x3ffffffffffffff, 0x25}, {0x1ffffffffffffff, 0x4c},
+      {0xffffffffffffff, 0x99},  {0x7fffffffffffff, 0x132},
+      {0x3fffffffffffff, 0x265}, {0x1fffffffffffff, 0x4cc},
+      {0xfffffffffffff, 0x999},  {0x7ffffffffffff, 0x1332},
+      {0x3ffffffffffff, 0x2665}, {0x1ffffffffffff, 0x4ccc},
+      {0xffffffffffff, 0x9998},  {0x7fffffffffff, 0x1332f},
+      {0x3fffffffffff, 0x2665a}, {0x1fffffffffff, 0x4cc9e},
+      {0xfffffffffff, 0x998e0},  {0x7ffffffffff, 0x133051},
+      {0x3ffffffffff, 0x265ae4}, {0x1ffffffffff, 0x4c9ed3},
+      {0xffffffffff, 0x98e223},  {0x7fffffffff, 0x13058c4},
+      {0x3fffffffff, 0x25b178e}, {0x1fffffffff, 0x4a062b2},
+      {0xfffffffff, 0x8ee23b8},  {0x7ffffffff, 0x10b21642},
+      {0x3ffffffff, 0x1d89d89d}, {0x1ffffffff, 0x2fffffff},
+      {0xffffffff, 0x45d1745d},  {0x7fffffff, 0x5a5a5a5a},
+      {0x3fffffff, 0x69ee5846},  {0x1fffffff, 0x73ecade3},
+      {0xfffffff, 0x79a9d260},   {0x7ffffff, 0x7cc0532b},
+      {0x3ffffff, 0x7e5ad146},   {0x1ffffff, 0x7f2c0bec},
+      {0xffffff, 0x7f95adef},    {0x7fffff, 0x7fcac0da},
+      {0x3fffff, 0x7fe55ae2},    {0x1fffff, 0x7ff2ac0e},
+      {0xfffff, 0x7ff955ae},     {0x7ffff, 0x7ffcaac1},
+      {0x3ffff, 0x7ffe555b},     {0x1ffff, 0x7fff2aac},
+      {0xffff, 0x7fff9556},      {0x7fff, 0x7fffcaab},
+      {0x3fff, 0x7fffe555},      {0x1fff, 0x7ffff2ab},
+      {0xfff, 0x7ffff955},       {0x7ff, 0x7ffffcab},
+      {0x3ff, 0x7ffffe55},       {0x1ff, 0x7fffff2b},
+      {0xff, 0x7fffff95},        {0x7f, 0x7fffffcb},
+      {0x3f, 0x7fffffe5},        {0x1f, 0x7ffffff3},
+      {0xf, 0x7ffffff9},         {0x7, 0x7ffffffd},
+      {0x3, 0x7ffffffe},         {0x1, 0x7fffffff},
+  };
+
+  for (const auto& instance : kInputs) {
+    absl::random_internal::sequence_urbg urbg({instance.first});
+    EXPECT_EQ(instance.second, dist(urbg));
+  }
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel
index d6ce88d..f18b160 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -557,6 +557,7 @@
     visibility = ["//visibility:private"],
     deps = [
         ":strings",
+        "//absl/base:config",
         "//absl/base:core_headers",
         "//absl/container:inlined_vector",
         "//absl/meta:type_traits",
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.gn b/third_party/abseil-cpp/absl/strings/BUILD.gn
index 17f7d55c..9a8c7e6 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.gn
+++ b/third_party/abseil-cpp/absl/strings/BUILD.gn
@@ -145,6 +145,7 @@
   visibility += [ ":*" ]
   deps = [
     ":strings",
+    "../base:config",
     "../base:core_headers",
     "../container:inlined_vector",
     "../meta:type_traits",
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
index 8515ec2..f782129 100644
--- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -385,6 +385,7 @@
     ${ABSL_DEFAULT_COPTS}
   DEPS
     absl::strings
+    absl::config
     absl::core_headers
     absl::inlined_vector
     absl::type_traits
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc
index 6176db9..9236acd 100644
--- a/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc
@@ -6,6 +6,8 @@
 #include <cmath>
 #include <string>
 
+#include "absl/base/config.h"
+
 namespace absl {
 namespace str_format_internal {
 
@@ -334,7 +336,7 @@
           static_cast<std::uint64_t>(decomposed.exponent), precision, out, exp))
     return true;
 
-#if defined(__SIZEOF_INT128__)
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
   // If that is not enough, try with __uint128_t.
   return CanFitMantissa<Float, __uint128_t>() &&
          FloatToBufferImpl<__uint128_t, Float, mode>(
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex_test.cc b/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
index 9d643a5..3c50119 100644
--- a/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
+++ b/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
@@ -14,7 +14,7 @@
 
 #include "absl/synchronization/mutex.h"
 
-#ifdef WIN32
+#ifdef _WIN32
 #include <windows.h>
 #endif
 
@@ -1035,7 +1035,7 @@
 class ScopedDisableBazelTestWarnings {
  public:
   ScopedDisableBazelTestWarnings() {
-#ifdef WIN32
+#ifdef _WIN32
     char file[MAX_PATH];
     if (GetEnvironmentVariableA(kVarName, file, sizeof(file)) < sizeof(file)) {
       warnings_output_file_ = file;
@@ -1052,7 +1052,7 @@
 
   ~ScopedDisableBazelTestWarnings() {
     if (!warnings_output_file_.empty()) {
-#ifdef WIN32
+#ifdef _WIN32
       SetEnvironmentVariableA(kVarName, warnings_output_file_.c_str());
 #else
       setenv(kVarName, warnings_output_file_.c_str(), 0);
diff --git a/third_party/abseil-cpp/absl/time/clock_benchmark.cc b/third_party/abseil-cpp/absl/time/clock_benchmark.cc
index a69fe00..c5c795e 100644
--- a/third_party/abseil-cpp/absl/time/clock_benchmark.cc
+++ b/third_party/abseil-cpp/absl/time/clock_benchmark.cc
@@ -15,6 +15,8 @@
 
 #if !defined(_WIN32)
 #include <sys/time.h>
+#else
+#include <winsock2.h>
 #endif  // _WIN32
 #include <cstdio>
 
diff --git a/third_party/abseil-cpp/absl/time/duration.cc b/third_party/abseil-cpp/absl/time/duration.cc
index 67791fe..a3ac61a9 100644
--- a/third_party/abseil-cpp/absl/time/duration.cc
+++ b/third_party/abseil-cpp/absl/time/duration.cc
@@ -49,6 +49,10 @@
 //
 // Arithmetic overflows/underflows to +/- infinity and saturates.
 
+#if defined(_MSC_VER)
+#include <winsock2.h>  // for timeval
+#endif
+
 #include <algorithm>
 #include <cassert>
 #include <cctype>
diff --git a/third_party/abseil-cpp/absl/time/duration_test.cc b/third_party/abseil-cpp/absl/time/duration_test.cc
index e3cede6..5dce9ac 100644
--- a/third_party/abseil-cpp/absl/time/duration_test.cc
+++ b/third_party/abseil-cpp/absl/time/duration_test.cc
@@ -12,6 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#if defined(_MSC_VER)
+#include <winsock2.h>  // for timeval
+#endif
+
 #include <chrono>  // NOLINT(build/c++11)
 #include <cmath>
 #include <cstdint>
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc
index 2585098..aa889875 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc
@@ -18,8 +18,18 @@
 # endif
 #endif
 
+#if defined(HAS_STRPTIME) && HAS_STRPTIME
+# if !defined(_XOPEN_SOURCE)
+#  define _XOPEN_SOURCE  // Definedness suffices for strptime.
+# endif
+#endif
+
 #include "absl/time/internal/cctz/include/cctz/time_zone.h"
 
+// Include time.h directly since, by C++ standards, ctime doesn't have to
+// declare strptime.
+#include <time.h>
+
 #include <cctype>
 #include <chrono>
 #include <cstddef>
diff --git a/third_party/abseil-cpp/absl/time/time.cc b/third_party/abseil-cpp/absl/time/time.cc
index 977a951..338c452 100644
--- a/third_party/abseil-cpp/absl/time/time.cc
+++ b/third_party/abseil-cpp/absl/time/time.cc
@@ -33,6 +33,10 @@
 
 #include "absl/time/time.h"
 
+#if defined(_MSC_VER)
+#include <winsock2.h>  // for timeval
+#endif
+
 #include <cstring>
 #include <ctime>
 #include <limits>
diff --git a/third_party/abseil-cpp/absl/time/time.h b/third_party/abseil-cpp/absl/time/time.h
index 594396c7..0534780 100644
--- a/third_party/abseil-cpp/absl/time/time.h
+++ b/third_party/abseil-cpp/absl/time/time.h
@@ -65,7 +65,14 @@
 #if !defined(_MSC_VER)
 #include <sys/time.h>
 #else
-#include <winsock2.h>
+// We don't include `winsock2.h` because it drags in `windows.h` and friends,
+// and they define conflicting macros like OPAQUE, ERROR, and more. This has the
+// potential to break Abseil users.
+//
+// Instead we only forward declare `timeval` and require Windows users include
+// `winsock2.h` themselves. This is both inconsistent and troublesome, but so is
+// including 'windows.h' so we are picking the lesser of two evils here.
+struct timeval;
 #endif
 #include <chrono>  // NOLINT(build/c++11)
 #include <cmath>
diff --git a/third_party/abseil-cpp/absl/time/time_test.cc b/third_party/abseil-cpp/absl/time/time_test.cc
index 4d791f4..e2b2f80 100644
--- a/third_party/abseil-cpp/absl/time/time_test.cc
+++ b/third_party/abseil-cpp/absl/time/time_test.cc
@@ -14,6 +14,10 @@
 
 #include "absl/time/time.h"
 
+#if defined(_MSC_VER)
+#include <winsock2.h>  // for timeval
+#endif
+
 #include <chrono>  // NOLINT(build/c++11)
 #include <cstring>
 #include <ctime>
diff --git a/third_party/abseil-cpp/absl/types/variant_test.cc b/third_party/abseil-cpp/absl/types/variant_test.cc
index d7024827..2efaf21 100644
--- a/third_party/abseil-cpp/absl/types/variant_test.cc
+++ b/third_party/abseil-cpp/absl/types/variant_test.cc
@@ -1793,8 +1793,8 @@
   EXPECT_EQ("B", piece);
 
   struct StrLen {
-    int operator()(const std::string& s) const { return s.size(); }
     int operator()(const char* s) const { return strlen(s); }
+    int operator()(const std::string& s) const { return s.size(); }
   };
 
   v = "SomeStr";
diff --git a/third_party/abseil-cpp/absl/utility/utility.h b/third_party/abseil-cpp/absl/utility/utility.h
index 7686db12..eef8fb4 100644
--- a/third_party/abseil-cpp/absl/utility/utility.h
+++ b/third_party/abseil-cpp/absl/utility/utility.h
@@ -25,6 +25,7 @@
 //   * index_sequence_for<Ts...>     == std::index_sequence_for<Ts...>
 //   * apply<Functor, Tuple>         == std::apply<Functor, Tuple>
 //   * exchange<T>                   == std::exchange<T>
+//   * make_from_tuple<T>            == std::make_from_tuple<T>
 //
 // This header file also provides the tag types `in_place_t`, `in_place_type_t`,
 // and `in_place_index_t`, as well as the constant `in_place`, and
@@ -315,6 +316,33 @@
   return old_value;
 }
 
+namespace utility_internal {
+template <typename T, typename Tuple, size_t... I>
+T make_from_tuple_impl(Tuple&& tup, absl::index_sequence<I...>) {
+  return T(std::get<I>(std::forward<Tuple>(tup))...);
+}
+}  // namespace utility_internal
+
+// make_from_tuple
+//
+// Given the template parameter type `T` and a tuple of arguments
+// `std::tuple(arg0, arg1, ..., argN)` constructs an object of type `T` as if by
+// calling `T(arg0, arg1, ..., argN)`.
+//
+// Example:
+//
+//   std::tuple<const char*, size_t> args("hello world", 5);
+//   auto s = absl::make_from_tuple<std::string>(args);
+//   assert(s == "hello");
+//
+template <typename T, typename Tuple>
+constexpr T make_from_tuple(Tuple&& tup) {
+  return utility_internal::make_from_tuple_impl<T>(
+      std::forward<Tuple>(tup),
+      absl::make_index_sequence<
+          std::tuple_size<absl::decay_t<Tuple>>::value>{});
+}
+
 }  // namespace absl
 
 #endif  // ABSL_UTILITY_UTILITY_H_
diff --git a/third_party/abseil-cpp/absl/utility/utility_test.cc b/third_party/abseil-cpp/absl/utility/utility_test.cc
index 5a4972b..f044ad6 100644
--- a/third_party/abseil-cpp/absl/utility/utility_test.cc
+++ b/third_party/abseil-cpp/absl/utility/utility_test.cc
@@ -341,5 +341,36 @@
   EXPECT_EQ(1, *b);
 }
 
+TEST(MakeFromTupleTest, String) {
+  EXPECT_EQ(
+      absl::make_from_tuple<std::string>(std::make_tuple("hello world", 5)),
+      "hello");
+}
+
+TEST(MakeFromTupleTest, MoveOnlyParameter) {
+  struct S {
+    S(std::unique_ptr<int> n, std::unique_ptr<int> m) : value(*n + *m) {}
+    int value = 0;
+  };
+  auto tup =
+      std::make_tuple(absl::make_unique<int>(3), absl::make_unique<int>(4));
+  auto s = absl::make_from_tuple<S>(std::move(tup));
+  EXPECT_EQ(s.value, 7);
+}
+
+TEST(MakeFromTupleTest, NoParameters) {
+  struct S {
+    S() : value(1) {}
+    int value = 2;
+  };
+  EXPECT_EQ(absl::make_from_tuple<S>(std::make_tuple()).value, 1);
+}
+
+TEST(MakeFromTupleTest, Pair) {
+  EXPECT_EQ(
+      (absl::make_from_tuple<std::pair<bool, int>>(std::make_tuple(true, 17))),
+      std::make_pair(true, 17));
+}
+
 }  // namespace
 
diff --git a/third_party/android_build_tools/aapt2/README.chromium b/third_party/android_build_tools/aapt2/README.chromium
index 789326e842..c9f7740b 100644
--- a/third_party/android_build_tools/aapt2/README.chromium
+++ b/third_party/android_build_tools/aapt2/README.chromium
@@ -1,6 +1,6 @@
 Name: Android SDK tool aapt2
 Short name: aapt2
-Version: 3.3.0-beta01-5013011
+Version: 3.6.0-alpha03-5516695
 URL:  https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/${Version}/aapt2-${Version}-linux.jar
 Security Critical: no
 License: Apache Version 2.0
diff --git a/third_party/android_build_tools/aapt2/cipd.yaml b/third_party/android_build_tools/aapt2/cipd.yaml
index c4ab5df0..39fd55a 100644
--- a/third_party/android_build_tools/aapt2/cipd.yaml
+++ b/third_party/android_build_tools/aapt2/cipd.yaml
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:3.3.0-beta01-5013011-cr0
+# cipd create --pkg-def cipd.yaml -tag version:3.6.0-alpha03-5516695-cr0
 package: chromium/third_party/android_build_tools/aapt2
 description: Android SDK tool to build App Bundles
 # TODO(https://crbug.com/950727): Remove this and go back to symlinks once
@@ -11,4 +11,3 @@
 install_mode: copy
 data:
   - file: aapt2
-  - file: lib64/libc++.so
diff --git a/third_party/blink/public/mojom/payments/payment_request.mojom b/third_party/blink/public/mojom/payments/payment_request.mojom
index 07f0ead..5de503b6 100644
--- a/third_party/blink/public/mojom/payments/payment_request.mojom
+++ b/third_party/blink/public/mojom/payments/payment_request.mojom
@@ -68,7 +68,7 @@
   OnShippingOptionChange(string shipping_option_id);
   OnPayerDetailChange(PayerDetail detail);
   OnPaymentResponse(PaymentResponse response);
-  OnError(PaymentErrorReason error);
+  OnError(PaymentErrorReason error, string error_message);
   OnComplete();
   OnAbort(bool aborted_successfully);
   OnCanMakePayment(CanMakePaymentQueryResult result);
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index 8086ac23..37e738e 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -246,6 +246,7 @@
   EnablePauseExecutionContextOnBackgroundFreeze(bool);
   BLINK_PLATFORM_EXPORT static void EnableConsolidatedMovementXY(bool);
   BLINK_PLATFORM_EXPORT static void EnableStreamsNative(bool);
+  BLINK_PLATFORM_EXPORT static void EnableMouseSubframeNoImplicitCapture(bool);
 
  private:
   WebRuntimeFeatures();
diff --git a/third_party/blink/renderer/core/dom/whitespace_attacher.cc b/third_party/blink/renderer/core/dom/whitespace_attacher.cc
index d267323..a4dbdb24 100644
--- a/third_party/blink/renderer/core/dom/whitespace_attacher.cc
+++ b/third_party/blink/renderer/core/dom/whitespace_attacher.cc
@@ -139,6 +139,8 @@
                !sibling_layout_object->IsFloatingOrOutOfFlowPositioned()) {
       break;
     }
+    context.next_sibling_valid = false;
+    context.next_sibling = nullptr;
   }
   SetLastTextNode(nullptr);
 }
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer_sanitization_test.cc b/third_party/blink/renderer/core/exported/web_frame_serializer_sanitization_test.cc
index 32780f8f..15264f4 100644
--- a/third_party/blink/renderer/core/exported/web_frame_serializer_sanitization_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_serializer_sanitization_test.cc
@@ -433,4 +433,20 @@
             mhtml.Find("Content-Location: http://www.test.com/1x.png"));
 }
 
+TEST_F(WebFrameSerializerSanitizationTest, ImageInPluginElement) {
+  RegisterMockedFileURLLoad(KURL("http://www.test.com/1x.png"),
+                            "frameserialization/1x.png");
+  RegisterMockedFileURLLoad(KURL("http://www.test.com/2x.png"),
+                            "frameserialization/2x.png");
+
+  String mhtml =
+      GenerateMHTMLFromHtml("http://www.test.com", "image_in_plugin.html");
+
+  // Image resources for both object and embed elements should be added.
+  EXPECT_NE(WTF::kNotFound,
+            mhtml.Find("Content-Location: http://www.test.com/1x.png"));
+  EXPECT_NE(WTF::kNotFound,
+            mhtml.Find("Content-Location: http://www.test.com/2x.png"));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/frame_serializer.cc b/third_party/blink/renderer/core/frame/frame_serializer.cc
index e713ffe..2a02f5bc 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer.cc
+++ b/third_party/blink/renderer/core/frame/frame_serializer.cc
@@ -50,8 +50,10 @@
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
 #include "third_party/blink/renderer/core/html/html_frame_element_base.h"
 #include "third_party/blink/renderer/core/html/html_image_element.h"
+#include "third_party/blink/renderer/core/html/html_image_loader.h"
 #include "third_party/blink/renderer/core/html/html_link_element.h"
 #include "third_party/blink/renderer/core/html/html_meta_element.h"
+#include "third_party/blink/renderer/core/html/html_plugin_element.h"
 #include "third_party/blink/renderer/core/html/html_style_element.h"
 #include "third_party/blink/renderer/core/html/image_document.h"
 #include "third_party/blink/renderer/core/html_names.h"
@@ -383,6 +385,13 @@
   } else if (const auto* style = ToHTMLStyleElementOrNull(element)) {
     if (CSSStyleSheet* sheet = style->sheet())
       SerializeCSSStyleSheet(*sheet, NullURL());
+  } else if (IsHTMLPlugInElement(element)) {
+    const auto* plugin = ToHTMLPlugInElement(&element);
+    if (plugin->IsImageType() && plugin->ImageLoader()) {
+      KURL image_url = document.CompleteURL(plugin->Url());
+      ImageResourceContent* cached_image = plugin->ImageLoader()->GetContent();
+      AddImageToResources(cached_image, image_url);
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.h b/third_party/blink/renderer/core/html/html_plugin_element.h
index eb118bc..ad14caf 100644
--- a/third_party/blink/renderer/core/html/html_plugin_element.h
+++ b/third_party/blink/renderer/core/html/html_plugin_element.h
@@ -103,6 +103,9 @@
   ParsedFeaturePolicy ConstructContainerPolicy(
       Vector<String>* /* messages */) const override;
 
+  bool IsImageType() const;
+  HTMLImageLoader* ImageLoader() const { return image_loader_.Get(); }
+
  protected:
   HTMLPlugInElement(const QualifiedName& tag_name,
                     Document&,
@@ -127,7 +130,6 @@
   // if necessary.
   virtual LayoutEmbeddedContent* LayoutEmbeddedContentForJSBindings() const;
 
-  bool IsImageType() const;
   LayoutEmbeddedObject* GetLayoutEmbeddedObject() const;
   bool AllowedToLoadFrameURL(const String& url);
   bool RequestObject(const PluginParameters& plugin_params);
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index 2821046..702a1f5 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -781,7 +781,9 @@
                                                           source_capabilities);
   }
 
-  if (event_result == WebInputEventResult::kNotHandled || mev.GetScrollbar()) {
+  if ((!RuntimeEnabledFeatures::MouseSubframeNoImplicitCaptureEnabled() &&
+       event_result == WebInputEventResult::kNotHandled) ||
+      mev.GetScrollbar()) {
     mouse_event_manager_->SetCapturesDragging(true);
     // Main frames don't implicitly capture mouse input on MouseDown, just
     // subframes do (regardless of whether local or remote).
@@ -1311,8 +1313,31 @@
                                                                  target);
   } else {
     if (pointer_event_manager_->SetPointerCapture(pointer_id, target) &&
-        pointer_id == PointerEventFactory::kMouseId)
+        pointer_id == PointerEventFactory::kMouseId) {
       CaptureMouseEventsToWidget(true);
+
+      // TODO(crbug.com/919908) This is a temporary approach to make pointer
+      // capture work across in-process frames while mouse subframe capture
+      // disabled. It's to experiment removing the frame capture logic. This
+      // must be re-write before the flag enabled.
+      if (RuntimeEnabledFeatures::MouseSubframeNoImplicitCaptureEnabled()) {
+        LocalFrame* frame = frame_;
+        LocalFrame* parent = DynamicTo<LocalFrame>(frame_->Tree().Parent());
+        while (parent) {
+          Element* subframe_element = nullptr;
+          if (frame->OwnerLayoutObject() &&
+              frame->OwnerLayoutObject()->GetNode()) {
+            subframe_element =
+                DynamicTo<Element>(frame->OwnerLayoutObject()->GetNode());
+          }
+
+          parent->GetEventHandler().capturing_subframe_element_ =
+              subframe_element;
+          frame = parent;
+          parent = DynamicTo<LocalFrame>(parent->Tree().Parent());
+        }
+      }
+    }
   }
 }
 
@@ -1323,8 +1348,29 @@
                                                                      target);
   } else {
     if (pointer_event_manager_->ReleasePointerCapture(pointer_id, target) &&
-        pointer_id == PointerEventFactory::kMouseId)
+        pointer_id == PointerEventFactory::kMouseId) {
       CaptureMouseEventsToWidget(false);
+
+      // TODO(crbug/919908) same as SetPointerCapture, this is temporary
+      // approach for removing mouse subframe capture. It must be re-write
+      // before enable the flag.
+      if (RuntimeEnabledFeatures::MouseSubframeNoImplicitCaptureEnabled()) {
+        LocalFrame* frame = frame_;
+        LocalFrame* parent = DynamicTo<LocalFrame>(frame_->Tree().Parent());
+        while (parent) {
+          Element* subframe_element = nullptr;
+          if (frame->OwnerLayoutObject() &&
+              frame->OwnerLayoutObject()->GetNode()) {
+            subframe_element =
+                DynamicTo<Element>(frame->OwnerLayoutObject()->GetNode());
+          }
+
+          parent->GetEventHandler().capturing_subframe_element_ = nullptr;
+          frame = parent;
+          parent = DynamicTo<LocalFrame>(parent->Tree().Parent());
+        }
+      }
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/input/event_handler_test.cc b/third_party/blink/renderer/core/input/event_handler_test.cc
index b7c258d..602aa5d 100644
--- a/third_party/blink/renderer/core/input/event_handler_test.cc
+++ b/third_party/blink/renderer/core/input/event_handler_test.cc
@@ -1779,6 +1779,122 @@
   EXPECT_EQ("hover over me", element3.InnerHTML().Utf8());
 }
 
+// Test that the hover is updated at the next begin frame after the main thread
+// scroll ends in an iframe.
+TEST_F(EventHandlerSimTest,
+       TestUpdateHoverAfterMainThreadScrollInIFrameAtBeginFrame) {
+  ScopedUpdateHoverFromScrollAtBeginFrameForTest scoped_feature(true);
+  WebView().MainFrameWidget()->Resize(WebSize(800, 600));
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  SimRequest frame_resource("https://example.com/iframe.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  main_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+    body {
+      margin: 0;
+    }
+    iframe {
+      width: 800px;
+      height: 600px;
+    }
+    </style>
+    <iframe id='iframe' src='iframe.html'>
+    </iframe>
+  )HTML");
+
+  frame_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body, html {
+        margin: 0;
+        height: 500vh;
+      }
+      div {
+        height: 500px;
+        width: 100%;
+      }
+    </style>
+    <body>
+    <div class="hoverme" id="hoverarea">hover over me</div>
+    </body>
+  )HTML");
+  Compositor().BeginFrame();
+
+  auto* iframe_element =
+      ToHTMLIFrameElement(GetDocument().getElementById("iframe"));
+  Document* iframe_doc = iframe_element->contentDocument();
+  FrameView* child_frame_view =
+      iframe_element->GetLayoutEmbeddedContent()->ChildFrameView();
+  auto* local_child_frame_view = DynamicTo<LocalFrameView>(child_frame_view);
+  ScrollableArea* iframe_scrollable_area =
+      local_child_frame_view->GetScrollableArea();
+
+  // Set mouse position and active web view.
+  WebMouseEvent mouse_down_event(
+      WebMouseEvent::kMouseDown, WebFloatPoint(100, 100),
+      WebFloatPoint(100, 100), WebPointerProperties::Button::kLeft, 1,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_down_event.SetFrameScale(1);
+  GetDocument().GetFrame()->GetEventHandler().HandleMousePressEvent(
+      mouse_down_event);
+
+  WebMouseEvent mouse_up_event(
+      WebInputEvent::kMouseUp, WebFloatPoint(100, 100), WebFloatPoint(100, 100),
+      WebPointerProperties::Button::kLeft, 1, WebInputEvent::kNoModifiers,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_up_event.SetFrameScale(1);
+  GetDocument().GetFrame()->GetEventHandler().HandleMouseReleaseEvent(
+      mouse_up_event);
+
+  WebView().MainFrameWidget()->SetFocus(true);
+  WebView().SetIsActive(true);
+
+  Element* element = iframe_doc->getElementById("hoverarea");
+  EXPECT_TRUE(element->IsHovered());
+
+  // Send scroll gesture events which will set
+  // |hover_needs_update_at_scroll_end_| to be true in ScrollManager.
+  constexpr float delta_y = 1000;
+  WebGestureEvent gesture_scroll_begin{
+      WebInputEvent::kGestureScrollBegin, WebInputEvent::kNoModifiers,
+      WebInputEvent::GetStaticTimeStampForTests()};
+  gesture_scroll_begin.SetFrameScale(1);
+  gesture_scroll_begin.data.scroll_begin.delta_x_hint = 0;
+  gesture_scroll_begin.data.scroll_begin.delta_y_hint = -delta_y;
+  gesture_scroll_begin.data.scroll_begin.scrollable_area_element_id =
+      iframe_scrollable_area->GetCompositorElementId().GetInternalValue();
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(gesture_scroll_begin));
+
+  WebGestureEvent gesture_scroll_update{
+      WebInputEvent::kGestureScrollUpdate, WebInputEvent::kNoModifiers,
+      WebInputEvent::GetStaticTimeStampForTests()};
+  gesture_scroll_update.SetFrameScale(1);
+  gesture_scroll_update.data.scroll_update.delta_x = 0;
+  gesture_scroll_update.data.scroll_update.delta_y = -delta_y;
+
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(gesture_scroll_update));
+
+  WebGestureEvent gesture_scroll_end{
+      WebInputEvent::kGestureScrollEnd, WebInputEvent::kNoModifiers,
+      WebInputEvent::GetStaticTimeStampForTests()};
+  gesture_scroll_end.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(gesture_scroll_end));
+
+  LocalFrameView* frame_view = GetDocument().View();
+  ASSERT_EQ(0, frame_view->LayoutViewport()->GetScrollOffset().Height());
+  ASSERT_EQ(1000, iframe_scrollable_area->ScrollOffsetInt().Height());
+  EXPECT_TRUE(element->IsHovered());
+
+  // The fake mouse move event is dispatched at the begin frame to update hover.
+  Compositor().BeginFrame();
+  EXPECT_FALSE(element->IsHovered());
+}
+
 // Test that the hover is updated at the next begin frame after the smooth JS
 // scroll ends.
 TEST_F(EventHandlerSimTest, TestUpdateHoverAfterJSScrollAtBeginFrame) {
@@ -2365,4 +2481,248 @@
   EXPECT_EQ("Some text to select", GetDocument().GetSelection()->toString());
 }
 
+// Test that with MouseSubframeNoImplicitCapture enable, mouse down at inner
+// frame and move to outer frame does not capture mouse to inner frame.
+TEST_F(EventHandlerSimTest, MouseDragWithNoSubframeImplicitCapture) {
+  ScopedMouseSubframeNoImplicitCaptureForTest scoped_feature(true);
+  WebView().MainFrameWidget()->Resize(WebSize(800, 600));
+
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  SimRequest frame_resource("https://example.com/frame.html", "text/html");
+
+  LoadURL("https://example.com/test.html");
+
+  main_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      iframe {
+        width: 200px;
+        height: 200px;
+      }
+      div {
+        width: 200px;
+        height: 200px;
+      }
+    </style>
+    <iframe id='frame' src='frame.html'></iframe>
+    <div id='outside'></div>
+  )HTML");
+
+  frame_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body {
+        margin: 0;
+      }
+      div {
+        width: 100px;
+        height: 100px;
+      }
+    </style>
+    <div id='target'></div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  WebMouseEvent mouse_down_inside_event(
+      WebMouseEvent::kMouseDown, WebFloatPoint(50, 50), WebFloatPoint(50, 50),
+      WebPointerProperties::Button::kLeft, 0,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_down_inside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_down_inside_event));
+
+  WebMouseEvent mouse_move_inside_event(
+      WebInputEvent::kMouseMove, WebFloatPoint(100, 100),
+      WebFloatPoint(100, 100), WebPointerProperties::Button::kLeft, 1,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_move_inside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_inside_event));
+  auto* iframe_element =
+      ToHTMLIFrameElement(GetDocument().getElementById("frame"));
+  Document* iframe_doc = iframe_element->contentDocument();
+  Element* target = iframe_doc->getElementById("target");
+
+  EXPECT_EQ(iframe_doc->GetFrame()
+                ->GetEventHandler()
+                .LastKnownMousePositionInRootFrame(),
+            FloatPoint(100, 100));
+  EXPECT_EQ(iframe_doc->HoverElement(), target);
+  EXPECT_FALSE(target->hasPointerCapture(PointerEventFactory::kMouseId));
+
+  // Without capturing, next mouse move will be send to outer frame.
+  WebMouseEvent mouse_move_outside_event(
+      WebInputEvent::kMouseMove, WebFloatPoint(100, 300),
+      WebFloatPoint(100, 300), WebPointerProperties::Button::kLeft, 1,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_move_outside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_outside_event));
+
+  // Mouse is hovering the element in outer frame.
+  EXPECT_FALSE(iframe_doc->HoverElement());
+  EXPECT_TRUE(
+      iframe_doc->GetFrame()->GetEventHandler().IsMousePositionUnknown());
+  EXPECT_EQ(GetDocument().HoverElement(),
+            GetDocument().getElementById("outside"));
+}
+
+// Test that with MouseSubframeNoImplicitCapture enable, mouse down at inner
+// frame, set pointer capture and move to outer frame will capture mouse to
+// the capture target in inner frame.
+TEST_F(EventHandlerSimTest,
+       MouseDragWithPointerCaptureAndNoSubframeImplicitCapture) {
+  ScopedMouseSubframeNoImplicitCaptureForTest scoped_feature(true);
+
+  WebView().MainFrameWidget()->Resize(WebSize(800, 600));
+
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  SimRequest frame_resource("https://example.com/frame.html", "text/html");
+
+  LoadURL("https://example.com/test.html");
+
+  main_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      iframe {
+        width: 200px;
+        height: 200px;
+      }
+      div {
+        width: 200px;
+        height: 200px;
+      }
+    </style>
+    <iframe id='frame' src='frame.html'></iframe>
+    <div id='outside'></div>
+  )HTML");
+
+  frame_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body {
+        margin: 0;
+      }
+      div {
+        width: 100px;
+        height: 100px;
+      }
+    </style>
+    <div id='target'></div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  WebMouseEvent mouse_down_inside_event(
+      WebMouseEvent::kMouseDown, WebFloatPoint(50, 50), WebFloatPoint(50, 50),
+      WebPointerProperties::Button::kLeft, 0,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_down_inside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_down_inside_event));
+
+  auto* iframe_element =
+      ToHTMLIFrameElement(GetDocument().getElementById("frame"));
+  Document* iframe_doc = iframe_element->contentDocument();
+  Element* target = iframe_doc->getElementById("target");
+
+  ExceptionState exception(nullptr, ExceptionState::kExecutionContext, "", "");
+
+  target->setPointerCapture(PointerEventFactory::kMouseId, exception);
+  EXPECT_TRUE(target->hasPointerCapture(PointerEventFactory::kMouseId));
+
+  // With pointercapture, next mouse move will be send to inner frame.
+  WebMouseEvent mouse_move_event(
+      WebInputEvent::kMouseMove, WebFloatPoint(100, 300),
+      WebFloatPoint(100, 300), WebPointerProperties::Button::kLeft, 1,
+      WebInputEvent::Modifiers::kLeftButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_move_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_event));
+
+  EXPECT_EQ(iframe_doc->GetFrame()
+                ->GetEventHandler()
+                .LastKnownMousePositionInRootFrame(),
+            FloatPoint(100, 300));
+  EXPECT_EQ(iframe_doc->HoverElement(), target);
+
+  // Release capture and move event will be send to outer frame.
+  target->releasePointerCapture(PointerEventFactory::kMouseId, exception);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_event));
+
+  // iframe no longer gets mouse move events.
+  EXPECT_FALSE(iframe_doc->HoverElement());
+  EXPECT_TRUE(
+      iframe_doc->GetFrame()->GetEventHandler().IsMousePositionUnknown());
+  // Mouse is hovering the element in outer frame.
+  EXPECT_EQ(GetDocument().HoverElement(),
+            GetDocument().getElementById("outside"));
+}
+
+// Test that mouse right button down and move to an iframe will route the events
+// to iframe correctly.
+TEST_F(EventHandlerSimTest, MouseRightButtonDownMoveToIFrame) {
+  WebView().MainFrameWidget()->Resize(WebSize(800, 600));
+
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  SimRequest frame_resource("https://example.com/frame.html", "text/html");
+
+  LoadURL("https://example.com/test.html");
+
+  main_resource.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+    div {
+      width: 200px;
+      height: 200px;
+    }
+    iframe {
+      width: 200px;
+      height: 200px;
+    }
+    </style>
+    <div></div>
+    <iframe id='frame' src='frame.html'></iframe>
+  )HTML");
+
+  frame_resource.Complete("<!DOCTYPE html>");
+  Compositor().BeginFrame();
+  WebMouseEvent mouse_down_outside_event(
+      WebMouseEvent::kMouseDown, WebFloatPoint(300, 29), WebFloatPoint(300, 29),
+      WebPointerProperties::Button::kRight, 0,
+      WebInputEvent::Modifiers::kRightButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_down_outside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_down_outside_event));
+
+  WebMouseEvent mouse_move_outside_event(
+      WebMouseEvent::kMouseMove, WebFloatPoint(300, 29), WebFloatPoint(300, 29),
+      WebPointerProperties::Button::kRight, 0,
+      WebInputEvent::Modifiers::kRightButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_move_outside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_outside_event));
+
+  WebMouseEvent mouse_move_inside_event(
+      WebMouseEvent::kMouseMove, WebFloatPoint(100, 229),
+      WebFloatPoint(100, 229), WebPointerProperties::Button::kRight, 0,
+      WebInputEvent::Modifiers::kRightButtonDown,
+      WebInputEvent::GetStaticTimeStampForTests());
+  mouse_move_inside_event.SetFrameScale(1);
+  WebView().MainFrameWidget()->HandleInputEvent(
+      WebCoalescedInputEvent(mouse_move_inside_event));
+  EXPECT_FALSE(
+      GetDocument().GetFrame()->GetEventHandler().IsMousePositionUnknown());
+  EXPECT_FALSE(To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild())
+                   ->GetEventHandler()
+                   .IsMousePositionUnknown());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc
index 61348ac..c8ba932f 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -847,6 +847,7 @@
        event.Event().button != WebPointerProperties::Button::kLeft) ||
       (is_pen && event.Event().button != pen_drag_button)) {
     mouse_pressed_ = false;
+    mouse_down_may_start_drag_ = false;
   }
 
   //  When pressing Esc key while dragging and the object is outside of the
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc
index e5398c6..70de36ad 100644
--- a/third_party/blink/renderer/core/input/scroll_manager.cc
+++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -711,7 +711,7 @@
   ClearGestureScrollState();
 
   if (RuntimeEnabledFeatures::UpdateHoverFromScrollAtBeginFrameEnabled())
-    frame_->GetEventHandler().MarkHoverStateDirty();
+    frame_->LocalFrameRoot().GetEventHandler().MarkHoverStateDirty();
 
   return WebInputEventResult::kNotHandled;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.cc
index abb740dc..675c620 100644
--- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.cc
@@ -132,7 +132,7 @@
 
 void LayoutNGListItem::UpdateMarker() {
   const ComputedStyle& style = StyleRef();
-  if (style.ListStyleType() == EListStyleType::kNone) {
+  if (style.ListStyleType() == EListStyleType::kNone && !IsMarkerImage()) {
     DestroyMarker();
     marker_type_ = kStatic;
     is_marker_text_updated_ = true;
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.cc b/third_party/blink/renderer/core/scroll/scrollable_area.cc
index d84a3db5..08d111a4 100644
--- a/third_party/blink/renderer/core/scroll/scrollable_area.cc
+++ b/third_party/blink/renderer/core/scroll/scrollable_area.cc
@@ -808,7 +808,13 @@
 }
 
 void ScrollableArea::MarkHoverStateDirty() {
-  GetLayoutBox()->GetFrame()->GetEventHandler().MarkHoverStateDirty();
+  if (GetLayoutBox()) {
+    GetLayoutBox()
+        ->GetFrame()
+        ->LocalFrameRoot()
+        .GetEventHandler()
+        .MarkHoverStateDirty();
+  }
 }
 
 void ScrollableArea::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/testing/data/frameserialization/image_in_plugin.html b/third_party/blink/renderer/core/testing/data/frameserialization/image_in_plugin.html
new file mode 100644
index 0000000..9f9510ca
--- /dev/null
+++ b/third_party/blink/renderer/core/testing/data/frameserialization/image_in_plugin.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta charset="utf8">
+<title>Test Image in Plugin Element</title>
+</head>
+<body>
+<object data="1x.png" ></object>
+<embed src="2x.png"></embed>
+</body>
+</html>
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
index 70d78e48..d0934be 100644
--- a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
@@ -55,10 +55,12 @@
                      info->FinalResponse().CurrentRequestUrl().GetString())
                : g_empty_atom,
           time_origin,
+          SecurityOrigin::IsSecure(frame->GetDocument()->Url()),
           server_timing),
       ContextClient(frame),
       resource_timing_info_(info) {
   DCHECK(frame);
+  DCHECK(frame->GetDocument());
   DCHECK(info);
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.cc b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
index d2bf374..2ffba14 100644
--- a/third_party/blink/renderer/core/timing/performance_resource_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
@@ -81,9 +81,11 @@
 PerformanceResourceTiming::PerformanceResourceTiming(
     const AtomicString& name,
     base::TimeTicks time_origin,
+    bool is_secure_context,
     const WebVector<WebServerTimingInfo>& server_timing)
     : PerformanceEntry(name, 0.0, 0.0),
       time_origin_(time_origin),
+      is_secure_context_(is_secure_context),
       server_timing_(
           PerformanceServerTiming::FromParsedServerTiming(server_timing)) {}
 
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.h b/third_party/blink/renderer/core/timing/performance_resource_timing.h
index 7a76c4a..e235bf1a 100644
--- a/third_party/blink/renderer/core/timing/performance_resource_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_resource_timing.h
@@ -53,6 +53,7 @@
   // Related doc: https://goo.gl/uNecAj.
   PerformanceResourceTiming(const AtomicString& name,
                             base::TimeTicks time_origin,
+                            bool is_secure_context,
                             const WebVector<WebServerTimingInfo>&);
   PerformanceResourceTiming(const WebResourceTimingInfo&,
                             base::TimeTicks time_origin,
diff --git a/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp b/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp
index 14f8840..86f70e3 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp
+++ b/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp
@@ -66,9 +66,6 @@
   <message name="IDS_DEVTOOLS_2f76fab71405b40cf521f64eab0d350f" desc="">
     Delete element
   </message>
-  <message name="IDS_DEVTOOLS_3427db2c4cb9d8d61c1dd32d218d5699" desc="">
-    Use <ph name="ELEMENTS_HINT">$1s</ph> in the console to refer to this element.
-  </message>
   <message name="IDS_DEVTOOLS_365fee797b55ffeac84d2ba82507b721" desc="">
     user agent stylesheet
   </message>
@@ -165,6 +162,9 @@
   <message name="IDS_DEVTOOLS_6f3cab519fe7e8f3b7834cf882f9dfe6" desc="">
     Element Classes
   </message>
+  <message name="IDS_DEVTOOLS_7490f30ff46ab588405acd7109915139" desc="">
+    Use <ph name="ELEMENTS_HINT">$1s</ph> in the console to refer to this element.
+  </message>
   <message name="IDS_DEVTOOLS_78e0b69d17e0287aaae4f79171e5b059" desc="">
     Disable DOM word wrap
   </message>
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_test.cc b/third_party/blink/renderer/modules/payments/can_make_payment_test.cc
index 609b744..3aa52fd 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_test.cc
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_test.cc
@@ -37,7 +37,7 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
 
   static_cast<PaymentRequestClient*>(request)->OnError(
-      PaymentErrorReason::USER_CANCEL);
+      PaymentErrorReason::USER_CANCEL, "User closed UI.");
 }
 
 TEST_F(HasEnrolledInstrumentTest, RejectPromiseOnUnknownError) {
@@ -51,7 +51,7 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
 
   static_cast<PaymentRequestClient*>(request)->OnError(
-      PaymentErrorReason::UNKNOWN);
+      PaymentErrorReason::UNKNOWN, "Unknown error.");
 }
 
 TEST_F(HasEnrolledInstrumentTest, RejectDuplicateRequest) {
@@ -138,7 +138,7 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
 
   static_cast<PaymentRequestClient*>(request)->OnError(
-      PaymentErrorReason::USER_CANCEL);
+      PaymentErrorReason::USER_CANCEL, "User closed the UI.");
 }
 
 TEST_P(CanMakePaymentTest, RejectPromiseOnUnknownError) {
@@ -153,7 +153,7 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
 
   static_cast<PaymentRequestClient*>(request)->OnError(
-      PaymentErrorReason::UNKNOWN);
+      PaymentErrorReason::UNKNOWN, "Unknown error.");
 }
 
 TEST_P(CanMakePaymentTest, RejectDuplicateRequest) {
diff --git a/third_party/blink/renderer/modules/payments/complete_test.cc b/third_party/blink/renderer/modules/payments/complete_test.cc
index 002181f7..eb6d5eb 100644
--- a/third_party/blink/renderer/modules/payments/complete_test.cc
+++ b/third_party/blink/renderer/modules/payments/complete_test.cc
@@ -48,7 +48,7 @@
       .Then(funcs.ExpectCall(), funcs.ExpectNoCall());
 
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
-      payments::mojom::blink::PaymentErrorReason::UNKNOWN);
+      payments::mojom::blink::PaymentErrorReason::UNKNOWN, "Unknown error.");
 }
 
 TEST(CompleteTest, ResolveCompletePromiseOnUserClosingUI) {
@@ -68,7 +68,8 @@
       .Then(funcs.ExpectCall(), funcs.ExpectNoCall());
 
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
-      payments::mojom::blink::PaymentErrorReason::USER_CANCEL);
+      payments::mojom::blink::PaymentErrorReason::USER_CANCEL,
+      "User closed the UI.");
 }
 
 // If user cancels the transaction during processing, the complete() promise
@@ -84,7 +85,8 @@
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
       ->OnPaymentResponse(BuildPaymentResponseForTest());
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
-      payments::mojom::blink::PaymentErrorReason::USER_CANCEL);
+      payments::mojom::blink::PaymentErrorReason::USER_CANCEL,
+      "User closed the UI.");
 
   request
       ->Complete(scope.GetScriptState(),
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc
index 8bb462e..eb983d3 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -1040,6 +1040,12 @@
   OnUpdatePaymentDetailsTimeout(nullptr);
 }
 
+void PaymentRequest::OnConnectionError() {
+  OnError(PaymentErrorReason::UNKNOWN,
+          "Renderer process could not establish or lost IPC connection to the "
+          "PaymentRequest service in the browser process.");
+}
+
 PaymentRequest::PaymentRequest(
     ExecutionContext* execution_context,
     const HeapVector<Member<PaymentMethodData>>& method_data,
@@ -1105,8 +1111,7 @@
   GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&payment_provider_, task_runner));
   payment_provider_.set_connection_error_handler(
-      WTF::Bind(&PaymentRequest::OnError, WrapWeakPersistent(this),
-                PaymentErrorReason::UNKNOWN));
+      WTF::Bind(&PaymentRequest::OnConnectionError, WrapWeakPersistent(this)));
 
   UseCounter::Count(execution_context, WebFeature::kPaymentRequestInitialized);
   payments::mojom::blink::PaymentRequestClientPtr client;
@@ -1286,56 +1291,28 @@
   }
 }
 
-void PaymentRequest::OnError(PaymentErrorReason error) {
+void PaymentRequest::OnError(PaymentErrorReason error,
+                             const String& error_message) {
+  DCHECK(!error_message.IsEmpty());
   DOMExceptionCode exception_code = DOMExceptionCode::kUnknownError;
-  String message;
 
   switch (error) {
-    case PaymentErrorReason::USER_CANCEL: {
+    case PaymentErrorReason::USER_CANCEL:
       exception_code = DOMExceptionCode::kAbortError;
-      message = "Request cancelled";
       break;
-    }
 
-    case PaymentErrorReason::NOT_SUPPORTED: {
+    case PaymentErrorReason::NOT_SUPPORTED:
       exception_code = DOMExceptionCode::kNotSupportedError;
-      DCHECK_LE(1U, method_names_.size());
-      auto it = method_names_.begin();
-      if (method_names_.size() == 1U) {
-        message = "The payment method \"" + *it + "\" is not supported";
-      } else {
-        StringBuilder sb;
-        sb.Append("The payment methods \"");
-        sb.Append(*it);
-        sb.Append("\"");
-        while (++it != method_names_.end()) {
-          sb.Append(", \"");
-          sb.Append(*it);
-          sb.Append("\"");
-        }
-        sb.Append(" are not supported");
-        message = sb.ToString();
-      }
       break;
-    }
 
-    case PaymentErrorReason::ALREADY_SHOWING: {
+    case PaymentErrorReason::ALREADY_SHOWING:
       exception_code = DOMExceptionCode::kAbortError;
-      message =
-          "Another PaymentRequest UI is already showing in a different tab or "
-          "window";
       break;
-    }
 
-    case PaymentErrorReason::UNKNOWN: {
-      exception_code = DOMExceptionCode::kUnknownError;
-      message = "Request failed";
+    case PaymentErrorReason::UNKNOWN:
       break;
-    }
   }
 
-  DCHECK(!message.IsEmpty());
-
   // If the user closes PaymentRequest UI after PaymentResponse.complete() has
   // been called, the PaymentResponse.complete() promise should be resolved with
   // undefined instead of rejecting.
@@ -1348,22 +1325,22 @@
   ScriptPromiseResolver* resolver = GetPendingAcceptPromiseResolver();
   if (resolver) {
     resolver->Reject(
-        MakeGarbageCollected<DOMException>(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, error_message));
   }
 
   if (abort_resolver_) {
     abort_resolver_->Reject(
-        MakeGarbageCollected<DOMException>(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, error_message));
   }
 
   if (can_make_payment_resolver_) {
     can_make_payment_resolver_->Reject(
-        MakeGarbageCollected<DOMException>(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, error_message));
   }
 
   if (has_enrolled_instrument_resolver_) {
     has_enrolled_instrument_resolver_->Reject(
-        MakeGarbageCollected<DOMException>(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, error_message));
   }
 
   ClearResolversAndCloseMojoConnection();
diff --git a/third_party/blink/renderer/modules/payments/payment_request.h b/third_party/blink/renderer/modules/payments/payment_request.h
index 6c940b6..3f18154 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.h
+++ b/third_party/blink/renderer/modules/payments/payment_request.h
@@ -111,6 +111,9 @@
   };
 
  private:
+  // Called when the renderer loses the IPC connection to the browser.
+  void OnConnectionError();
+
   // LifecycleObserver:
   void ContextDestroyed(ExecutionContext*) override;
 
@@ -122,7 +125,8 @@
   void OnShippingOptionChange(const String& shipping_option_id) override;
   void OnPayerDetailChange(payments::mojom::blink::PayerDetailPtr) override;
   void OnPaymentResponse(payments::mojom::blink::PaymentResponsePtr) override;
-  void OnError(payments::mojom::blink::PaymentErrorReason) override;
+  void OnError(payments::mojom::blink::PaymentErrorReason,
+               const String& error_message) override;
   void OnComplete() override;
   void OnAbort(bool aborted_successfully) override;
   void OnCanMakePayment(
diff --git a/third_party/blink/renderer/modules/payments/payment_request_test.cc b/third_party/blink/renderer/modules/payments/payment_request_test.cc
index 6080022b..a8f012ea 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request_test.cc
@@ -311,7 +311,8 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall(&error_message));
 
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
-      payments::mojom::blink::PaymentErrorReason::NOT_SUPPORTED);
+      payments::mojom::blink::PaymentErrorReason::NOT_SUPPORTED,
+      "The payment method \"foo\" is not supported");
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
   EXPECT_EQ("NotSupportedError: The payment method \"foo\" is not supported",
@@ -331,7 +332,8 @@
       .Then(funcs.ExpectNoCall(), funcs.ExpectCall(&error_message));
 
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
-      payments::mojom::blink::PaymentErrorReason::USER_CANCEL);
+      payments::mojom::blink::PaymentErrorReason::USER_CANCEL,
+      "Request cancelled");
 
   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
   EXPECT_EQ("AbortError: Request cancelled", error_message);
@@ -403,12 +405,11 @@
 
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
       ->OnShippingAddressChange(BuildPaymentAddressForTest());
-  request->OnUpdatePaymentDetails(
-      ScriptValue::From(
-          scope.GetScriptState(),
-          FromJSONString(scope.GetScriptState()->GetIsolate(),
-                         scope.GetScriptState()->GetContext(),
-                         "{\"total\": {}}", scope.GetExceptionState())));
+  request->OnUpdatePaymentDetails(ScriptValue::From(
+      scope.GetScriptState(),
+      FromJSONString(scope.GetScriptState()->GetIsolate(),
+                     scope.GetScriptState()->GetContext(), "{\"total\": {}}",
+                     scope.GetExceptionState())));
   EXPECT_FALSE(scope.GetExceptionState().HadException());
 }
 
@@ -435,12 +436,11 @@
       "\"shippingOptions\": [{\"id\": \"standardShippingOption\", \"label\": "
       "\"Standard shipping\", \"amount\": {\"currency\": \"USD\", \"value\": "
       "\"5.00\"}, \"selected\": true}]}";
-  request->OnUpdatePaymentDetails(
-      ScriptValue::From(scope.GetScriptState(),
-                        FromJSONString(scope.GetScriptState()->GetIsolate(),
-                                       scope.GetScriptState()->GetContext(),
-                                       detail_with_shipping_options,
-                                       scope.GetExceptionState())));
+  request->OnUpdatePaymentDetails(ScriptValue::From(
+      scope.GetScriptState(),
+      FromJSONString(scope.GetScriptState()->GetIsolate(),
+                     scope.GetScriptState()->GetContext(),
+                     detail_with_shipping_options, scope.GetExceptionState())));
   EXPECT_FALSE(scope.GetExceptionState().HadException());
   EXPECT_EQ("standardShippingOption", request->shippingOption());
   static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
@@ -537,12 +537,11 @@
       "\"value\": \"5.00\"}},"
       "\"error\": \"This is an error message.\"}";
 
-  request->OnUpdatePaymentDetails(
-      ScriptValue::From(
-          scope.GetScriptState(),
-          FromJSONString(scope.GetScriptState()->GetIsolate(),
-                         scope.GetScriptState()->GetContext(),
-                         detail_with_error_msg, scope.GetExceptionState())));
+  request->OnUpdatePaymentDetails(ScriptValue::From(
+      scope.GetScriptState(),
+      FromJSONString(scope.GetScriptState()->GetIsolate(),
+                     scope.GetScriptState()->GetContext(),
+                     detail_with_error_msg, scope.GetExceptionState())));
   EXPECT_FALSE(scope.GetExceptionState().HadException());
 }
 
diff --git a/third_party/blink/renderer/modules/serial/BUILD.gn b/third_party/blink/renderer/modules/serial/BUILD.gn
index cf08466..d012183 100644
--- a/third_party/blink/renderer/modules/serial/BUILD.gn
+++ b/third_party/blink/renderer/modules/serial/BUILD.gn
@@ -16,6 +16,8 @@
     "serial.h",
     "serial_port.cc",
     "serial_port.h",
+    "serial_port_underlying_source.cc",
+    "serial_port_underlying_source.h",
     "worker_navigator_serial.cc",
     "worker_navigator_serial.h",
   ]
diff --git a/third_party/blink/renderer/modules/serial/DEPS b/third_party/blink/renderer/modules/serial/DEPS
index ee7d4d0..eea6680 100644
--- a/third_party/blink/renderer/modules/serial/DEPS
+++ b/third_party/blink/renderer/modules/serial/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
   "+base/unguessable_token.h",
+  "+mojo/public/cpp/system/data_pipe.h",
+  "+mojo/public/cpp/system/simple_watcher.h",
   "+services/device/public/mojom",
 ]
diff --git a/third_party/blink/renderer/modules/serial/serial_port.cc b/third_party/blink/renderer/modules/serial/serial_port.cc
index bf98e94..a6c308c 100644
--- a/third_party/blink/renderer/modules/serial/serial_port.cc
+++ b/third_party/blink/renderer/modules/serial/serial_port.cc
@@ -4,13 +4,22 @@
 
 #include "third_party/blink/renderer/modules/serial/serial_port.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/modules/serial/serial.h"
+#include "third_party/blink/renderer/modules/serial/serial_options.h"
+#include "third_party/blink/renderer/modules/serial/serial_port_underlying_source.h"
+#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 
 namespace blink {
 
+namespace {
+const char kOpenError[] = "Failed to open serial port.";
+const int kMaxBufferSize = 16 * 1024 * 1024; /* 16 MiB */
+}  // namespace
+
 SerialPort::SerialPort(Serial* parent, mojom::blink::SerialPortInfoPtr info)
     : info_(std::move(info)), parent_(parent) {}
 
@@ -18,28 +27,230 @@
 
 ScriptPromise SerialPort::open(ScriptState* script_state,
                                const SerialOptions* options) {
-  if (port_)
-    return ScriptPromise::CastUndefined(script_state);
+  if (open_resolver_) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "A call to open() is already in progress."));
+  }
+
+  if (port_) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
+                                           "The port is already open."));
+  }
+
+  // TODO(crbug.com/884928): Implement full conversion of SerialOptions.
+  auto mojo_options = device::mojom::blink::SerialConnectionOptions::New();
+  mojo_options->bitrate = options->baudrate();
+  mojo_options->data_bits = device::mojom::blink::SerialDataBits::EIGHT;
+  mojo_options->parity_bit = device::mojom::blink::SerialParityBit::NO_PARITY;
+  mojo_options->stop_bits = device::mojom::blink::SerialStopBits::ONE;
+
+  if (options->buffersize() <= 0) {
+    return ScriptPromise::Reject(
+        script_state,
+        V8ThrowException::CreateRangeError(
+            script_state->GetIsolate(),
+            String::Format(
+                "Requested buffer size (%d bytes) must be greater than zero.",
+                options->buffersize())));
+  }
+
+  if (options->buffersize() > kMaxBufferSize) {
+    return ScriptPromise::Reject(
+        script_state,
+        V8ThrowException::CreateRangeError(
+            script_state->GetIsolate(),
+            String::Format("Requested buffer size (%d bytes) is greater than "
+                           "the maximum allowed (%d bytes).",
+                           options->buffersize(), kMaxBufferSize)));
+  }
+  buffer_size_ = options->buffersize();
+
+  // Pipe handle pair for the ReadableStream.
+  mojo::ScopedDataPipeConsumerHandle readable_pipe;
+  mojo::ScopedDataPipeProducerHandle readable_pipe_producer;
+  if (!CreateDataPipe(&readable_pipe_producer, &readable_pipe)) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kQuotaExceededError,
+                          "Resources exhausted allocating read buffer."));
+  }
+
+  // Pipe handle pair for the WritableStream.
+  mojo::ScopedDataPipeProducerHandle writable_pipe;
+  mojo::ScopedDataPipeConsumerHandle writable_pipe_consumer;
+  if (!CreateDataPipe(&writable_pipe, &writable_pipe_consumer)) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kQuotaExceededError,
+                          "Resources exhausted allocating read buffer."));
+  }
+
+  device::mojom::blink::SerialPortClientPtr client_ptr;
+  auto client_request = mojo::MakeRequest(&client_ptr);
 
   parent_->GetPort(info_->token, mojo::MakeRequest(&port_));
-  // TODO(https://crbug.com/884928): Call port_->Open() and initialize the
-  // ReadableStream and WritableStream.
-  return ScriptPromise::CastUndefined(script_state);
+  port_.set_connection_error_handler(
+      WTF::Bind(&SerialPort::OnConnectionError, WrapWeakPersistent(this)));
+
+  open_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  auto callback = WTF::Bind(&SerialPort::OnOpen, WrapPersistent(this),
+                            std::move(readable_pipe), std::move(writable_pipe),
+                            std::move(client_request));
+
+  port_->Open(std::move(mojo_options), std::move(writable_pipe_consumer),
+              std::move(readable_pipe_producer), std::move(client_ptr),
+              std::move(callback));
+  return open_resolver_->Promise();
 }
 
-ScriptPromise SerialPort::close(ScriptState* script_state) {
+void SerialPort::clearReadError(ScriptState* script_state,
+                                ExceptionState& exception_state) {
+  if (!port_) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "Port is not open.");
+    return;
+  }
+
+  if (underlying_source_) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "No error to clear.");
+    return;
+  }
+
+  mojo::ScopedDataPipeConsumerHandle readable_pipe;
+  mojo::ScopedDataPipeProducerHandle readable_pipe_producer;
+  if (!CreateDataPipe(&readable_pipe_producer, &readable_pipe)) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kQuotaExceededError,
+        "Resources exhausted allocating read buffer.");
+    return;
+  }
+
+  port_->ClearReadError(std::move(readable_pipe_producer));
+  InitializeReadableStream(script_state, std::move(readable_pipe));
+}
+
+void SerialPort::close() {
+  if (underlying_source_) {
+    underlying_source_->ExpectClose();
+  }
   ContextDestroyed();
-  return ScriptPromise::CastUndefined(script_state);
+}
+
+void SerialPort::UnderlyingSourceClosed() {
+  readable_ = nullptr;
+  underlying_source_ = nullptr;
 }
 
 void SerialPort::ContextDestroyed() {
   // Release connection-related resources as quickly as possible.
   port_.reset();
+  if (client_binding_.is_bound())
+    client_binding_.Unbind();
+  readable_ = nullptr;
+  underlying_source_ = nullptr;
 }
 
 void SerialPort::Trace(Visitor* visitor) {
   visitor->Trace(parent_);
+  visitor->Trace(readable_);
+  visitor->Trace(underlying_source_);
+  visitor->Trace(open_resolver_);
   ScriptWrappable::Trace(visitor);
 }
 
+void SerialPort::Dispose() {
+  // The binding holds a raw pointer to this object which must be released when
+  // it becomes garbage.
+  if (client_binding_.is_bound())
+    client_binding_.Unbind();
+}
+
+void SerialPort::OnReadError(device::mojom::blink::SerialReceiveError error) {
+  if (underlying_source_) {
+    // TODO(crbug.com/893334): Customize the exception based on |error|.
+    underlying_source_->SignalErrorOnClose(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNetworkError, "Port encountered error."));
+  }
+}
+
+void SerialPort::OnSendError(device::mojom::blink::SerialSendError error) {
+  // TODO(crbug.com/893334): Signal to the underlying sink.
+}
+
+bool SerialPort::CreateDataPipe(mojo::ScopedDataPipeProducerHandle* producer,
+                                mojo::ScopedDataPipeConsumerHandle* consumer) {
+  MojoCreateDataPipeOptions options;
+  options.struct_size = sizeof(MojoCreateDataPipeOptions);
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
+  options.element_num_bytes = 1;
+  options.capacity_num_bytes = buffer_size_;
+
+  MojoResult result = mojo::CreateDataPipe(&options, producer, consumer);
+  if (result == MOJO_RESULT_OK)
+    return true;
+
+  DCHECK_EQ(result, MOJO_RESULT_RESOURCE_EXHAUSTED);
+  return false;
+}
+
+void SerialPort::OnConnectionError() {
+  if (open_resolver_) {
+    open_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNetworkError, kOpenError));
+    open_resolver_ = nullptr;
+  }
+  if (underlying_source_) {
+    underlying_source_->SignalErrorOnClose(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNetworkError, "Port closed unexpectedly."));
+  }
+  // TODO(crbug.com/893334): Signal to the underlying sink.
+  ContextDestroyed();
+}
+
+void SerialPort::OnOpen(
+    mojo::ScopedDataPipeConsumerHandle readable_pipe,
+    mojo::ScopedDataPipeProducerHandle writable_pipe,
+    device::mojom::blink::SerialPortClientRequest client_request,
+    bool success) {
+  ScriptState* script_state = open_resolver_->GetScriptState();
+  if (!script_state->ContextIsValid())
+    return;
+
+  if (!success) {
+    open_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNetworkError, kOpenError));
+    open_resolver_ = nullptr;
+    return;
+  }
+
+  ScriptState::Scope scope(script_state);
+  InitializeReadableStream(script_state, std::move(readable_pipe));
+  InitializeWritableStream(script_state, std::move(writable_pipe));
+  client_binding_.Bind(std::move(client_request));
+  open_resolver_->Resolve();
+  open_resolver_ = nullptr;
+}
+
+void SerialPort::InitializeReadableStream(
+    ScriptState* script_state,
+    mojo::ScopedDataPipeConsumerHandle readable_pipe) {
+  DCHECK(!underlying_source_);
+  DCHECK(!readable_);
+  underlying_source_ = MakeGarbageCollected<SerialPortUnderlyingSource>(
+      script_state, this, std::move(readable_pipe));
+  readable_ = ReadableStream::CreateWithCountQueueingStrategy(
+      script_state, underlying_source_, 0);
+}
+
+void SerialPort::InitializeWritableStream(
+    ScriptState* script_state,
+    mojo::ScopedDataPipeProducerHandle writable_pipe) {
+  // TODO(crbug.com/893334): Implement a SerialPortUnderlyingSink.
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/serial/serial_port.h b/third_party/blink/renderer/modules/serial/serial_port.h
index 3073b99..b699c6b 100644
--- a/third_party/blink/renderer/modules/serial/serial_port.h
+++ b/third_party/blink/renderer/modules/serial/serial_port.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SERIAL_SERIAL_PORT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERIAL_SERIAL_PORT_H_
 
+#include "mojo/public/cpp/bindings/binding.h"
 #include "services/device/public/mojom/serial.mojom-blink.h"
 #include "third_party/blink/public/mojom/serial/serial.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
@@ -18,35 +19,66 @@
 namespace blink {
 
 class ReadableStream;
+class ScriptPromiseResolver;
 class ScriptState;
 class Serial;
 class SerialOptions;
+class SerialPortUnderlyingSource;
 class WritableStream;
 
-class SerialPort final : public ScriptWrappable {
+class SerialPort final : public ScriptWrappable,
+                         public device::mojom::blink::SerialPortClient {
   DEFINE_WRAPPERTYPEINFO();
+  USING_PRE_FINALIZER(SerialPort, Dispose);
 
  public:
   explicit SerialPort(Serial* parent, mojom::blink::SerialPortInfoPtr info);
   ~SerialPort() override;
 
   // Web-exposed functions
-  ReadableStream* in() const { return nullptr; }
-  WritableStream* out() const { return nullptr; }
+  ReadableStream* readable() const { return readable_; }
+  WritableStream* writable() const { return nullptr; }
 
   ScriptPromise open(ScriptState*, const SerialOptions* options);
-  ScriptPromise close(ScriptState*);
+  void clearReadError(ScriptState*, ExceptionState&);
+  void close();
 
   const base::UnguessableToken& token() const { return info_->token; }
+  void UnderlyingSourceClosed();
 
   void ContextDestroyed();
   void Trace(Visitor*) override;
+  void Dispose();
+
+  // SerialPortClient
+  void OnReadError(device::mojom::blink::SerialReceiveError) override;
+  void OnSendError(device::mojom::blink::SerialSendError) override;
 
  private:
-  mojom::blink::SerialPortInfoPtr info_;
-  device::mojom::blink::SerialPortPtr port_;
+  bool CreateDataPipe(mojo::ScopedDataPipeProducerHandle* producer,
+                      mojo::ScopedDataPipeConsumerHandle* consumer);
+  void OnConnectionError();
+  void OnOpen(mojo::ScopedDataPipeConsumerHandle,
+              mojo::ScopedDataPipeProducerHandle,
+              device::mojom::blink::SerialPortClientRequest,
+              bool success);
+  void InitializeReadableStream(ScriptState*,
+                                mojo::ScopedDataPipeConsumerHandle);
+  void InitializeWritableStream(ScriptState*,
+                                mojo::ScopedDataPipeProducerHandle);
 
+  mojom::blink::SerialPortInfoPtr info_;
   Member<Serial> parent_;
+
+  uint32_t buffer_size_ = 0;
+  device::mojom::blink::SerialPortPtr port_;
+  mojo::Binding<device::mojom::blink::SerialPortClient> client_binding_{this};
+
+  Member<ReadableStream> readable_;
+  Member<SerialPortUnderlyingSource> underlying_source_;
+
+  // Resolver for the Promise returned by open().
+  Member<ScriptPromiseResolver> open_resolver_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/serial/serial_port.idl b/third_party/blink/renderer/modules/serial/serial_port.idl
index d525b937..b54ea8b5 100644
--- a/third_party/blink/renderer/modules/serial/serial_port.idl
+++ b/third_party/blink/renderer/modules/serial/serial_port.idl
@@ -8,12 +8,15 @@
     Exposed(Window Serial,DedicatedWorker Serial),
     SecureContext
 ] interface SerialPort {
-    readonly attribute ReadableStream in;
-    readonly attribute WritableStream out;
+    readonly attribute ReadableStream readable;
+    readonly attribute WritableStream writable;
 
     [CallWith=ScriptState, MeasureAs=SerialPortOpen]
     Promise<void> open(SerialOptions options);
 
-    [CallWith=ScriptState, MeasureAs=SerialPortClose]
-    Promise<void> close();
+    [CallWith=ScriptState, RaisesException]
+    void clearReadError();
+
+    [MeasureAs=SerialPortClose]
+    void close();
 };
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc b/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc
new file mode 100644
index 0000000..a6996d9
--- /dev/null
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_source.cc
@@ -0,0 +1,181 @@
+// 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 "third_party/blink/renderer/modules/serial/serial_port_underlying_source.h"
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/core/streams/readable_stream_default_controller_interface.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
+#include "third_party/blink/renderer/modules/serial/serial_port.h"
+
+namespace blink {
+
+SerialPortUnderlyingSource::SerialPortUnderlyingSource(
+    ScriptState* script_state,
+    SerialPort* serial_port,
+    mojo::ScopedDataPipeConsumerHandle handle)
+    : UnderlyingSourceBase(script_state),
+      data_pipe_(std::move(handle)),
+      watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+      serial_port_(serial_port) {
+  watcher_.Watch(data_pipe_.get(),
+                 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+                 MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED,
+                 WTF::BindRepeating(&SerialPortUnderlyingSource::OnHandleReady,
+                                    WrapWeakPersistent(this)));
+}
+
+ScriptPromise SerialPortUnderlyingSource::pull(ScriptState* script_state) {
+  // Only one pending call to pull() is allowed by the spec.
+  DCHECK(!pending_pull_);
+  // pull() shouldn't be called if an error has been signaled to the controller.
+  DCHECK(data_pipe_);
+
+  if (ReadData())
+    return ScriptPromise::CastUndefined(script_state);
+
+  return ArmWatcher(script_state);
+}
+
+ScriptPromise SerialPortUnderlyingSource::Cancel(ScriptState* script_state,
+                                                 ScriptValue reason) {
+  Close();
+  return ScriptPromise::CastUndefined(script_state);
+}
+
+void SerialPortUnderlyingSource::ContextDestroyed(
+    ExecutionContext* execution_context) {
+  Close();
+  UnderlyingSourceBase::ContextDestroyed(execution_context);
+}
+
+void SerialPortUnderlyingSource::SignalErrorImmediately(
+    DOMException* exception) {
+  SignalErrorOnClose(exception);
+  PipeClosed();
+}
+
+void SerialPortUnderlyingSource::SignalErrorOnClose(DOMException* exception) {
+  if (data_pipe_) {
+    // Pipe is still open. Wait for PipeClosed() to be called.
+    pending_exception_ = exception;
+    return;
+  }
+
+  Controller()->Error(exception);
+  serial_port_->UnderlyingSourceClosed();
+}
+
+void SerialPortUnderlyingSource::ExpectClose() {
+  if (data_pipe_) {
+    // Pipe is still open. Wait for PipeClosed() to be called.
+    expect_close_ = true;
+    return;
+  }
+
+  Controller()->Close();
+  serial_port_->UnderlyingSourceClosed();
+}
+
+void SerialPortUnderlyingSource::Trace(Visitor* visitor) {
+  visitor->Trace(pending_pull_);
+  visitor->Trace(pending_exception_);
+  visitor->Trace(serial_port_);
+  UnderlyingSourceBase::Trace(visitor);
+}
+
+bool SerialPortUnderlyingSource::ReadData() {
+  const void* buffer = nullptr;
+  uint32_t available = 0;
+  MojoResult result =
+      data_pipe_->BeginReadData(&buffer, &available, MOJO_READ_DATA_FLAG_NONE);
+  switch (result) {
+    case MOJO_RESULT_OK: {
+      auto* array = DOMUint8Array::Create(
+          static_cast<const unsigned char*>(buffer), available);
+      result = data_pipe_->EndReadData(available);
+      DCHECK_EQ(result, MOJO_RESULT_OK);
+      Controller()->Enqueue(array);
+      return true;
+    }
+    case MOJO_RESULT_FAILED_PRECONDITION:
+      PipeClosed();
+      return true;
+    case MOJO_RESULT_SHOULD_WAIT:
+      return false;
+    default:
+      NOTREACHED();
+      return false;
+  }
+}
+
+ScriptPromise SerialPortUnderlyingSource::ArmWatcher(
+    ScriptState* script_state) {
+  MojoResult ready_result;
+  mojo::HandleSignalsState ready_state;
+  MojoResult result = watcher_.Arm(&ready_result, &ready_state);
+  if (result == MOJO_RESULT_OK) {
+    pending_pull_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+    return pending_pull_->Promise();
+  }
+
+  DCHECK_EQ(ready_result, MOJO_RESULT_OK);
+  if (ready_state.readable()) {
+    bool read_result = ReadData();
+    DCHECK(read_result);
+  } else if (ready_state.peer_closed()) {
+    PipeClosed();
+  }
+
+  return ScriptPromise::CastUndefined(script_state);
+}
+
+void SerialPortUnderlyingSource::OnHandleReady(
+    MojoResult result,
+    const mojo::HandleSignalsState& state) {
+  DCHECK(pending_pull_);
+
+  switch (result) {
+    case MOJO_RESULT_OK: {
+      bool read_result = ReadData();
+      DCHECK(read_result);
+      // If the pipe was closed |pending_pull_| will have been resolved.
+      if (pending_pull_) {
+        pending_pull_->Resolve();
+        pending_pull_ = nullptr;
+      }
+      break;
+    }
+    case MOJO_RESULT_SHOULD_WAIT:
+      watcher_.ArmOrNotify();
+      break;
+    case MOJO_RESULT_FAILED_PRECONDITION:
+      PipeClosed();
+      break;
+  }
+}
+
+void SerialPortUnderlyingSource::PipeClosed() {
+  if (pending_exception_) {
+    Controller()->Error(pending_exception_);
+    serial_port_->UnderlyingSourceClosed();
+  }
+  if (expect_close_) {
+    Controller()->Close();
+    serial_port_->UnderlyingSourceClosed();
+  }
+  Close();
+}
+
+void SerialPortUnderlyingSource::Close() {
+  watcher_.Cancel();
+  data_pipe_.reset();
+  if (pending_pull_) {
+    pending_pull_->Resolve();
+    pending_pull_ = nullptr;
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h b/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h
new file mode 100644
index 0000000..c4a803a
--- /dev/null
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_source.h
@@ -0,0 +1,55 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SERIAL_SERIAL_PORT_UNDERLYING_SOURCE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_SERIAL_SERIAL_PORT_UNDERLYING_SOURCE_H_
+
+#include "mojo/public/cpp/system/data_pipe.h"
+#include "mojo/public/cpp/system/simple_watcher.h"
+#include "third_party/blink/renderer/core/streams/underlying_source_base.h"
+
+namespace blink {
+
+class DOMException;
+class ScriptPromiseResolver;
+class SerialPort;
+
+class SerialPortUnderlyingSource : public UnderlyingSourceBase {
+ public:
+  SerialPortUnderlyingSource(ScriptState*,
+                             SerialPort*,
+                             mojo::ScopedDataPipeConsumerHandle);
+
+  // UnderlyingSourceBase
+  ScriptPromise pull(ScriptState*) override;
+  ScriptPromise Cancel(ScriptState*, ScriptValue reason) override;
+  void ContextDestroyed(ExecutionContext*) override;
+
+  void SignalErrorImmediately(DOMException*);
+  void SignalErrorOnClose(DOMException*);
+  void ExpectClose();
+
+  void Trace(Visitor*) override;
+
+ private:
+  // Reads data from |data_pipe_|. Returns true if data was enqueued to
+  // |Controller()| or the pipe was closed, and false otherwise.
+  bool ReadData();
+
+  ScriptPromise ArmWatcher(ScriptState*);
+  void OnHandleReady(MojoResult, const mojo::HandleSignalsState&);
+  void PipeClosed();
+  void Close();
+
+  mojo::ScopedDataPipeConsumerHandle data_pipe_;
+  mojo::SimpleWatcher watcher_;
+  Member<SerialPort> serial_port_;
+  Member<ScriptPromiseResolver> pending_pull_;
+  Member<DOMException> pending_exception_;
+  bool expect_close_ = false;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SERIAL_SERIAL_PORT_UNDERLYING_SOURCE_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.cc b/third_party/blink/renderer/modules/xr/xr_ray.cc
index 4a1c664..9e695382 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.cc
+++ b/third_party/blink/renderer/modules/xr/xr_ray.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/geometry/dom_point_read_only.h"
 #include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
 #include "third_party/blink/renderer/modules/xr/xr_utils.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "ui/gfx/geometry/quaternion.h"
@@ -19,16 +20,19 @@
 
 namespace blink {
 
-XRRay::XRRay(const TransformationMatrix& matrix) {
-  Set(matrix);
+XRRay::XRRay(const TransformationMatrix& matrix,
+             ExceptionState& exception_state) {
+  Set(matrix, exception_state);
 }
 
-XRRay::XRRay(XRRigidTransform* transform) {
+XRRay::XRRay(XRRigidTransform* transform, ExceptionState& exception_state) {
   DOMFloat32Array* m = transform->matrix();
-  Set(DOMFloat32ArrayToTransformationMatrix(m));
+  Set(DOMFloat32ArrayToTransformationMatrix(m), exception_state);
 }
 
-XRRay::XRRay(DOMPointInit* origin, DOMPointInit* direction) {
+XRRay::XRRay(DOMPointInit* origin,
+             DOMPointInit* direction,
+             ExceptionState& exception_state) {
   FloatPoint3D o;
   if (origin) {
     o = FloatPoint3D(origin->x(), origin->y(), origin->z());
@@ -43,27 +47,32 @@
     d = FloatPoint3D(0.f, 0.f, -1.f);
   }
 
-  Set(o, d);
+  Set(o, d, exception_state);
 }
 
-void XRRay::Set(const TransformationMatrix& matrix) {
+void XRRay::Set(const TransformationMatrix& matrix,
+                ExceptionState& exception_state) {
   FloatPoint3D origin = matrix.MapPoint(FloatPoint3D(0, 0, 0));
   FloatPoint3D direction = matrix.MapPoint(FloatPoint3D(0, 0, -1));
   direction.Move(-origin.X(), -origin.Y(), -origin.Z());
 
-  Set(origin, direction);
+  Set(origin, direction, exception_state);
 }
 
 // Sets member variables from passed in |origin| and |direction|.
 // All constructors eventually invoke this method.
 // If the |direction|'s length is 0, this method will initialize direction to
 // default vector (0, 0, -1).
-void XRRay::Set(FloatPoint3D origin, FloatPoint3D direction) {
+void XRRay::Set(FloatPoint3D origin,
+                FloatPoint3D direction,
+                ExceptionState& exception_state) {
   DVLOG(3) << __FUNCTION__ << ": origin=" << origin.ToString()
            << ", direction=" << direction.ToString();
 
   if (direction.length() == 0.0f) {
-    direction = FloatPoint3D{0, 0, -1};
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      kUnableToNormalizeZeroLength);
+    return;
   } else {
     direction.Normalize();
   }
@@ -73,20 +82,48 @@
                                         direction.Z(), 0.0);
 }
 
-XRRay* XRRay::Create(XRRigidTransform* transform) {
-  return MakeGarbageCollected<XRRay>(transform);
+XRRay* XRRay::Create(XRRigidTransform* transform,
+                     ExceptionState& exception_state) {
+  auto* result = MakeGarbageCollected<XRRay>(transform, exception_state);
+
+  if (exception_state.HadException()) {
+    return nullptr;
+  }
+
+  return result;
 }
 
-XRRay* XRRay::Create() {
-  return MakeGarbageCollected<XRRay>(nullptr, nullptr);
+XRRay* XRRay::Create(ExceptionState& exception_state) {
+  auto* result = MakeGarbageCollected<XRRay>(nullptr, nullptr, exception_state);
+
+  if (exception_state.HadException()) {
+    return nullptr;
+  }
+
+  return result;
 }
 
-XRRay* XRRay::Create(DOMPointInit* origin) {
-  return MakeGarbageCollected<XRRay>(origin, nullptr);
+XRRay* XRRay::Create(DOMPointInit* origin, ExceptionState& exception_state) {
+  auto* result = MakeGarbageCollected<XRRay>(origin, nullptr, exception_state);
+
+  if (exception_state.HadException()) {
+    return nullptr;
+  }
+
+  return result;
 }
 
-XRRay* XRRay::Create(DOMPointInit* origin, DOMPointInit* direction) {
-  return MakeGarbageCollected<XRRay>(origin, direction);
+XRRay* XRRay::Create(DOMPointInit* origin,
+                     DOMPointInit* direction,
+                     ExceptionState& exception_state) {
+  auto* result =
+      MakeGarbageCollected<XRRay>(origin, direction, exception_state);
+
+  if (exception_state.HadException()) {
+    return nullptr;
+  }
+
+  return result;
 }
 
 XRRay::~XRRay() {}
@@ -94,52 +131,62 @@
 DOMFloat32Array* XRRay::matrix() {
   DVLOG(3) << __FUNCTION__;
 
-  if (!matrix_) {
+  // A page may take the matrix value and detach it so matrix_ is a detached
+  // array buffer.  If that's the case, recompute the matrix.
+  // Step 1. If transform’s internal matrix is not null, perform the following
+  // steps:
+  //    Step 1. If the operation IsDetachedBuffer on internal matrix is false,
+  //    return transform’s internal matrix.
+  if (!matrix_ || !matrix_->View() || !matrix_->View()->Data()) {
     // Returned matrix should represent transformation from ray originating at
     // (0,0,0) with direction (0,0,-1) into ray originating at |origin_| with
     // direction |direction_|.
 
     TransformationMatrix matrix;
 
-    // Translation from 0 to |origin_| is simply translation by |origin_|.
-    matrix.Translate3d(origin_->x(), origin_->y(), origin_->z());
-
-    const blink::FloatPoint3D initialRayDirection =
-        blink::FloatPoint3D{0.f, 0.f, -1.f};
     const blink::FloatPoint3D desiredRayDirection = {
         direction_->x(), direction_->y(), direction_->z()};
 
+    // Translation from 0 to |origin_| is simply translation by |origin_|.
+    // (implicit) Step 6: Let translation be the translation matrix with
+    // components corresponding to ray’s origin
+    matrix.Translate3d(origin_->x(), origin_->y(), origin_->z());
+
+    // Step 2: Let z be the vector [0, 0, -1]
+    const blink::FloatPoint3D initialRayDirection =
+        blink::FloatPoint3D{0.f, 0.f, -1.f};
+
+    // Step 3: Let axis be the vector cross product of z and ray’s direction,
+    // z × direction
+    blink::FloatPoint3D axis = initialRayDirection.Cross(desiredRayDirection);
+
+    // Step 4: Let cos_angle be the scalar dot product of z and ray’s direction,
+    // z · direction
     float cos_angle = initialRayDirection.Dot(desiredRayDirection);
 
+    // Step 5: Set rotation based on the following:
     if (cos_angle > 0.9999) {
       // Vectors are co-linear or almost co-linear & face the same direction,
       // no rotation is needed.
+
     } else if (cos_angle < -0.9999) {
       // Vectors are co-linear or almost co-linear & face the opposite
       // direction, rotation by 180 degrees is needed & can be around any vector
       // perpendicular to (0,0,-1) so let's rotate by (1, 0, 0).
-      blink::FloatPoint3D axis = FloatPoint3D{1, 0, 0};
-      cos_angle = -1;
-
-      matrix.Rotate3d(axis.X(), axis.Y(), axis.Z(),
-                      rad2deg(std::acos(cos_angle)));
+      matrix.Rotate3d(1, 0, 0, 180);
     } else {
       // Rotation needed - create it from axis-angle.
-      blink::FloatPoint3D axis = initialRayDirection.Cross(desiredRayDirection);
-
       matrix.Rotate3d(axis.X(), axis.Y(), axis.Z(),
                       rad2deg(std::acos(cos_angle)));
     }
 
+    // Step 7: Let matrix be the result of premultiplying rotation from the left
+    // onto translation (i.e. translation * rotation) in column-vector notation.
+    // Step 8: Set ray’s internal matrix to matrix
     matrix_ = transformationMatrixToDOMFloat32Array(matrix);
   }
 
-  if (!matrix_ || !matrix_->View() || !matrix_->View()->Data()) {
-    // A page may take the matrix value and detach it so matrix_ is a detached
-    // array buffer.  This breaks the inspector, so return null instead.
-    return nullptr;
-  }
-
+  // Step 9: Return matrix
   return matrix_;
 }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.h b/third_party/blink/renderer/modules/xr/xr_ray.h
index 02f296b..369fefe 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.h
+++ b/third_party/blink/renderer/modules/xr/xr_ray.h
@@ -16,6 +16,7 @@
 
 class DOMPointInit;
 class DOMPointReadOnly;
+class ExceptionState;
 class TransformationMatrix;
 class XRRigidTransform;
 
@@ -23,25 +24,33 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit XRRay(const TransformationMatrix& matrix);
-  explicit XRRay(XRRigidTransform* transform);
-  XRRay(DOMPointInit* origin, DOMPointInit* direction);
+  explicit XRRay(const TransformationMatrix& matrix,
+                 ExceptionState& exception_state);
+  explicit XRRay(XRRigidTransform* transform, ExceptionState& exception_state);
+  XRRay(DOMPointInit* origin,
+        DOMPointInit* direction,
+        ExceptionState& exception_state);
   ~XRRay() override;
 
   DOMPointReadOnly* origin() const { return origin_; }
   DOMPointReadOnly* direction() const { return direction_; }
   DOMFloat32Array* matrix();
 
-  static XRRay* Create();
-  static XRRay* Create(DOMPointInit* origin);
-  static XRRay* Create(DOMPointInit* origin, DOMPointInit* direction);
-  static XRRay* Create(XRRigidTransform* transform);
+  static XRRay* Create(ExceptionState& exception_state);
+  static XRRay* Create(DOMPointInit* origin, ExceptionState& exception_state);
+  static XRRay* Create(DOMPointInit* origin,
+                       DOMPointInit* direction,
+                       ExceptionState& exception_state);
+  static XRRay* Create(XRRigidTransform* transform,
+                       ExceptionState& exception_state);
 
   void Trace(blink::Visitor*) override;
 
  private:
-  void Set(const TransformationMatrix& matrix);
-  void Set(FloatPoint3D origin, FloatPoint3D direction);
+  void Set(const TransformationMatrix& matrix, ExceptionState& exception_state);
+  void Set(FloatPoint3D origin,
+           FloatPoint3D direction,
+           ExceptionState& exception_state);
 
   Member<DOMPointReadOnly> origin_;
   Member<DOMPointReadOnly> direction_;
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.idl b/third_party/blink/renderer/modules/xr/xr_ray.idl
index fa85593..38bb19e 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.idl
+++ b/third_party/blink/renderer/modules/xr/xr_ray.idl
@@ -10,7 +10,8 @@
     Constructor(),
     Constructor(DOMPointInit origin),
     Constructor(DOMPointInit origin, DOMPointInit direction),
-    Constructor(XRRigidTransform transform)
+    Constructor(XRRigidTransform transform),
+    RaisesException=Constructor
 ] interface XRRay {
   [SameObject] readonly attribute DOMPointReadOnly origin;
   [SameObject] readonly attribute DOMPointReadOnly direction;
diff --git a/third_party/blink/renderer/modules/xr/xr_utils.h b/third_party/blink/renderer/modules/xr/xr_utils.h
index 4ecf343..50b43705 100644
--- a/third_party/blink/renderer/modules/xr/xr_utils.h
+++ b/third_party/blink/renderer/modules/xr/xr_utils.h
@@ -26,6 +26,9 @@
                                            double z,
                                            double w);
 
+constexpr char kUnableToNormalizeZeroLength[] =
+    "Unable to normalize vector of length 0.";
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_UTILS_H_
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index 4176da04..2a41297e 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -699,4 +699,8 @@
   RuntimeEnabledFeatures::SetStreamsNativeEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableMouseSubframeNoImplicitCapture(bool enable) {
+  RuntimeEnabledFeatures::SetMouseSubframeNoImplicitCaptureEnabled(enable);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/mojo/geometry_struct_traits_test.cc b/third_party/blink/renderer/platform/mojo/geometry_struct_traits_test.cc
index 61735335..3333a12 100644
--- a/third_party/blink/renderer/platform/mojo/geometry_struct_traits_test.cc
+++ b/third_party/blink/renderer/platform/mojo/geometry_struct_traits_test.cc
@@ -90,6 +90,12 @@
     NOTREACHED();
   }
 
+  void EchoQuaternion(gfx::mojom::blink::QuaternionPtr,
+                      EchoQuaternionCallback) override {
+    // The type map is not specified.
+    NOTREACHED();
+  }
+
   mojo::BindingSet<gfx::mojom::blink::GeometryTraitsTestService>
       traits_test_bindings_;
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 29f9b8d..baf5762 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -960,6 +960,10 @@
       status: "test",
     },
     {
+      // When enabled, iframes are not capturing mouse events by default.
+      name: "MouseSubframeNoImplicitCapture",
+    },
+    {
       name: "MuteButton",
       depends_on: ["PictureInPictureAPI"],
       origin_trial_feature_name: "MuteButton",
diff --git a/third_party/blink/tools/blinkpy/web_tests/merge_results.py b/third_party/blink/tools/blinkpy/web_tests/merge_results.py
index 67a28b83..8177360 100644
--- a/third_party/blink/tools/blinkpy/web_tests/merge_results.py
+++ b/third_party/blink/tools/blinkpy/web_tests/merge_results.py
@@ -667,10 +667,20 @@
             ('Output directory %s exists!\n'
              'Use --allow-existing-output-directory to continue') % directory)
 
-    if remove_existing and not fs.remove_contents(directory):
+    if not remove_existing:
+        return
+
+    # The directory name 'layout-test-results' needs to be consistent with
+    # //build/scripts/slave/recipe_modules/chromium_tests/steps.py and
+    # //src/testing/buildbot/gn_isolate_map.pyl.
+    layout_test_results = fs.join(directory, 'layout-test-results')
+    merged_output_json = fs.join(directory, 'output.json')
+    if fs.exists(layout_test_results) and not fs.remove_contents(layout_test_results):
         raise IOError(
             ('Unable to remove output directory %s contents!\n'
-             'See log output for errors.') % directory)
+             'See log output for errors.') % layout_test_results)
+    if fs.exists(merged_output_json):
+        fs.remove(merged_output_json)
 
 
 def main(argv):
@@ -710,9 +720,9 @@
         action='store_true', default=False,
         help='Allow merging results into a directory which already exists.')
     parser.add_argument(
-        '--remove-existing-output-directory',
+        '--remove-existing-layout-test-results',
         action='store_true', default=False,
-        help='Remove merging results into a directory which already exists.')
+        help='Remove existing layout test results from the output directory.')
     parser.add_argument(
         '--input-directories', nargs='+',
         help='Directories to merge the results from.')
@@ -787,7 +797,7 @@
         if not args.output_directory:
             args.output_directory = os.getcwd()
             args.allow_existing_output_directory = True
-            args.remove_existing_output_directory = True
+            args.remove_existing_layout_test_results = True
 
         assert not args.input_directories
         args.input_directories = [os.path.dirname(f) for f in args.positional]
@@ -799,7 +809,8 @@
         args.input_directories = args.positional
 
     if not args.output_directory:
-        args.output_directory = tempfile.mkdtemp(suffix='webkit_layout_test_results.')
+        args.output_directory = tempfile.mkdtemp(suffix='_merged_web_test_results')
+        args.allow_existing_output_directory = True
 
     assert args.output_directory
     assert args.input_directories
@@ -823,7 +834,7 @@
         FileSystem(),
         args.output_directory,
         allow_existing=args.allow_existing_output_directory,
-        remove_existing=args.remove_existing_output_directory)
+        remove_existing=args.remove_existing_layout_test_results)
 
     merger.merge(args.output_directory, args.input_directories)
 
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 52a7841c..c478f550 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -2194,8 +2194,6 @@
 Bug(none) external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html [ WontFix ]
 Bug(none) external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html [ WontFix ]
 Bug(none) external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-similar-but-cross-origin-success.sub.html [ WontFix ]
-Bug(none) virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html [ WontFix ]
-Bug(none) virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-similar-but-cross-origin-success.sub.html [ WontFix ]
 Bug(none) external/wpt/wasm/serialization/module/window-domain-success.sub.html [ WontFix ]
 Bug(none) external/wpt/wasm/serialization/module/window-similar-but-cross-origin-success.sub.html [ WontFix ]
 # -------------------- origin-vs-url in console messages -----------------
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index bdc5f84..55291a7 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -367,8 +367,6 @@
 crbug.com/954591 external/wpt/css/css-transforms/composited-under-rotateY-180deg.html [ Failure ]
 crbug.com/954591 external/wpt/css/css-transforms/composited-under-rotateY-180deg-clip.html [ Failure ]
 
-# LayoutNG fixes this
-
 # ====== Paint team owned tests to here ======
 
 crbug.com/922249 virtual/android/fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure Pass ]
@@ -706,11 +704,6 @@
 # ====== LayoutNG-only failures from here ======
 # LayoutNG - is a new layout system for Blink.
 
-# Tests for LayoutNG to pass, but not planned to fix for pre-LayoutNG.
-crbug.com/836300 fast/css3-text/css3-text-decoration/text-decoration-skip-ink-links.html [ Pass Failure ]
-
-# ====== LayoutNG ======
-
 crbug.com/636993 external/wpt/css/css-text-decor/text-decoration-color.html [ Failure ]
 crbug.com/591099 css3/filters/composited-layer-child-bounds-after-composited-to-sw-shadow-change.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-009.html [ Failure ]
@@ -4770,9 +4763,6 @@
 crbug.com/716320 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.html [ Failure Timeout ]
 crbug.com/798572 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel-success.html [ Failure Timeout ]
 
-crbug.com/874302 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success-and-failure.html [ Timeout ]
-crbug.com/874302 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.html [ Timeout ]
-crbug.com/798572 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel-success.html [ Failure Timeout ]
 crbug.com/874302 external/wpt/wasm/serialization/module/broadcastchannel-success-and-failure.html [ Timeout ]
 crbug.com/874302 external/wpt/wasm/serialization/module/broadcastchannel-success.html [ Timeout ]
 
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index f02b2d6..a4f8e0f 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -463,12 +463,6 @@
     "args": ["--force-presentation-receiver-for-testing"]
   },
   {
-    "prefix": "sharedarraybuffer",
-    "base": "external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers",
-    "args": ["--js-flags=--harmony-sharedarraybuffer",
-             "--enable-blink-features=SharedArrayBuffer"]
-  },
-  {
     "prefix": "longtask-v2",
     "base": "http/tests/performance-timing/longtask-v2",
     "args": ["--enable-blink-features=LongTaskV2"]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index c6cc45ce8..ca55eff 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -155738,6 +155738,9 @@
    "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe-domain.sub.html": [
     []
    ],
+   "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe-messagechannel.html": [
+    []
+   ],
    "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe.html": [
     []
    ],
@@ -233465,6 +233468,12 @@
      {}
     ]
    ],
+   "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel-success.html": [
+    [
+     "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel-success.html",
+     {}
+    ]
+   ],
    "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-messagechannel-success.html": [
     [
      "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-messagechannel-success.html",
@@ -313940,7 +313949,7 @@
    "support"
   ],
   "README.md": [
-   "d4d6032d8343ded32da0604fe0efe901dbed2474",
+   "8f5a2d990852565f9ddf7abdcede2c586f45c3dd",
    "support"
   ],
   "WebCryptoAPI/META.yml": [
@@ -422395,6 +422404,10 @@
    "a6dd70177584c9115c24beb281e7681110c07624",
    "support"
   ],
+  "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe-messagechannel.html": [
+   "6f3f284ae24b1d5c1ea432766bed2cb2445a9a42",
+   "support"
+  ],
   "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe.html": [
    "6f27ad7d5becee543f00093b47fbe65fa46614dd",
    "support"
@@ -422459,6 +422472,10 @@
    "9205d01df26e3274692f48aa76d7ffceba9e51ac",
    "testharness"
   ],
+  "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel-success.html": [
+   "98145310f610f0ca88af938872e9ea2103de600c",
+   "testharness"
+  ],
   "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-messagechannel-success.html": [
    "cd67e5b2c9553a9172959c1ba7df5b96b7091a33",
    "testharness"
@@ -460292,7 +460309,7 @@
    "support"
   ],
   "resources/idlharness.js": [
-   "c7a040996b99941d5d8d6078b09953878ce612ee",
+   "cb294c072de2af61b2a4c7c8e4588d05a8186109",
    "support"
   ],
   "resources/idlharness.js.headers": [
@@ -460352,7 +460369,7 @@
    "support"
   ],
   "resources/webidl2/lib/webidl2.js": [
-   "ef519c09df6d6da812fcbba57c7ca0f475af1ed5",
+   "d909c30ff07eda519f969a22a0bae6836550c2d8",
    "support"
   ],
   "screen-capture/META.yml": [
@@ -464684,7 +464701,7 @@
    "support"
   ],
   "shadow-dom/scroll-to-the-fragment-in-shadow-tree.html": [
-   "c87932eb62f435ecf24cf30229669b569161b1c7",
+   "b4ecc16a67daeb1160523e10cca057d0c9582d5c",
    "testharness"
   ],
   "shadow-dom/slotchange-customelements.html": [
@@ -467704,7 +467721,7 @@
    "reftest"
   ],
   "svg/scripted/script-runs-in-shadow-tree.html": [
-   "d3a896fb93da55973f31fc574b13a6ad62bd1e94",
+   "9693db333ff18c1e6f39515be29c77d551e4e2fe",
    "testharness"
   ],
   "svg/scripted/text-attrs-dxdy-have-length.svg": [
@@ -468736,7 +468753,7 @@
    "support"
   ],
   "tools/manifest/vcs.py": [
-   "c810be1242668e9c7c42a9c43e534bd2365b6eb6",
+   "d98ccf900365c17ebab55af1da8a4b998fde28ca",
    "support"
   ],
   "tools/mypy.ini": [
@@ -469072,7 +469089,7 @@
    "support"
   ],
   "tools/serve/serve.py": [
-   "45634934c37b5b839275361d5ffc8b223d9f922a",
+   "77675dbeb3254e14da8cac6e9fc4ced0356292b9",
    "support"
   ],
   "tools/serve/test_functional.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image-ref.html b/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image-ref.html
new file mode 100644
index 0000000..9e72fb31
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Reference: CSS Lists: 'list-style-image' takes precedence over 'list-style-type: none'</title>
+    <link rel="author" title="Emil A Eklund" href="mailto:eae@chromium.org">
+    <style>
+      li {
+        list-style-image: url('../../images/green-16x16.png');
+      }
+    </style>
+  </head>
+  <body>
+    <ul>
+      <li>Should have a green square list marker.</li>
+    </ul>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image.html b/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image.html
new file mode 100644
index 0000000..6b7b83a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-lists/list-type-none-style-image.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>CSS Lists: 'list-style-image' takes precedence over 'list-style-type: none'</title>
+    <link rel="author" title="Emil A Eklund" href="mailto:eae@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/CSS2/generate.html#propdef-list-style-image">
+    <link rel="match" href="list-type-none-style-image-ref.html">
+    <style>
+      ul {
+        list-style-type: none;
+      }
+      li {
+        list-style-image: url('../../images/green-16x16.png');
+      }
+    </style>
+  </head>
+  <body>
+    <ul>
+      <li>Should have a green square list marker.</li>
+    </ul>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/feature-policy/reporting/payment-report-only.https-expected.txt b/third_party/blink/web_tests/external/wpt/feature-policy/reporting/payment-report-only.https-expected.txt
index 19f3d28..dc5e0c9 100644
--- a/third_party/blink/web_tests/external/wpt/feature-policy/reporting/payment-report-only.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/feature-policy/reporting/payment-report-only.https-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL PaymentRequest report only mode promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL PaymentRequest report only mode promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/navigation-timing/secure_connection_start_non_zero.https.html b/third_party/blink/web_tests/external/wpt/navigation-timing/secure_connection_start_non_zero.https.html
new file mode 100644
index 0000000..e95468ef
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/navigation-timing/secure_connection_start_non_zero.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>secureConnectionStart non-zero value test</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+    <h1>Description</h1>
+    <p>The tests that secureConnectionStart has a non-zero value.</p>
+<script>
+    window.onload = () => {
+        test(t => {
+            const entry = performance.getEntriesByType("navigation")[0];
+            assert_greater_than(entry.secureConnectionStart, 0, "secureConnectionStart is non-zero");
+        }, "Test that secureConnectionStart is not zero");
+    };
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/payment-method-basic-card/payment-request-canmakepayment-method.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-method-basic-card/payment-request-canmakepayment-method.https-expected.txt
index d5d09362..f5fe3350 100644
--- a/third_party/blink/web_tests/external/wpt/payment-method-basic-card/payment-request-canmakepayment-method.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-method-basic-card/payment-request-canmakepayment-method.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
-FAIL Must return false when the PMI is not supported at by the user agent. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
-FAIL Must return true when basic-card is amongst unsupported PMIs. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL Must return false when the PMI is not supported at by the user agent. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
+FAIL Must return true when basic-card is amongst unsupported PMIs. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 FAIL If basic-card is supported, then return a promise that resolves to true. assert_equals: if it throws, then it must be a NotAllowedError. expected "NotAllowedError" but got "UnknownError"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/constructor_convert_method_data.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/constructor_convert_method_data.https-expected.txt
index 5f66fe4..6bc9e48 100644
--- a/third_party/blink/web_tests/external/wpt/payment-request/constructor_convert_method_data.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-request/constructor_convert_method_data.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 PASS Smoke test.
 PASS Tries to convert data member during Payment Request construction, irrespective of PMI.
-FAIL Converts PaymentMethodData's data to mandated IDL type during PaymentRequest construction. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL Converts PaymentMethodData's data to mandated IDL type during PaymentRequest construction. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt
index 573abae..5b7ee0ea 100644
--- a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt
@@ -1,9 +1,9 @@
 This is a testharness.js-based test.
 Harness Error. harness_status.status = 1 , harness_status.message = No show() or retry() in progress, so nothing to abort
-FAIL If payment method identifier are supported, resolve promise with true. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL If payment method identifier are supported, resolve promise with true. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 FAIL If request.[[state]] is "created", then return a promise that resolves to true for known method. assert_equals: if it throws, then it must be a NotAllowedError. expected "NotAllowedError" but got "UnknownError"
-FAIL All methods are unsupported promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
-FAIL Mix of supported and unsupported methods, at least one method is supported. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL All methods are unsupported promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
+FAIL Mix of supported and unsupported methods, at least one method is supported. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 FAIL If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException. assert_throws: function "function() { throw e }" threw object "InvalidStateError: Already called show() once" that is not a DOMException AbortError: property "code" is equal to 11, expected 20
 FAIL If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.https-expected.txt
index fe7f167..ad1d3ce1 100644
--- a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 Harness Error. harness_status.status = 1 , harness_status.message = Already called show() once
-FAIL hasEnrolledInstrument() resolves to false for unsupported payment methods. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL hasEnrolledInstrument() resolves to false for unsupported payment methods. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 FAIL If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 FAIL If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https-expected.txt
index fe7f167..ad1d3ce1 100644
--- a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 Harness Error. harness_status.status = 1 , harness_status.message = Already called show() once
-FAIL hasEnrolledInstrument() resolves to false for unsupported payment methods. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL hasEnrolledInstrument() resolves to false for unsupported payment methods. promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process."
 FAIL If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 FAIL If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-show-method.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-show-method.https-expected.txt
index bebd7e8..b9ec0ae 100644
--- a/third_party/blink/web_tests/external/wpt/payment-request/payment-request-show-method.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-request/payment-request-show-method.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 Harness Error. harness_status.status = 1 , harness_status.message = Already called show() once
-FAIL Calling show() without being triggered by user interaction throws assert_throws: function "function() { throw e }" threw object "UnknownError: Request failed" that is not a DOMException SecurityError: property "code" is equal to 0, expected 18
+FAIL Calling show() without being triggered by user interaction throws assert_throws: function "function() { throw e }" threw object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process." that is not a DOMException SecurityError: property "code" is equal to 0, expected 18
 FAIL Throws if the promise [[state]] is not 'created'. promise_test: Unhandled rejection with value: object "InvalidStateError: No show() or retry() in progress, so nothing to abort"
 FAIL If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException. assert_throws: function "function() { throw e }" threw object "InvalidStateError: Already called show() once" that is not a DOMException AbortError: property "code" is equal to 11, expected 20
 FAIL If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException. assert_throws: function "function() { throw e }" threw object "InvalidStateError: Already called show() once" that is not a DOMException NotSupportedError: property "code" is equal to 11, expected 9
diff --git a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
index 742ebbb..0e1568f1 100644
--- a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
+++ b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
@@ -1,3 +1,3 @@
 mypy==0.710
 mypy-extensions==0.4.1
-typed-ast==1.3.5
+typed-ast==1.4.0
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRay_constructor.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrRay_constructor.https.html
index 0e78cff..ebf88845 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrRay_constructor.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRay_constructor.https.html
@@ -90,22 +90,25 @@
   }
 
   {
-    // Check that we don't crash on direction too close to 0,0,0:
+    // Check that we throw exception on direction too close to 0,0,0:
     let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0};
     let directionDict = {x : 0.0, y : 0.0, z : 0.0, w : 0.0};
 
-    let xrRay = new XRRay(
-      DOMPoint.fromPoint(originDict),
-      DOMPoint.fromPoint(directionDict));
+    try {
+      let xrRay = new XRRay(
+        DOMPoint.fromPoint(originDict),
+        DOMPoint.fromPoint(directionDict));
 
-    assert_point_approx_equals(
-      xrRay.origin, originDict,
-      FLOAT_EPSILON, "origin-custom-direction-zero:");
-
-    // cannot validate direction's & matrix's values w/o making it depend on current
-    // implementation, just check that they're not null
-    assert_not_equals(xrRay.direction, null, "origin-custom-direction-zero:direction should not be null");
-    assert_not_equals(xrRay.matrix, null, "origin-custom-direction-zero:matrix should not be null");
+      assert(false, "origin-custom-direction-zero:exception not thrown");
+    }
+    catch(e)
+    {
+      if(e instanceof DOMException) {
+        assert_equals(e.name, "InvalidStateError", "origin-custom-direction-zero:incorrect DOM exception thrown");
+      } else {
+        assert(false, "origin-custom-direction-zero:other exception thrown: " + e);
+      }
+    }
   }
 
   //
diff --git a/third_party/blink/web_tests/serial/resources/serial-test-utils.js b/third_party/blink/web_tests/serial/resources/serial-test-utils.js
index b2676e53..037b059 100644
--- a/third_party/blink/web_tests/serial/resources/serial-test-utils.js
+++ b/third_party/blink/web_tests/serial/resources/serial-test-utils.js
@@ -1,3 +1,151 @@
+// Returns a SerialPort instance and associated FakeSerialPort instance.
+async function getFakeSerialPort(fake) {
+  let token = fake.addPort();
+  let fakePort = fake.getFakePort(token);
+
+  let ports = await navigator.serial.getPorts();
+  assert_equals(ports.length, 1);
+
+  let port = ports[0];
+  assert_true(port instanceof SerialPort);
+
+  return { port, fakePort };
+}
+
+// Implementation of an UnderlyingSink to create a WritableStream from a Mojo
+// data pipe producer handle.
+class DataPipeSink {
+  constructor(producer) {
+    this._producer = producer;
+  }
+
+  async write(chunk, controller) {
+    let {result, numBytes} = this._producer.writeData(chunk);
+    if (result == Mojo.RESULT_OK) {
+      if (numBytes < chunk.byteLength)
+        return this.write(chunk.slice(numBytes), controller);
+    } else if (result == Mojo.RESULT_FAILED_PRECONDITION) {
+      controller.close();
+    } else if (result == Mojo.RESULT_SHOULD_WAIT) {
+      await this.writable();
+      return this.write(chunk, controller);
+    }
+  }
+
+  close() {
+    if (this._watcher)
+      this._watcher.cancel();
+    this._producer.close();
+  }
+
+  abort(reason) {
+    this.close();
+  }
+
+  writable() {
+    return new Promise((resolve) => {
+      this._watcher =
+          this._producer.watch({ writable: true, peerClosed: true }, () => {
+            this._watcher.cancel();
+            this._watcher = undefined;
+            resolve();
+          });
+    });
+  }
+}
+
+// Implementation of blink.mojom.SerialPort.
+class FakeSerialPort {
+  constructor() {}
+
+  bind(request) {
+    assert_equals(undefined, this.binding);
+    this.binding = new mojo.Binding(device.mojom.SerialPort,
+                                    this, request);
+    this.binding.setConnectionErrorHandler(() => {
+      this.writable_.getWriter().close();
+      this.binding = undefined;
+    });
+  }
+
+  write(data) {
+    let writer = this.writable_.getWriter();
+    writer.write(data);
+    writer.releaseLock();
+  }
+
+  simulateParityError() {
+    this.writable_.getWriter().close();
+    this.writable_ = undefined;
+    this.client_.onReadError(device.mojom.SerialReceiveError.PARITY_ERROR);
+  }
+
+  waitForErrorCleared() {
+    if (this.writable_)
+      return Promise.resolve();
+
+    if (!this.errorClearedPromise_) {
+      this.errorClearedPromise_ = new Promise((resolve) => {
+        this.errorCleared_ = resolve;
+      });
+    }
+
+    return this.errorClearedPromise_;
+  }
+
+  async open(options, in_stream, out_stream, client) {
+    this.options_ = options;
+    this.client_ = client;
+    this.writable_ = new WritableStream(new DataPipeSink(out_stream));
+    return { success: true };
+  }
+
+  async clearSendError(in_stream) {}
+
+  async clearReadError(out_stream) {
+    this.writable_ = new WritableStream(new DataPipeSink(out_stream));
+    if (this.errorCleared_)
+      this.errorCleared_();
+  }
+
+  async flush() {
+    return { success: false };
+  }
+
+  async getControlSignals() {
+    return { signals: { dcd: false, cts: false, ri: false, dsr: false } };
+  }
+
+  async setControlSignals(signals) {
+    return { success: false };
+  }
+
+  async configurePort(options) {
+    this.options_ = options;
+    return { success: true };
+  }
+
+  async getPortInfo() {
+    return {
+      bitrate: this.options_.bitrate,
+      data_bits: this.options_.data_bits,
+      parity_bit: this.options_.parity_bit,
+      stop_bits: this.options_.stop_bits,
+      cts_flow_control: this.options_.has_cts_flow_control ?
+          this.options_.cts_flow_control : false
+    };
+  }
+
+  async setBreak() {
+    return { success: false };
+  }
+
+  async clearBreak() {
+    return { success: false };
+  }
+}
+
+// Implementation of blink.mojom.SerialService.
 class FakeSerialService {
   constructor() {
     this.interceptor_ =
@@ -35,7 +183,11 @@
     info.token = new mojoBase.mojom.UnguessableToken();
     info.token.high = 0;
     info.token.low = token;
-    this.ports_.set(token, info);
+    let record = {
+      portInfo: info,
+      fakePort: new FakeSerialPort(),
+    };
+    this.ports_.set(token, record);
     return token;
   }
 
@@ -47,16 +199,37 @@
     this.selectedPort_ = this.ports_.get(token);
   }
 
+  getFakePort(token) {
+    let record = this.ports_.get(token);
+    if (record === undefined)
+      return undefined;
+    return record.fakePort;
+  }
+
   bind(handle) {
     this.bindingSet_.addBinding(this, handle);
   }
 
   async getPorts() {
-    return { ports: Array.from(this.ports_.values()) };
+    return {
+      ports: Array.from(this.ports_, ([token, record]) => record.portInfo)
+    };
   }
 
   async requestPort(filters) {
-    return { port: this.selectedPort_ };
+    if (this.selectedPort_)
+      return { port: this.selectedPort_.portInfo };
+    else
+      return { port: null };
+  }
+
+  async getPort(token, port_request) {
+    let record = this.ports_.get(token.low);
+    if (record !== undefined) {
+      record.fakePort.bind(port_request);
+    } else {
+      port_request.close();
+    }
   }
 }
 
diff --git a/third_party/blink/web_tests/serial/serialPort_clearReadError.html b/third_party/blink/web_tests/serial/serialPort_clearReadError.html
new file mode 100644
index 0000000..b28a41a
--- /dev/null
+++ b/third_party/blink/web_tests/serial/serialPort_clearReadError.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/mojo/public/mojom/base/unguessable_token.mojom.js"></script>
+<script src="file:///gen/third_party/blink/public/mojom/serial/serial.mojom.js"></script>
+<script src="resources/serial-test-utils.js"></script>
+<script>
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  assert_throws('InvalidStateError', () => port.clearReadError());
+}, 'clearReadError() not allowed on a closed port.');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  await port.open({ buffersize: 64 });
+  assert_throws('InvalidStateError', () => port.clearReadError());
+}, 'clearReadError() not allowed without a reported error');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+  await port.open({ buffersize: 64 });
+
+  fakePort.simulateParityError();
+
+  assert_throws('InvalidStateError', () => port.clearReadError());
+}, 'clearReadError() not allowed before readable has been aborted');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+  await port.open({ buffersize: 64 });
+
+  fakePort.simulateParityError();
+
+  await promise_rejects(t, 'NetworkError', port.readable.getReader().read());
+  port.clearReadError();
+}, 'clearReadError() can be called after readable reports error');
+
+</script>
diff --git a/third_party/blink/web_tests/serial/serialPort_open.html b/third_party/blink/web_tests/serial/serialPort_open.html
new file mode 100644
index 0000000..835eef27
--- /dev/null
+++ b/third_party/blink/web_tests/serial/serialPort_open.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/mojo/public/mojom/base/unguessable_token.mojom.js"></script>
+<script src="file:///gen/third_party/blink/public/mojom/serial/serial.mojom.js"></script>
+<script src="resources/serial-test-utils.js"></script>
+<script>
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  await port.open({ buffersize: 64 });
+  return promise_rejects(t, 'InvalidStateError', port.open({ buffersize: 64 }));
+}, 'A SerialPort cannot be opened if it is already open.');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  const firstRequest = port.open({ buffersize: 64 });
+  await promise_rejects(t, 'InvalidStateError', port.open({ buffersize: 64 }));
+  await firstRequest;
+}, 'Simultaneous calls to open() are disallowed.');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  await promise_rejects(t, new RangeError(), port.open({ buffersize: -1 }));
+  await promise_rejects(t, new RangeError(), port.open({ buffersize: 0 }));
+}, 'Buffer size must be greater than zero.');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  const buffersize = 1 * 1024 * 1024 * 1024 /* 1 GiB */;
+  return promise_rejects(t, new RangeError(), port.open({ buffersize }));
+}, 'Unreasonably large buffer sizes are rejected.');
+
+</script>
diff --git a/third_party/blink/web_tests/serial/serialPort_readable.html b/third_party/blink/web_tests/serial/serialPort_readable.html
new file mode 100644
index 0000000..0195bcf1
--- /dev/null
+++ b/third_party/blink/web_tests/serial/serialPort_readable.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/mojo/public/mojom/base/unguessable_token.mojom.js"></script>
+<script src="file:///gen/third_party/blink/public/mojom/serial/serial.mojom.js"></script>
+<script src="resources/serial-test-utils.js"></script>
+<script>
+
+function compareArrays(actual, expected) {
+  assert_equals(actual.byteLength, expected.byteLength);
+  for (let i = 0; i < expected.byteLength; ++i)
+    assert_equals(actual[i], expected[i], `Mismatch at position ${i}.`);
+}
+
+async function readAll(reader) {
+  const chunks = [];
+  while (true) {
+    let { value, done } = await reader.read();
+    if (done) {
+      // It would be better to allocate |buffer| up front with the number of
+      // of bytes expected but this is the best that can be done without a BYOB
+      // reader to control the amount of data read.
+      const length =
+          chunks.reduce((total, chunk) => total + chunk.byteLength, 0);
+      const buffer = new Uint8Array(length);
+      chunks.reduce((offset, chunk) => {
+        buffer.set(chunk, offset);
+        return offset + chunk.byteLength;
+      }, 0);
+      return buffer;
+    }
+
+    chunks.push(value);
+  }
+}
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  assert_equals(port.readable, null);
+
+  await port.open({ buffersize: 64 });
+  assert_true(port.readable instanceof ReadableStream);
+
+  port.close();
+  assert_equals(port.readable, null);
+}, 'open() and close() set and unset SerialPort.readable');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+
+  assert_equals(port.readable, null);
+
+  await port.open({ buffersize: 64 });
+  assert_true(port.readable instanceof ReadableStream);
+
+  const reader = port.readable.getReader();
+  port.close();
+
+  const { value, done } = await reader.read();
+  assert_true(done);
+  assert_equals(value, undefined);
+  assert_equals(port.readable, null);
+}, 'SerialPort.readable closes on port close');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+  await port.open({ buffersize: 64 });
+
+  const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+  fakePort.write(data);
+
+  const reader = port.readable.getReader();
+  let { value, done } = await reader.read();
+  assert_false(done);
+  compareArrays(data, value);
+
+  port.close();
+
+  ({ value, done } = await reader.read());
+  assert_true(done);
+  assert_equals(undefined, value);
+}, 'Can read a small amount of data');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+  await port.open({ buffersize: 64 });
+
+  const data = new Uint8Array(1024);  // Much larger than buffersize above.
+  for (let i = 0; i < data.byteLength; ++i)
+    data[i] = i & 0xff;
+  fakePort.write(data);
+
+  const reader = port.readable.getReader();
+  port.close();
+  const value = await readAll(reader);
+  compareArrays(data, value);
+}, 'Can read a large amount of data');
+
+serial_test(async (t, fake) => {
+  const { port, fakePort } = await getFakeSerialPort(fake);
+  await port.open({ buffersize: 64 });
+
+  const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+  fakePort.write(data);
+  fakePort.simulateParityError();
+
+  let reader = port.readable.getReader();
+  let { value, done } = await reader.read();
+  assert_false(done);
+  compareArrays(data, value);
+
+  await promise_rejects(t, 'NetworkError', reader.read());
+  assert_equals(port.readable, null);
+
+  port.clearReadError();
+  assert_true(port.readable instanceof ReadableStream);
+  reader = port.readable.getReader();
+
+  await fakePort.waitForErrorCleared();
+  fakePort.write(data);
+
+  ({ value, done } = await reader.read());
+  assert_false(done);
+  compareArrays(data, value);
+
+  port.close();
+  ({ value, done } = await reader.read());
+  assert_true(done);
+  assert_equals(undefined, value);
+}, 'Parity error closes readable, can be cleared and more data received');
+
+</script>
+
diff --git a/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/README.txt b/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/README.txt
deleted file mode 100644
index ddc7d0a..0000000
--- a/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/README.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# This suite runs the tests in with --js-flags=--harmony-sharedarraybuffer
-# This enables the SharedArrayBuffer language feature in V8.
-# See https://github.com/tc39/ecmascript_sharedmem for more information.
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-worker-success-dedicatedworker-expected.txt b/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-worker-success-dedicatedworker-expected.txt
deleted file mode 100644
index 1f113d2..0000000
--- a/third_party/blink/web_tests/virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-worker-success-dedicatedworker-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-PASS postMessaging to a dedicated sub-worker allows them to see each others' modifications
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 50a3a685..79e727a 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1168,8 +1168,9 @@
 [Worker]     setter ondisconnect
 [Worker] interface SerialPort
 [Worker]     attribute @@toStringTag
-[Worker]     getter in
-[Worker]     getter out
+[Worker]     getter readable
+[Worker]     getter writable
+[Worker]     method clearReadError
 [Worker]     method close
 [Worker]     method constructor
 [Worker]     method open
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index f36f1b8..b08cec5 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -7387,8 +7387,9 @@
     setter ondisconnect
 interface SerialPort
     attribute @@toStringTag
-    getter in
-    getter out
+    getter readable
+    getter writable
+    method clearReadError
     method close
     method constructor
     method open
diff --git a/third_party/custom_tabs_client/BUILD.gn b/third_party/custom_tabs_client/BUILD.gn
index 12d1b9c..5cab5479 100644
--- a/third_party/custom_tabs_client/BUILD.gn
+++ b/third_party/custom_tabs_client/BUILD.gn
@@ -27,6 +27,8 @@
     "src/Application/src/main/java/org/chromium/customtabsclient/SessionHelper.java",
   ]
   android_manifest = "src/Application/src/main/AndroidManifest.xml"
+  min_sdk_version = 16
+  target_sdk_version = 21
   apk_name = "CustomTabsClientExample"
   deps = [
     ":chrome_tabs_client_example_apk_resources",
diff --git a/third_party/feed/README.chromium b/third_party/feed/README.chromium
index 6b2dfd0..3d5d0b6 100644
--- a/third_party/feed/README.chromium
+++ b/third_party/feed/README.chromium
@@ -2,7 +2,7 @@
 Short name: feed
 URL: https://chromium.googlesource.com/feed
 Version: 0
-Revision: d8b173e83ca88bafc9d69339f939604886f4d583
+Revision: 5708e2dcfff432c1fe4106b876813a7205e32ea0
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/wayland/OWNERS b/third_party/wayland/OWNERS
index fe51e0c..eef9e02f 100644
--- a/third_party/wayland/OWNERS
+++ b/third_party/wayland/OWNERS
@@ -1,2 +1,3 @@
-reveman@chromium.org
+dcastagna@chromium.org
+oshima@chromium.org
 piman@chromium.org
diff --git a/tools/grit/grit/gather/policy_json.py b/tools/grit/grit/gather/policy_json.py
index 10a176ce..97d73f0 100644
--- a/tools/grit/grit/gather/policy_json.py
+++ b/tools/grit/grit/gather/policy_json.py
@@ -174,8 +174,10 @@
       for item in obj:
         self._AddSchemaKeys(item, depth + 1)
       self._AddIndentedNontranslateableChunk(depth, '],\n')
-    elif obj_type in (bool, int, str):
+    elif obj_type == str:
       self._AddIndentedNontranslateableChunk(depth, "'%s',\n" % obj)
+    elif obj_type in (bool, int):
+      self._AddIndentedNontranslateableChunk(depth, "%s,\n" % obj)
     else:
       raise Exception('Invalid schema object: %s' % obj)
 
diff --git a/tools/grit/grit/gather/policy_json_unittest.py b/tools/grit/grit/gather/policy_json_unittest.py
index b50ff9b..52fb532 100755
--- a/tools/grit/grit/gather/policy_json_unittest.py
+++ b/tools/grit/grit/gather/policy_json_unittest.py
@@ -100,7 +100,13 @@
                 "            'type': 'object',"
                 "            'inner': {"
                 "              'description': 'inner description',"
+                "              'type': 'integer', 'minimum': 0, 'maximum': 100"
+                "            },"
+                "            'inner2': {"
+                "              'description': 'inner2 description',"
                 "              'type': 'integer',"
+                "              'enum': [ 1, 2, 3 ],"
+                "              'sensitiveValue': True"
                 "            },"
                 "          },"
                 "        },"
@@ -113,7 +119,7 @@
                 "}")
     gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
     gatherer.Parse()
-    self.failUnless(len(gatherer.GetCliques()) == 3)
+    self.failUnless(len(gatherer.GetCliques()) == 4)
     expected = self.GetExpectedOutput(original)
     self.failUnless(expected == eval(gatherer.Translate('en')))
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index de495558..8b4eee8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -29682,6 +29682,9 @@
   <int value="15" label="OpenCleanupBlobJournalFailed">
     Open failed because the blob journal could not be cleaned up.
   </int>
+  <int value="16" label="OpenFailedMetadataSetup">
+    Open failed because the backing store's metadata could not be set up.
+  </int>
 </enum>
 
 <enum name="IdleDeadlineCallbackType">
@@ -34245,6 +34248,7 @@
   <int value="-918618075" label="enable-service-worker"/>
   <int value="-915035507" label="ArcPrintSpoolerExperiment:enabled"/>
   <int value="-914210146" label="enable-web-based-signin"/>
+  <int value="-914097698" label="EnableDbusAndX11StatusIcons:disabled"/>
   <int value="-913294939" label="DriveFS:enabled"/>
   <int value="-912456561" label="MidiManagerWinrt:enabled"/>
   <int value="-908421850" label="PointerEvent:enabled"/>
@@ -34635,6 +34639,7 @@
   <int value="-339103761" label="ArcGraphicBuffersVisualizationTool:enabled"/>
   <int value="-338978205" label="NavigationMojoResponse:enabled"/>
   <int value="-334873793" label="MediaSessionNotification:enabled"/>
+  <int value="-333216449" label="MouseSubframeNoImplicitCapture:enabled"/>
   <int value="-329727402" label="disable-files-quick-view"/>
   <int value="-328361990" label="enable-experimental-extension-apis"/>
   <int value="-327272022" label="AutofillRejectCompanyBirthyearName:enabled"/>
@@ -35072,6 +35077,7 @@
   <int value="336429189" label="DisallowUnsafeHttpDownloads:disabled"/>
   <int value="339671131" label="disable-per-user-timezone"/>
   <int value="341152650" label="SoundContentSetting:enabled"/>
+  <int value="341851350" label="EnableDbusAndX11StatusIcons:enabled"/>
   <int value="345664265" label="BlinkHeapIncrementalMarking:disabled"/>
   <int value="346711293" label="enable-save-password-bubble"/>
   <int value="347981012" label="TabToGTSAnimation:disabled"/>
@@ -35850,6 +35856,7 @@
   <int value="1482039233" label="SearchSuggestionsOnLocalNtp:disabled"/>
   <int value="1482839038" label="AutofillCreditCardAuthentication:enabled"/>
   <int value="1486171015" label="disable-fill-on-account-select"/>
+  <int value="1486784197" label="MouseSubframeNoImplicitCapture:disabled"/>
   <int value="1487341558" label="MacViewsAutofillPopup:enabled"/>
   <int value="1488193175" label="ChromeOSAssistant:enabled"/>
   <int value="1488700164" label="password-import:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index c78b82301..d7a0d64 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -3078,6 +3078,9 @@
 
 <histogram name="Android.StrictMode.CheckGooglePlayServicesTime" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed from code June 2019. See https://crbug.com/577190 for context.
+  </obsolete>
   <owner>wnwen@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -18093,16 +18096,20 @@
 </histogram>
 
 <histogram name="ClientHints.CountRulesReceived" units="count"
-    expires_after="M77">
+    expires_after="M82">
+  <owner>yoavweiss@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
+  <owner>mkwst@chromium.org</owner>
   <summary>
     Count of client hints that were received by the render process. Recorded
     approximately at the time of the renderer startup.
   </summary>
 </histogram>
 
-<histogram name="ClientHints.PersistDuration" units="ms">
+<histogram name="ClientHints.PersistDuration" units="ms" expires_after="M82">
+  <owner>yoavweiss@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
+  <owner>mkwst@chromium.org</owner>
   <summary>
     Duration for which the origin requested the client hints to be persisted.
     Collected on the renderer side.
@@ -18110,16 +18117,20 @@
 </histogram>
 
 <histogram name="ClientHints.UpdateEventCount" units="count"
-    expires_after="M77">
+    expires_after="M82">
+  <owner>yoavweiss@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
+  <owner>mkwst@chromium.org</owner>
   <summary>
     Count of events when the client hints needs to be persisted to the disk by
     the browser.
   </summary>
 </histogram>
 
-<histogram name="ClientHints.UpdateSize" units="count" expires_after="M77">
+<histogram name="ClientHints.UpdateSize" units="count" expires_after="M82">
+  <owner>yoavweiss@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
+  <owner>mkwst@chromium.org</owner>
   <summary>
     Count of client hints that need to be persisted to the disk. Recorded by the
     renderer.
@@ -20929,7 +20940,7 @@
 </histogram>
 
 <histogram name="ContextMenu.CancelSystemTouches" enum="BooleanHit"
-    expires_after="M77">
+    expires_after="M83">
   <owner>michaeldo@chromium.org</owner>
   <summary>
     Logs true when the system touches are cancelled in order to show the Context
@@ -20938,7 +20949,7 @@
 </histogram>
 
 <histogram name="ContextMenu.DelayedElementDetails"
-    enum="ContextMenuDelayedElementDetails" expires_after="M77">
+    enum="ContextMenuDelayedElementDetails" expires_after="M83">
   <owner>michaeldo@chromium.org</owner>
   <summary>
     Logged when DOM element details are not yet available when the user
@@ -20951,6 +20962,9 @@
 
 <histogram name="ContextMenu.DOMElementFetchDuration" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019. iFrame Context Menu feature shipped.
+  </obsolete>
   <owner>michaeldo@chromium.org</owner>
   <summary>
     How long it takes to fetch the details of the DOM element the user is
@@ -20962,7 +20976,7 @@
 </histogram>
 
 <histogram name="ContextMenu.DOMElementFrame" enum="ContextMenuDOMElementFrame"
-    expires_after="M77">
+    expires_after="M83">
   <owner>michaeldo@chromium.org</owner>
   <summary>
     Logged when the Context Menu will be displayed. Also logs if the element for
@@ -21070,6 +21084,9 @@
 
 <histogram name="ContextMenu.UnexpectedFindElementResultHandlerMessage"
     enum="BooleanHit" expires_after="M77">
+  <obsolete>
+    Removed 06/2019. iFrame Context Menu feature shipped.
+  </obsolete>
   <owner>michaeldo@chromium.org</owner>
   <summary>
     Logged when an unexpected FindElementResultHandler message was received by
@@ -21088,7 +21105,7 @@
 </histogram>
 
 <histogram name="ContextMenu.WaitingForElementDetails" enum="BooleanHit"
-    expires_after="M77">
+    expires_after="M83">
   <owner>michaeldo@chromium.org</owner>
   <summary>
     Logs true when the context menu gesture recognizer fully recognizes a long
@@ -33030,8 +33047,11 @@
 </histogram>
 
 <histogram name="Event.AndroidActionDown.ToolType" enum="MotionEventToolType"
-    expires_after="M77">
-  <owner>mustaq@chromium.org</owner>
+    expires_after="never">
+<!-- expires-never: Needed for long-term usage tracking for different types of
+     pointers. -->
+
+  <owner>mustaq@chromium.org, nzolghadr@chromium.org</owner>
   <summary>
     Tracks the number of Android MotionEvents with ACTION_DOWN or
     ACTION_POINTER_DOWN or ACTION_BUTTON_PRESS for each ToolType (unknown,
@@ -38172,7 +38192,9 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeAPIFunctionCalls"
-    enum="DeclarativeAPIFunctionType" expires_after="M77">
+    enum="DeclarativeAPIFunctionType" expires_after="never">
+<!-- expires-never: For monitoring usage of declarative APIs. -->
+
   <owner>karandeepb@chromium.org</owner>
   <summary>
     Number of calls to the declarative API extension functions. This includes
@@ -41720,7 +41742,9 @@
 </histogram>
 
 <histogram name="Extensions.WebRequestAction" enum="RequestAction"
-    expires_after="M77">
+    expires_after="never">
+<!-- expires-never: For monitoring Web request actions. -->
+
   <owner>karandeepb@chromium.org</owner>
   <summary>
     Counts the number of times an action is requested by extensions as part of
@@ -81716,7 +81740,7 @@
 </histogram>
 
 <histogram name="Notifications.NotificationHelper.ComServerModuleStatus"
-    enum="NotificationHelperComServerModuleStatus" expires_after="M77">
+    enum="NotificationHelperComServerModuleStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <summary>
     The execute status of a ComServerModule class instance. Logged whenever a
@@ -81761,7 +81785,7 @@
 </histogram>
 
 <histogram name="Notifications.NotificationHelper.ServerRuntime" units="ms"
-    expires_after="M77">
+    expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <summary>
     The runtime of the notification_helper server process. This process is
@@ -81886,7 +81910,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.CloseStatus"
-    enum="WindowsNotificationCloseStatus" expires_after="M77">
+    enum="WindowsNotificationCloseStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81896,7 +81920,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.CreateToastManagerErrorCode"
-    enum="Hresult" expires_after="M77">
+    enum="Hresult" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81908,7 +81932,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.DisplayFailure" enum="Hresult"
-    expires_after="M77">
+    expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81931,7 +81955,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.GetDisplayedLaunchIdStatus"
-    enum="WindowsNotificationGetDisplayedLaunchIdStatus" expires_after="M77">
+    enum="WindowsNotificationGetDisplayedLaunchIdStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81942,7 +81966,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.GetDisplayedStatus"
-    enum="WindowsNotificationGetDisplayedStatus" expires_after="M77">
+    enum="WindowsNotificationGetDisplayedStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81953,7 +81977,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.GetNotificationLaunchIdStatus"
-    enum="WindowsNotificationGetNotificationLaunchIdStatus" expires_after="M77">
+    enum="WindowsNotificationGetNotificationLaunchIdStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -81974,7 +81998,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.GetSettingStatus"
-    enum="WindowsNotificationGetSettingStatus" expires_after="M77">
+    enum="WindowsNotificationGetSettingStatus" expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -82031,7 +82055,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.LaunchIdDecodeStatus"
-    enum="WindowsNotificationLaunchIdDecodeStatus" expires_after="M77">
+    enum="WindowsNotificationLaunchIdDecodeStatus" expires_after="M87">
   <owner>chengx@chromium.org</owner>
   <owner>finnur@chromium.org</owner>
   <summary>
@@ -82086,7 +82110,7 @@
 </histogram>
 
 <histogram name="Notifications.Windows.ShowFailedErrorCode" enum="Hresult"
-    expires_after="M77">
+    expires_after="M87">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -82614,6 +82638,17 @@
   </summary>
 </histogram>
 
+<histogram name="NQE.PeerToPeerConnectionsDuration" units="duration"
+    expires_after="M82">
+  <owner>tbansal@chromium.org</owner>
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    Records the duration of the time period for which there was at least one
+    peer to peer active connection. Recorded when the count of peer to peer
+    connections drop from a non-zero value to a zero value.
+  </summary>
+</histogram>
+
 <histogram name="NQE.Prefs.ReadCount" units="count" expires_after="M77">
   <owner>tbansal@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
@@ -133548,7 +133583,9 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.CrashCreated" units="tabs">
+<histogram name="Tabs.SadTab.CrashCreated" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot;,
@@ -133560,7 +133597,9 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.CrashDisplayed" units="tabs">
+<histogram name="Tabs.SadTab.CrashDisplayed" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot; and the
@@ -133580,7 +133619,9 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillCreated" units="tabs">
+<histogram name="Tabs.SadTab.KillCreated" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -133594,8 +133635,10 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillCreated.OOM" units="tabs">
-  <owner>oshima@chromium.org</owner>
+<histogram name="Tabs.SadTab.KillCreated.OOM" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
+  <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
     Jim!&quot; page due to the kernel out-of-memory killer, recorded once per
@@ -133607,7 +133650,9 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillDisplayed" units="tabs" expires_after="M77">
+<histogram name="Tabs.SadTab.KillDisplayed" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -133618,8 +133663,10 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillDisplayed.OOM" units="tabs">
-  <owner>oshima@chromium.org</owner>
+<histogram name="Tabs.SadTab.KillDisplayed.OOM" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
+  <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
     Jim!&quot; page due to the kernel out-of-memory killer and the user saw the
@@ -133630,7 +133677,8 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.OomCreated" units="tabs">
+<histogram name="Tabs.SadTab.OomCreated" units="tabs"
+    expires_after="2020-06-01">
   <owner>wfh@chromium.org</owner>
   <summary>
     Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot;,
@@ -133642,7 +133690,8 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.OomDisplayed" units="tabs">
+<histogram name="Tabs.SadTab.OomDisplayed" units="tabs"
+    expires_after="2020-06-01">
   <owner>wfh@chromium.org</owner>
   <summary>
     Cumulative number of times a tab ran out of memory with &quot;Aw,
@@ -133661,7 +133710,9 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.ReloadCount" units="tabs">
+<histogram name="Tabs.SadTab.ReloadCount" units="tabs"
+    expires_after="2020-06-01">
+  <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
     The number of times a tab was reloaded because it was killed (usually by the
@@ -136588,7 +136639,7 @@
 </histogram>
 
 <histogram name="UMA.Debug.EnableCrashUpload.DeferredStartUpAsyncTaskDuration"
-    units="ms">
+    units="ms" expires_after="M77">
   <owner>wnwen@chromium.org</owner>
   <summary>
     Measures how much time it took to complete all async deferred startup tasks
@@ -136597,7 +136648,7 @@
 </histogram>
 
 <histogram name="UMA.Debug.EnableCrashUpload.DeferredStartUpCompleteTime"
-    units="ms">
+    units="ms" expires_after="M77">
   <owner>wnwen@chromium.org</owner>
   <summary>
     Measures how much time since application was first in foreground till all
@@ -136606,11 +136657,7 @@
 </histogram>
 
 <histogram name="UMA.Debug.EnableCrashUpload.DeferredStartUpDuration"
-    units="ms" expires_after="2017-01-24">
-  <obsolete>
-    Deprecated 01/2017 for
-    UMA.Debug.EnableCrashUploadDeferredStartupAsyncTaskDuration.
-  </obsolete>
+    units="ms" expires_after="M77">
   <owner>wnwen@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <summary>
@@ -136620,7 +136667,11 @@
 </histogram>
 
 <histogram name="UMA.Debug.EnableCrashUpload.DeferredStartUpDurationAsync"
-    units="ms">
+    units="ms" expires_after="2017-01-24">
+  <obsolete>
+    Deprecated 01/2017 for
+    UMA.Debug.EnableCrashUpload.DeferredStartupAsyncTaskDuration.
+  </obsolete>
   <owner>wnwen@chromium.org</owner>
   <owner>asvitkine@chromium.org</owner>
   <summary>
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc
index cc1e7272..c1b0ae3 100644
--- a/ui/accessibility/ax_node.cc
+++ b/ui/accessibility/ax_node.cc
@@ -629,52 +629,43 @@
 // Returns false otherwise.
 bool AXNode::SetRoleMatchesItemRole(const AXNode* ordered_set) const {
   ax::mojom::Role item_role = data().role;
-
   // Switch on role of ordered set
   switch (ordered_set->data().role) {
     case ax::mojom::Role::kFeed:
       return item_role == ax::mojom::Role::kArticle;
-
     case ax::mojom::Role::kList:
       return item_role == ax::mojom::Role::kListItem;
-
     case ax::mojom::Role::kGroup:
       return item_role == ax::mojom::Role::kListItem ||
              item_role == ax::mojom::Role::kMenuItem ||
              item_role == ax::mojom::Role::kMenuItemRadio ||
              item_role == ax::mojom::Role::kTreeItem;
-
     case ax::mojom::Role::kMenu:
       return item_role == ax::mojom::Role::kMenuItem ||
              item_role == ax::mojom::Role::kMenuItemRadio ||
              item_role == ax::mojom::Role::kMenuItemCheckBox;
-
     case ax::mojom::Role::kMenuBar:
       return item_role == ax::mojom::Role::kMenuItem ||
              item_role == ax::mojom::Role::kMenuItemRadio ||
              item_role == ax::mojom::Role::kMenuItemCheckBox;
-
     case ax::mojom::Role::kTabList:
       return item_role == ax::mojom::Role::kTab;
-
     case ax::mojom::Role::kTree:
       return item_role == ax::mojom::Role::kTreeItem;
-
     case ax::mojom::Role::kListBox:
       return item_role == ax::mojom::Role::kListBoxOption;
-
     case ax::mojom::Role::kMenuListPopup:
       return item_role == ax::mojom::Role::kMenuListOption;
-
     case ax::mojom::Role::kRadioGroup:
       return item_role == ax::mojom::Role::kRadioButton;
-
     case ax::mojom::Role::kDescriptionList:
       // Only the term for each description list entry should receive posinset
       // and setsize.
       return item_role == ax::mojom::Role::kDescriptionListTerm ||
              item_role == ax::mojom::Role::kTerm;
-
+    case ax::mojom::Role::kPopUpButton:
+      // kPopUpButtons can wrap a kMenuListPopUp.
+      return item_role == ax::mojom::Role::kMenuListPopup;
     default:
       return false;
   }
diff --git a/ui/accessibility/ax_role_properties.cc b/ui/accessibility/ax_role_properties.cc
index 9a7c43c..1cb85d6 100644
--- a/ui/accessibility/ax_role_properties.cc
+++ b/ui/accessibility/ax_role_properties.cc
@@ -328,6 +328,7 @@
     case ax::mojom::Role::kRadioGroup:
     case ax::mojom::Role::kTabList:
     case ax::mojom::Role::kTree:
+    case ax::mojom::Role::kPopUpButton:
       return true;
     default:
       return false;
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index a92a132..f3a5f2acd 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -993,6 +993,9 @@
                                      const AXNode* local_parent,
                                      std::vector<const AXNode*>& items,
                                      const AXNode& original_node) const {
+  // Ignored nodes are not a part of ordered sets.
+  if (original_node.data().HasState(ax::mojom::State::kIgnored))
+    return;
   // Stop searching current path if roles of local_parent and ordered set match.
   // Don't compare the container to itself.
   if (!(ordered_set == local_parent)) {
@@ -1082,6 +1085,22 @@
   // Find all items within ordered_set and add to vector.
   PopulateOrderedSetItems(ordered_set, ordered_set, items, node);
 
+  // If ordered_set role is kPopUpButton and it wraps a kMenuListPopUp, then we
+  // would like it to inherit the SetSize from the kMenuListPopUp it wraps. To
+  // do this, we treat the kMenuListPopUp as the ordered_set and eventually
+  // assign its SetSize value to the kPopUpButton.
+  if ((node.data().role == ax::mojom::Role::kPopUpButton) &&
+      (items.size() != 0)) {
+    // kPopUpButtons are only allowed to contain one kMenuListPopUp.
+    // The single element is guaranteed to be a kMenuListPopUp because that is
+    // the only item role that matches the ordered set role of kPopUpButton.
+    // Please see AXNode::SetRoleMatchesItemRole for more details.
+    DCHECK(items.size() == 1);
+    const AXNode* menu_list_popup = items[0];
+    items.clear();
+    PopulateOrderedSetItems(menu_list_popup, menu_list_popup, items, node);
+  }
+
   // Keep track of the number of elements ordered_set has.
   int32_t num_elements = 0;
   // Necessary for calculating set_size.
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc
index b9f017a..3b973f6 100644
--- a/ui/accessibility/ax_tree_unittest.cc
+++ b/ui/accessibility/ax_tree_unittest.cc
@@ -2566,4 +2566,35 @@
   ASSERT_TRUE(tree.Unserialize(tree_update));
 }
 
+// Tests that kPopUpButtons are assigned the SetSize of the wrapped
+// kMenuListPopup, if one is present.
+TEST(AXTreeTest, TestSetSizePosInSetPopUpButton) {
+  AXTreeUpdate initial_state;
+  initial_state.root_id = 1;
+  initial_state.nodes.resize(6);
+  initial_state.nodes[0].id = 1;
+  initial_state.nodes[0].child_ids = {2, 3};
+  initial_state.nodes[1].id = 2;
+  initial_state.nodes[1].role = ax::mojom::Role::kPopUpButton;
+  initial_state.nodes[2].id = 3;
+  initial_state.nodes[2].role = ax::mojom::Role::kPopUpButton;
+  initial_state.nodes[2].child_ids = {4};
+  initial_state.nodes[3].id = 4;
+  initial_state.nodes[3].role = ax::mojom::Role::kMenuListPopup;
+  initial_state.nodes[3].child_ids = {5, 6};
+  initial_state.nodes[4].id = 5;
+  initial_state.nodes[4].role = ax::mojom::Role::kMenuListOption;
+  initial_state.nodes[5].id = 6;
+  initial_state.nodes[5].role = ax::mojom::Role::kMenuListOption;
+  AXTree tree(initial_state);
+
+  // The first popupbutton should have SetSize of 0.
+  AXNode* popup_button_1 = tree.GetFromId(2);
+  EXPECT_OPTIONAL_EQ(0, popup_button_1->GetSetSize());
+  // The second popupbutton should have SetSize of 2, since the menulistpopup
+  // that it wraps has a SetSize of 2.
+  AXNode* popup_button_2 = tree.GetFromId(3);
+  EXPECT_OPTIONAL_EQ(2, popup_button_2->GetSetSize());
+}
+
 }  // namespace ui
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
index e262a42..89dd850 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Teclado español</translation>
 <translation id="8179976553408161302">Intro</translation>
 <translation id="8193175696669055101">Modelo de dispositivo</translation>
+<translation id="8208580316430297579">Obra de arte</translation>
 <translation id="8223479393428528563">Para guardar estos archivos y poder usarlos sin conexión, vuelve a conectarte a Internet, haz clic con el botón derecho en los archivos y selecciona la opción <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">Anular</translation>
 <translation id="8261506727792406068">Eliminar</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
index 0da4e47d..45d8545 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Näppäimistö: espanja</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Laitteen malli</translation>
+<translation id="8208580316430297579">Kuvitus</translation>
 <translation id="8223479393428528563">Jos haluat tallentaa nämä tiedostot offline-käyttöä varten, siirry online-tilaan, klikkaa tiedostoja hiiren kakkospainikkeella ja valitse vaihtoehto <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">Keskeytä</translation>
 <translation id="8261506727792406068">Poista</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
index 26b30c1b..3b1fdab 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Spanish na keyboard</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Modelo ng device</translation>
+<translation id="8208580316430297579">Artwork</translation>
 <translation id="8223479393428528563">Upang i-save ang mga file na ito para sa offline na paggamit, mag-online muli, i-right click ang mga file at piliin ang opsyong <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">I-abort</translation>
 <translation id="8261506727792406068">I-delete</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index e695880..4513fe64 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">स्‍पेनिश कीबोर्ड</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">डिवाइस मॉडल</translation>
+<translation id="8208580316430297579">आर्टवर्क</translation>
 <translation id="8223479393428528563">इन फ़ाइलों को ऑफ़लाइन देखने को सेव करने के लिए, फिर से ऑनलाइन होकर, फ़ाइलों पर राइट-क्‍लिक करें और <ph name="OFFLINE_CHECKBOX_NAME" /> विकल्‍प चुनें.</translation>
 <translation id="8249296373107784235">रद्द करें</translation>
 <translation id="8261506727792406068">मिटाएं</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
index 7a9c776..04bd023 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -629,6 +629,7 @@
 <translation id="8160015581537295331">מקלדת ספרדית</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">דגם מכשיר</translation>
+<translation id="8208580316430297579">אמנות</translation>
 <translation id="8223479393428528563">כדי לשמור קבצים אלה לשימוש לא מקוון, חזור למצב מקוון, לחץ לחיצה ימנית על הקבצים ובחר את האפשרות <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">בטל</translation>
 <translation id="8261506727792406068">מחיקה</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
index 1b4ab86..7645cb8c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">スペイン語のキーボード</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">デバイスモデル</translation>
+<translation id="8208580316430297579">アート</translation>
 <translation id="8223479393428528563">これらのファイルを保存してオフラインで使用できるようにするには、オンラインに戻ってファイルを右クリックし、[<ph name="OFFLINE_CHECKBOX_NAME" />] オプションを選択します。</translation>
 <translation id="8249296373107784235">中止</translation>
 <translation id="8261506727792406068">削除</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
index 7cca685..068f98bb 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -616,6 +616,7 @@
 <translation id="8160015581537295331">ಸ್ಪ್ಯಾನಿಷ್ ಕೀಬೋರ್ಡ್</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">ಸಾಧನ ಮಾದರಿ</translation>
+<translation id="8208580316430297579">ಕಲಾಕೃತಿ</translation>
 <translation id="8223479393428528563">ಆಫ್‌‌ಲೈನ್ ಬಳಕೆಗಾಗಿ ಈ ಫೈಲ್ ಗಳನ್ನು ಉಳಿಸಲು, ಆನ್‌ಲೈನ್‌ಗೆ ಹಿಂತಿರುಗಲು, ಫೈಲ್‌ಗಳ ಮೇಲೆ ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ, ಮತ್ತು <ph name="OFFLINE_CHECKBOX_NAME" /> ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ.</translation>
 <translation id="8249296373107784235">ನಿಷ್ಫಲಗೊಳಿಸು</translation>
 <translation id="8261506727792406068">ಅಳಿಸಿ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index d319c676..fdd963c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">스페인어 키보드</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">기기 모델</translation>
+<translation id="8208580316430297579">포스터</translation>
 <translation id="8223479393428528563">오프라인 사용 목적으로 이 파일을 저장하려면 온라인으로 돌아가서 마우스 오른쪽 버튼으로 파일을 클릭한 다음 <ph name="OFFLINE_CHECKBOX_NAME" /> 옵션을 선택하세요.</translation>
 <translation id="8249296373107784235">중단</translation>
 <translation id="8261506727792406068">삭제</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
index 6bf0aa9..62eed848 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">സ്പാനിഷ് കീബോര്‍ഡ്</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">ഉപകരണ മോഡൽ</translation>
+<translation id="8208580316430297579">കലാസൃഷ്‌ടി</translation>
 <translation id="8223479393428528563">ഓഫ്‌ലൈൻ ഉപയോഗത്തിനായി ഈ ഫയലുകൾ സംരക്ഷിക്കാൻ, ഓൺലൈനിൽ തിരികെ വന്ന് ഫയലുകൾ റൈറ്റ് ക്ലിക്ക് ചെയ്‌ത്, <ph name="OFFLINE_CHECKBOX_NAME" /> ഓപ്‌ഷൻ തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="8249296373107784235">ഉപേക്ഷിക്കുക</translation>
 <translation id="8261506727792406068">ഇല്ലാതാക്കുക</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
index fc46593..0dea0e5 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">स्पॅनिश कीबोर्ड</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">डिव्हाइस मॉडेल</translation>
+<translation id="8208580316430297579">कलाकृती</translation>
 <translation id="8223479393428528563">ऑफलाइन वापराकरिता या फायली सेव्ह करण्यासाठी, परत ऑनलाइन व्‍हा, फायलींवर राइट-क्लिक करा आणि <ph name="OFFLINE_CHECKBOX_NAME" /> पर्याय निवडा.</translation>
 <translation id="8249296373107784235">रद्द करा</translation>
 <translation id="8261506727792406068">हटवा</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
index 6544b1f..7d81a04 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Spansk tastatur</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Enhetsmodell</translation>
+<translation id="8208580316430297579">Kunst</translation>
 <translation id="8223479393428528563">For å lagre disse filene for bruk utenfor Internett, går du på nettet, høyreklikker på filene og velger <ph name="OFFLINE_CHECKBOX_NAME" />-alternativet.</translation>
 <translation id="8249296373107784235">Avbryt</translation>
 <translation id="8261506727792406068">Slett</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index 45a6b3b..f5c813b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Tastatură spaniolă</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Modelul dispozitivului</translation>
+<translation id="8208580316430297579">Opere de artă</translation>
 <translation id="8223479393428528563">Pentru a salva aceste fișiere pentru utilizare offline, revino online, dă clic dreapta pe fișiere și selectează opțiunea <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">Abandonați</translation>
 <translation id="8261506727792406068">Șterge</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
index df4a5ea..9c689981 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Испанская раскладка</translation>
 <translation id="8179976553408161302">ВВОД</translation>
 <translation id="8193175696669055101">Модель устройства</translation>
+<translation id="8208580316430297579">Обложка</translation>
 <translation id="8223479393428528563">Чтобы работать с этими файлами в офлайн-режиме, подключитесь к Интернету, нажмите правой кнопкой мыши на каждый документ и выберите вариант "<ph name="OFFLINE_CHECKBOX_NAME" />".</translation>
 <translation id="8249296373107784235">Отмена</translation>
 <translation id="8261506727792406068">Удалить</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index cbb2ecb..f2017af 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -286,6 +286,7 @@
 <translation id="4568854179928172494">மாற்றிய நேரம்</translation>
 <translation id="4572815280350369984"><ph name="FILE_TYPE" /> கோப்பு</translation>
 <translation id="457386861538956877">மேலும்...</translation>
+<translation id="4579744207439506346">தேர்வுக்கு <ph name="ENTRY_NAME" /> சேர்க்கப்பட்டது.</translation>
 <translation id="4582497162516204941">Linux (பீட்டா) மூலம் நிறுவு</translation>
 <translation id="4594543368593301662"><ph name="SEARCH_TERM" /> என்பதற்கான தேடல் முடிவுகளைக் காட்டுகிறது.</translation>
 <translation id="4631887759990505102">கலைஞர்</translation>
@@ -419,6 +420,7 @@
 <translation id="5819442873484330149">ஹாங்குல் 3 செட் (இறுதி)</translation>
 <translation id="5833610766403489739">இந்தக் கோப்பு வேறு எங்கோ சேமிக்கப்பட்டுவிட்டது. உங்கள் பதிவிறக்க இருப்பிட அமைப்பைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.</translation>
 <translation id="5838051104334203064">இந்தச் சாதனத்தை Play ஸ்டோர் ஆப்ஸினால் பயன்படுத்த முடியாது</translation>
+<translation id="5838451609423551646">தேர்ந்தெடுக்கப்பட்டதில் உள்ள அனைத்து உள்ளீடுகளும் அகற்றப்பட்டன.</translation>
 <translation id="5838825566232597749">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல்</translation>
 <translation id="5850516540536751549">இந்தக் கோப்பு வகை ஆதரிக்கப்படவில்லை. இந்த வகையான கோப்பைத் திறக்கக்கூடிய பயன்பாட்டைக் கண்டறிய <ph name="BEGIN_LINK" />Chrome இணைய அங்காடியைப்<ph name="END_LINK" /> பார்வையிடவும்.
     <ph name="BEGIN_LINK_HELP" />மேலும் அறிக<ph name="END_LINK_HELP" /></translation>
@@ -492,6 +494,7 @@
 <translation id="6820687829547641339">Gzip compressed tar archive</translation>
 <translation id="6825883775269213504">ரஷ்யன்</translation>
 <translation id="6827236167376090743">இந்த வீடியோவானது தொடர்ந்து நீண்ட நேரம் இயங்கும்.</translation>
+<translation id="6847101934483209767">தேர்விலிருந்து <ph name="ENTRY_NAME" /> அகற்றப்பட்டது.</translation>
 <translation id="6862635236584086457">இந்த கோப்புறையில் சேமிக்கப்படும் எல்லாக் கோப்புகளும் ஆன்லைனில் தானாகவே காப்புப்பிரதி எடுக்கப்படுகின்றன</translation>
 <translation id="6870130893560916279">உக்ரைனியன் விசைப்பலகை</translation>
 <translation id="6876155724392614295">பைக்</translation>
@@ -619,11 +622,13 @@
 <translation id="8148264977957212129">பின்யின் உள்ளீட்டு முறை</translation>
 <translation id="8151638057146502721">உள்ளமை</translation>
 <translation id="8153607920959057464">இந்தக் கோப்பைக் காண்பிக்க முடியாது.</translation>
+<translation id="8154842056504218462">அனைத்து உள்ளீடுகளும் தேர்ந்தெடுக்கப்பட்டுள்ளன.</translation>
 <translation id="8157684860301034423">ஆப்ஸ் தகவலை மீட்டெடுக்க முடியவில்லை.</translation>
 <translation id="8157939133946352716">7x5</translation>
 <translation id="8160015581537295331">ஸ்பானிஷ் விசைப்பலகை</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">சாதனத்தின் மாடல்</translation>
+<translation id="8208580316430297579">கலைப்பணி</translation>
 <translation id="8223479393428528563">இந்தக் கோப்புகளை ஆஃப்லைனில் பயன்படுத்துவதற்காகச் சேமிக்க, ஆன்லைனிற்கு சென்று, கோப்புகளில் வலது-கிளிக் செய்து, <ph name="OFFLINE_CHECKBOX_NAME" /> விருப்பத்தைத் தேர்தெடுக்கவும்.</translation>
 <translation id="8249296373107784235">கைவிடு</translation>
 <translation id="8261506727792406068">நீக்கு</translation>
@@ -661,6 +666,7 @@
 <translation id="8686213429977032554">இந்த இயக்ககக் கோப்பு இன்னும் பகிரப்படவில்லை</translation>
 <translation id="8698464937041809063">Google வரைதல்</translation>
 <translation id="8714406895390098252">சைக்கிள்</translation>
+<translation id="8719721339511222681"><ph name="ENTRY_NAME" /> தேர்ந்தெடுக்கப்பட்டுள்ளது.</translation>
 <translation id="8722421161699219904">யுஎஸ் சர்வதேச விசைப்பலகை</translation>
 <translation id="872537912056138402">குரோஷியன்</translation>
 <translation id="874420130893181774">பாரம்பரிய பின்யின் உள்ளீட்டு முறை</translation>
@@ -701,6 +707,7 @@
 <translation id="942954117721265519">இந்தக் கோப்பகத்தில் படங்கள் இல்லை.</translation>
 <translation id="943972244133411984">மாற்றியவர்</translation>
 <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
+<translation id="947144732524271678"><ph name="FROM_ENTRY_NAME" /> முதல் <ph name="TO_ENTRY_NAME" /> வரை <ph name="ENTRY_COUNT" /> உள்ளீடுகள் தேர்ந்தெடுக்கப்பட்டுள்ளன.</translation>
 <translation id="981121421437150478">ஆஃப்லைன்</translation>
 <translation id="988685240266037636">"<ph name="FILE_NAME" />" என்ற பெயருள்ள கோப்பு ஏற்கனவே உள்ளது. அதை இடமாற்றவா?</translation>
 <translation id="996903396648773764"><ph name="NUMBER_OF_MB" /> மெ.பை.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
index f809f3a4..a3b8627 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">స్పానిష్ కీబోర్డ్</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">పరికరం మోడల్</translation>
+<translation id="8208580316430297579">కళాకృతి</translation>
 <translation id="8223479393428528563">ఈ ఫైల్‌లను ఆఫ్‌లైన్‌లో ఉపయోగించేందుకు వాటిని సేవ్ చేయడానికి, తిరిగి ఆన్‌లైన్‌లోకి వచ్చి, ఫైల్‌లపై కుడి-క్లిక్ చేసి, ఆపై <ph name="OFFLINE_CHECKBOX_NAME" /> ఎంపికను ఎంచుకోండి.</translation>
 <translation id="8249296373107784235">రద్దుచేయి</translation>
 <translation id="8261506727792406068">తొలగించు</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index be62f1c..e2a705f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">แป้นพิมพ์ภาษาสเปน</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">รุ่นอุปกรณ์</translation>
+<translation id="8208580316430297579">งานศิลปะ</translation>
 <translation id="8223479393428528563">หากต้องการบันทึกไฟล์เหล่านี้เพื่อใช้งานแบบออฟไลน์ ให้คลิกขวาที่ไฟล์ และเลือกตัวเลือก <ph name="OFFLINE_CHECKBOX_NAME" /></translation>
 <translation id="8249296373107784235">ล้มเลิก</translation>
 <translation id="8261506727792406068">ลบ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
index 161f7e23..09e66ae 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">İspanyolca klavye</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Cihaz modeli</translation>
+<translation id="8208580316430297579">Poster</translation>
 <translation id="8223479393428528563">Bu dosyaları çevrimdışı kullanım için kaydetmek üzere tekrar çevrimiçi olun, dosyaları sağ tıklayın ve <ph name="OFFLINE_CHECKBOX_NAME" /> seçeneğini belirleyin.</translation>
 <translation id="8249296373107784235">İptal Et</translation>
 <translation id="8261506727792406068">Sil</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
index 38627f0c..760b62d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">Bàn phím tiếng Tây Ban Nha</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">Mẫu thiết bị</translation>
+<translation id="8208580316430297579">Tác phẩm nghệ thuật</translation>
 <translation id="8223479393428528563">Để lưu các tệp này để sử dụng ngoại tuyến, hãy trực tuyến trở lại, nhấp chuột phải vào tệp và chọn tùy chọn <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="8249296373107784235">Hủy bỏ</translation>
 <translation id="8261506727792406068">Xóa</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
index 8db9a68..db8b1c0 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -623,6 +623,7 @@
 <translation id="8160015581537295331">西班牙语键盘</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">设备型号</translation>
+<translation id="8208580316430297579">图片</translation>
 <translation id="8223479393428528563">要保存这些文件以供离线使用,请恢复联网状态,右键点击文件,然后选择<ph name="OFFLINE_CHECKBOX_NAME" />选项。</translation>
 <translation id="8249296373107784235">取消</translation>
 <translation id="8261506727792406068">删除</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
index 92f33930..5f53142 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -628,6 +628,7 @@
 <translation id="8160015581537295331">西班牙文鍵盤</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8193175696669055101">裝置型號</translation>
+<translation id="8208580316430297579">圖檔</translation>
 <translation id="8223479393428528563">如要儲存這些檔案以供離線使用,請重新上網,在檔案上按一下滑鼠右鍵,然後選取 [<ph name="OFFLINE_CHECKBOX_NAME" />] 選項。</translation>
 <translation id="8249296373107784235">取消</translation>
 <translation id="8261506727792406068">刪除</translation>
diff --git a/ui/events/blink/prediction/kalman_predictor.cc b/ui/events/blink/prediction/kalman_predictor.cc
index 357c6dc2..41904cc 100644
--- a/ui/events/blink/prediction/kalman_predictor.cc
+++ b/ui/events/blink/prediction/kalman_predictor.cc
@@ -18,7 +18,8 @@
 constexpr base::TimeDelta InputPredictor::kMaxTimeDelta;
 constexpr base::TimeDelta InputPredictor::kMaxResampleTime;
 
-KalmanPredictor::KalmanPredictor() = default;
+KalmanPredictor::KalmanPredictor(const bool enable_time_filtering)
+    : enable_time_filtering_(enable_time_filtering) {}
 
 KalmanPredictor::~KalmanPredictor() = default;
 
@@ -30,6 +31,7 @@
   x_predictor_.Reset();
   y_predictor_.Reset();
   last_point_.time_stamp = base::TimeTicks();
+  time_filter_.Reset();
 }
 
 void KalmanPredictor::Update(const InputData& cur_input) {
@@ -39,9 +41,12 @@
     dt = cur_input.time_stamp - last_point_.time_stamp;
     if (dt > kMaxTimeDelta)
       Reset();
+    else if (enable_time_filtering_)
+      time_filter_.Update(dt.InMillisecondsF(), 0);
   }
 
-  double dt_ms = dt.InMillisecondsF();
+  double dt_ms = enable_time_filtering_ ? time_filter_.GetPosition()
+                                        : dt.InMillisecondsF();
   last_point_ = cur_input;
   x_predictor_.Update(cur_input.pos.x(), dt_ms);
   y_predictor_.Update(cur_input.pos.y(), dt_ms);
diff --git a/ui/events/blink/prediction/kalman_predictor.h b/ui/events/blink/prediction/kalman_predictor.h
index b83dd472..6b373f5 100644
--- a/ui/events/blink/prediction/kalman_predictor.h
+++ b/ui/events/blink/prediction/kalman_predictor.h
@@ -19,7 +19,7 @@
 // be used to predict one dimension (x, y).
 class KalmanPredictor : public InputPredictor {
  public:
-  explicit KalmanPredictor();
+  explicit KalmanPredictor(bool enable_time_filtering);
   ~KalmanPredictor() override;
 
   const char* GetName() const override;
@@ -45,10 +45,14 @@
   gfx::Vector2dF PredictVelocity() const;
   gfx::Vector2dF PredictAcceleration() const;
 
-  // Prdictor for each axis.
+  // Predictor for each axis.
   KalmanFilter x_predictor_;
   KalmanFilter y_predictor_;
 
+  // Filter to smooth time intervals.
+  KalmanFilter time_filter_;
+  bool enable_time_filtering_;
+
   // The last input point.
   InputData last_point_;
 
diff --git a/ui/events/blink/prediction/kalman_predictor_unittest.cc b/ui/events/blink/prediction/kalman_predictor_unittest.cc
index 4d8a1d8..039c6637 100644
--- a/ui/events/blink/prediction/kalman_predictor_unittest.cc
+++ b/ui/events/blink/prediction/kalman_predictor_unittest.cc
@@ -44,7 +44,8 @@
   explicit KalmanPredictorTest() {}
 
   void SetUp() override {
-    predictor_ = std::make_unique<ui::KalmanPredictor>();
+    predictor_ = std::make_unique<ui::KalmanPredictor>(
+        false /* enable_time_filtering */);
   }
 
   DISALLOW_COPY_AND_ASSIGN(KalmanPredictorTest);
@@ -89,6 +90,16 @@
   ValidatePredictor(x, y, t);
 }
 
+// Tests the kalman predictor constant position with time filtering.
+TEST_F(KalmanPredictorTest, PredictConstantValueTimeFiltered) {
+  predictor_ =
+      std::make_unique<ui::KalmanPredictor>(true /* enable_time_filtering */);
+  std::vector<double> x = {50, 50, 50, 50, 50, 50};
+  std::vector<double> y = {-50, -50, -50, -50, -50, -50};
+  std::vector<double> t = {8, 16, 24, 32, 40, 48};
+  ValidatePredictor(x, y, t);
+}
+
 // Tests the kalman predictor predict constant velocity.
 TEST_F(KalmanPredictorTest, PredictLinearValue) {
   std::vector<double> x = {0, 8, 16, 20, 23, 27, 31, 38, 48, 60};
@@ -97,6 +108,37 @@
   ValidatePredictor(x, y, t);
 }
 
+// Tests the time filtering as the kalman predictor predicts constant velocity.
+// Position is changing on a fixed rate assuming a fixed hardware resample
+// frequency. Due to timestamp noise generated by the OS event delivery,
+// timestamps are inconsistent.
+TEST_F(KalmanPredictorTest, PredictLinearValueTimeFiltered) {
+  std::unique_ptr<ui::KalmanPredictor> filtered_predictor =
+      std::make_unique<ui::KalmanPredictor>(true /* enable_time_filtering */);
+  std::vector<double> x = {0, 8, 16, 24, 32, 40, 48, 60};
+  std::vector<double> y = {30, 38, 46, 54, 62, 70, 78, 90};
+  std::vector<double> t = {0, 8, 16, 23, 33, 39, 49, 60};
+  for (size_t i = 0; i < t.size(); i++) {
+    if (filtered_predictor->HasPrediction() && predictor_->HasPrediction()) {
+      ui::InputPredictor::InputData filtered_result;
+      ui::InputPredictor::InputData unfiltered_result;
+      EXPECT_TRUE(filtered_predictor->GeneratePrediction(
+          FromMilliseconds(t[i]), false /* is_resampling */, &filtered_result));
+      EXPECT_TRUE(predictor_->GeneratePrediction(FromMilliseconds(t[i]),
+                                                 false /* is_resampling */,
+                                                 &unfiltered_result));
+      EXPECT_LT(std::abs(filtered_result.pos.x() - x[i]),
+                std::abs(unfiltered_result.pos.x() - x[i]));
+      EXPECT_LT(std::abs(filtered_result.pos.y() - y[i]),
+                std::abs(unfiltered_result.pos.y() - y[i]));
+    }
+    InputPredictor::InputData data = {gfx::PointF(x[i], y[i]),
+                                      FromMilliseconds(t[i])};
+    filtered_predictor->Update(data);
+    predictor_->Update(data);
+  }
+}
+
 // Tests the kalman predictor predict constant acceleration.
 TEST_F(KalmanPredictorTest, PredictQuadraticValue) {
   std::vector<double> x = {0, 2, 8, 18, 32, 50, 72, 98};
@@ -105,5 +147,15 @@
   ValidatePredictor(x, y, t);
 }
 
+// Tests the kalman predictor predict constant acceleration with time filtering.
+TEST_F(KalmanPredictorTest, PredictQuadraticValueTimeFiltered) {
+  predictor_ =
+      std::make_unique<ui::KalmanPredictor>(true /* enable_time_filtering */);
+  std::vector<double> x = {0, 2, 8, 18, 32, 50, 72, 98};
+  std::vector<double> y = {10, 11, 14, 19, 26, 35, 46, 59};
+  std::vector<double> t = {8, 16, 24, 32, 40, 48, 56, 64};
+  ValidatePredictor(x, y, t);
+}
+
 }  // namespace test
 }  // namespace ui
diff --git a/ui/events/blink/scroll_predictor.cc b/ui/events/blink/scroll_predictor.cc
index 7c95975..fad9e0a 100644
--- a/ui/events/blink/scroll_predictor.cc
+++ b/ui/events/blink/scroll_predictor.cc
@@ -22,6 +22,8 @@
 constexpr char kPredictor[] = "predictor";
 constexpr char kScrollPredictorTypeLsq[] = "lsq";
 constexpr char kScrollPredictorTypeKalman[] = "kalman";
+constexpr char kScrollPredictorTypeKalmanTimeFiltered[] =
+    "kalman_time_filtered";
 
 }  // namespace
 
@@ -39,7 +41,11 @@
   if (predictor_type == kScrollPredictorTypeLsq)
     predictor_ = std::make_unique<LeastSquaresPredictor>();
   else if (predictor_type == kScrollPredictorTypeKalman)
-    predictor_ = std::make_unique<KalmanPredictor>();
+    predictor_ =
+        std::make_unique<KalmanPredictor>(false /* enable_time_filtering */);
+  else if (predictor_type == kScrollPredictorTypeKalmanTimeFiltered)
+    predictor_ =
+        std::make_unique<KalmanPredictor>(true /* enable_time_filtering */);
   else
     predictor_ = std::make_unique<EmptyPredictor>();
 }
diff --git a/ui/gfx/geometry/mojo/geometry.mojom b/ui/gfx/geometry/mojo/geometry.mojom
index 4eec21dc..78d28f0 100644
--- a/ui/gfx/geometry/mojo/geometry.mojom
+++ b/ui/gfx/geometry/mojo/geometry.mojom
@@ -85,3 +85,10 @@
   float x;
   float y;
 };
+
+struct Quaternion {
+  double x;
+  double y;
+  double z;
+  double w;
+};
diff --git a/ui/gfx/geometry/mojo/geometry.typemap b/ui/gfx/geometry/mojo/geometry.typemap
index db70bf0..b982607 100644
--- a/ui/gfx/geometry/mojo/geometry.typemap
+++ b/ui/gfx/geometry/mojo/geometry.typemap
@@ -13,6 +13,7 @@
   "//ui/gfx/geometry/safe_integer_conversions.h",
   "//ui/gfx/geometry/scroll_offset.h",
   "//ui/gfx/geometry/insets.h",
+  "//ui/gfx/geometry/quaternion.h",
   "//ui/gfx/geometry/vector2d.h",
   "//ui/gfx/geometry/vector2d_f.h",
   "//ui/gfx/geometry/vector3d_f.h",
@@ -31,6 +32,7 @@
   "gfx.mojom.RectF=gfx::RectF",
   "gfx.mojom.Insets=gfx::Insets",
   "gfx.mojom.InsetsF=gfx::InsetsF",
+  "gfx.mojom.Quaternion=gfx::Quaternion",
   "gfx.mojom.Vector2d=gfx::Vector2d",
   "gfx.mojom.Vector2dF=gfx::Vector2dF",
   "gfx.mojom.Vector3dF=gfx::Vector3dF",
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits.h b/ui/gfx/geometry/mojo/geometry_struct_traits.h
index aa6251e2..dc2b3b8 100644
--- a/ui/gfx/geometry/mojo/geometry_struct_traits.h
+++ b/ui/gfx/geometry/mojo/geometry_struct_traits.h
@@ -11,6 +11,7 @@
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/point3_f.h"
 #include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/quaternion.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/scroll_offset.h"
@@ -180,6 +181,21 @@
   }
 };
 
+template <>
+struct StructTraits<gfx::mojom::QuaternionDataView, gfx::Quaternion> {
+  static double x(const gfx::Quaternion& q) { return q.x(); }
+  static double y(const gfx::Quaternion& q) { return q.y(); }
+  static double z(const gfx::Quaternion& q) { return q.z(); }
+  static double w(const gfx::Quaternion& q) { return q.w(); }
+  static bool Read(gfx::mojom::QuaternionDataView data, gfx::Quaternion* out) {
+    out->set_x(data.x());
+    out->set_y(data.y());
+    out->set_z(data.z());
+    out->set_w(data.w());
+    return true;
+  }
+};
+
 }  // namespace mojo
 
 #endif  // UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc b/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
index d0be185..da7130a 100644
--- a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
+++ b/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
@@ -9,6 +9,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/mojo/geometry_traits_test_service.mojom.h"
 #include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/quaternion.h"
 
 namespace gfx {
 
@@ -78,6 +79,11 @@
     std::move(callback).Run(v);
   }
 
+  void EchoQuaternion(const Quaternion& q,
+                      EchoQuaternionCallback callback) override {
+    std::move(callback).Run(q);
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   mojo::BindingSet<GeometryTraitsTestService> traits_test_bindings_;
 
@@ -238,4 +244,19 @@
   EXPECT_EQ(z, output.z());
 }
 
+TEST_F(GeometryStructTraitsTest, Quaternion) {
+  const double x = 1234.5;
+  const double y = 6789.6;
+  const double z = 31415.9;
+  const double w = 27182.8;
+  gfx::Quaternion input(x, y, z, w);
+  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  gfx::Quaternion output;
+  proxy->EchoQuaternion(input, &output);
+  EXPECT_EQ(x, output.x());
+  EXPECT_EQ(y, output.y());
+  EXPECT_EQ(z, output.z());
+  EXPECT_EQ(w, output.w());
+}
+
 }  // namespace gfx
diff --git a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom b/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
index 1be6ae9cb..d1eea65 100644
--- a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
+++ b/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
@@ -44,4 +44,7 @@
 
   [Sync]
   EchoVector3dF(Vector3dF v) => (Vector3dF pass);
+
+  [Sync]
+  EchoQuaternion(Quaternion q) => (Quaternion pass);
 };
diff --git a/ui/gl/gl_surface_egl_surface_control.cc b/ui/gl/gl_surface_egl_surface_control.cc
index af1c77e..a11b176 100644
--- a/ui/gl/gl_surface_egl_surface_control.cc
+++ b/ui/gl/gl_surface_egl_surface_control.cc
@@ -178,7 +178,18 @@
     const gfx::Rect& damage_rect,
     SwapCompletionCallback completion_callback,
     PresentationCallback present_callback) {
-  DCHECK(pending_transaction_);
+  // The transaction is initialized on the first ScheduleOverlayPlane call. If
+  // we don't have a transaction at this point, it means the scheduling the
+  // overlay plane failed. Simply report a swap failure to lose the context and
+  // recreate the surface.
+  if (!pending_transaction_ || surface_lost_) {
+    LOG(ERROR) << "CommitPendingTransaction failed because surface is lost";
+
+    surface_lost_ = true;
+    std::move(completion_callback).Run(gfx::SwapResult::SWAP_FAILED, nullptr);
+    std::move(present_callback).Run(gfx::PresentationFeedback::Failure());
+    return;
+  }
 
   // Mark the intersection of a surface's rect with the damage rect as the dirty
   // rect for that surface.
@@ -252,6 +263,11 @@
     const gfx::RectF& crop_rect,
     bool enable_blend,
     std::unique_ptr<gfx::GpuFence> gpu_fence) {
+  if (surface_lost_) {
+    LOG(ERROR) << "ScheduleOverlayPlane failed because surface is lost";
+    return false;
+  }
+
   if (!SurfaceControl::SupportsColorSpace(image->color_space())) {
     LOG(ERROR) << "Not supported color space used with overlay : "
                << image->color_space().ToString();
diff --git a/ui/gl/gl_surface_egl_surface_control.h b/ui/gl/gl_surface_egl_surface_control.h
index 3a4b9d9..4c17693 100644
--- a/ui/gl/gl_surface_egl_surface_control.h
+++ b/ui/gl/gl_surface_egl_surface_control.h
@@ -196,6 +196,9 @@
   EGLSurface offscreen_surface_ = nullptr;
   base::CancelableOnceClosure check_pending_presentation_callback_queue_task_;
 
+  // Set if a swap failed and the surface is no longer usable.
+  bool surface_lost_ = false;
+
   scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
   base::WeakPtrFactory<GLSurfaceEGLSurfaceControl> weak_factory_;
 };
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index ec8778e..d12b934 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -16,6 +16,7 @@
 <translation id="1383876407941801731">தேடல்</translation>
 <translation id="1398853756734560583">பெரிதாக்கு</translation>
 <translation id="1409544243779336081">ஆப்ஸ் பரிந்துரை</translation>
+<translation id="1498028757988366001">இதை முன்பே தேடியிருக்கிறீர்கள். "<ph name="QUERY" />"யைத் தேடல் வரலாற்றிலிருந்து நீக்கினால் உங்கள் கணக்கு பயன்படுத்தப்படும் அனைத்து சாதனங்களில் இருந்தும் நிரந்தரமாக அகற்றப்படும்.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 நிமிடம், }other{# நிமிடங்கள், }}</translation>
 <translation id="1643823602425662293">அறிவிப்பு</translation>
 <translation id="169515659049020177">Shift</translation>
@@ -169,6 +170,7 @@
 <translation id="7365057348334984696">{MINUTES,plural, =1{1 நிமிடம் முன்பு}other{# நிமிடங்கள் முன்பு}}</translation>
 <translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
 <translation id="7410957453383678442">{MINUTES,plural, =1{1 நிமிடம் மீதமுள்ளது}other{# நிமிடங்கள் மீதமுள்ளன}}</translation>
+<translation id="7430878839542012341">இதுவரை தேடியவற்றிலிருந்து இந்தத் தேடலை நீக்கவா?</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> டெ.பை</translation>
 <translation id="7507604095951736240">ஈமோஜி</translation>
 <translation id="7658239707568436148">ரத்து செய்</translation>
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index 5167f6d..758ef6c 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -4,7 +4,7 @@
 
 #include "ui/views/controls/tabbed_pane/tabbed_pane.h"
 
-#include <memory>
+#include <utility>
 
 #include "base/i18n/rtl.h"
 #include "base/logging.h"
@@ -126,18 +126,20 @@
 
 Tab::Tab(TabbedPane* tabbed_pane, const base::string16& title, View* contents)
     : tabbed_pane_(tabbed_pane),
-      title_(new Label(title, style::CONTEXT_LABEL, style::STYLE_TAB_ACTIVE)),
       state_(State::kActive),
       contents_(contents) {
   // Calculate the size while the font list is bold.
-  preferred_title_size_ = title_->GetPreferredSize();
+  auto title_label = std::make_unique<Label>(title, style::CONTEXT_LABEL,
+                                             style::STYLE_TAB_ACTIVE);
+  title_ = title_label.get();
+  preferred_title_size_ = title_label->GetPreferredSize();
   const bool is_vertical =
       tabbed_pane_->GetOrientation() == TabbedPane::Orientation::kVertical;
   const bool is_highlight_style =
       tabbed_pane_->GetStyle() == TabbedPane::TabStripStyle::kHighlight;
 
   if (is_vertical)
-    title_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
+    title_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
 
   if (is_highlight_style && is_vertical) {
     constexpr int kTabVerticalPadding = 8;
@@ -153,8 +155,8 @@
   SetLayoutManager(std::make_unique<FillLayout>());
   SetState(State::kInactive);
   // Calculate the size while the font list is normal and set the max size.
-  preferred_title_size_.SetToMax(title_->GetPreferredSize());
-  AddChildView(title_);
+  preferred_title_size_.SetToMax(title_label->GetPreferredSize());
+  AddChildView(std::move(title_label));
 
   // Use leaf so that name is spoken by screen reader without exposing the
   // children.
@@ -174,6 +176,25 @@
 #endif
 }
 
+const base::string16& Tab::GetTitleText() const {
+  return title_->text();
+}
+
+void Tab::SetTitleText(const base::string16& text) {
+  title_->SetText(text);
+
+  // Active and inactive states use different font sizes. Find the largest size
+  // and reserve that amount of space.
+  State old_state = state_;
+  SetState(State::kActive);
+  preferred_title_size_ = GetPreferredSize();
+  SetState(State::kInactive);
+  preferred_title_size_.SetToMax(GetPreferredSize());
+  SetState(old_state);
+
+  InvalidateLayout();
+}
+
 void Tab::OnStateChanged() {
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   const bool is_highlight_mode =
@@ -684,13 +705,11 @@
 }
 
 TabbedPane::TabbedPane(TabbedPane::Orientation orientation,
-                       TabbedPane::TabStripStyle style)
-    : contents_(new View()) {
+                       TabbedPane::TabStripStyle style) {
   DCHECK(orientation != TabbedPane::Orientation::kHorizontal ||
          style != TabbedPane::TabStripStyle::kHighlight);
-  tab_strip_ = new MdTabStrip(orientation, style);
-  AddChildView(tab_strip_);
-  AddChildView(contents_);
+  tab_strip_ = AddChildView(std::make_unique<MdTabStrip>(orientation, style));
+  contents_ = AddChildView(std::make_unique<View>());
 }
 
 TabbedPane::~TabbedPane() = default;
@@ -704,19 +723,16 @@
   return contents_->children().size();
 }
 
-void TabbedPane::AddTab(const base::string16& title, View* contents) {
-  AddTabAtIndex(tab_strip_->children().size(), title, contents);
-}
-
-void TabbedPane::AddTabAtIndex(size_t index,
-                               const base::string16& title,
-                               View* contents) {
+void TabbedPane::AddTabInternal(size_t index,
+                                const base::string16& title,
+                                std::unique_ptr<View> contents) {
   DCHECK_LE(index, GetTabCount());
   contents->SetVisible(false);
 
-  tab_strip_->AddChildViewAt(new MdTab(this, title, contents),
-                             static_cast<int>(index));
-  contents_->AddChildViewAt(contents, static_cast<int>(index));
+  tab_strip_->AddChildViewAt(
+      std::make_unique<MdTab>(this, title, contents.get()),
+      static_cast<int>(index));
+  contents_->AddChildViewAt(std::move(contents), static_cast<int>(index));
   if (!GetSelectedTab())
     SelectTabAt(index);
 
@@ -774,6 +790,10 @@
   return tab_strip_->style();
 }
 
+Tab* TabbedPane::GetTabAt(size_t index) {
+  return tab_strip_->GetTabAtIndex(index);
+}
+
 Tab* TabbedPane::GetSelectedTab() {
   return tab_strip_->GetSelectedTab();
 }
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.h b/ui/views/controls/tabbed_pane/tabbed_pane.h
index 8f6a5cf..7020c4d 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.h
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.h
@@ -5,6 +5,8 @@
 #ifndef UI_VIEWS_CONTROLS_TABBED_PANE_TABBED_PANE_H_
 #define UI_VIEWS_CONTROLS_TABBED_PANE_TABBED_PANE_H_
 
+#include <memory>
+
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
@@ -59,12 +61,22 @@
   // Adds a new tab at the end of this TabbedPane with the specified |title|.
   // |contents| is the view displayed when the tab is selected and is owned by
   // the TabbedPane.
-  void AddTab(const base::string16& title, View* contents);
+  template <typename T>
+  T* AddTab(const base::string16& title, std::unique_ptr<T> contents) {
+    return AddTabAtIndex(GetTabCount(), title, std::move(contents));
+  }
 
   // Adds a new tab at |index| with |title|. |contents| is the view displayed
   // when the tab is selected and is owned by the TabbedPane. If the tabbed pane
   // is currently empty, the new tab is selected.
-  void AddTabAtIndex(size_t index, const base::string16& title, View* contents);
+  template <typename T>
+  T* AddTabAtIndex(size_t index,
+                   const base::string16& title,
+                   std::unique_ptr<T> contents) {
+    T* result = contents.get();
+    AddTabInternal(index, title, std::move(contents));
+    return result;
+  }
 
   // Selects the tab at |index|, which must be valid.
   void SelectTabAt(size_t index);
@@ -81,6 +93,9 @@
   // Gets the style of the tab strip.
   TabStripStyle GetStyle() const;
 
+  // Returns the tab at the given index.
+  Tab* GetTabAt(size_t index);
+
  private:
   friend class FocusTraversalTest;
   friend class Tab;
@@ -88,6 +103,13 @@
   friend class test::TabbedPaneTest;
   friend class test::TabbedPaneAccessibilityMacTest;
 
+  // Adds a new tab at |index| with |title|. |contents| is the view displayed
+  // when the tab is selected and is owned by the TabbedPane. If the tabbed pane
+  // is currently empty, the new tab is selected.
+  void AddTabInternal(size_t index,
+                      const base::string16& title,
+                      std::unique_ptr<View> contents);
+
   // Get the Tab (the tabstrip view, not its content) at the selected index.
   Tab* GetSelectedTab();
 
@@ -112,14 +134,14 @@
 
   // The tab strip and contents container. The child indices of these members
   // correspond to match each Tab with its respective content View.
-  TabStrip* tab_strip_;
-  View* contents_;
+  TabStrip* tab_strip_ = nullptr;
+  View* contents_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(TabbedPane);
 };
 
 // The tab view shown in the tab strip.
-class Tab : public View {
+class VIEWS_EXPORT Tab : public View {
  public:
   // Internal class name.
   static const char kViewClassName[];
@@ -132,6 +154,9 @@
   bool selected() const { return contents_->GetVisible(); }
   void SetSelected(bool selected);
 
+  const base::string16& GetTitleText() const;
+  void SetTitleText(const base::string16& text);
+
   // Overridden from View:
   bool OnMousePressed(const ui::MouseEvent& event) override;
   void OnMouseEntered(const ui::MouseEvent& event) override;
@@ -166,7 +191,7 @@
   void OnPaint(gfx::Canvas* canvas) override;
 
   TabbedPane* tabbed_pane_;
-  Label* title_;
+  Label* title_ = nullptr;
   gfx::Size preferred_title_size_;
   State state_;
   // The content view associated with this tab.
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm b/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
index bdd0064..2dc681a 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
+++ b/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
@@ -49,15 +49,16 @@
     WidgetTest::SetUp();
     widget_ = CreateTopLevelPlatformWidget();
     widget_->SetBounds(gfx::Rect(50, 50, 100, 100));
-    tabbed_pane_ = new TabbedPane();
-    tabbed_pane_->SetSize(gfx::Size(100, 100));
+    auto tabbed_pane = std::make_unique<TabbedPane>();
+    tabbed_pane->SetSize(gfx::Size(100, 100));
 
     // Create two tabs and position/size them.
-    tabbed_pane_->AddTab(base::ASCIIToUTF16("Tab 1"), new View());
-    tabbed_pane_->AddTab(base::ASCIIToUTF16("Tab 2"), new View());
-    tabbed_pane_->Layout();
+    tabbed_pane->AddTab(base::ASCIIToUTF16("Tab 1"), std::make_unique<View>());
+    tabbed_pane->AddTab(base::ASCIIToUTF16("Tab 2"), std::make_unique<View>());
+    tabbed_pane->Layout();
 
-    widget_->GetContentsView()->AddChildView(tabbed_pane_);
+    tabbed_pane_ =
+        widget_->GetContentsView()->AddChildView(std::move(tabbed_pane));
     widget_->Show();
   }
 
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc b/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
index f2e3f28..50611cd 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane_unittest.cc
@@ -96,10 +96,12 @@
 // width of horizontal tab strips for preferred size calculations. Tab titles
 // are elided to fit the actual width.
 TEST_F(TabbedPaneTest, SizeAndLayout) {
-  View* child1 = new StaticSizedView(gfx::Size(20, 10));
-  tabbed_pane_->AddTab(ASCIIToUTF16("tab1 with very long text"), child1);
-  View* child2 = new StaticSizedView(gfx::Size(5, 5));
-  tabbed_pane_->AddTab(ASCIIToUTF16("tab2 with very long text"), child2);
+  View* child1 = tabbed_pane_->AddTab(
+      ASCIIToUTF16("tab1 with very long text"),
+      std::make_unique<StaticSizedView>(gfx::Size(20, 10)));
+  View* child2 =
+      tabbed_pane_->AddTab(ASCIIToUTF16("tab2 with very long text"),
+                           std::make_unique<StaticSizedView>(gfx::Size(5, 5)));
   tabbed_pane_->SelectTabAt(0);
 
   // |tabbed_pane_| width should match the largest child in horizontal mode.
@@ -127,10 +129,11 @@
 TEST_F(TabbedPaneTest, SizeAndLayoutInVerticalOrientation) {
   MakeTabbedPane(TabbedPane::Orientation::kVertical,
                  TabbedPane::TabStripStyle::kBorder);
-  View* child1 = new StaticSizedView(gfx::Size(20, 10));
-  tabbed_pane_->AddTab(ASCIIToUTF16("tab1"), child1);
-  View* child2 = new StaticSizedView(gfx::Size(5, 5));
-  tabbed_pane_->AddTab(ASCIIToUTF16("tab2"), child2);
+  View* child1 = tabbed_pane_->AddTab(
+      ASCIIToUTF16("tab1"),
+      std::make_unique<StaticSizedView>(gfx::Size(20, 10)));
+  View* child2 = tabbed_pane_->AddTab(
+      ASCIIToUTF16("tab2"), std::make_unique<StaticSizedView>(gfx::Size(5, 5)));
   tabbed_pane_->SelectTabAt(0);
 
   // |tabbed_pane_| reserves extra width for the tab strip in vertical mode.
@@ -157,8 +160,7 @@
 TEST_F(TabbedPaneTest, AddAndSelect) {
   // Add several tabs; only the first should be selected automatically.
   for (size_t i = 0; i < 3; ++i) {
-    View* tab = new View();
-    tabbed_pane_->AddTab(DefaultTabTitle(), tab);
+    tabbed_pane_->AddTab(DefaultTabTitle(), std::make_unique<View>());
     EXPECT_EQ(i + 1, tabbed_pane_->GetTabCount());
     EXPECT_EQ(0u, tabbed_pane_->GetSelectedTabIndex());
   }
@@ -170,8 +172,8 @@
   }
 
   // Add a tab at index 0, it should not be selected automatically.
-  View* tab0 = new View();
-  tabbed_pane_->AddTabAtIndex(0, ASCIIToUTF16("tab0"), tab0);
+  View* tab0 = tabbed_pane_->AddTabAtIndex(0, ASCIIToUTF16("tab0"),
+                                           std::make_unique<View>());
   EXPECT_NE(tab0, GetSelectedTabContentView());
   EXPECT_NE(0u, tabbed_pane_->GetSelectedTabIndex());
 }
@@ -179,8 +181,7 @@
 TEST_F(TabbedPaneTest, ArrowKeyBindings) {
   // Add several tabs; only the first should be selected automatically.
   for (size_t i = 0; i < 3; ++i) {
-    View* tab = new View();
-    tabbed_pane_->AddTab(DefaultTabTitle(), tab);
+    tabbed_pane_->AddTab(DefaultTabTitle(), std::make_unique<View>());
     EXPECT_EQ(i + 1, tabbed_pane_->GetTabCount());
   }
 
@@ -215,7 +216,7 @@
 
   constexpr size_t kNumTabs = 3;
   for (size_t i = 0; i < kNumTabs; ++i) {
-    tabbed_pane_->AddTab(DefaultTabTitle(), new View());
+    tabbed_pane_->AddTab(DefaultTabTitle(), std::make_unique<View>());
   }
   // Check the first tab is selected.
   EXPECT_EQ(0u, tabbed_pane_->GetSelectedTabIndex());
diff --git a/ui/views/examples/tabbed_pane_example.cc b/ui/views/examples/tabbed_pane_example.cc
index f20d362b..b534d663 100644
--- a/ui/views/examples/tabbed_pane_example.cc
+++ b/ui/views/examples/tabbed_pane_example.cc
@@ -61,7 +61,8 @@
     AddButton("Added");
   } else if (sender == add_at_) {
     const base::string16 label = ASCIIToUTF16("Added at 1");
-    tabbed_pane_->AddTabAtIndex(1, label, new LabelButton(nullptr, label));
+    tabbed_pane_->AddTabAtIndex(1, label,
+                                std::make_unique<LabelButton>(nullptr, label));
   } else if (sender == select_at_) {
     if (tabbed_pane_->GetTabCount() > 1)
       tabbed_pane_->SelectTabAt(1);
@@ -81,8 +82,8 @@
 }
 
 void TabbedPaneExample::AddButton(const std::string& label) {
-  LabelButton* button = new LabelButton(nullptr, ASCIIToUTF16(label));
-  tabbed_pane_->AddTab(ASCIIToUTF16(label), button);
+  tabbed_pane_->AddTab(ASCIIToUTF16(label), std::make_unique<LabelButton>(
+                                                nullptr, ASCIIToUTF16(label)));
 }
 
 }  // namespace examples
diff --git a/ui/views/focus/focus_traversal_unittest.cc b/ui/views/focus/focus_traversal_unittest.cc
index 2b82859..3d2ef8e 100644
--- a/ui/views/focus/focus_traversal_unittest.cc
+++ b/ui/views/focus/focus_traversal_unittest.cc
@@ -299,18 +299,17 @@
 
   GetContentsView()->SetBackground(CreateSolidBackground(SK_ColorWHITE));
 
-  Checkbox* cb = new Checkbox(ASCIIToUTF16("This is a checkbox"));
-  GetContentsView()->AddChildView(cb);
+  auto cb = std::make_unique<Checkbox>(ASCIIToUTF16("This is a checkbox"));
+  auto* cb_ptr = GetContentsView()->AddChildView(std::move(cb));
   // In this fast paced world, who really has time for non hard-coded layout?
-  cb->SetBounds(10, 10, 200, 20);
-  cb->SetID(TOP_CHECKBOX_ID);
+  cb_ptr->SetBounds(10, 10, 200, 20);
+  cb_ptr->SetID(TOP_CHECKBOX_ID);
 
-  left_container_ = new PaneView();
-  left_container_->SetBorder(CreateSolidBorder(1, SK_ColorBLACK));
-  left_container_->SetBackground(
-      CreateSolidBackground(SkColorSetRGB(240, 240, 240)));
-  left_container_->SetID(LEFT_CONTAINER_ID);
-  GetContentsView()->AddChildView(left_container_);
+  auto container = std::make_unique<PaneView>();
+  container->SetBorder(CreateSolidBorder(1, SK_ColorBLACK));
+  container->SetBackground(CreateSolidBackground(SkColorSetRGB(240, 240, 240)));
+  container->SetID(LEFT_CONTAINER_ID);
+  left_container_ = GetContentsView()->AddChildView(std::move(container));
   left_container_->SetBounds(10, 35, 250, 200);
 
   int label_x = 5;
@@ -320,55 +319,55 @@
   int y = 10;
   int gap_between_labels = 10;
 
-  Label* label = new Label(ASCIIToUTF16("Apple:"));
+  auto label = std::make_unique<Label>(ASCIIToUTF16("Apple:"));
   label->SetID(APPLE_LABEL_ID);
-  left_container_->AddChildView(label);
-  label->SetBounds(label_x, y, label_width, label_height);
+  auto* label_ptr = left_container_->AddChildView(std::move(label));
+  label_ptr->SetBounds(label_x, y, label_width, label_height);
 
-  Textfield* text_field = new Textfield();
+  auto text_field = std::make_unique<Textfield>();
   text_field->SetID(APPLE_TEXTFIELD_ID);
-  left_container_->AddChildView(text_field);
-  text_field->SetBounds(label_x + label_width + 5, y,
-                        text_field_width, label_height);
+  auto* text_field_ptr = left_container_->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(label_x + label_width + 5, y, text_field_width,
+                            label_height);
 
   y += label_height + gap_between_labels;
 
-  label = new Label(ASCIIToUTF16("Orange:"));
+  label = std::make_unique<Label>(ASCIIToUTF16("Orange:"));
   label->SetID(ORANGE_LABEL_ID);
-  left_container_->AddChildView(label);
-  label->SetBounds(label_x, y, label_width, label_height);
+  label_ptr = left_container_->AddChildView(std::move(label));
+  label_ptr->SetBounds(label_x, y, label_width, label_height);
 
-  text_field = new Textfield();
+  text_field = std::make_unique<Textfield>();
   text_field->SetID(ORANGE_TEXTFIELD_ID);
-  left_container_->AddChildView(text_field);
-  text_field->SetBounds(label_x + label_width + 5, y,
-                        text_field_width, label_height);
+  text_field_ptr = left_container_->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(label_x + label_width + 5, y, text_field_width,
+                            label_height);
 
   y += label_height + gap_between_labels;
 
-  label = new Label(ASCIIToUTF16("Banana:"));
+  label = std::make_unique<Label>(ASCIIToUTF16("Banana:"));
   label->SetID(BANANA_LABEL_ID);
-  left_container_->AddChildView(label);
-  label->SetBounds(label_x, y, label_width, label_height);
+  label_ptr = left_container_->AddChildView(std::move(label));
+  label_ptr->SetBounds(label_x, y, label_width, label_height);
 
-  text_field = new Textfield();
+  text_field = std::make_unique<Textfield>();
   text_field->SetID(BANANA_TEXTFIELD_ID);
-  left_container_->AddChildView(text_field);
-  text_field->SetBounds(label_x + label_width + 5, y,
-                        text_field_width, label_height);
+  text_field_ptr = left_container_->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(label_x + label_width + 5, y, text_field_width,
+                            label_height);
 
   y += label_height + gap_between_labels;
 
-  label = new Label(ASCIIToUTF16("Kiwi:"));
+  label = std::make_unique<Label>(ASCIIToUTF16("Kiwi:"));
   label->SetID(KIWI_LABEL_ID);
-  left_container_->AddChildView(label);
-  label->SetBounds(label_x, y, label_width, label_height);
+  label_ptr = left_container_->AddChildView(std::move(label));
+  label_ptr->SetBounds(label_x, y, label_width, label_height);
 
-  text_field = new Textfield();
+  text_field = std::make_unique<Textfield>();
   text_field->SetID(KIWI_TEXTFIELD_ID);
-  left_container_->AddChildView(text_field);
-  text_field->SetBounds(label_x + label_width + 5, y,
-                        text_field_width, label_height);
+  text_field_ptr = left_container_->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(label_x + label_width + 5, y, text_field_width,
+                            label_height);
 
   y += label_height + gap_between_labels;
 
@@ -378,67 +377,70 @@
   left_container_->AddChildView(std::move(button));
   y += 40;
 
-  cb =  new Checkbox(ASCIIToUTF16("This is another check box"));
+  cb = std::make_unique<Checkbox>(ASCIIToUTF16("This is another check box"));
   cb->SetBounds(label_x + label_width + 5, y, 180, 20);
   cb->SetID(FRUIT_CHECKBOX_ID);
-  left_container_->AddChildView(cb);
+  left_container_->AddChildView(std::move(cb));
   y += 20;
 
-  Combobox* combobox =  new Combobox(&combobox_model_);
+  auto combobox = std::make_unique<Combobox>(&combobox_model_);
   combobox->SetBounds(label_x + label_width + 5, y, 150, 30);
   combobox->SetID(COMBOBOX_ID);
-  left_container_->AddChildView(combobox);
+  left_container_->AddChildView(std::move(combobox));
 
-  right_container_ = new PaneView();
-  right_container_->SetBorder(CreateSolidBorder(1, SK_ColorBLACK));
-  right_container_->SetBackground(
-      CreateSolidBackground(SkColorSetRGB(240, 240, 240)));
-  right_container_->SetID(RIGHT_CONTAINER_ID);
-  GetContentsView()->AddChildView(right_container_);
+  container = std::make_unique<PaneView>();
+  container->SetBorder(CreateSolidBorder(1, SK_ColorBLACK));
+  container->SetBackground(CreateSolidBackground(SkColorSetRGB(240, 240, 240)));
+  container->SetID(RIGHT_CONTAINER_ID);
+  right_container_ = GetContentsView()->AddChildView(std::move(container));
   right_container_->SetBounds(270, 35, 300, 200);
 
   y = 10;
   int radio_button_height = 18;
   int gap_between_radio_buttons = 10;
-  RadioButton* radio_button = new RadioButton(ASCIIToUTF16("Asparagus"), 1);
+  auto radio_button =
+      std::make_unique<RadioButton>(ASCIIToUTF16("Asparagus"), 1);
   radio_button->SetID(ASPARAGUS_BUTTON_ID);
-  right_container_->AddChildView(radio_button);
-  radio_button->SetBounds(5, y, 70, radio_button_height);
-  radio_button->SetGroup(1);
+  auto* radio_button_ptr =
+      right_container_->AddChildView(std::move(radio_button));
+  radio_button_ptr->SetBounds(5, y, 70, radio_button_height);
+  radio_button_ptr->SetGroup(1);
   y += radio_button_height + gap_between_radio_buttons;
-  radio_button = new RadioButton(ASCIIToUTF16("Broccoli"), 1);
+  radio_button = std::make_unique<RadioButton>(ASCIIToUTF16("Broccoli"), 1);
   radio_button->SetID(BROCCOLI_BUTTON_ID);
-  right_container_->AddChildView(radio_button);
-  radio_button->SetBounds(5, y, 70, radio_button_height);
-  radio_button->SetGroup(1);
-  RadioButton* radio_button_to_check = radio_button;
+  radio_button_ptr = right_container_->AddChildView(std::move(radio_button));
+  radio_button_ptr->SetBounds(5, y, 70, radio_button_height);
+  radio_button_ptr->SetGroup(1);
+  RadioButton* radio_button_to_check = radio_button_ptr;
   y += radio_button_height + gap_between_radio_buttons;
-  radio_button = new RadioButton(ASCIIToUTF16("Cauliflower"), 1);
+  radio_button = std::make_unique<RadioButton>(ASCIIToUTF16("Cauliflower"), 1);
   radio_button->SetID(CAULIFLOWER_BUTTON_ID);
-  right_container_->AddChildView(radio_button);
-  radio_button->SetBounds(5, y, 70, radio_button_height);
-  radio_button->SetGroup(1);
+  radio_button_ptr = right_container_->AddChildView(std::move(radio_button));
+  radio_button_ptr->SetBounds(5, y, 70, radio_button_height);
+  radio_button_ptr->SetGroup(1);
   y += radio_button_height + gap_between_radio_buttons;
 
-  View* inner_container = new View();
+  auto inner_container = std::make_unique<View>();
   inner_container->SetBorder(CreateSolidBorder(1, SK_ColorBLACK));
   inner_container->SetBackground(
       CreateSolidBackground(SkColorSetRGB(230, 230, 230)));
   inner_container->SetID(INNER_CONTAINER_ID);
-  right_container_->AddChildView(inner_container);
-  inner_container->SetBounds(100, 10, 150, 180);
+  auto* inner_container_ptr =
+      right_container_->AddChildView(std::move(inner_container));
+  inner_container_ptr->SetBounds(100, 10, 150, 180);
 
-  ScrollView* scroll_view = new ScrollView();
+  auto scroll_view = std::make_unique<ScrollView>();
   scroll_view->SetID(SCROLL_VIEW_ID);
-  inner_container->AddChildView(scroll_view);
-  scroll_view->SetBounds(1, 1, 148, 178);
+  auto* scroll_view_ptr =
+      inner_container_ptr->AddChildView(std::move(scroll_view));
+  scroll_view_ptr->SetBounds(1, 1, 148, 178);
 
   auto scroll_content = std::make_unique<View>();
   scroll_content->SetBounds(0, 0, 200, 200);
   scroll_content->SetBackground(
       CreateSolidBackground(SkColorSetRGB(200, 200, 200)));
   auto* scroll_content_ptr =
-      scroll_view->SetContents(std::move(scroll_content));
+      scroll_view_ptr->SetContents(std::move(scroll_content));
 
   static const char* const kTitles[] = {
       "Rosetta", "Stupeur et tremblement", "The diner game",
@@ -458,11 +460,11 @@
 
   y = 5;
   for (size_t i = 0; i < base::size(kTitles); ++i) {
-    Link* link = new Link(ASCIIToUTF16(kTitles[i]));
+    auto link = std::make_unique<Link>(ASCIIToUTF16(kTitles[i]));
     link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     link->SetID(kIDs[i]);
-    scroll_content_ptr->AddChildView(link);
-    link->SetBounds(5, y, 300, 15);
+    auto* link_ptr = scroll_content_ptr->AddChildView(std::move(link));
+    link_ptr->SetBounds(5, y, 300, 15);
     y += 15;
   }
 
@@ -486,72 +488,70 @@
 
   y += 40;
 
-  View* contents = nullptr;
-  Link* link = nullptr;
-
   // Left bottom box with style checkboxes.
-  contents = new View();
+  auto contents = std::make_unique<View>();
   contents->SetBackground(CreateSolidBackground(SK_ColorWHITE));
-  cb = new Checkbox(ASCIIToUTF16("Bold"));
-  contents->AddChildView(cb);
-  cb->SetBounds(10, 10, 50, 20);
-  cb->SetID(BOLD_CHECKBOX_ID);
+  cb = std::make_unique<Checkbox>(ASCIIToUTF16("Bold"));
+  cb_ptr = contents->AddChildView(std::move(cb));
+  cb_ptr->SetBounds(10, 10, 50, 20);
+  cb_ptr->SetID(BOLD_CHECKBOX_ID);
 
-  cb = new Checkbox(ASCIIToUTF16("Italic"));
-  contents->AddChildView(cb);
-  cb->SetBounds(70, 10, 50, 20);
-  cb->SetID(ITALIC_CHECKBOX_ID);
+  cb = std::make_unique<Checkbox>(ASCIIToUTF16("Italic"));
+  cb_ptr = contents->AddChildView(std::move(cb));
+  cb_ptr->SetBounds(70, 10, 50, 20);
+  cb_ptr->SetID(ITALIC_CHECKBOX_ID);
 
-  cb = new Checkbox(ASCIIToUTF16("Underlined"));
-  contents->AddChildView(cb);
-  cb->SetBounds(130, 10, 70, 20);
-  cb->SetID(UNDERLINED_CHECKBOX_ID);
+  cb = std::make_unique<Checkbox>(ASCIIToUTF16("Underlined"));
+  cb_ptr = contents->AddChildView(std::move(cb));
+  cb_ptr->SetBounds(130, 10, 70, 20);
+  cb_ptr->SetID(UNDERLINED_CHECKBOX_ID);
 
-  link = new Link(ASCIIToUTF16("Help"));
-  contents->AddChildView(link);
-  link->SetBounds(10, 35, 70, 10);
-  link->SetID(STYLE_HELP_LINK_ID);
+  auto link = std::make_unique<Link>(ASCIIToUTF16("Help"));
+  auto* link_ptr = contents->AddChildView(std::move(link));
+  link_ptr->SetBounds(10, 35, 70, 10);
+  link_ptr->SetID(STYLE_HELP_LINK_ID);
 
-  text_field = new Textfield();
-  contents->AddChildView(text_field);
-  text_field->SetBounds(10, 50, 100, 20);
-  text_field->SetID(STYLE_TEXT_EDIT_ID);
+  text_field = std::make_unique<Textfield>();
+  text_field_ptr = contents->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(10, 50, 100, 20);
+  text_field_ptr->SetID(STYLE_TEXT_EDIT_ID);
 
-  style_tab_ = new TabbedPane();
-  GetContentsView()->AddChildView(style_tab_);
+  auto style_tab = std::make_unique<TabbedPane>();
+  style_tab_ = GetContentsView()->AddChildView(std::move(style_tab));
   style_tab_->SetBounds(10, y, 210, 100);
-  style_tab_->AddTab(ASCIIToUTF16("Style"), contents);
+  style_tab_->AddTab(ASCIIToUTF16("Style"), std::move(contents));
   style_tab_->GetSelectedTab()->SetID(STYLE_CONTAINER_ID);
-  style_tab_->AddTab(ASCIIToUTF16("Other"), new View());
+  style_tab_->AddTab(ASCIIToUTF16("Other"), std::make_unique<View>());
 
   // Right bottom box with search.
-  contents = new View();
+  contents = std::make_unique<View>();
   contents->SetBackground(CreateSolidBackground(SK_ColorWHITE));
-  text_field = new Textfield();
-  contents->AddChildView(text_field);
-  text_field->SetBounds(10, 10, 100, 20);
-  text_field->SetID(SEARCH_TEXTFIELD_ID);
+  text_field = std::make_unique<Textfield>();
+  text_field_ptr = contents->AddChildView(std::move(text_field));
+  text_field_ptr->SetBounds(10, 10, 100, 20);
+  text_field_ptr->SetID(SEARCH_TEXTFIELD_ID);
 
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("Search"));
   button->SetBounds(112, 5, 60, 30);
   button->SetID(SEARCH_BUTTON_ID);
   contents->AddChildView(std::move(button));
 
-  link = new Link(ASCIIToUTF16("Help"));
+  link = std::make_unique<Link>(ASCIIToUTF16("Help"));
   link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   link->SetID(HELP_LINK_ID);
-  contents->AddChildView(link);
-  link->SetBounds(175, 10, 30, 20);
+  link_ptr = contents->AddChildView(std::move(link));
+  link_ptr->SetBounds(175, 10, 30, 20);
 
-  search_border_view_ = new BorderView(contents);
-  search_border_view_->SetID(SEARCH_CONTAINER_ID);
+  auto search_border_view = std::make_unique<BorderView>(contents.release());
+  search_border_view->SetID(SEARCH_CONTAINER_ID);
 
-  GetContentsView()->AddChildView(search_border_view_);
+  search_border_view_ =
+      GetContentsView()->AddChildView(std::move(search_border_view));
   search_border_view_->SetBounds(300, y, 240, 50);
 
   y += 60;
 
-  contents = new View();
+  contents = std::make_unique<View>();
   contents->SetFocusBehavior(View::FocusBehavior::ALWAYS);
   contents->SetBackground(CreateSolidBackground(SK_ColorBLUE));
   contents->SetID(THUMBNAIL_CONTAINER_ID);
@@ -564,8 +564,8 @@
   button->SetID(THUMBNAIL_SUPER_STAR_ID);
   contents->AddChildView(std::move(button));
 
-  GetContentsView()->AddChildView(contents);
-  contents->SetBounds(250, y, 200, 50);
+  auto* contents_ptr = GetContentsView()->AddChildView(std::move(contents));
+  contents_ptr->SetBounds(250, y, 200, 50);
   // We can only call RadioButton::SetChecked() on the radio-button is part of
   // the view hierarchy.
   radio_button_to_check->SetChecked(true);
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.html b/ui/webui/resources/cr_components/chromeos/network/network_config.html
index 654a6f4f..783d1c3 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.html
@@ -50,7 +50,7 @@
           restamp>
         <network-password-input label="[[i18n('OncWiFi-Passphrase')]]"
             value="{{configProperties_.WiFi.Passphrase}}"
-            on-enter="connectIfConfigured_"
+            on-enter="onEnterPressedInPasswordInput_"
             property="[[managedProperties.WiFi.Passphrase]]">
         </network-password-input>
       </template>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index 88587d6f..a01d5ec 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -73,6 +73,16 @@
       value: false,
     },
 
+    /**
+     * Whether pressing the "Enter" key within the password field should start a
+     * connection attempt. If this field is false, pressing "Enter" saves the
+     * current configuration but does not connect.
+     */
+    connectOnEnter: {
+      type: Boolean,
+      value: false,
+    },
+
     /** Set to any error from the last configuration result. */
     error: {
       type: String,
@@ -445,11 +455,16 @@
   },
 
   /** @private */
-  connectIfConfigured_: function() {
+  onEnterPressedInPasswordInput_: function() {
     if (!this.isConfigured_) {
       return;
     }
-    this.connect();
+
+    if (this.connectOnEnter) {
+      this.connect();
+    } else {
+      this.save();
+    }
   },
 
   /** @private */